zerkalius

Борт-журнал · что менялось, и ПОЧЕМУ именно так · словарь непонятных слов

Архив хранит каждую версию целиком, но архив отвечает на вопрос «как было», а не «зачем так сделали». Здесь второе. Записи короткие, но причина есть у каждой — через месяц именно её и не хватает.

Весь сайт · Binary-Drum-Machine\

2026-09-21Порядок в корне: имена «Zerkalius-…», служебное — в папки с «_»

Решение пользователя. Все страницы названы по одному образцу:

Служебное — в папки с подчёркиванием: четыре общих модуля (recorder, hub-link, slider-arrows, banks_data) — в _js\, шрифты ASCII-арта — в _fonts\. В корне остались только страницы и то, что требует GitHub Pages (index.html, CNAME, README). Старый Fold v0.957 (fold-v0957\), на который не вело ни одной ссылки, убран с сайта в локальный archive\_retired\.

ПОЧЕМУ НА СТАРЫХ АДРЕСАХ ОСТАЛИСЬ ФАЙЛЫ

На каждом прежнем имени лежит крошечная страница-переадресация: она сразу уводит на новый адрес, сохраняя хвост ссылки (?…, #…). GitHub Pages сам переадресовывать не умеет, а закладки и чужие ссылки на 1001100.online/Kubits.html иначе упёрлись бы в «страница не найдена». Настройки страниц не теряются: браузер хранит их по сайту, а не по имени файла.

Путь к модулям поменялся у тринадцати страниц, поэтому у всех, у кого есть свой номер, он поднят: Layers v1.539, Fold v1.116, цельный Fold v0.742, Genezis v0.427, WebGL v0.330, GPU v0.194, Кубиты v0.306, Grid v11, Code 35.2, октаэдр v0.018, хаб v0.003.

Хаб v0.004–0.005 · Обои v0.003–0.004Живой фон хаба

Сделано на другом компьютере и пришло через GitHub. Новая страница oboi\Zerkalius-oboi.html — обои «Zerkalius Серпинский» из Lively: three.js, дождь символов, надпись, холм или треугольник Серпинского. Хаб подключает её фоном через iframe, кнопки разложены заново: флагман, сетка лаборатории, строка знака (там же кнопка «Обои»). Настройки обоев для хаба — в _js\nastroyka.js: радуга, застывший дождь, без часов и музыки.

ПОЧЕМУ ПОТОМ ПОПРАВЛЕНО

Папка обоев js\ переименована в _js\ — по стандарту имён сайта служебные папки начинаются с подчёркивания (обои v0.004). С кнопки «Fold цельный» в хабе снят номер версии (хаб v0.005): номер на кнопке устаревал при каждом бампе файла — так уже вышло с v0.741, когда файл стал v0.742. Имя кнопки не должно дублировать то, что и так написано в самом файле.

Обои крутят WebGL всё время, пока открыт хаб. На слабой машине это может ощущаться; лекарство, если понадобится, — пауза, пока вкладка не видна.

2026-09-22 · Обои v0.005Значок «в Хаб» у обоев — только на отдельной странице

Просьба пользователя: у oboi\Zerkalius-oboi.html, открытой самой по себе, не было пути назад в хаб. Теперь есть — тот же общий hub-link.js, что у всех страниц.

ПОЧЕМУ НЕ ВСЕГДА

Та же страница — живой фон самого хаба (в iframe). Там значок висел бы поверх хаба и звал в хаб из хаба. Поэтому модуль подключается, только если страница — не внутри другой (window.top===window). Папка oboi добавлена в список подпапок hub-link.js, иначе ссылка вела бы на несуществующий oboi/index.html.

2026-09-22 · Lively v0.001–0.010 · Хаб v0.007Все обои Lively в одной странице — со звуком и записью

Новая страница lively\Zerkalius-lively.html: четыре сцены обоев Lively (Холм, Серпинский, Радар, Воронка) с панелью настройки, как в «Настройка.html». Добавлено то, что уже есть у остальных машин: трек с диска (🎵), захват звука ПК (🎤) и запись видео (⏺ / R). Движок — копия _lively\Zerkalius\js (обои 1.9) в lively\_js\; звук и сведение кадра — lively\_js\zvuk.js. «Мозаика» сюда не вошла: у неё другой движок — неподвижная картинка из символов, которая реагирует на мышь, а не на звук.

ПОЧЕМУ ЗВУК ИДЁТ ЧЕРЕЗ livelyAudioListener

Обои уже умеют реагировать на музыку — Lively отдаёт им 32 полосы спектра. Страница раскладывает спектр трека или звука ПК на те же 32 полосы и зовёт ту же функцию, поэтому движок не менялся, а холм, дождь, радар и надпись дышат под звук ровно так же, как на рабочем столе.

ПОЧЕМУ КАДР ДЛЯ ЗАПИСИ СВОДИТ САМА СТРАНИЦА

Общий recorder.js складывает холсты как есть. У обоев их пять, а часы, прозрачность дождя, контраст и полосы экрана сделаны через CSS — в запись они бы не попали, и дождь вышел бы на полную яркость. Поэтому страница подменяет у записи только сведение кадра; хранилище кусков, кнопка и восстановление остаются общими. Кадр WebGL снимается сразу после его отрисовки, пока буфер ещё не отдан экрану (Lively v0.002). В v0.001 для этого был включён preserveDrawingBuffer, и страница тормозила даже без записи: отклик на клавишу — больше секунды. Флаг заставляет видеокарту каждый кадр копировать весь экран вместо простой смены буфера.

ПОЧЕМУ ХОЛМ ТОРМОЗИЛ НА «ПЫЛИ» (Lively v0.003)

«Размер символов» у холма меняет не размер, а густоту сетки: при 2 выходило 500×500 = 250 тысяч символов, и сетка рисуется дважды — чёрной подложкой и знаками. К тому же каждый шаг ползунка пересобирал холм, а прежняя сетка оставалась в видеопамяти, так что страница тяжелела на глазах. Теперь у холма потолок в 120 тысяч символов, старая геометрия освобождается, а пересборка (холм, плотность радара, ширина и глубина Серпинского) идёт, когда ползунок отпустили. Та же утечка есть и в самих обоях _lively — туда правка не перенесена.

ПОЧЕМУ ПАНЕЛЬ ПРЯЧЕТСЯ НА P

В «Настройка.html» панель пряталась на H, но на сайте H — значок «в Хаб». С v0.004 панель прячется и колесом мыши над обоями (вниз — спрятать, вверх — показать, нажатие — переключить); над самой панелью колесо по-прежнему листает список.

НАСТРОЙКИ СТРОК РАЗДЕЛЕНЫ (Lively v0.010)

Просьба пользователя: не писать в каждой подписи «строка 1: …». В группе «Надпись и часы» над настройками каждой строки — подзаголовок (Строка 1, 2, 3, 4, Вся надпись, Часы), а подписи короткие: «текст», «размер, %», «шрифт», «интервал». В Lively-файле подписи прежние — меняется только панель.

СТРОКА 4: СВОЁ ПОЛЕ ИЛИ НАЗВАНИЕ ТРЕКА (Lively v0.009)

Решение пользователя: у строки 4 своё текстовое поле. Написано в поле — выводится оно, даже когда трек есть. Поле пустое — выводится название: у файла его имя, у звука ПК — имя вкладки или окна, откуда звук. Имя берётся из видеодорожки захвата, и браузер его отдаёт не всегда: вместо имени бывает служебный код («window:123:0», «web-contents-media-stream://…») — такой не выводится, остаётся поле. Имя снимается один раз при начале захвата: если во вкладке сменилась песня, строка сама не обновится.

МОИ НАБОРЫ (Lively v0.008)

Просьба пользователя: свои пресеты — в кэше и в файле. Первая группа панели: список, «загрузить», «сохранить» (то же имя — перезапись с вопросом), «удалить», «в файл» (все наборы одним JSON) и «из файла» (добавляются к своим, одноимённые заменяются). Набор хранит все настройки, включая сцену, «А», строку трека и цвет дождя. Лежат под отдельным ключом zerk-lively-presets, а не среди настроек: кнопка «сбросить» чистит настройки, но наборы не трогает. Браузерное хранилище привязано к этому браузеру и сайту — поэтому и выгрузка в файл: только так наборы переедут на другую машину.

СВОЙ ЦВЕТ ДОЖДЯ (Lively v0.007)

Просьба пользователя. В группе «Дождь» — галочка «свой цвет дождя» и выбор цвета. Снята — дождь, как раньше, берёт общий цвет или радугу. Только на сайте, в Lively не выгружается.

ЗАПИСЬ ДЛЯ ТЕЛЕФОНА 9:16 (Lively v0.006)

Просьба пользователя: видео для мобильника, рамкой показать, что попадёт в кадр. Вырезать полосу из широкого кадра нельзя — надпись «Zerkalius» рассчитана на всю ширину экрана и ушла бы за края. Поэтому в режиме «телефон 9:16» сцена целиком перестраивается под вертикальную рамку по центру (движок берёт размер из stageW(), а не из окна): надпись, часы, дождь, холм, воронка укладываются в неё. Рамка — пунктир поверх; вокруг чёрное. Запись пишет холсты, поэтому в видео попадает ровно рамка — ширина = высота окна × 9/16 (при 1080 по высоте — 608×1080). Переключать формат во время записи нельзя: размер кадра видео уже задан.

КОМПАКТНАЯ ПАНЕЛЬ, «А» У КАЖДОГО ПОЛЗУНКА, СТРОКА ТРЕКА (Lively v0.005)

Просьба пользователя. Подпись, ползунок, число и галочка «А» стоят в одну строку, группы сворачиваются щелчком по заголовку (страница это помнит). Раньше «авто» было только у 33 ползунков из списка обоев; теперь у всех. Чтобы это не тормозило, тяжёлые шевелятся реже: пересборка сетки (густота холма, плотность радара, ширина и глубина Серпинского) — не чаще раза в секунду, пересчёт надписи, дождя и воронки — раза в четверть секунды, и только когда целое значение сменилось. Надпись и дождь теперь пересчитываются порознь: раньше любая правка надписи стирала дождь, и на «авто» он сбрасывался бы без конца. С маски надписи читается только её полоса, а не весь экран. Строка 4 — название загруженного трека (галочка в группе «Надпись»), своя величина, шрифт и интервал; в Lively она не выгружается — там трека нет.

ПОЧЕМУ ПУСТАЯ НАДПИСЬ ТЕПЕРЬ ПУСТАЯ (Lively v0.004)

Если все три строки стёрты, движок подставлял «Zerkalius». Просьба пользователя: пусто — значит без надписи. «Zerkalius» остался только невидимой меркой: от него считаются размер и место часов, чтобы они не прыгали. В обоях _lively поведение прежнее.

2026-09-23 · Code 35.3–35.4Стартовый вид: радар, рамка, сразу Play

Просьба пользователя со скриншотами: Zerkalius-code.html должна открываться сразу в том виде, что на снимках, и уже идущей. При загрузке теперь включены 🛰️ Радар (круги) и 🔳 рамка, свечение выключено, Delta — «Серпинский», операция — «Оригинал», галочки Аниматрицы, Ёлки, Цилиндра и диагоналей сняты, и сразу нажимается Play. 35.4 — по второму снимку, где видна нижняя часть панели: 60 мс на шаг при x1, масштаб 19px, экран 350, интервал 0.7, моноширинный шрифт, «🎨 Цвет как код» включён, пресет Матрица с яркостью фона 0.8. 35.5 — пока идёт Play, кнопка ⏸ плавно мигает раз в секунду; на паузе и после Стопа мигание снимается. 35.6 — у круглых кнопок справа от панели включённое состояние обведено кольцом с отступом: 🎯 и 🔳 — жёлтым, 📌 — красным, 🔃 и 🛰️ — зелёным. Раньше классы «включено» у 🎯, 📌 и 🔃 ставились, но стиля не имели, и понять, что кнопка нажата, было нельзя. Туда же, под 🛰️, переехали кнопки выравнивания |< >|< >| и запись ⏺ из правого верхнего угла холста — теперь все кнопки холста в одном столбце, и он ездит вместе с панелью. И 🔃 реверс теперь включён сразу при открытии. 35.7 — идущая запись ⏺ тоже обведена красным кольцом и мигает, но цветом (красный ⇄ тёмный), а не прозрачностью: в Дзене прозрачность этой кнопки прибита намертво, и мигание прозрачностью там бы пропало.

2026-09-23 · Code 35.8 · Хаб v0.008Вкладки слева и справа, ❓ Помощь; Code — флагман хаба

Просьба пользователя: «эти меню сделай вкладками, так же как в Layers, справа слева расположи». Одна длинная панель разобрана на десять разделов. Сверху по центру — полоса вкладок, каждая прячет и показывает свой раздел. Слева: 📂 Файл, 🔊 Звук, 🔎 Поиск, 🔺 Формы, 🧬 Слои и ▶ Плеер (он внизу панели и не прокручивается). Справа, в новой панели: ↕ Движение, Δ Логика, 👁 Вид, 🎨 Цвет. Панель, у которой все разделы спрятаны, исчезает, ⚙ прячет обе, ⇄ меняет их местами. Какие вкладки закрыты, браузер помнит. Последняя вкладка, «❓ Помощь», открывает окно с описанием машины и инструкцией по каждому разделу, кнопкам холста и клавишам.

Хаб v0.008: большая кнопка «Zerkalius» ведёт теперь на Zerkalius-code.html (раньше она была в лаборатории как «Genezis Code 0»), а прежний флагман Zerkalius-genezis.html встал в лабораторию под именем «Genezis». Номер версии хаба получил тёмную плашку: на бегущих цифрах обоев его не было видно. Хаб v0.009 — кнопки переливаются теми же цветами, что цифры обоев (зелёный, жёлтый, фиолетовый, синий). Каждая начинает со своей случайной фазы, чтобы они не мигали хором; под мышью перелив снимается, и кнопка загорается обычным зелёным. Хаб v0.010 — имена наоборот, по уточнению пользователя: большая кнопка (Zerkalius Code) подписана «Genezis», а Zerkalius-genezis.html в лаборатории — «Zerkalius». Хаб v0.011 — окончательно: большая кнопка подписана «Code», кнопка Zerkalius-genezis.html в лаборатории — «Genezis». Хаб v0.012 — лаборатория выстроена в порядке создания: XOR Engine (15.06), Genezis и GPU (17.06), Grid Module (05.07), WebGL (06.07), Кубиты (18.07), Fold цельный (06.08), Fold · v1.115 (21.08), Fold Layers (01.09), ASCII-арт (19.09), Zazerkalius (23.09). Даты — первое появление файла в git под любым из прежних имён. Хаб v0.013 — в «Знаке и записях» остались только Борт-журнал и Обои; Октаэдр (20.09) и Обои Lively (23.09) ушли в лабораторию, каждый на своё место по дате. Хаб v0.014 — «Fold цельный» и «Fold · v1.115» убраны из лаборатории в новую нижнюю панель «🗄 Архив»: это прежние ветви, работа идёт в Layers. Сами страницы не тронуты и открываются по-прежнему — замороженный Fold опубликован именно в этом виде. Хаб v0.015 — по слову пользователя «вообще убери»: панель «Архив» снята, а сами страницы ушли с сайта в корневой archive\_retired\ — Zerkalius-fold.html (цельная v0.7xx) и вся папка fold\ (замороженный Fold v1.115 с переадресацией fold.html). Ничего не удалено: вернуть — перетащить обратно. Старые ссылки на эти адреса перестанут открываться. Хаб v0.016 — туда же, по той же просьбе, ушёл Zerkalius-xor-engine.html (XOR Engine, самая первая страница лаборатории, 15.06).

35.9 — РАЗДЕЛЫ ПЕРЕМЕЩАЮТСЯ, КАК МЕНЮ В LAYERS

Просьба: «все вкладки меню также перемещаемыми, как у остальных». У каждого раздела шапка (⠿, название, ✕). За неё раздел тащат: над панелью он встаёт между разделами там, где курсор, в том числе в соседнюю панель; мимо панелей — висит на холсте плавающим окном. Пока тащишь, пустая (спрятанная) панель проступает, чтобы было куда положить. Окно нельзя увести за край — шапка остаётся в пределах экрана, тот же зажим, что в Layers. Раскладка помнится в браузере, ↺ на полосе вкладок её сбрасывает.

35.10 — РАСКЛАДКА ПО УМОЛЧАНИЮ, СВЕТЛЕЕ, ✥

По снимку пользователя: при первом открытии (и после ↺) открыт только ▶ Плеер — плавающим окном внизу по центру холста, остальные разделы спрятаны и достаются вкладками. Панели и окна осветлены (#101010 → #1c1e24, вложенные группы → #23262e). В шапке раздела вместо блёклого ⠿ — голубой ✥, чтобы было видно, что за неё тащат.

35.11 — РАЗДЕЛЫ В ПАНЕЛИ КАРТОЧКАМИ

«Когда вкладки в боковой панели, не видно их границ»: разделы шли одной лентой. Теперь каждый — карточка с рамкой и своим фоном, под мышью рамка загорается голубым.

35.12 — РАМКА ВЫКЛЮЧЕНА, 🔃 И 🛰️ НА ПЛЕЕРЕ

Рамка прицела при открытии теперь выключена. Пока открыт ▶ Плеер, кнопки 🔃 реверс и 🛰️ радар стоят прямо в его строке, а у холста прячутся; закрыли плеер — вернулись в столбец. На плеере — двойники: щелчок жмёт настоящую кнопку, вид копируется с неё, так что состояние у них одно.

35.13 — ↺ ПЕРЕКЛЮЧАЕТ «ВСЕ РАЗДЕЛЫ ⇄ ТОЛЬКО ПЛЕЕР»

Щелчок по ↺ открывает все разделы, следующий — оставляет один плеер; разделы при этом остаются там, куда их перенесли. Сброс раскладки на исходную ушёл на Shift+↺.

35.14 — 🔃 И 🛰️ ПО БОКАМ ПЛЕЕРА

«Не так, их по бокам плеера»: у плавающего плеера 🔃 висит снаружи слева, 🛰️ — снаружи справа, на середине высоты окна. В боковой панели снаружи места нет — там они по краям строки кнопок.

35.15 — над шапкой раздела курсор «перемещение» (четыре стрелки, как значок ✥) вместо «руки», и тот же курсор держится, пока раздел тащат.

35.16 — «СЕТКА» ВСЕГДА НА ВЕСЬ ЭКРАН

Была 150×100 при любом окне, и на большом экране по краям зияла пустота. Теперь размер считается от холста: столбцов — сколько символов входит в ширину, строк — в высоту (под радаром — в диагональ, чтобы кольца дошли до углов), с запасом и чётно, чтобы 1010 при прокрутке по кругу смыкалось без шва. Пока на холсте сетка, она сама перестраивается при смене окна, масштаба, интервала, шрифта и радара; любая другая загрузка снимает этот признак.

35.17 — «СЕТКА» СТАЛА ОТДЕЛЬНЫМ СЛОЕМ

Уточнение пользователя: «сетка — это вообще отдельное построение, она не зависит от количества строк». Кнопка больше не заменяет загруженные строки шахматкой, а включает и выключает слой-фон: 1010 на весь холст позади строк, с тем же шагом, что у символов, и с той же привязкой — сетка лежит ровно под текстом и едет вместе с перетаскиванием. Цвет — фоновый, приглушённый. Строки и «Экран» не трогаются. Слой рисуется в отдельный холст один раз и дальше только копируется, пока не поменялись размер, кегль, шаг или цвет. Замена строк сеткой (35.16) осталась только у сцены типа vacuum.

35.18 — под радаром сетка сворачивается в кольца: те же радиусы, что у строк радара, символы повёрнуты вдоль окружности тем же поворотом, шаг по дуге — ширина символа. На каждом кольце число символов чётное, соседние кольца сдвинуты по чётности — шахматка, свёрнутая в круг.

35.19 — «сетки нет, не видно». Причина: hexToRgb в этой машине отдаёт не объект, а строку «r, g, b», а слой обращался к rgb.r — выходил цвет rgba(undefined,…), браузер его отбрасывал и рисовал чёрным по чёрному. Теперь строка подставляется целиком, как в остальной отрисовке (RENDERER.rgba).

35.20 — «эти не скрывай, когда они на плеере, просто дубли»: 🔃 и 🛰️ у холста больше не прячутся, когда открыт плеер; на плеере — их дубли с общим состоянием.

35.21 — «эти 2 наверху от плеера надо, а не сбоку»: у плавающего плеера дубли 🔃 и 🛰️ висят теперь над окном — 🔃 над левым углом, 🛰️ над правым. Сбоку они торчали за края и расширяли окно почти на сотню пикселей в каждую сторону. В боковой панели всё по-прежнему, по краям строки кнопок.

35.22 — «сетка пропадает при малом масштабе 1». Слой сам себя выключал, если шаг строк меньше 2 px или символ уже 1 px, а на масштабе 1 так и выходит. Да и символ в пиксель всё равно не прочесть. Теперь при символе меньше 5 px сетка рисуется по пикселям: «1» ярко, «0» тускло, та же шахматка и те же кольца под радаром. Клетка при этом не меньше пикселя, иначе шахматка из долей пикселя слилась бы в серую муть или пошла муаром.

35.23 — «по умолчанию все панели включены». При первом открытии и после Shift+↺ открыты все разделы, а не только ▶ Плеер; сам плеер по-прежнему висит окном внизу по центру. Ключ памяти вкладок сменён (zcode_tabs_off_v1 → _v2): иначе у всех, кто уже открывал страницу, браузер помнил бы «только плеер», и новое умолчание до них не дошло бы. Куда перенесены разделы, браузер помнит по-прежнему, это отдельный ключ.

35.24 — «это не нужно больше»: голубая кнопка ⇄ под ⚙ (поменять левую и правую панели местами) убрана вместе со своим обработчиком. Разделы и так переносятся мышью в любую панель, а ↺ не тронут: его «все разделы ⇄ только плеер» — другое дело. Правила CSS для panel-right остались без кнопки. Они ничего не делают, пока этот класс не поставлен.

35.25 — ПРЕСЕТЫ СТАЛИ ЦЕЛЫМИ СЦЕНАМИ

«Поправь все пресеты, в них какая-то жесть творится». Причина: пресет из «📍 Карты Сокровищ» ставил только свой десяток галочек (эхо, два слоя, 3D, Ёлка, неон, рамка, радар, тема, скорость). Всё остальное оставалось от того, что было на экране до него: от стартового вида (интервал 0.7, масштаб 19, «Цвет как код», 🔃 реверс) или от прошлой сцены (Дыхание, Цилиндр, Аниматрица, множитель скорости, алгоритм сдвига, сдвиг холста мышью). Выходило, что одна и та же сцена выглядит по-разному в зависимости от того, что выбирали перед ней. Теперь перед встроенным пресетом все эти настройки возвращаются к значениям из самой разметки страницы (defaultValue, defaultChecked, defaultSelected — отдельного списка чисел нет, чтобы он не разошёлся с разметкой). 🔃 🎯 📌 выключаются, холст встаёт в центр, и только потом накладывается сцена.

Свои сцены (★) с этой версии запоминают всё то же самое, плюс «Экран» и 🔃. У ★, сохранённых раньше, этого снимка нет, и они ведут себя как прежде: меняют только то, что хранят.

Попутно найдено: список «Логическая операция» (NOT, XOR со сдвигом, зеркало) не работал вовсе. Строки читают его через UI.logicalOpSelect, а в объекте UI такого поля не было, поэтому всегда выходил «Оригинал». Поле добавлено, и смена операции теперь пересчитывает строки.

35.26 — «код матрицы не работает»: вместо кода страницы на холсте была каша из 0 и 1. Сцена «0. Код Матрицы» подавала код через общий путь implantOrReplace, а там при включённом «Вживлении» (галочка во «🔺 Формах», по умолчанию включена) новый материал не заменяет строки, а вклеивается в середину прежних. Фрактальные пресеты на время загрузки эту галочку снимали, а этот — нет. Теперь снимает и он.

35.27 — «это удали»: раздел «🔎 Поиск» (логгер узоров: вводишь, например, 11011, и строки, где узор встретился, копятся в поле ниже) убран целиком: вкладка, поле, сама проверка на каждом шаге плеера и строка в ❓ Помощи. Если раздел был в сохранённой раскладке, она его просто пропускает.

35.28 — «это тоже лишнее»: зелёная кнопка ⚙ в левом верхнем углу холста (прятала обе панели разом) убрана вместе с обработчиком и строкой в Помощи. Панели и так прячутся: каждый раздел закрывается вкладкой или ✕, а панель без открытых разделов исчезает сама. Правила CSS для menu-off остались, но без кнопки этот класс никто не ставит.

35.29 — ВЫРАВНИВАНИЕ |< >|< >| В ПРЕСЕТАХ

«Посмотри, как в пресетах отрабатывает». Нашлось три беды. Первая: строки фракталов дополнены пробелами до полной ширины, и «влево» / «вправо» двигали треугольник целиком, форма не менялась. Теперь эти два режима равняют строку по её видимому краю: пробелы по краям не считаются, и Серпинский прижимается к краю прямоугольным треугольником. «По центру» осталось по всей строке, иначе несимметричные фигуры (R110) искажались бы. Под Цилиндром край не ищется: пробелы там едут по кругу вместе с символами. Вторая: под 🛰️ радаром выравнивания нет вовсе (строки идут кольцами), а кнопки выглядели рабочими. Теперь они там гаснут. Третья: пресет не трогал выравнивание, и оно тянулось из прошлой сцены. Теперь пресет ставит «по центру», а ★ запоминает своё. Заодно >|< больше не переносится на две строки: в 34 px кнопки три знака не влезали.

35.30 — «больше шрифтов, до 13, и Roboto Mono»: к четырём прежним (системный моноширинный, Courier New, Impact, Comic Sans) добавлены девять: Roboto Mono, JetBrains Mono, Fira Code, IBM Plex Mono, Source Code Pro, Space Mono, Share Tech Mono, VT323, Press Start 2P. Они берутся с Google Fonts, а не из _fonts\ сайта: страницу открывают и файлом с диска, а с file:// браузер шрифты из соседней папки не отдаёт. Холст рисует шрифтом, только когда тот уже скачан, поэтому при выборе шрифт сперва догружается (document.fonts.load), и лишь потом кадр рисуется заново. Без этого первый кадр вышел бы запасным шрифтом, а в паузе так бы и остался.

35.31 — «название Зеркалиус Код»: в шапке панели, во вкладке браузера и в приветствии консоли теперь «Zerkalius Code 35.31» вместо «Binary Drum Machine (Pro …)» и «(Zerkalius …)». Имя файла и адрес страницы не менялись. Прежнее имя живёт в названии репозитория (Binary-Drum-Machine), трогать его незачем.

35.32 — ШРИФТЫ БЕЗ ИНТЕРНЕТА

«Для локальной версии надо подтянуть». В 35.30 девять новых шрифтов шли с Google Fonts, и без сети вместо них был обычный моноширинный. Теперь они лежат в самом проекте. Восемь уже были в _fonts\ (их туда клали для ASCII-арта), Roboto Mono докачан из репозитория google/fonts (ofl/robotomono, лицензия OFL).

Подключить .ttf через @font-face было бы проще, но так не работает: страницу открывают и файлом с диска, а Chrome на file:// не отдаёт странице шрифт из соседней папки (считает это чужим источником). Обычный <script src> при этом грузится. Поэтому каждый шрифт переложен в _fonts\js\<имя>.js: внутри base64 и вызов window.__zerkFont, который собирает FontFace и добавляет его в document.fonts. Скрипт шрифта подгружается, только когда шрифт выбран (проверка в начале каждого кадра, так что срабатывает и от пресета, и от ★). Roboto Mono грузится сразу, им написана вся панель. Строки @import с Google Fonts сняты. Файлы весят 60–350 КБ.

35.33 — «кнопку: передвижение строк не плавное, а построчное, синхронно с сеткой; прыгает по строкам — и обратно». Новая кнопка ▦ внизу столбца кнопок холста, под ⏺. Пока она включена, перетаскивание мышью сдвигает холст целыми клетками: по вертикали на межстрочный шаг, по горизонтали на ширину символа. Строки и «Сетка» отсчитываются от одного центра, поэтому сдвиг, кратный клетке, оставляет строки ровно на местах сетки. При включении, а также при смене масштаба, интервала или шрифта холст сразу встаёт на ближайшую клетку. Ещё щелчок возвращает плавное движение. Кнопка — настройка перетаскивания, а не часть сцены, поэтому пресеты её не трогают.

35.34 — СТРАНИЦА НЕ ЗАПУСКАЛАСЬ: ТЕГ СКРИПТА В КОММЕНТАРИИ

«Пусто»: после 35.32 страница открывалась без вкладок, со пустым списком сцен и чёрным холстом. Не выполнялся ни один её скрипт. Виноват комментарий 35.32, где открывающий тег скрипта был написан буквами (<script src>). Сам по себе он безвреден, но выше, в разборе исходника для «Цвета как код», в коде есть строка '<!--'. Для HTML-разборщика внутри тега скрипта эта пара означает «начался вложенный скрипт». После неё закрывающий тег перестаёт закрывать, весь остаток файла уходит в текст скрипта, и тот не разбирается. Комментарий переписан без тега. Правило: в коде этой страницы не писать открывающий тег скрипта буквами нигде, даже в комментариях и строках.

35.35 — «эту надпись внизу холста»: строка состояния («Двойной клик по холсту — Режим Дзен», «Сцена загружена: …» и прочие сообщения) переехала из шапки левой панели вниз холста, по центру, на тёмной подложке. Щелчки проходят сквозь неё к холсту. В Дзене она гаснет вместе с кнопками.

35.36 — «текстовый файл пусть прямо на холст можно кидать»: файл, брошенный на холст, грузится так же, как кнопкой «📂 Текст», и с тем же «Вживлением», если оно включено. Пока файл тащат над холстом, по краю идёт зелёный пунктир. Звуковой файл заодно встаёт треком, как «🎵 Трек». Картинку или другой не текст страница не грузит, а пишет внизу «Не текст». Файл, брошенный мимо холста, браузер больше не открывает вместо страницы: иначе промах на пару пикселей уносил всю работу.

35.37 — «добавь межсимвольный, до 0,5»: во «👁 Виде» под «Интервалом» новый ползунок «Межсимв.» от 0.5 до 3, по умолчанию 1. Это доля ширины символа: при 1 символы стоят вплотную, как задумал шрифт, при 0.5 наезжают друг на друга, при 3 стоят втрое реже. Шаг умножается везде, где считается раскладка строки, чтобы ничего не разъехалось: в самих строках, в «Сетке» (и в её кольцах под радаром, и в пиксельной), в подгонке сетки-сцены под экран и в ▦ шаге по сетке. Строки радара этого не касается: там символы и так раскладываются ровно по всей окружности, каждое кольцо на свою длину. Пресет возвращает 1, ★ помнит своё.

35.38 — СКАЧКИ ⇄ ПЛАВНО В ПЛЕЕРЕ

Уточнение пользователя к 35.33: речь была про движение строк при проигрывании, и «эту кнопку в плеер — скачки и плавно». Кнопка ▦ ушла из столбца у холста в строку ▶ Плеера, после ▶▶, и стала переключателем режима. ▦ «Скачки» (так при открытии): строки прыгают на целую строку за шаг, как было всегда, и стоят ровно на строках «Сетки». Перетаскивание холста в этом режиме тоже идёт по клеткам. 〰 «Плавно»: между шагами строки скользят от строки к строке. Сразу после шага они рисуются там, где стояли до него (со сдвигом на столько строк, сколько прошёл шаг, с учётом множителя, алгоритма и 🔃), и к следующему шагу доезжают на место. Под радаром так же скользят кольца. Перетаскивание в этом режиме плавное.

Чтобы скольжение было видно, в плавном режиме кадр рисуется на каждом экранном кадре, а не только на шаге. Не скользят замороженный слой («Заморозить Слой 1»), «Заморозить Y-скролл» (шаг там нулевой) и прыжки длиннее экрана: протащить через весь экран было бы некрасиво, их честнее показать скачком.

35.39 — «текст, вставка файла не работает». Причин три. Первая: загрузка текста шла через тот же путь, что генератор форм, и при включённом «Вживлении» (по умолчанию включено) файл не заменял строки, а вклеивался в середину прежних, обрезаясь по их ширине и высоте. На вид ничего не происходило. Та же беда была у «Кода Матрицы» в 35.26. Теперь любой текст (кнопкой, броском на холст, кодом страницы) всегда заменяет строки, а «Вживление» остаётся делом генератора форм. Вторая: повторно выбранный тот же файл браузер не считает изменением, и загрузка молчала. Теперь поле выбора после чтения очищается. Третья: у файлов из Windows в конце каждой строки оставался невидимый , теперь он срезается (и метка BOM в начале тоже). После загрузки внизу холста пишется имя файла и число строк, пустой файл — отдельным сообщением.

35.40 — «панели крайние прозрачные пусть». У левой и правой панели больше нет ни фона, ни рамки, ни тени, и холст виден сквозь промежутки между разделами. Фон остался у самих карточек разделов, иначе кнопки терялись бы на бегущих цифрах. Полоса прокрутки тоже без подложки. Прозрачность только на вид: пустое место панели по-прежнему её, и щелчок по нему до холста не доходит.

35.41 — «защити от выделения все панели». Ползунки, кнопки и холст тянут мышью, а протяжка для браузера — ещё и выделение текста: подписи и значки плеера заливались синим. Запрет стоит на всей странице разом, как в Октаэдре. Поэтому его получают сами собой и панели, и плавающие окна, и круглые кнопки у холста, и разделы, которые появятся потом. Выделять можно только там, где это нужно: в полях ввода и в окне ❓ Помощь, откуда текст копируют.

35.42 — «почему, когда ставлю галку „⚓ Заморозить слой 1“, строки прыгают в центр, а не остаются, где были». Ошибка была в отрисовке: замороженный слой всегда показывал строки от нулевой (в коде стоял 0 вместо текущего номера), поэтому картинка перескакивала к началу текста, и оно вставало в центр экрана. Теперь в момент постановки галки запоминается текущая строка (frozenIndex), и слой стоит ровно на ней. Когда галку снимаешь, слой идёт дальше с того же места, а не с того, куда за это время убежал счётчик кадров, так что скачка нет и в эту сторону. ■ Стоп и загрузка сцены сбрасывают запомненное место.

35.43 — «нужен подсчёт циклов Аниматрицы». Под галкой «Аниматрица» появилась строка: сколько раз волна прошла текст сверху донизу и на какой строке она сейчас. Кроме числа проходов ищется и настоящий цикл. После каждого прохода берётся отпечаток всего текста (хеш FNV-1a по всем строкам) и запоминается вместе с номером прохода. Отпечаток исходного текста — проход 0, поэтому ловится и возврат к самому началу. Как только отпечаток повторится, текст вернулся в состояние, где уже был, и дальше картина ходит по кругу. Тогда пишется «🔁 Цикл: период N» и после какого прохода начался повтор. При загрузке нового текста или сцены счёт начинается заново. Правки текста другими средствами («Вставить 0/1» и т. п.) счёт не сбрасывают, и найденный после них цикл может быть ложным.

35.44 — две просьбы. «Сохранил текущую, а как потом включить — пропала кнопка загрузки». Отдельной кнопки не было никогда: сцена включалась выбором в списке. Только что сохранённая ★ сразу стоит в нём выбранной, а выбрать уже выбранное браузер не считает изменением (нет события change), поэтому включить её заново было нечем. Рядом со списком появилась кнопка ▶: включает выбранную сцену, в том числе ту, что уже стоит. В помощи дописано, что ★ хранит только настройки, а текст холста в неё не входит. «F5 не должен сбрасывать, начинать с того же; стартовый вид — только когда кеша ещё нет». Раньше при каждом открытии ставился стартовый вид (радар, масштаб 19, экран 350, 60 мс, цвет как код…) и затирал всё, что настроили. Теперь при уходе со страницы (pagehide, beforeunload и скрытие вкладки) состояние целиком ложится в память браузера. Туда входят текст холста, вид и галочки (тот же снимок, что у ★), скорость, цвета, радар, рамка, выбранная сцена, кадр плеера и играл ли он. При открытии всё это возвращается. Стартовый вид ставится только при первом заходе, пока запомненного нет. Если текст не влез в память (очень большой файл), состояние пишется без него, а текст берётся как раньше.

35.45 — «надо и текст, и сохранять всё вместе, как пресеты». ★-сцена стала полным пресетом. «💾 Сохр.» у списка кладёт в неё тот же полный снимок, что запоминается для F5 (поле full): текст холста, вид и галочки, скорость, цвета, радар, рамку и кадр. Выбор ★ в списке или ▶ ставит снимок целиком. Для F5 и для сцены работает один и тот же код (SESSION.apply), поэтому они не разойдутся. Память браузера у страницы около 5 МБ на всё, и несколько сцен с большими текстами могут её заполнить. Тогда сцена сохраняется без текста, и об этом прямо говорит окно, а не молчание. ★, сохранённые до 35.45, помнят только настройки и включаются как раньше.

35.46 — «надо и в файл сохранять, чтобы потом на другой компьютер». Сцены живут в памяти браузера, а она у каждого компьютера своя. Под списком сцен появились «📤 Сцены в файл» и «📥 Из файла». 📤 выгружает все ★ разом одним файлом Zerkalius-сцены-ДАТА.json, целиком, с текстами. 📥 добавляет их в список. Свои сцены при этом не затираются, а сцена, которая уже есть точь-в-точь, второй раз не добавляется. Такой файл можно и просто бросить на холст: по метке zerkaliusScenes он узнаётся и уходит в список сцен, а не на холст текстом. Любой другой .json грузится текстом, как раньше.

35.47 — «счётчик Аниматрицы показывать внизу, пусть там все уведомления». Строка счётчика ушла из раздела Логики вниз холста и стоит над строкой состояния, тем же видом и своим цветом, одной строкой: «Аниматрица: пройдено циклов N · волна на строке r из H · повтора пока нет» или «· 🔁 цикл: период P». Свою строку ей дали нарочно. Строка состояния — для разовых сообщений (сцена сохранена, файл загружен), а счётчик меняется на каждом шаге и затирал бы их раньше, чем их успеешь прочесть. Видна, пока Аниматрица включена, в Дзене гаснет вместе со строкой состояния.

35.48 — по скриншоту с открытой боковой панелью Chrome, когда окно стало у́же. Полоса вкладок переносилась: «❓ Помощь» уезжала на вторую строку. Теперь полоса всегда в одну строку: вкладки сжимаются, длинные подписи обрезаются многоточием, полное имя видно во всплывающей подсказке. Место под полосу — всё, что между двумя панелями (было «экран минус 720 px», стало минус 624). Плеер вылезал за правый край: плавающее окно держалось на экране только краем в 60 px, и после сужения окна браузера оставалось обрезанным. Теперь окно при сужении и при открытии страницы возвращается на экран целиком. У плеера сверху оставлен зазор под его дубли 🔃 🛰️, а окно шире экрана прижимается к левому краю. Заодно, при просмотре в Chrome (разовое исключение по слову пользователя): после F5 счётчик Аниматрицы не показывался, пока плеер стоит. Галку ставил снимок, без события, и строка появлялась только с первым шагом волны. Теперь она обновляется сразу после восстановления и после загрузки сцены.

35.49 — «как смотреть это кино будем?» → «журнал в файл». Видео тут плохой свидетель: на масштабе в 4–5 px мелкий текст волны не разглядеть, а журнал точен до символа. Под галкой «Аниматрица» появились «⏺ Журнал» и «💾 Журнал в файл». ⏺ записывает весь текст в момент старта, затем после каждого прохода волны и при загрузке нового текста. Заголовок записи: что это (старт, проход N, новый текст), отпечаток текста (тот же FNV-1a, по которому ищется цикл), число непробельных символов, сколько символов изменилось с прошлой записи, найденный цикл. В шапке файла — время, число строк, ширина, сцена и само правило волны словами, чтобы файл читался без страницы. Полный текст пишется, пока журнал меньше 40 МБ, дальше только заголовки. Иначе большой текст за долгую запись раздул бы файл на сотни мегабайт. 💾 отдаёт Zerkalius-аниматрица-ДАТА-ВРЕМЯ.txt в любой момент, можно и во время записи. Пока идёт запись, кнопка красная и показывает число записей, а внизу холста стоит «⏺ журнал».

35.50 — «как вручную, не ловя момент, прокрутить треугольник в начало». ■ Стоп ставит кадр 0, и первая строка встаёт в центр экрана, а над ней виден хвост текста: экран показывает строки по кругу. Попасть ползунком «Кадр» точно в половину «Экрана» мышью трудно. В Плеере рядом с ■ появилась кнопка ⤒, то же делает клавиша Home: пауза, и первая строка текста стоит у верхнего края экрана. Окно строк бывает выше холста, тогда его верх уходит за край. Поэтому строка ставится к первой видимой строке, а не к краю окна, по той же формуле, по которой строки ставит отрисовка. Home в полях ввода остаётся полю.

35.51 — «как переключать сразу циклы?». Цикл здесь — проход волны, тот, что считает «пройдено циклов». Под журналом Аниматрицы появились ⏮ Цикл и ⏭ Цикл, клавиши PageUp и PageDown, и галка «Плеер — целыми циклами». ⏭ сразу гонит волну до конца текущего цикла. Шаги внутри идут без пересчёта строк, пересчёт один раз в конце, иначе это 255 пересчётов всего текста подряд. С галкой ▶ делает целый цикл на каждом шаге. ⏮ возвращает текст: посреди цикла к его началу, с границы к предыдущему. Для этого после каждого цикла текст кладётся в историю, исходный текст — как цикл 0. Всего хранится не больше 30 МБ, старые циклы уходят. При возврате из поиска повтора стираются отпечатки циклов «из будущего»: пройденные заново, они совпали бы сами с собой и дали бы ложный цикл. Галка «Плеер — целыми циклами» запоминается в сцене и после F5.

35.52 — «после F5 показывает 0 циклов, но это не так». Снимок для F5 (35.44) помнил текст и все настройки, а счёт Аниматрицы в него не входил. Текст возвращался уже прокрученным, а загрузка текста обнуляла счёт. Теперь в снимок входят число пройденных циклов, строка волны, найденный повтор и отпечатки прошлых циклов, без которых повтор с циклом до F5 не нашёлся бы. Всё это ставится обратно уже после загрузки текста. То же получают и ★-сцены, они снимают тот же снимок. Историю для ⏮ не храним, она занимает много: назад можно вернуться только до того места, где открыли страницу.

35.53 — «это отдельными гифками собирать бы прямо в коде». После журнала сцены «1» (цикл 128 с 65-го прохода, досчитан в Python и подтверждён самой страницей на 667-м проходе) картинки цикла собирались вне страницы. Теперь у Аниматрицы есть выбор шага (каждый 1-й, 2-й, 4-й, 8-й, 16-й, 64-й проход) и 🎞 GIF. Волна гонится на копии текста тем же правилом, так что холст, счёт и журнал не трогаются. Если волна посреди цикла, копия сперва доходит до его конца. Кадры идут, пока картина не вернётся к первому кадру (круг замкнулся), но не больше 256. Шаг 1 показывает весь цикл и «густо–редко», 8 — родственников через 8, 64 — вложенный треугольник. Кодировщик GIF свой, без библиотек, чтобы страница работала с диска без интернета: палитра на 4 цвета и сжатие LZW по стандарту GIF89a, рост размера кода — как у проверенного omggif. В словарь добавлены «Префиксный XOR», «Теорема Лукаса» и «Период — степень двойки».

35.54 — «ромбическая сетка». Пользователь увидел, что треугольник сцены «1» сложен из ромбов-«кадров», идущих цепочками по диагоналям. Замер на проходе 155 (он же 667-й): при сдвиге по диагонали на (16 строк, ±16 символов) совпадает 89,5% клеток, на 32 — 90%, на 8 и 24 — около 70%, а мимо на один символ — 59%, это уровень случайности. Две причины, обе — степени двойки. Правило 90 ведёт узор ровно на символ за строку, отсюда диагонали под 45°. Треугольник Серпинского сложен из своих копий, сдвинутых по диагонали, отсюда повтор на 16 и 32. В «👁 Виде» появилась ◇ Ромбическая сетка с шагом 8, 16, 32 или 64. Это два семейства прямых через вершину текста (середину первой строки): «столбец − строка» и «столбец + строка» кратны шагу. Сетка рисуется по символам, с учётом выравнивания, только внутри конуса от вершины и рвётся на стыке строк по кругу. Ромб выходит высотой в шаг, соседние сдвинуты на полшага, поэтому решётке сдвигов (16, ±16) соответствует шаг 32. Он и стоит по умолчанию, совпадая с ромбами, которые пользователь обвёл сам. Вне страницы все 21 целый ромб прохода 155 вырезаны и сравнены: с верхним совпадает 83–97%, ромбы на средней вертикали — 97%. Из 545 клеток ромба 64 заняты во всех ромбах сразу, 276 пусты во всех, 205 меняются от ромба к ромбу.

35.55 — «подсвечивать полосы». Дальнейший разбор сцены «1» по всем 128 проходам цикла показал: у каждой строки свой период волны, ближайшая степень двойки больше её номера. Строка 0 стоит, строка 1 повторяется через 2 прохода, строки 2–3 через 4, 4–7 через 8, и так до 64–127 через 128. Это теорема Лукаса по одной строке: строке r нужны только строки выше. Общий период 128 — это период нижней полосы, а треугольник работает как часовой механизм, где каждая полоса вдвое медленнее верхней. Отсюда же: верхний ромб (строки 0–32) повторяется через 64 прохода, в нём 64 разных кадра. Всех ромбов за цикл 2688, разных 1541. Вдоль боковых сторон треугольника чередуются всего два кадра-близнеца, всё разнообразие внутри. В «👁 Виде» появилась галка ▤ Полосы периодов: строки тонируются полосами по степеням двойки, у правого края подпись «строки 16–31 · период 32». Полосы считаются от первой строки текста, рисуются фоном под символами, под радаром не рисуются.

ИССЛЕДОВАНИЕ 2026-09-24: ЦИКЛ АНИМАТРИЦЫ НА СЦЕНЕ «1» — ЧТО НАЙДЕНО

Откуда числа. Журнал Аниматрицы (35.49) со сцены «1» дал один кадр: текст 128 строк × 257 символов из «1», «0» и пробелов, проход 15, волна на строке 76. Правило волны детерминированное, поэтому дальше всё досчитано вне страницы (Python, то же правило, что в runAnimatrixGlobal) по всем проходам. Главный вывод подтвердила сама страница на 667-м проходе: «🔁 цикл: период 128, повтор после 65-го прохода».

1. Разгон и цикл. Нули, которых было 976, гаснут друг о друга и к 65-му проходу вымирают полностью. Дальше идёт чистый цикл: проход 193 равен проходу 65 символ в символ, период 128. Если в том же тексте заменить нули единицами, цикл 128 начинается сразу, без разгона.

2. Почему 128. Без нулей волна — это префиксный XOR: строка i становится XOR всех строк над ней и её самой. Через k проходов строка i собирается из строк выше с коэффициентами C(i−j+k−1, k−1) по модулю 2 (теорема Лукаса). Через 2m проходов, если 2m ≥ числа строк, остаётся только сама строка. Период — ближайшая степень двойки не меньше числа строк: 128 → 128, 100 → 128, 200 → 256.

3. Любой кадр — XOR сдвинутых копий. Состояние через k проходов после 65-го равно XOR копий 65-го, сдвинутых вниз на все d, у которых нет общих двоичных единиц с k−1 (d & (k−1) = 0). Пример: проход 155 (= 667-й), k = 90, k−1 = 1011001, сдвиги 0, 2, 4, 6, 32, 34, 36, 38. Проверено на всём тексте, совпадает символ в символ. Отсюда и закономерности внутри цикла: «густо–редко» через проход (на чётных единиц почти вдвое меньше: 65 — 4168, 66 — 2096), «родственники» через 8, вложенный треугольник через 64.

4. У каждой строки свой период — степень двойки. Строка 0 стоит, строка 1 повторяется через 2 прохода, строки 2–3 через 4, 4–7 через 8, 8–15 через 16, 16–31 через 32, 32–63 через 64, 64–127 через 128. Период строки — ближайшая степень двойки больше её номера, и это Лукас по одной строке: строке r нужны только строки выше. Проверено по всем 128 проходам. Треугольник работает как часовой механизм: каждая полоса вдвое медленнее верхней, общий период — период нижней полосы. Показывает «▤ Полосы периодов» (35.55).

5. Ромбы-«кадры». Картинка почти повторяется при сдвиге по диагонали: на (16 строк, ±16 символов) совпадает 89,5% клеток, на 32 — 90%, на 8 и 24 — около 70%, мимо на один символ — 59%, это уровень случайности. Ромбы 32 строки высотой, соседние сдвинуты на 16. Показывает «◇ Ромбическая сетка» с шагом 32 (35.54). Причин две, обе — степени двойки: Правило 90 ведёт узор ровно на символ за строку (диагонали под 45°), а треугольник Серпинского сложен из своих копий, сдвинутых по диагонали.

6. Размер ромбов — нули в k−1. Каждый нулевой разряд 2j в k−1 добавляет копию со сдвигом 2j и включает ромбы этого размера. Проход 977 (k = 16, k−1 = 0001111): три размера сразу — 16, 32, 64. Проход 129 (k = 64, 0111111): только 64, две большие половины. Проход 155 (1011001): 32, плюс утолщение линий от разрядов 2 и 4. Проход 192 (1111110): крупных нет, только утолщения.

7. Проход 155 изнутри. 21 целый ромб. С верхним совпадает 83–97%, ромбы на средней вертикали — 97%. Из 545 клеток ромба в этом проходе 64 заняты во всех ромбах, 276 пусты во всех, 205 разнятся. За весь цикл общего каркаса нет: меняется каждая клетка.

8. Словарь кадров цикла. Всего ромбов 2688 (21 место × 128 проходов), разных 1541. 1206 встречаются один раз, 130 — по 4, 128 — по 6, два почти пустых (по 6 единиц) — по 20 раз. Верхний ромб (строки 0–32) повторяется через 64 прохода, у него 64 разных кадра.

9. Близнецы. Зеркало: каждый ромб либо симметричен сам (303), либо имеет зеркального близнеца (1238), всегда в том же проходе на зеркальном месте. Вся анимация в каждом кадре симметрична слева направо, новая информация только в половине треугольника. Точные близнецы: то же место через 64 прохода (320 пар, полосы с периодом ≤ 64); тот же проход, на 32 строки ниже по боковой стороне (по 128 пар в каждую сторону; вдоль краёв чередуются всего два кадра); на 64 строки ниже (по 64). Почти близнецы: многие пары отличаются на 1 или 3 клетки, и отличия всегда только на краю ромба, в вершинах, а внутри копия точь-в-точь. Граница принадлежит следующей, более медленной полосе. Пример: верхний ромб на проходах 65 и 97 отличается одной нижней вершиной (строки 0–31 с периодом 32 уже повторились, а строка 32 с периодом 64 — ещё нет). Самая большая семья почти одинаковых (58) — пустые ромбы внизу по центру, та самая тёмная «дыра».

Что здесь классика, а что своё. Классика: Лукас (1878), Глейшер (1899), Серпинский (1915), Вольфрам с соавторами (1983–84, Правило 90 и линейные автоматы). Своё у Zerkalius: три символа и правило «два разных → верхний». Из-за него волна нелинейна, и появляется разгон с вымиранием нулей. В литературе такого варианта не встречалось, но утверждать, что его никто не изучал, нельзя.

Code 35.56 · хаб v0.027 · страница «Исследование» v0.001 — «сетку авто, ось симметрии, картинки — в папку сайта и в индекс». В ромбической сетке появился шаг «авто — по проходу». Он берёт k — число проходов от начала найденного цикла, а пока цикла нет, от начала текста — и рисует все размеры ромбов, для которых в k−1 стоит ноль, каждый своим цветом (8 голубой, 16 зелёный, 32 жёлтый, 64 красный). Справа сверху легенда: k, k−1 в двоичной записи и включённые размеры. Новая галка ⫼ Ось симметрии рисует вертикаль через вершину текста, а над ней живой процент: доля непустых пар символов, одинаковых слева и справа от оси, по видимым строкам. На цикле Аниматрицы он должен показывать 100%. Картинки исследования переехали из временной папки в issledovanie\ на сайте. Там же страница Zerkalius-issledovanie.html: все девять пунктов с картинками. В хабе, в «Знаке и записях», рядом с Борт-журналом и Обоями появилась кнопка Research / Исследование. hub-link.js знает новую подпапку, иначе значок ⌂ вёл бы не туда.

Исследование v0.002 — «что у тебя за квадраты?» На листе из 128 кадров проступали белые квадраты-блоки, которых в самой картинке нет. У картинок стояло image-rendering: pixelated, то есть без сглаживания. Оно хорошо, когда мелкую картинку увеличивают, а лист шириной 2128 пикселей браузер ужимает до ширины страницы и без сглаживания выбрасывает целые ряды пикселей: тонкие линии слипаются в блоки (муар). Сглаживание вернули, на странице картинки только ужимаются.

Исследование v0.003 — «всё равно чётные темнее». Так и есть, и это не показ, а сама картина. На чётных проходах единиц ровно вдвое меньше: в среднем 2562 против 5075. А главное, в чётных проходах ни одна единица ни разу не стоит прямо над другой: пар «единица над единицей» 0 по всему циклу, в нечётных в среднем 3751. Нечётный кадр состоит из вертикальных штрихов, у 90% единиц над ними тоже единица. Следующий проход складывает строку с соседней сверху, и штрих гасится до точек. Кадры чередуются так: штрихи — точки — штрихи.

Исследование v0.004 — «можно её в нормальном размере, не уменьшенную, видеть?» Щелчок по любой картинке открывает её поверх страницы в полный размер 1:1, с прокруткой, а кнопки ×2 и ×4 увеличивают её. При увеличении сглаживание выключено, там оно и нужно: каждый символ виден чётким квадратом. Закрывается по Esc, ✕ или щелчку по фону.

Исследование v0.005 — «прогони следующий треугольник, 100 или 200». Нули в сцене «1» — от генератора: «Правило 90» пишет внутри треугольника «0» там, где клетка пустая, а «Обрезать фон» гасит в пробелы только то, что снаружи. Ширина — 2·строк+1, у 128 строк это 257, как в журнале. Тем же способом построены треугольники на 50, 64, 100, 128, 200 и 256 строк (сид «1») и прогнаны с нулевого прохода. Период везде по прогнозу: 64, 64, 128, 128, 256, 256, то есть 100 → 128 и 200 → 256. 128 строк дали «цикл 128 с 65-го», как показала страница, значит, расчёт совпадает с Code. Новый закон: разгон — ровно половина периода плюс один проход. Нули вымирают и цикл начинается на проходах 33, 33, 65, 65, 129, 129. Почему ровно половина, пока не доказано.

Исследование v0.006 — «дальше». Сделано 17 прогонов: правила 90, 150, 30, 110 и 18, сиды 1, 11, 101, 1101 и 10011, 64 и 100 строк, с обрезкой фона и без. Период всегда P, ближайшая степень двойки не меньше числа строк, в том числе там, где нули не вымирают. Поправка к v0.005: «разгон = половина периода + 1» — не общий закон, а свойство треугольника Серпинского (правило 90 или 18 из одной точки, с обрезкой). У правила 150 разгон 40 и 80 (5/8 P), у правила 30 — 10 и 11, у 110 — 8, у сида 11 — 18. Без обрезки фона разгон ровно P/2. При сидах 101, 1101, 10011 и без обрезки нули не вымирают совсем и живут внутри цикла.

Исследование v0.007 — «правило 150 с картинками». На странице лист и GIF правила 150 на 100 строк. Исходный треугольник почти весь из нулей: 7348 против 2652 единиц. За 10 проходов нулей остаётся 502, к 40-му — 16, а дальше несколько одиночек держатся до 80-го и тянут разгон до 5/8 периода. С 80-го идёт чистый цикл 128 (проход 208 = проход 80). У цикла свой рисунок: сквозные вертикальные «стволы» и треугольники по бокам.

Исследование v0.008 — «правило 30». Лист и GIF правила 30 на 100 строк. Правило 30 хаотическое: в исходном треугольнике нулей и единиц почти поровну (4804 и 5196). Нули гибнут быстро, к 11-му проходу их нет, это весь разгон. Цикл на вид шумовой, без треугольников Серпинского, но строгий: период ровно 128, проход 139 равен проходу 11 символ в символ. Левый край держит правильные косые полосы, правый — хаос.

Исследование v0.009 — «правило 110». Из одной точки правило 110 растёт только влево, и треугольник выходит половинкой с вертикальным правым краем. Разгон самый короткий из всех, 8 проходов: 2174 нуля в начале, ни одного к 8-му. Дальше цикл ровно 128, проход 136 равен проходу 8. Форма треугольника на период не влияет, его задаёт только число строк. Зеркальной симметрии у половинки нет, так что ось симметрии в Code здесь ничего не покажет.

Исследование v0.010 — «каждый ромб как 1 или 0: у близнецов одинаковый, у симметричного — по соседу через ось». Обоим условиям отвечает чётность ромба, XOR всех его клеток. У зеркальных близнецов единиц поровну, значит бит одинаков. В симметричном ромбе пары через ось гасят друг друга, и бит зависит только от клеток на оси. Из ромбов выходит новый треугольник: при ромбах в 32 строки 21 бит, в 16 строк 105 бит, в 8 строк 465 бит. Он всегда симметричен, и у него свой цикл, тоже ровно 128. При ромбах 16 и 8 все 128 кадров разные, при ромбах 32 разных всего 40. На странице мозаики прохода 155 и GIF цикла.

Исследование v0.011 — «ромбы из ромбов». Треугольник из ромбов-битов лежит в той же геометрии, что и исходный, поэтому свёртку можно повторять. Лестница с ромбами высотой 4: 128 строк → 62 → 29 → 13 → 5 → 1. Каждая ступень всегда симметрична и держит период исходной картины, 128, хотя по своему размеру имела бы 64, 32, 16, 8: ступени помнят часы оригинала. Сама ступень волне не подчиняется: проход волны по ступени не даёт ступень ни одного следующего прохода, так что свёртка и волна не перестановочны. Верхний бит (весь треугольник в одной клетке) внутри цикла повторяется ровно через 12 проходов блоком 000111101111, но 128 на 12 не делится, и на стыке циклов ритм сбивается. Ритм с тройкой в картине из степеней двойки неожиданен, пока это наблюдение.

Code 35.57 — «разбитые сеткой ромбы собирать в кино» и «общую картинку со всеми ромбами». Под осью симметрии в «👁 Виде» появились кнопка 🎞 Ромбы в кино и выбор режима. Ромбы те же, что режет ромбическая сетка: вершина решётки в середине первой строки, высота ромба равна шагу сетки (при «авто» — 32). Ромбы кадра подряд — GIF из всех целых ромбов текущего текста, сверху вниз и слева направо. Верхний ромб по проходам — GIF одного ромба: волна гонится на копии, кадр после каждого прохода, пока ромб не вернётся к себе (у сцены «1» через 64) или не наберётся 256 кадров. Все ромбы одной картинкой — PNG: ромбы стоят на своих местах в треугольнике, но раздвинуты с зазорами, как разобранная мозаика. Цвета: пусто внутри ромба — тёмно-серое, «0» — синее, остальное — светлое. Для этого GIF-кодировщик научился палитре на 8 цветов (раньше 4).

Исследование v0.012 — «отзеркалить нижний через центр в верхний и там XOR». На экране строки идут по кругу: снизу треугольник (начало текста), сверху трапеция (конец), касаются в центре. Нижний треугольник отражён вверх (строка i ложится на 127−i) и сложен XOR с верхней половиной. Меняется только середина трапеции. На проходе 128 выходит знак Зеркалиуса: середина трапеции там пуста, трапеция распалась на два треугольника, и отражение ложится в пустоту точным зеркалом, получаются песочные часы вершинами через центр. На проходе 155 верх и отражённый низ совпадают на 49% (уровень случайности), и XOR даёт кашу. После операции волна снова циклична с периодом 128, без разгона.

Исследование v0.013 — «верхние два треугольника по краям отзеркалить вниз, в противоположные стороны, в пустоты». Отражение через центральную точку, поворот на 180°: верхний левый угол ложится в пустоту справа от нижнего треугольника, верхний правый — слева, дальше XOR с нижней половиной. Отдельно сделан вариант «оба сразу»: каждая половина XOR отражённая другая. На проходе 128 боковые треугольники ложатся в пустоты точными копиями, и получаются два целых больших ромба высотой 64. «Оба сразу» превращает картину в решётку больших ромбов с крестом через центр, то есть в ромбическую сетку в масштабе 64, собранную из одного кадра. На проходе 155 контур становится шестиугольником. «Оба сразу» всегда симметричен сверху вниз и удваивает единицы. После любой операции волна циклична с периодом 128.

Code 35.58 · исследование v0.014 — «добавь это в Code кнопкой». В «Δ Логике» под Аниматрицей появились выбор «низ → вверх», «верх → вниз, в противостороны», «оба сразу», кнопка ⧖ Зеркало и ↶. Отражение через центр экрана — поворот на 180°: строка i ↔ n−1−i, столбец k ↔ W−1−k. XOR идёт по правилу волны: одинаковые → пробел, символ и пробел → символ, два разных → символ из отражения. «Оба сразу» берёт обе половины от исходного текста. При нечётном числе строк средняя строка — сама себе отражение, её не трогаем, иначе XOR стёр бы её. Операция меняет сам текст, поэтому ↶ хранит прежний, а счёт циклов Аниматрицы начинается заново. Подмечено при разборе: если брать верх уже после XOR с низом, низ становится просто отражённым верхом, это «обмен через три XOR». На страницу добавлен крупный шестиугольник прохода 155.

Исследование v0.015 — «продолжишь?» про ритм 12 верхнего бита. Верхний бит собирается из кадра одними XOR, поэтому он — чётность единиц кадра на фиксированном «следе» из 3613 клеток. След найден обратным ходом свёртки и сверен на всех 128 проходах. Приложенный к копиям начального кадра со сдвигом на d строк, след выделяет набор D = {d : d mod 12 ∈ {2, 4, 9, 11}}, периодичный с шагом 12. Верхний бит на проходе k — это чётность числа d из D с d & (k−1) = 0, совпадает на всех 128. По модулю 2 период 12 раскладывается в (1+x)⁴·(1+x+x²)⁴: множитель (1+x)⁴ даёт ритм 4, множитель 1+x+x² — ритм 3, вместе 12. Строк 128, ряд обрывается, отсюда сбой на стыке. Ритм — свойство лестницы из ромбов высотой 4, а не волны: при высоте 2 он 68, при 8 — 96, при 6 его нет. Почему D вышел периодичен именно с шагом 12, пока открыто.

Исследование v0.016 — «продолжай» про ритм 12. Шаг 12 сидит в самом следе лестницы: его центральный столбец — это 111101111000, повторённый через 12. Ритм складывается по ступеням. После первой ступени столбец повторяется через 4, на второй и третьей ритм смешанный, с четвёртой становится ровно 12: четвёрка первой свёртки, умноженная на тройку, набегающую дальше. Тройку даёт форма ромба: одномерная модель (только строки, окно 5 с шагом 2) даёт шаг 5, а не 12. Волна этот след только «читает»: чистый набор D с шагом 12 получается лишь при отсчёте от 65-го прохода, а от шума, от одной точки и от других кадров — нет. Вопрос закрыт, дальше — комбинаторика лестницы, к волне она не относится.

Исследование v0.017 — «почти надпись». Пользователь увидел в треугольнике с ромбической сеткой строчку текста; проверили буквально: ромб — буква, одинаковые ромбы — одна буква, зеркальный — та же строчной. На проходе 155 из 105 ромбов высотой 16 выходит 47 разных, с точностью до зеркала 26 букв, а без самого края ромба — 15. Каждая строка — зеркальный палиндром, горизонтальных слов длиннее 4 букв нет. Слова идут вдоль сторон: ряд ромбов, параллельный боковой стороне, на расстоянии e от края после короткого заголовка повторяет одно слово длиной в ближайшую степень двойки больше e+1 (край — «аб», дальше «девз», «гжиЛ»), начиная не позже уровня 2e+1. Проверено на всех 128 проходах и на ромбах 8 и 4 строки. Это закон периодов строк, повёрнутый на сторону. Картинки: кадр с буквами в ромбах и лист алфавита.

Code 35.59 — «да» на буквы в Code. В «Виде» под ромбической сеткой появился флажок «🔤 Буквы в ромбах». Каждый ромб сетки (высота — шаг сетки, при «авто» — 16) подписан буквой прямо на холсте: одинаковые ромбы — одна буква, зеркальный — та же строчной. Буквы раздаются по частоте, при равенстве — по первому появлению сверху вниз и слева направо, поэтому на проходе 155 выходит ровно лист алфавита со страницы «Исследование»: это сверено прогоном того же кода в node. Цвет буквы — ряд вдоль боковой стороны, чтобы слова «аб», «девз», «гжиЛ» были видны глазом. Справа сверху — сколько ромбов, разных и букв. Буквы считаются по всему тексту, но только когда текст сменился. Флажок входит в сцены и сбрасывается вместе с видом. При проверке поймался ложный сбой: тестовый файл был с переводами строк Windows, и «\r» в конце строки сдвигал вершину. На странице строк с «\r» не бывает, в коде это не ошибка.

Code 35.60 — «задавать цвет 0 и 1 для сетки». В «🎨 Цвете» под Активом и Фоном появилась строка «0 / 1»: флажок и два цвета. Флажок включает их на холсте: «0» и «1» красятся своими цветами, а яркость остаётся от Δ — изменившиеся символы с прозрачностью Актива, прочие с прозрачностью Фона, чтобы подсветка изменений не пропала. Синтаксис, крипто и мутация главнее, красное «точное совпадение» радуги тоже. Эти же два цвета теперь всегда берут 🎞 GIF, 🎞 Ромбы в кино и лист ромбов — раньше там были зашиты синий «0» и светлый «1», они же стоят по умолчанию. Флажок и цвета входят в сцены и в сброс вида. Заметка для чтения картинок: на сцене «1» в цикле нулей нет вовсе, так что синие и белые символы там — это Фон и Актив пресета «Зеркалиус» (Фон синий, Актив светлый, разница — Δ), а не «0» и «1».

Code 35.61 — «вообще Сетку имел в виду». Просьба была про слой «Сетка» (кнопка в «Файле», шахматка 1010 за строками), а 35.60 сделала цвета «0» и «1» для самого текста — это остаётся, но просили другое. Теперь в «🎨 Цвете» есть строка «Сетка 0 / 1»: флажок и два цвета. Без флажка сетка, как прежде, рисуется одним цветом Фона; выбор любого из двух цветов сам ставит флажок, чтобы не искать, почему цвет не применился. Работает во всех трёх видах сетки: символами, пикселями на мелком масштабе и кольцами под радаром. В пиксельном виде раньше «0» отличался от «1» только тусклостью (30%); при своих цветах «0» не притушен — их различает цвет. Прозрачность по-прежнему от Фона. Сетка кэшируется отдельным холстом, в ключ кэша вошли оба цвета, так что смена цвета перерисовывает её сразу.

Code 35.62 — «нужна разреженность сетки +1 — через символ пробел». В «🎨 Цвете» под цветами сетки — поле «Сетка: пробелы» (0…16): сколько пробелов между символами слоя «Сетка» в строке. 0 — сплошная 1010, как было; 1 — «1 0 1 0» через пробел; 2 — через два. Оставшиеся символы по-прежнему чередуются 1 и 0, а соседние строки сдвинуты — выходит та же шахматка, только редкая (1 0 1 0 над 0 1 0 1), а не полосы из одних единиц и одних нулей: иначе цвета «0» и «1» из 35.61 потеряли бы смысл. Столбцы считаются от центра холста, так что редкая сетка едет вместе с перетаскиванием и не «дрожит». Сделано во всех трёх видах: символами, пикселями (пробел — прозрачная клетка) и кольцами под радаром — там число мест на кольце теперь кратно 2·шаг, чтобы на стыке не было шва. Поле входит в сцены и в сброс вида.

Code 35.63 — «клик на заголовок — перезагрузка». Заголовок «Zerkalius Code NN.NN» в левой панели теперь кнопка: щелчок перезагружает страницу, как F5. Ничего не теряется: снимок SESSION (текст, вид, счёт Аниматрицы) пишется сам при уходе со страницы. У заголовка появились id="appTitle", курсор-рука и подсказка; маркер версии в правилах (CLAUDE.md) поправлен — теперь это <h3 id="appTitle" …>Zerkalius Code NN.NN</h3>, а не голый <h3>.

Code 35.64 — «фигура в пустотах своих почему-то задаёт фон». Причина не в сетке: пустоты фигуры — это настоящие «0» текста. Генератор фрактала пишет «0» во все пустые клетки внутри треугольника, а «Обрезать фон» режет нули только снаружи, до первой и после последней «1» строки. Эти «0» рисуются тускло, цветом Фона, и ложились прямо на символы слоя «Сетка» — два слоя сливались в штриховку, и пустоты выглядели как свой, другой фон. Теперь при включённой сетке каждый символ текста сначала закрывает свою клетку чёрным: сетка видна только там, где у текста пробел. Сделано для обычного вида; под радаром сетка кольцами и символы стоят не по одной решётке, там закрытия нет.

Code 35.65 — «какие-то квадратные чёрные за символами». Закрытие сетки из 35.64 убрано, вид снова как в 35.63. Почему не вышло: сетка и текст стоят не на одной решётке. Во время игры текст плавно едет (скольжение 35.38) и почти всё время сдвинут на долю строки относительно сетки, а по горизонтали строка чётной длины сдвинута на полсимвола. Чёрный прямоугольник идёт за текстом и режет символы сетки пополам — отсюда чёрные квадраты с огрызками. А когда кегль выше межстрочного, прямоугольник следующей строки срезал и низ уже нарисованных символов. Урок: закрывать сетку клетками можно только если она стоит на той же решётке, что и текст; иначе это делается формой самого символа или правкой текста.

Code 35.66 — «нули должны быть в фигурах; просто клади сверху биты фигуры, а сетка всегда на заднем плане, а как это будет выглядеть, я подберу цветом 1 и 0 сетки». И пример: белая сетка — чёрные биты фигуры видны все; «0» сетки чёрный, на него лёг белый — виден только белый. Сделано так: клетка, где стоит символ фигуры, целиком принадлежит фигуре — символа сетки в ней нет, формы не смешиваются, а что видно, решают цвета. Порядок кадра при включённой сетке: холст прозрачный → текст (и полосы периодов) → сетка режимом destination-over, то есть под уже нарисованное, без занятых клеток → чёрный фон тоже под всё. Решётка сетки встаёт на решётку текста: по x от начала строк (строка чётной длины раньше была сдвинута на полсимвола — отсюда и огрызки в 35.64), по y от тех же строк; пока строки скользят, закрыта ближайшая клетка. Скрытые символы (прозрачность 0) клетку не занимают — там видна сетка. На мелком шрифте (больше 6000 клеток на экране) сетка не пишется заново каждый кадр: берётся готовая из кэша, на копии вырезаются клетки фигуры. Под радаром и в 3D-вращении — как было: сетка под текстом без вырезания.

Code 35.67 — «не понял, что это, вот что с нулями делает» (скриншот: строка «0 / 1» с чёрным «0» и белым «1»). Это строка 35.60 — цвета битов самой фигуры, не сетки. Чёрный «0» фигуры на чёрном фоне не виден, а клетку у сетки (35.66) всё равно занимает — на месте нулей фигуры в сетке чёрные дыры. Подпись была безликая «0 / 1», теперь «Фигура 0 / 1», а цвета шахматки — строка «Сетка 0 / 1» под ней; в подсказке сказано, чьи это цвета и что будет с чёрным «0».

Code 35.68 — «1 у своего цвета и 0 также». Два квадрата цвета стояли в конце строки после подписи «0 / 1», и было не понять, который из них чей. Теперь строки называются просто «Фигура» и «Сетка», а перед каждым квадратом своя цифра: «0 ■ 1 ■».

Code 35.69 — «тут стрелок не хватает, ползункам всем — стрелки» (скриншот плеера: Кадр и Скорость без ◂ ▸). Стрелки раздавались только ползункам внутри левой и правой панели (.controls). Плеер и любой раздел, вынутый на плавающее окно, к моменту раздачи лежат прямо в body — им стрелок не доставалось. Теперь ◂ ▸ получает каждый ползунок страницы; удержание стрелки, как и прежде, повторяет шаг.

Code 35.70 — «и цвет фона надо вообще», и по ходу — «проверь все последние правки сам в браузере» (четвёртое разовое исключение). Первой строкой палитры «🎨 Цвета» встал «Фон холста» — цвет под текстом и сеткой, был всегда чёрный; прежняя строка «Фон» (цвет неизменившихся символов) переименована в «Статика», чтобы два «фона» не путались. Проверка нашла две ошибки, обе исправлены здесь же. Первая: флажок «Фигура 0 / 1» (35.60) молча не работал, пока включён «Цвет как код», а он включён в стартовом виде — синтаксис был главнее. Теперь цвета битов главнее синтаксиса (крипто и мутация — по-прежнему главнее них). Вторая: слой «Сетка» не переживал F5 — теперь он в снимке SESSION и в ★-сцене. Проверено в браузере на фигуре «Правило 90» (50 строк, нули внутри): сетка встаёт на решётку текста клетка в клетку, в клетках фигуры её нет, нули фигуры на месте; разреженность 1 — «1 0 1 0» шахматкой; цвета сетки 0 / 1 и фигуры 0 / 1 (жёлтые «1», синие «0») применяются; фон холста — и с сеткой, и без (пиксель угла 32,48,64 при #203040); радар с сеткой и воспроизведение — без ошибок в консоли; буквы в ромбах рисуются; стрелка ◂ ▸ у множителя скорости шагает и обновляет подпись; щелчок по заголовку перезагружает, после чего текст, галки, разреженность и сетка на месте. 35.69 и 35.70 ушли одним коммитом. Способ проверки (встроенная панель через локальный сервер) записан в правила.

Code 35.71 — «разреженность и по строкам тоже» — «сетки». Строка «Сетка реже» в «🎨 Цвете»: ↔ — пробелы между символами в строке (как было в 35.62), ↕ — новое поле, пустые строки между строками сетки (1 — через строку, до 16). Оставшиеся символы по-прежнему чередуются 1 и 0 шахматкой: номер символа в строке и номер строки считаются по оставшимся, так что ↔1 ↕1 даёт «1 0 1 0» над пустой строкой над «0 1 0 1». Сделано во всех видах сетки: символами (и из кэша, и под фигурой), пикселями на мелком масштабе (пустая строка прозрачна) и кольцами под радаром — там «строка» это кольцо, пропускается каждое кольцо, кроме каждого (↕+1)-го. Поле входит в сцены, в F5 и в сброс вида. В браузере не смотрел (разрешение было разовым); узор для ↔/↕ = 0/0, 1/1, 0/1, 2/1 сверен расчётом в node.

Code 35.72 — «когда на 1 сетки ложится такого же цвета 0, почему видно только 0? Должно же быть месиво». Я в 35.66 понял «клади сверху биты фигуры, сетка на заднем плане, а как будет выглядеть — подберу цветом» как «клетка фигуры целиком её» и вырезал сетку под фигурой. Пользователь имел в виду простое наложение слоёв. Теперь по умолчанию так: сетка позади, на той же решётке, что и текст (это из 35.66 осталось — символы совпадают клетка в клетку), биты фигуры сверху, и в общей клетке символы накладываются: одного цвета «0» на «1» — месиво из обоих, чёрный «0» сетки под белым битом — виден только белый. Прежнее поведение — по галке «Сетку под битами фигуры не рисовать» под цветами сетки. Урок: «сверху / на заднем плане» у пользователя — это порядок слоёв, а не вырезание; решают цвета.

Code 35.73 — «нужно нарезать ромбы и сложить в гиф или видео» (на снимках: сетка шаг 64, «каждый 2-й»). Кнопка «🎞 Ромбы в кино» уже резала ромбы, но по проходам снимала только верхний ромб и строго через проход, а шаг «каждый N-й» брал лишь 🎞 GIF всего текста. Теперь фильмы по проходам берут шаг оттуда же, и есть третий фильм — «все ромбы по проходам»: разобранный лист (ромбы на своих местах с зазорами, как в PNG «все ромбы одной картинкой»), кадр за кадром, пока весь текст не вернётся к первому кадру; предел — 256 кадров или ~200 МБ кадров в памяти. Волна гонится на копии, холст и счёт циклов не трогаются. Формат — GIF своим кодировщиком: видео (WebM) потребовало бы проигрывать кадры в реальном времени, а GIF собирается сразу и открывается где угодно. В браузере не смотрел — проверяет пользователь.

Code 35.74 — «нужна кнопка, которая все соберёт ромбы-кадры, разного размера, по всему циклу в свои гифы». Кнопка «📦 Все ромбы цикла — по GIF на размер» под «🎞 Ромбы в кино»: волна гонится на копии текста, пока весь текст не повторится (до 4096 проходов), после каждого прохода текст режется на ромбы 8, 16, 32, 64, 128, 256 — на каждый размер свой GIF. В GIF идут только РАЗНЫЕ ромбы, в порядке первого появления: без отбора ромбы 8 на тексте в 256 строк дали бы десятки тысяч кадров, а так выходит «алфавит» ромбов цикла (как у 🔤 Букв в ромбах, но по всему циклу и без склейки зеркальных). Сравниваются по тому, что видно: пробел / «0» / прочее. Предел 1500 кадров на GIF, в строке состояния — сколько разных из скольких. Файлы качаются по очереди.

Треугольник v0.001–v0.002 — «делаем отдельный html для такого треугольника, чтобы там было всё из того, что есть в этом файле, для начала» и следом «проверь, чтобы 1024 строки норм ходили». Новая страница Zerkalius-treugolnik.html (в хабе — Черновики → Triangle) — копия Code 35.74 целиком, дальше живёт сама. Память СВОЯ (ключи ztri_*): иначе две страницы затирали бы друг другу текст, сцены и вид; при первом запуске она берёт то, что лежит у Code, но ключи Code только читает. Сброс вида пишет пустое значение, а не удаляет ключ — иначе после сброса снова подхватился бы вид Code. 1024 строки, разобрано по коду (в браузере не мерил): шаг волны меняет одну строку, а страница пересчитывала все 1024 по 2047 символов и рисовала кадр — и так на каждый шаг, помноженный на множитель скорости. Теперь пересчитываются 2–3 затронутые строки, кадр и подпись — раз за тик; «целыми циклами» пересчитывает всё один раз после всех проходов. Следствие: «мутация» растёт только у строк, которые реально менялись. Символ мельче 4 px рисуется прямоугольником (fillText на сотни тысяч символов — главная цена кадра). Буквы в ромбах пересчитываются раз за проход, а не на каждом шаге. У 🎞 GIF — предел ~200 МБ кадров (на 1024 строках кадр ~2 МБ). Сетка «авто» знает ромб 512. 📦 Все ромбы цикла (и в Code 35.75) идёт кусками по 60 мс с ходом в строке состояния, повторное нажатие — стоп: на 1024 строках цикл ~1500 проходов по ~6 млн клеток ромбов, одним куском страница замирала бы на минуту. Размеры — до 512.

Треугольник v0.003–v0.005 — «Missing catch or finally after try», затем «проверь сам» (шестое разовое исключение). v0.003: мой комментарий // в строке сброса вида стоял ПЕРЕД «} catch (e) {}» и съел его — страница не запускалась вовсе. Замеры в Chrome на тексте 1024 строки × 2047 (конус, случайные 0/1 — худший случай), плоский вид: v0.004 — символ мельче 4 px пишется точкой в буфер пикселей и выводится одной картинкой: кадр при кегле 1 (весь треугольник на экране) 600 → 80 мс, при кегле 3 188 → 32 мс. Прямоугольники из v0.002 не помогли: цену давали смены заливки и строки цвета на каждый из миллиона символов, а не сам fillText. v0.005 — флаги Δ и мутации в typed arrays, сравнение по кодам символов: полный пересчёт 223 → 92 мс; шаг волны без склейки строки по символу: 100 шагов 60 → 27 мс. Итог на тик плеера: кегль 3 — 26 мс (множитель 1) и 49 мс (множитель 100), кегль 1 — 72 и 103 мс, «целыми циклами» — 173 мс при кегле 3. Шаг волны с выборочным пересчётом (v0.002) против прежнего полного — примерно в 370 раз дешевле. Осталось дорогим: ◇ сетка шаг 8 на кегле 1 (+50 мс — полмиллиона отрезков) и 🔤 буквы в ромбах (+60 мс на отрисовку букв). Кнопки со скачиванием (📦, 🎞) в этот раз не нажимались.

Треугольник v0.006 — «это вообще удалим» (кнопка 🛰️ радара), «подробнее по кадрам: сколько ромбов, какие на каких кадрах — перенеси сюда отображение, сводку», «отдельное окно для захвата выбранного ромба» и «подробное описание с примером, как считается Аниматрица и строится начальный Серпинский». Радар снят: обе кнопки спрятаны, а сцены, снимок F5 и стартовый вид его больше не включают. Три новых окна-раздела (вкладки сверху, таскаются, как все): «◇ Сводка ромбов» — текущий кадр (сколько ромбов, разных рисунков, букв, симметричных; буквы на своих местах), «▶ По кадрам — весь цикл» — таблицы по кадрам и по формам с рисунком и проходами, где форма есть, и 💾 .txt; «🔍 Ромб крупно» — 🎯 или Alt+щелчок по треугольнику, ромб живьём, на холсте белой рамкой, такие же — голубым, зеркальные — розовым, лента его разных состояний на границах проходов, GIF и PNG; «📖 Как считается» — правило 90 таблицей, пример на 4 строки (генератор, обрезка, пять проходов волны — проход 4 = Серпинский, проход 5 = проход 1), почему ромбы. Перепись ромбов теперь одна на всех (сводка, окно ромба, 🔤 буквы): числовой отпечаток вместо строк, прописная — та из зеркальной пары, чья строка символов меньше, как в 35.59. В цикле буквы — по первому появлению, в кадре — по частоте; это сказано в самом окне. Проверено в Chrome: правило 90 на 64 строки, ромб 16 — на проходе 5 21 ромб, 15 рисунков, 9 букв; цикл — период 64 с прохода 33 (разгон 28), 518 форм за цикл; Alt+щелчок берёт ромб и не трогает паузу. Поправка к собственному тексту: «нули исчезают на первом проходе» верно только для примера на 4 строки.

Треугольник v0.007 — «нужна кнопка закреп: первая строка всегда на самом верху при любом изменении масштаба». 🔝 — на месте убранного радара (и двойник над плеером). Разовая ⤒ в плеере ставила начало вверх один раз и останавливала игру; закреп держит всегда: пока он включён, отрисовка сама берёт позицию с первой строки и кладёт верх окна строк к верхнему краю холста — при любом кегле, интервале, во время игры и волны. Строк на экране — не больше, чем в тексте (иначе снизу по кругу снова шло бы начало); скольжение и сдвиг перетаскиванием по вертикали при закрепе не действуют. Помнится в снимке F5. Проверено в Chrome: кегль 3, 9, 20 посреди проходов волны — вверху строка 0, в 3–9 px от края.

Треугольник v0.008 — «по аналогии с ромбами вычислить и выделить эти треугольники — они до основания идут вниз; хотя это те же ромбы, просто общая грань их». Галка «◭ Треугольники-копии» в «👁 Вид». В чистой фазе проход — накопленный XOR по столбцу (умножение на треугольную матрицу единиц P), а в P^k клетка (i, j) равна C(k−1+i−j, i−j) mod 2 — единица ровно при (i−j) & (k−1) = 0 (Лукас). Значит, кадр через k проходов от начала цикла — XOR копий кадра начала цикла, сдвинутых вниз на все d с d & (k−1) = 0, и каждая копия видна треугольником: вершина на оси в строке d, стороны под 45° до основания. Рисуются V-линии от строки d вниз, цвет — по старшему разряду d, сумма разрядов — пунктиром, у вершины число d; «авто» оставляет не больше 24 копий (кратные 2, 4, 8…), можно выбрать «все» или «кратные N». Та же строка — в ◇ Сводке и в «📖 Как считается». k берётся по модулю периода. Проверено в Chrome расчётом по всем кадрам цикла: правило 90, 64 строки (период 64 с прохода 33) — 520 128 клеток, 100 строк (период 128 с прохода 65) — 2 552 700 клеток, расхождений 0; в цикле один символ «1». На 256 строках, k = 96 (k−1 = 01011111): копии 32, 128, 160 — линии легли на видимые грани узора.

Треугольник v0.009 — «по умолчанию для новых браузеров так открывай, и плеер» (снимок экрана). Раскладка без памяти: слева Файл, Звук, Формы, Слои; справа Движение, Логика, Вид, Цвет; окнами — ◇ Сводка ромбов сверху справа, 🔍 Ромб крупно под ней, плеер под треугольником правее центра; «📖 Как считается» спрятано. Первый запуск — не исходник с радаром, как в Code, а сам треугольник: правило 90, сид 1, 50 строк, фон обрезан; 1 мс на шаг, масштаб 11px, Аниматрица и 🔝 закреп включены. Подхватка памяти Code (текст, снимок F5, раскладка, вкладки) снята: в браузере, где открывали Code, иначе вместо треугольника встал бы исходник Code; сцены по-прежнему берутся у Code, пока своих нет. Проверено в Chrome на адресе 127.0.0.1 (своя пустая память, как у нового браузера) — вид совпал со снимком.

Треугольник v0.010 — снимок пользователя: зелёные треугольники у основания, которых ромбы не покрывают, и красные «песочные часы» между ромбами; затем «эти ромбы ещё и отражать от горизонтали, нижний на верх, например XOR». «Единица разбора» в «👁 Вид»: ◇ ромбы, ▲▼ треугольники (ромб, разрезанный горизонтальной диагональю; полосы высотой S/2 режут треугольник без остатка, в полосе n — n+1 ▲ и n ▼; ▲ последней полосы — края у основания без пары) и ⧗ часы (▼ над ▲ вершиной к вершине, там, где сходятся два ромба). Единица действует на сетку (горизонтали через S/2), 🔤 буквы, ◇ Сводку (с прогоном цикла) и 🔍 Крупно (щелчок берёт фигуру нужного вида). Движок переписан на общую геометрию фигур, вид подмешан в отпечаток. Сводка для ▲▼ считает, повторяют ли ▲ у основания рисунки ▲ выше. ⊕ Отражение: нижняя половина переворачивается через горизонталь на верхнюю и складывается правилом волны (верх главнее) — картинка в 🔍 Крупно и счёт «симметричны сверху вниз» в сводке. Проверено в Chrome: 50 строк, S = 32 — ▲▼ 9 фигур (6 ▲, 3 ▼, три ▲ у основания), одни часы в строке 32; щелчки попадают в нужные фигуры; XOR ромба сверен ручным расчётом (17 = 17). 64 строки, S = 16, весь цикл: симметричные сверху вниз — только на проходах 120–130 (часы — одни на всех 11, ромб — один на 4 из них), в 53 кадрах из 64 нет ни одной.

Треугольник v0.011 — «я всё понял, это пирамида», «вершина — центр часов». Единица «◆ пирамиды»: смотрим сверху, вершина — узел решётки (центр часов), рёбра — диагонали сетки, основание — квадрат 2h+1 × 2h+1 клеток вокруг узла; грани — ▼ и ▲ часов и половинки ромбов слева и справа остриём к вершине. Соседние пирамиды перекрываются: половинка ромба — грань двух пирамид. На сетке — вертикали (стороны квадратов), буква — на вершине, щелчок берёт пирамиду с ближайшей вершиной; в 🔍 Крупно — рёбра на картинке и четыре грани, повёрнутые к верху (обход кругом); в сводке — сколько пирамид с 4 одинаковыми гранями, с двумя парами, в среднем разных граней. Поправка к v0.010: пустые фигуры (одни пробелы — дыры в узоре) одинаковы и симметричны без смысла, теперь они считаются отдельно — прежние «симметричные на проходах 120–130» на 64 строках были именно такими. Итог расчётом по всему циклу (правило 90): у непустых пирамид 4 одинаковые грани — 0 при ромбах 16 и 32 (64 и 128 строк), 6 из 52 634 при ромбе 8; две пары — 2 из 951, 3 из 1902, 12 из 11 419; у 95–99% все четыре грани разные. Симметрия кадра живёт между пирамидами (лево ↔ право), а не внутри них. Грани сверены прямым чтением клеток.

Треугольник v0.012 — «да» на объёмный вид пирамид. Окно «🗻 3D»: пирамиды с вершинами в узлах одной чётности (решётка А — вершины в строках 0, S, 2S…, вершина текста — вершина пирамиды; Б — со сдвигом на полшага) ложатся основаниями встык, без перекрытия, и кадр становится полем пирамид; можно смотреть и одну пирамиду, выбранную в «🔍 Крупно». Проекция грани на землю — ровно тот кусок текста, что виден сверху, поэтому узор натягивается на грань точным аффинным отображением (drawImage под setTransform с обрезкой по треугольнику), без библиотек. Невидимые грани отбрасываются, остальные — от дальних к ближним, освещение по нормали; мышь — поворот, колесо — масштаб, ползунок высоты, автовращение, «⊙ сверху». Картинка живая: текстура (1 клетка = 1 пиксель) обновляется за волной не чаще 5 раз в секунду. Проверено в Chrome: «⊙ сверху» на 128 строках совпал с текстом клетка в клетку (1880 из 1880); 1024 строки — ромб 32: 1155 пирамид, кадр 61 мс; ромб 16: 4355 пирамид, 181 мс; текстура 19 мс.

Треугольник v0.013 — «делать»: пирамида и её отражение под основанием — октаэдр, знак Zerkalius. В «🗻 3D» галка «⧫ зеркало (октаэдры)»: под каждой пирамидой — такая же вершиной вниз, её грани несут ту же картину (проекция та же — это и есть отражение через основание), биты — по режиму: 0 ↔ 1, как нижняя половина в «Октаэдре»; пусто ↔ символ (дополнение узора, только внутри треугольника — иначе поле за краями стало бы сплошь «1»); без инверсии. Камера опускается под основание («⊖ снизу»), свет снизу отражён. Проверено в Chrome: 128 строк, ромб 32 — сверху клетки «1» светлые (голубых 0), снизу все 226 — голубые (биты перевёрнуты); при взгляде снизу видны ровно 140 нижних граней (35 октаэдров × 4).

Исследование v0.021 — «3»: точная формула разгона. Столбцы независимы, клетка видит только клетки выше — у каждой клетки своё время жизни нуля τ, не зависящее от числа строк ниже. Посчитано для всех клеток до 1024 строк и прямым прогоном до повтора: начало цикла = max τ + 1 (расхождений 0). max τ растёт скачками на строках 3·2^(k−1)+1 (4, 7, 13, 25, 49, 97, 193, 385, 769), рекордсмен — пара клеток с отступом ±2^(k−1), τ = 2^k. Формула: цикл с прохода 2^m + 1, где 2^m — наибольшая степень двойки ≤ 2(N−2)/3 (N ≤ 4 — проход 1); проверена для всех N от 2 до 1024. Отсюда поправка: «разгон = P/2 + 1» (раздел 9, v0.005, и мой раздел 11) верно только в верхней четверти каждого удвоения (N от 3·2^(m−2)+2 до 2^m); при 65…97 строках цикл идёт с 33-го, а не с 65-го. Прежние прогоны (50, 64, 100, 128, 200, 256, 512, 1000, 1024) все случайно попали в верхние четверти. Вывод «почему именно так» открыт: первая догадка (сплошная лесенка 1 0 1 0 по Лукасу над рекордсменом) расчётом опровергнута. Карта τ для 128 строк — razgon-tau-128.png; скрипты — archive\_issledovanie-treugolnik-1024\.

Исследование v0.022 — «дальше»: рекордсмен выведен. Столбец с отступом a = 2^(k−1): под краем «1» ровно 2a − 1 нулей подряд (на чётной глубине 2i при 0 < i < a C(a+2i, i) чётно — перенос младшего разряда, Куммер), на глубине 2a — «1» (C(3a, a) нечётно), на 2a + 1 — «0», рекордсмен. Первый проход заливает нули в блок из 2a единиц, а «1» под блоком гаснет в пробел — щит над нулём. Дальше блок — чистый XOR: щит после k проходов равен C(2a+k, k) − 1 (хоккейная клюшка) и непуст ровно при k & 2a ≠ 0, первый раз — при k = 2a. Ноль живёт 2^k проходов и гибнет на проходе 2^k + 1. Сверено расчётом для k = 1…9 по всем трём шагам. Открыта только верхняя граница (что никто не живёт дольше) — проверена сплошным расчётом до 1024 строк. Урок: догадка v0.021 («лесенка 1 0 1 0») была неверна — трасса столбца проход за проходом показала сплошные нули.

Треугольник v0.014–v0.015 — пользователь прислал выгрузку сводки (50 строк, ромб 8, проход 143) — «объясни на примере»; в выгрузке номер формы слипался с числом («#541» = форма #54, 1 раз) — теперь «#54×1», «Б×3». Затем «поиск по словарю на сочетания слов», «можно свитчер использовать» (E:\GD\_Swtchr). В Swtchr словаря нет — есть частоты троек букв, собранные из русских строк Windows; тем же путём собран словарь: словоформы из System32 u-RU\*.mui (и SysWOW64), с убранным «&» ускорителей меню (иначе «Сохр&анить» даёт обрывки «тва», «зра»), без сокращений (слова, чаще стоящие с точкой: «нед.», «авт.»), без слов без гласных, короткие — только частые; плюс короткие слова Swtchr и ~490 частых простых слов вручную — 21 770 словоформ, файл _js/slovar-ru.js (грузится по требованию, работает и с диска). Окно «🔎 Слова»: строки букв — ряды, стороны треугольника (у ромбов), по желанию справа налево; ищутся слова по словарю, сочетания (словарные слова встык) и «почти слова» по тройкам Swtchr (порог — 30-й процентиль похожести самих словарных слов); щелчок подсвечивает фигуры на холсте. Из двух букв — только настоящие (да, не, на, по…). Проверено: 50 строк, ромб 8, проход 143 — ваза, два, ели, жал, кем, «два·за»; за цикл — ещё вниз, окон, еда, ива, хор, где, мед, жил, дно, око, мак, сом… Буквы — имена форм по частоте, так что находки — совпадения, как слово в номерном знаке.

Треугольник v0.016 — «значит ищем картинки-фильмы» → «бегущие формы» и «фильм одного места». Окно «🎞 Фильмы» прогоняет цикл на копии: у каждого места — его фильм (период — через сколько проходов место повторяется — и число разных кадров), щелчок выбирает место в «🔍 Крупно» (лента, 🎞 GIF); ходы — тот же рисунок на следующем проходе в соседнем месте, цепочки «качели» и «бег», щелчок — GIF окрестности. Итог расчёта: бега нет и быть не может — волна пересчитывает каждый столбец сам по себе, вбок рисунку сдвинуться нечем. 128 строк, ромб 16, весь цикл: рисунок остаётся на месте 427 раз, переезжает по-настоящему (ушёл со своего места и появился рядом) — 2 раза, цепочек нет. Первая прикидка в Python насчитала «качели» по 5 кадров, но засчитывала и случаи, когда рядом просто стоял близнец того же рисунка, — окно считает строже. Фильмы мест: 27 мест с периодом 32, 42 — 64, 36 — 128; внутри периода все кадры разные; короче всех — верхние ромбы (раздел 4).

Треугольник v0.017 + Октаэдр v0.042 — «связь с „Октаэдром“: открыть выбранную пирамиду прямо там, большим знаком». В «🔍 Крупно» кнопка «◆ Октаэдр»: грань пирамиды — h+1 рядов, и в тексте правила 90 значимы клетки одной чётности (прочие — нули-прокладки), так что на грани в ряду r от вершины ровно r+1 клеток — треугольник Паскаля, как грань «Октаэдра»; бит — «1» → 1, прочее → 0. Грани — восточная, южная, западная, северная (обход по часовой, как слоты октаэдра, повёрнутого на 45°), в ряду — слева направо для смотрящего снаружи (у «Октаэдра» k = 0 у левого угла, проверено по обходу вершин грани). Передача — адресом …#treug=R.БИТЫ: «Октаэдр» v0.042 берёт картину как «свои биты» при основании 4, снимает Серпинского и чистит адрес, чтобы F5 не затёр правок. Низ октаэдра — как всегда, та же картина инвертированная. Проверено в Chrome: 64 строки, ромб 16, пирамида с вершиной в строке 32 — «Октаэдр» открылся с 9 рядами, основанием 4, все 180 бит совпали, адрес очищен.

Треугольник v0.018 — «октаэдры по циклу: GIF или запись того, как поле „дышит“ за весь период». В «🗻 3D» кнопки «🎞 GIF цикла» и «⏺ Видео цикла»: волна гонится на копии текста (шаг — «каждый N-й» у 🎞 GIF Аниматрицы), каждый кадр — то же 3D, что в окне, с подписью прохода, пока весь текст не вернётся к первому кадру (не больше 512); при «вращать» за цикл — ровно один оборот. У 3D с освещением сотни оттенков, а кодировщик GIF знал до 8 цветов — теперь до 256 (8 бит; прежние GIF с 4–5 цветами не меняются), кадр квантуется в куб 6×6×6. Видео — WebM с холста (MediaRecorder, кадр по requestFrame), в полных цветах. Проверено в Chrome: 64 строки, ромб 16 — GIF 64 кадра, 426 КБ, 1,1 с, открывается; 16 строк, ромб 8 — WebM 16 кадров, 194 КБ, 400×340.

Исследование v0.023 + Треугольник v0.019 — «что мы знаем о протеканиях 1 или 0 этих слоёв с вершины вниз» (скриншот 🗻 3D, стрелка от вершины поперёк полос). Раздел 13 «Протекание» и абзац в «📖 Как считается». Течь идёт только вниз по столбцу, за один проход — хоть через весь столбец (верх уже пересчитан). «0» течёт только в разгоне: в цикле нулей нет ни у одного N, а начало цикла = гибель последнего нуля — это уже стояло в разделе 12, в ответе пользователю я сперва назвал это новой находкой, в разделе сказано честно. Новое: верхняя «1» столбца вечна (родник), одна «1» после k проходов на глубине d ⇔ d & (k−1) = 0 — отсюда слои 2^m на проходах 2^m + 1; ось треугольника — чистый родник на проходе p (128 строк, проходы 1…255, клетка в клетку). Прочие столбцы — родник плюс копии; чистых родников со сдвигом фазы у 64 строк 34 отступа из 64. Картинка rodnik-128.png — глубина × проход.

Треугольник v0.020 — «режим отображения, где вместо 1 и 0 квадраты цветом отличить» и следом «а режим с ромбами вместо квадратов». В «Цвете» под строкой «Фигура» — «Биты: 1 0 знаками / ■ квадраты / ◆ ромбы». Квадрат — вся клетка текста (ширина символа × интервал), ромб — вписанный в неё; цвета — «0» и «1» строки «Фигура» (в этих режимах всегда, иначе квадраты были бы одного цвета), яркость полная, «Скрыть статику» работает как прежде. Фигуры копятся в Path2D по цвету и заливаются разом — две заливки на кадр вместо тысяч fillText; при кегле меньше 4 px — прямо в буфер пикселей, в кольцевой раскладке фигура повёрнута вдоль кольца. Режим помнят сцены. GIF и прочие выгрузки рисуют по-прежнему своим способом. Chrome в этот момент был отключён — проверен только разбор скрипта, картинку смотрит пользователь.

Треугольник v0.021 — «тут настройку, чтобы видео с панелями запись» (скриншот кнопки ⏺). Правый щелчок по ⏺ — меню «Что писать: только холст / вкладку целиком, с панелями»; выбор помнится (ztri_rec_mode), в режиме вкладки на кнопке значок ▣. Панели — не холст, captureStream их не видит, а рисовать DOM в холст самим — тяжело и неточно. Поэтому вкладка пишется захватом экрана браузера (getDisplayMedia, preferCurrentTab): Chrome один раз спрашивает «Поделиться этой вкладкой», его кнопка «Закрыть доступ» тоже останавливает и сохраняет запись. Хранилище кусков, имя файла, защита от закрытия — те же, что у записи холста (общий хвост begin). Во время записи вкладки кнопка не мигает и счётчик REC не показывается — оба попали бы в кадр. Звук — звук вкладки, если отмечен в окне Chrome, иначе трек визуализатора. Chrome отключён — проверен только разбор скрипта.

Code 35.76 + общий _js/recorder.js — «да» на «перенести в Code и в общий модуль записи». Code получил ту же правку, что Треугольник v0.021 (своя память выбора — zcode_rec_mode). Общий recorder.js — у всех страниц с круглой ⏺ в правом нижнем углу (Genezis, Genezis WebGL, GPU, Grid, Kubits, Lively, Октаэдр): правый щелчок — «что писать», выбор один на все эти страницы (zerk_rec_mode), значок ▣, запись вкладки через getDisplayMedia; остановка — ⏺, R или «Закрыть доступ» в Chrome. У модуля нет подписи ?v= в подключениях — чтобы правка приехала, может понадобиться Ctrl+F5. Проверен разбор скриптов, в браузере — пользователь.

Результаты v0.001 (новая страница rezultaty/) + Хаб v0.031 + Треугольник v0.022 + Исследование v0.024 — «это в методичку, может и в хаб? все результаты — очень интересное получилось», затем «надо отдельной, не в ресёрч — это же как бы результаты» и «нечто, что можно готовым смотреть». Витрина: вверху весь цикл 1024 строк одной анимацией (новая, cikl-1024.gif: каждый 4-й проход, 256 кадров, густота единиц в квадрате 4×4) и шесть главных законов строкой; дальше карточки — «все ромбы цикла» 1024 строк по семи размерам (первые 300 разных рисунков каждого, с числом разных за цикл), цикл и законы, ромбы изнутри, зеркало, другие правила — у каждой ссылка на свой раздел «Исследования». Картинки «Исследования» не копируются, берутся из его папки. Полные GIF по 1500 рисунков (3–21 МБ, вместе 65 МБ) на сайт не пошли: публичный репозиторий и так несёт 190 МБ старого видео. MP4 пробовали — на кадрах, где каждый — новый рисунок, видео тяжелее GIF (512: 62 МБ против 21). В хабе — третья главная кнопка Results под Triangle; в «📖 Как считается» Треугольника и в подзаголовке «Исследования» — ссылки на витрину; hub-link.js знает папку rezultaty.

Исследование v0.018 — «проверим и с заполненными нулями, без обрезки фигуры, 90 начнём». Правило 90, 50 строк без «Обрезать фон»: разгон 32, период 64, но единиц в цикле 1…50 и все в центральном столбце, а нули живут; с обрезкой — наоборот. Разгадка: волна переписывает клетку только по клетке того же столбца строкой выше — столбцы независимы. Где встречаются «0» и «1», остаётся верхний, и метка самой верхней непустой клетки столбца (строка 0 не переписывается) заливает весь столбец; к циклу каждый столбец однометочный, а в однометочном столбце волна — чистый XOR по наличию символа. Отсюда два закрытых вопроса: период всегда степень двойки при любых нулях (метки едут на узоре XOR), и нули живут ровно в столбцах, чья верхняя непустая клетка — «0» (с обрезкой верх — край треугольника, там «1»; сиды 101, 1101, 10011 оставляют «0» в строке 0). Сверено на 13 прогонах из 13 (правила 90, 18, 150, 30, 110, разные сиды, с обрезкой и без). Полосы во всю ширину на скриншоте — фон из «0», он однометочен сразу и мигает периодами строк. Открыто: точная формула разгона P/2 и P/2 + 1.

Треугольник v0.023 — «а если вместо XOR Аниматрицу AND», «какие ещё есть лог. операции, которые не обнулятся», «да». Под галкой Аниматрицы — выбор операции волны: XOR (прежний), XNOR, NAND, NOR, AND, OR. Прежде чем делать, перебрали все 16 операций от двух бит на столбце 128 строк (столбцы независимы, см. исследование v0.018): цикл 128 дают только XOR и XNOR — только у них по верхней клетке и новой нижней однозначно восстанавливается старая, то есть проход обратим. NAND и NOR не обнуляются сразу — разгон до 127 проходов, потом мигание с периодом 2. AND и OR замирают после первого прохода: строка становится AND (OR) всех строк над ней, а повтор ничего не меняет; на сцене «1» AND оставит один центральный столбец. Правило волны было переписано в девяти местах (сама волна, GIF, ромбы в кино, окна ромба и поля) — теперь все берут клетку из одной функции waveCell(). XNOR, NAND и NOR из двух пробелов делают символ; пишут «1», поэтому фон вокруг треугольника зажигается. Смена операции обнуляет счёт циклов (старые отпечатки к новой операции не относятся), текст не трогает. Выбор входит в сцену и переживает F5. «Зеркало через центр» и Эхо остались на XOR — это не волна.

Layers v1.628 — «в текущих строках — там тоже треугольник — найти все ромбы-треугольники по размерам, записать и сортировать по размерам, и отдельно все, с наложениями, строка за строкой, бит за битом», уточнение: «там нет Аниматрицы, просто статику». В «Строках» рядом с «🧮 Лин. сложностью» — ◇ Ромбы: сетка, ◇ Все внахлёст и поле «до» (размер, 0 — все). Ищутся ▲ (вершина сверху), ▼ (вершина снизу) и ◇ (▲ размера s и ▼ размера s−1 под ним) всех размеров от 2 — так, как стоят на экране: начало строки берётся тем же расчётом, что у XOR по столбцам (выравнивание, «½», зеркала), наклон стороны — полсимвола на строку на «½», символ на остальных. Фигура есть, только если все её клетки — биты. «Сетка» — жадно сверху вниз, слева направо, без наложений внутри вида и размера; на треугольнике Паскаля это ровно регулярная нарезка (проверено рассуждением: следующая ▲ того же размера встаёт не раньше, чем через s бит). «Все» — каждое положение. Отчёт — файл .txt: сводка по размерам, у каждого вида и размера разные рисунки по частоте и все места (строка : бит). Потолки — 120 млн прочитанных клеток и 40 млн символов отчёта, иначе на треугольнике в 128 строк «все без ограничения» — это около 300 млн клеток; отсюда и поле «до», по умолчанию 16. Данные не трогаются.

Общий формат фигур _js/figury.js + Layers v1.629 + Треугольник v0.024 — «нужно потом сравнить и найти одинаковые с найденными в Аниматрице, форматы надо подготовить». Обе страницы пишут фигуры одной таблицей .tsv через новый общий модуль (ZFIG): одна строка на разный рисунок — вид (▲ ▼ ◇ ⧗ ◆), шаг решётки, строк, клеток, рисунок (строки через «/», клетки 0, 1 и «.» — пусто), ключ без зеркала (меньший из рисунка и его отражения), подрешётки «чёт»/«нечёт», сколько, где. Главная трудность — решётки разные: Треугольник рисует правило 90 на ПОЛНОЙ сетке (шаг 2: строка на два символа шире), Паскаль там лежит в клетках одной чётности, а волна Аниматрицы перемешивает обе; Layers на «½» хранит только клетки Паскаля (шаг 1: строка на бит шире). Поэтому у фигур шага 2 пишутся обе подрешётки отдельными столбцами, уже в виде шага 1: подрешётка вершины («чёт») у ◇ высотой S — это ромб Паскаля со стороной S/2 + 1, вторая — на размер меньше. Фигура Layers на «½» сравнивается с этими столбцами, на обычных выравниваниях — с рисунком напрямую. В Layers рядом с «до» — выбор «отчёт .txt / таблица .tsv», «до» по умолчанию 17 (ромбы и ▲ Треугольника высотой 32). В ◇ Сводке Треугольника — «📐 .tsv»: прогнан цикл — все формы цикла (зеркальные близнецы у него уже слиты), нет — фигуры текущего кадра. В модуле есть и чтение таблицы (ZFIG.parse) — под будущее сравнение.

Треугольник v0.025 — «надо кнопку сохр все формы — которая запустит и дождётся всех циклов и сохранит». В ◇ Сводке — 📐 Весь цикл → .tsv: тот же прогон, что у ▶ (копия текста, кусками, до повтора или 4096 проходов), а когда цикл замкнётся, таблица всех форм скачивается сама. Повторное нажатие во время прогона — стоп, и тогда таблица не пишется, чтобы не принять обрывок за весь цикл. Вид и размер фигур — выбранные в окне.

Проверка 2026-09-25 (по слову пользователя «проверь, запусти и сохрани 256 Аниматрицу, все размеры»): Правило 90, сид «1», 256 строк × 513, XOR. Ромбы S = 8…128 и ▲▼ S = 8…256 — все 11 прогонов замкнулись одинаково: повтор с прохода 129, период 256, кадров 385 (разгон P/2 + 1, как в исследовании). Разных форм: ромбы 22479 / 13501 / 5831 / 2250 / 610, ▲▼ 21204 / 21474 / 9951 / 4112 / 1453 / 321; таблицы — 120 МБ. Две находки: браузер пропускает с одной страницы только ПЕРВОЕ из автоматических скачиваний подряд (остальные молча глотает — таблицы пришлось принимать локальным приёмником), и в скрытой вкладке прогон почти стоит: setTimeout(…, 0) там идёт раз в секунду.

Треугольник v0.026 — «да» на «кнопку: все размеры → один файл». В ◇ Сводке — 📐 Все размеры → .tsv и выбор видов (◇ и ▲▼ / все 4 / выбранный): для каждого вида и каждого размера из списка, что помещается в текст, — тот же прогон цикла, в конце ОДНО скачивание: шапка ZFIG со сводкой прогонов и блоки «# --- вид, S = …» (ZFIG.parse их пропускает), в «где» — вид и S. Стоп — повторным нажатием, файл тогда не пишется; ▶ и «Весь цикл» на время прогона не перебивают его. Куски прогона цикла теперь идут через MessageChannel, а не setTimeout, — в скрытой вкладке он больше не стоит.

Проверка Layers v1.629 (по слову пользователя «прогони в Layers 256 Серпинский для теста»): 🔺 Серпинский на 256 строк, «Центр ½», «до» 17. Сетка — 0,6 с, 2627 разных рисунков; все внахлёст — около 4 с, 14240 разных, отчёт .txt упёрся в потолок 40 млн символов (сводка полная). Счёт сверен с формулами: ▲ размера 2 в сетке — 8256 (полосы по 2 строки, 1 + 2 + … + 128), ▲ всех положений размеров 2…17 — C(257,3) − C(241,3) = 492200. Формат сверен с Треугольником: все 6 рисунков ромбов кадра 0 Аниматрицы (сам Серпинский, подрешётка «чёт») при S = 8, 16, 32 нашлись среди ◇ Layers «все» сторонами 5, 9, 17. В «сетке» Layers — не все (при S = 32 два из шести): жадная укладка ромбов ложится не в те узлы, что у ромбической сетки Треугольника (строки через S/2). Память localhost после проверки возвращена из копии.

Layers v1.630 — «пройдись по всем панелям, наведи порядок в кнопках по минимуму — минимум текста, две кнопки на строку, максимум утоньши, сгруппируй по функциям, проверь на дубли, вкладку Новое распусти». Все панели (Шаги, Поиск, Маски, Лог находок, Вид, Строки, Выделить, Построения, Сквозная, Перенос) пересобраны одним приёмом: разделы .psec с маленьким заголовком и сеткой в две колонки, кнопка с полем — строкой .pr на обе колонки. Кнопки 15 px (было 17), шрифт 11 px, промежутки 2 px; подписи — по два-три слова, не влезло — многоточие; полный смысл остался в подсказках, их не трогали. Короче стали и подписи, которые код ставит на ходу («↕ Переписать», «🖱 Выдел: нет», «⇔◀ Рев+Инв», «🎭 Маска: вкл», «⛔ Выше отсечки: нет», «📌 Фикс: 0», «⬆ Кусок вверх»…). Id у всех кнопок прежние — обработчики и сохранённая раскладка их находят; элементы переносил скрипт по id, с проверкой, что ни один не потерян. Цветовые строки «Вида», ползунки, подсветки, режимы фон-поиска и ряд ручек «Переноса» перенесены целиком — у них своя вёрстка. Вкладка «Новое» (дубли-пульты v1.542) распущена: все её кнопки и так на своих панелях. Дубли сняты с панелей в скрытый #retiredBtns (живы, чтобы код их находил): «⇔ Зеркало: круг» (= «◀/▶ Зеркало»), «Инв» (= «⇔◀/⇔▶»), «= Цвет» (= «✕ Новые» во «Виде»), «🎭 По маске» из «Поиска» (= её копия в «Масках»). Одинаковые подписи у разного — разведены: «⤓ Вписать» зеркала и «⤓ В строку» у GF(2). Прежняя разметка со всеми её комментариями — в архиве v1629.

Layers v1.631 — «окно для поиска кнопок». Новая вкладка 🔎 (окно «🔎 Кнопки», гуляет, как все: док, выпадающее меню, холст, отдельное окно) и Ctrl+K — открыть его с курсором в строке. Ищет по всем панелям: подпись кнопки или галки, её подсказка и имя панели, слова в любом порядке, без регистра и ё; совпавшие в подписи — выше. Щелчок по найденному — показать: панель раскрывается (или поднимается её окно), кнопка мигает жёлтой рамкой; «▶» — нажать сразу. Enter — показать первую, Ctrl+Enter — нажать. Список собирается заново на каждый ввод — подписи переключателей меняются на ходу, панели ездят. Скрытые дубли (#retiredBtns) в поиск не попадают. Нужно стало после v1.630: подписи короткие, и «где та кнопка» проще спросить словом из подсказки. Ctrl+F не занят нарочно — он остаётся браузеру.

Layers v1.632 — «Крест удалить из Layers, он есть в Зазеркалье — достаточно; также ядро децимации, карту осей» (из списка «что только для справки» пользователь выбрал пункт 1). Сняты: окно 🪞 Крест (в Zazerkalius — «🪞 Зеркало»), кнопки 🧬 Ядро, 🪞 Карта осей и её пара 🪞 Оси сквозной со списком обхода (в Zazerkalius — «🧬 Лента: оси и ядро» и «Указатели симметрии»). Код остался: всё подвешено через проверку «есть ли кнопка» и без неё молчит, Карта осей в кэш не пишется — включённой после перезагрузки не окажется. Остальное из списка (▽ Спуск, ⇋ Поправка, 🧮 Лин. сложность, GF(2), балансы и номера) — не трогали. И вторая просьба, по снимку меню цепочек: «сюда перемести сохранение ромбов». ◇ Ромбы: сетка, ◇ Внахлёст, поле «до» и формат (.txt / .tsv) переехали из «Строк» в подвал списка цепочек (▾ у имени), над настройками вида. Список перерисовывается целиком, поэтому значения «до» и формата держат переменные rhDdMax/rhDdFmt. Поиск 🔎 теперь находит и кнопки этого подвала — щелчок раскрывает список.

Layers v1.633 — «там по меню подсказки врут». У ◇ Ромбов в меню цепочек подсказки были перенесены из «Строк» как есть: «отчёт скачивается .txt» (формат теперь выбирается) и «поле справа» (оно ниже) — переписаны под новое место, с указанием на страницу «Сравнение». И шире: после v1.630 подсказки по всем панелям ссылались на кнопки старыми именами («⬆ Достроить вверх», «▭ Выбор ячеек», «✕ Снять столбец», «🧩 Паттерн-цепочка»…). Скрипт сверил подписи v1629 с нынешними и заменил старые имена в «ёлочках» — только в том, что видит человек: подсказки (title, TIPS) и сообщения в коде; комментарии в коде не трогал, это история. Около шестидесяти замен. Поле маски подписано «🎭 Прореж.» — так на него и ссылаются подсказки (прежнее «🎭 Маска» совпало бы с кнопкой маски в «Строках»). Попутно исправлены три подсказки, вравшие ещё до этого: «🔗 Сквозная 🐍 →/←» и «⧅/⧄ Зигзаг» — в «Поиске» эти режимы зовутся «ЗмейПрав/ЗмейЛев» и «ЗигПрав/ЗигЛев».

Сравнение v0.002 + Layers v1.634 + Треугольник v0.028 + _js/figury.js (картина) — «тут бы ещё показать статистику по отдельности для каждого, не обязательно оба файла загружать, и в них показать целый и его части, желательно интерактив — не Аниматрицу, а только если статика». У каждого набора — своя сводка сразу после загрузки: вид × высота, клеток, разных рисунков, встреч, самый частый. В формат добавлен необязательный блок «картина» (строки «#»: шаг, первая строка и «#| a биты» — где строка начинается в полустолбцах); старое чтение его пропускает, формат остался v1. Пишут его Layers (◇ Ромбы → .tsv — цепочка) и Треугольник (📐 .tsv текущего кадра); у цикла Аниматрицы картины нет — кадров много. Если картина есть, страница рисует её целиком, а ниже — части: вид и высота, рисунки по частоте маленькими картинками; щелчок по рисунку зажигает на картине все его места (поиск по самой картине, так что годится любой рисунок, и с зеркалом), щелчок по картине берёт фигуру выбранного вида с вершиной в этой клетке. Щелчок по строке сравнения зажигает фигуру на обеих картинах (у совпавших подрешёткой — целую фигуру своего набора). Подпись модуля у всех трёх страниц — ?v=2, иначе браузер отдал бы старый figury.js без картины.

Треугольник v0.030 + Layers v1.635 + Сравнение v0.003 + _js/figury.js (?v=3) — «надо как-то сгруппировать — непонятно ничего, что как, и знать, что скачаю; отдельные кнопки, не зависящие от текущего прогона: По циклу · Участки (ромб) · Все размеры — чтобы так писала итоговая кнопка; и Всё», и следом «ещё надо открывать сразу в окне для просмотра». В ◇ Сводке Треугольника две группы. «Смотреть»: ▶ Цикл по кадрам — на экран, 💾 Отчёт .txt. «Скачать таблицу .tsv»: три выбора — откуда (цикл / кадр), участки (◇ ромбы, ▲▼, ⧗, ◆, все виды), размер (все / этот) — и итоговая кнопка, которая сама пишет, что скачает: «📐 Скачать: Цикл · Ромбы · Все размеры»; рядом «📐 Всё: цикл · все виды · все размеры». Прогон каждый раз свой, на копии текста — открытый «▶ Цикл по кадрам» на результат больше не влияет (раньше «📐 .tsv» молча брал его, если он был). Кадр пишется с картиной, несколько размеров — одним файлом. Сняты «📐 .tsv», «📐 Весь цикл → .tsv» и «📐 Все размеры → .tsv» с выбором видов — их всё это покрывает. Галка «👁 сразу открыть в «Сравнении»» (и такая же 👁 у ◇ Ромбов в меню цепочек Layers, для .tsv): окно «Сравнения» открывается в момент щелчка — после долгого прогона браузер счёл бы его всплывающим и не пустил, — а таблица приезжает туда сообщением, когда готова (ZFIG.sendToViewer шлёт, пока страница не ответит; первая — в набор А, дальше — в Б). Пока делалось, Треугольник дважды уходил вперёд в соседней сессии (v0.027, v0.029) — номера взяты из файла.

Треугольник v0.031 + Layers v1.636 + Сравнение v0.004 + _js/figury.js (?v=4) — по снимку («⏹ Стоп», идёт прогон, а окно «Сравнения» уже открыто пустым): «пусть страницу потом откроет». Галка «👁» теперь только отметка: окно открывает ZFIG.save, когда таблица готова (ZFIG.showInViewer). Уже открытое окно «Сравнения» получает её сразу. Иначе страница пробует открыть окно сама — у быстрой выгрузки это ещё тот же щелчок, и браузер пускает; после долгого прогона цикла браузер такое окно обычно блокирует как всплывающее, и тогда в правом нижнем углу появляется плашка «Готово: … — 👁 Открыть в «Сравнении»» — её щелчок уже настоящий. Файл скачивается в любом случае.

Layers v1.637 — «Сравнение показывает 0 разных рисунков, шаг решётки 2», «пусть не смотрит вообще выделение, по всем делает» и «подсказка врёт». ◇ Ромбы (сетка и внахлёст, .txt и .tsv) берут теперь ВСЮ цепочку: раньше при одной выделенной строке диапазон был «от первой строки до неё», и выделенная строка 1 давала таблицу из двух строк — почти пустую. Если фигур ноль, а выравнивание не «½» (шаг решётки 2), сообщение подсказывает включить «Центр ½»: строки, растущие на бит, как у Паскаля, стоят со сдвигом в полсимвола, и на целых столбцах их биты друг под другом не сходятся. Над «◇ Внахлёст» и другими строками меню цепочек всплывало «Переключить вкладку цепочки»: title стоял на обёртке меню, а подсказки ищут ближайший элемент с title вверх по разметке — всё без своей подсказки брало её. Title переехал на саму кнопку «Цепочка ⌄».

Хаб v0.035 + Битмультфильмы v0.004 — «сделай стрелки от Треуг — к Результатам, переименуй Битмультфильмы». Между двумя главными кнопками хаба — три дорожки во всю ширину кнопки, по ним вниз бегут шевроны, цвет переливается вместе с кнопками (при «меньше движения» в системе стоят на месте). Кнопка «Results / Результаты» теперь «Bit Cartoons / Битмультфильмы», так же названа и сама страница rezultaty/ (заголовок окна и шапка). Папка и адрес прежние, ссылки не ломаются.

Треугольник v0.032 + Исследование v0.025 — следом за переименованием: ссылки на витрину подписаны «Битмультфильмы» (в Треугольнике — ещё и строка состояния «Заготовка из «Битмультфильмов»» после перехода по ссылке с заготовкой).

Хаб v0.036 — по снимку, где стрелки стояли: «оживи вниз-вверх, пусть дёргаются». Стояли они из-за «меньше движения» (на Windows Server включено по умолчанию, см. v0.028) — теперь оно стрелки не останавливает. Плавный бег вниз заменён рывками: пара шевронов прыгает вниз и отскакивает вверх с короткими замираниями, у каждой из трёх дорожек свой темп.

Битмультфильмы v0.005 — по снимку просмотра «Ромбы 64»: «там кнопки вперёд-назад, плей-пауза» и «в центр экрана». В полосе просмотра GIF — «◀ назад», «⏸ пауза / ▶ плей», «вперёд ▶», ползунок и номер кадра; пробел, ← и → — то же с клавиатуры. GIF браузер на паузу не ставит и кадров не отдаёт, поэтому страница читает файл сама и раскладывает на кадры своим разбором GIF (палитры, прозрачность, чересстрочность, снос кадра), показывая их на холсте. Все кадры в памяти не держатся (у ромба 512 — ~330 МБ): снимок каждого 25-го, шаг назад собирается от ближайшего. Сверено со встроенным разбором Chromium на всех 17 GIF страницы — кадры совпадают до пикселя, и после шагов назад тоже. С диска (file://) браузер файл читать не даёт — там GIF просто крутится, без кнопок. Картинка (любая, не только GIF) стоит в центре экрана; крупная (×4) не срезается, а прокручивается.

Треугольник v0.033 — по снимку окна «🗻 3D»: «это в новом окне — возможность открывать». В шапке каждого раздела — ⧉: раздел переезжает в отдельное окно браузера живым (как «🗗 Панели в окно» в Layers) — ручки работают, рисует по-прежнему страница Треугольника; окно можно унести на другой монитор. 🗻 3D там растягивает холст на всё окно (дома — прежние 400×340). Вернуть — ↩ в шапке или закрыть окно: раздел встаёт туда, где был (в раскладку пишется это место, а не окно). Вкладка раздела, пока он в своём окне, поднимает окно, а не прячет раздел; ✕ возвращает и прячет. Место и размер окна у каждого раздела запоминаются; уходит страница — окна закрываются с ней. Проверено на сайте и с диска.

Сравнение v0.005 — «пусть сверху картинка и потом ниже таблица». В каждом наборе теперь сначала картина с выбором частей и рисунками, под ней — сводная таблица (вид × высота). Раньше таблица стояла первой, и до картины надо было листать.

Сравнение v0.006 — «пусть подгонит масштаб, если не влезает в окно картинка, и колёсиком мыши изменять масштаб там» и «создать гифы на каждый размер для фигур всех в один файл, можно рар или несколько»; следом — «нет, по порядку». Картина, которая не влезает в ширину набора или в 75% высоты окна, вписывается сама; колесо над ней — крупнее / мельче вокруг курсора, рядом — масштаб в процентах и «⤢ вписать». Щелчки по картине и подсветка мест масштаб учитывают. «🎞 GIF по размерам (.zip)» у каждого набора — по GIF на каждый вид и высоту (как строки сводки): кадры — все разные рисунки группы по порядку появления, как в файле, с подписью «◇ 5 стр. · 3/22 · ×53 · стр 1 бит 0»; скорость — 0,2…1,5 с на кадр. Все GIF и spisok.txt — одним .zip без сжатия: RAR браузер писать не умеет, .zip открывают и WinRAR, и Windows. GIF пишет тот же кодировщик, что в Треугольнике. Проверено на цепочке 200 строк: 33 GIF, каждый читается, кадров столько же, сколько в списке.

Layers v1.638 + Сравнение v0.007 + _js/figury.js (?v=5) + Треугольник v0.034 (только подпись модуля) — «так гиф должна все кадры поочерёдно, а она просто взяла индивидуальные?» и по снимку меню цепочек: «тут нет мест? надо, чтобы там два вида выгрузки было — только индивидуальные, и все поочерёдно»; «по умолчанию так сделай, как на скриншоте». У ◇ Ромбов в меню цепочки три формата: «отчёт .txt», «таблица .tsv — разные» (строка на разный рисунок, как было) и «таблица .tsv — все места по порядку» — строка на каждое место фигуры, сверху вниз и слева направо; «сколько» — всего раз у рисунка, «где» — это место. Шапка такой таблицы несёт строку «# порядок: все места» (ZFIG.PLACES), parse() отдаёт places. Умолчания подвала — «до 256», «таблица .tsv — разные», 👁 включена. «Сравнение» такую таблицу для сводки и сравнения сводит к разным рисункам (сводки двух видов одной цепочки совпадают), а «🎞 GIF по размерам» при «все места по порядку» даёт кадр на каждое место: «◇ 3 стр. · место 1/190 · рис. 1/2 ×91 · стр 1 бит 0»; у таблицы «разные» мест нет — там кадры по разным рисункам, о чём сказано в spisok.txt. Кодировщик GIF пишет кадр за кадром и порциями по ~40 мс (мест бывают десятки тысяч; предел — 20 000 кадров на GIF), таблица LZW помечается поколением вместо очистки на каждый кадр. Проверено на цепочке 40 строк: 169 разных, 1125 мест — сумма «сколько» у «разных» та же, у каждого рисунка мест ровно «сколько»; 15 GIF, 1125 кадров, все читаются.

Layers v1.639 — «светлый фон нужен, вкл/выкл». Во вкладке «Вид», рядом с «💬 Подсказки», — ☀ Светлый фон. Интерфейс Layers тёмный насквозь: сотни цветов прописаны прямо в правилах, и наборы цветов полотна тоже тёмные, — поэтому не вторая палитра, а переворот яркости у всей страницы (invert + hue-rotate 180°): тёмное становится светлым, оттенки остаются — красная «1» остаётся красной, только темнее, белая становится чёрной, серый «0» — светло-серым, фон полотна — белым. Картинки переворачиваются обратно. Окна панелей (Панели, Маски, Результат, Черновик, Лог находок) светлеют вместе со страницей, новые открываются уже светлыми. Выбор хранится с настройками вида, сброс настроек возвращает тёмный. Проверено: закреплённые на экране элементы стоят на своих местах, после перезагрузки режим сохраняется.

Layers v1.640 — по снимку группы «Круг»: «Полуоборот — у этой кнопки должна быть как галка, запоминать последнее нажатие (как Круг)… Инв переименуй в ИнвКруг… если несколько строк выделено — нижняя выделенная делает полуоборот, а верхние — этот же её полуоборот своей длины, то есть больше сделают: строка в 2 раза уже сделает полный оборот» и «в другую сторону также». «◄ Инв / ► Инв» теперь «◄ ИнвКруг / ► ИнвКруг». Полуоборот — две кнопки, ◄ Полуоборот и ► Полуоборот, и запоминаются, как ◄/►Круг: подсвечена последняя, «🚀 Авто» повторяет полуобороты этой стороны. Правило: k — длина нижней выделенной строки, каждая выделенная делает k тактов ИнвКруга в свою сторону (у строки длины L это k mod 2L тактов): нижняя встаёт изнанкой, как раньше; на бит короче — изнанка и сдвиг на бит; вдвое короче — полный оборот, строка дома. Прыжок считается сразу, вместе с пометками «перевёрнут» и «новый». «Авто» перебирает до повтора набора: у строки 2L / НОД(k, 2L) прыжков, у набора — НОК (для 4/6/7/8 — 42). Проверено: на 120 случайных наборах разной длины, в обе стороны, прыжок совпадает с k честными тактами ИнвКруга — биты, флаги и пометки; «Авто» останавливается на полном цикле, строки возвращаются домой.

Layers v1.641 — «нужно такой же полуоборот для Круг сделать». Под «◄/► Круг» — ◄ ½ Круг / ► ½ Круг: полный оборот обычного Круга — L сдвигов, половина — L/2, поэтому k = половина длины нижней выделенной строки (у нечётной — с округлением вниз), и каждая выделенная строка сдвигается на k mod L бит без инверсии: вдвое короче нижней — полный оборот, стоит на месте. Прежний полуоборот, чтобы не путать, подписан ◄ ½ ИнвКруг / ► ½ ИнвКруг и стоит под «ИнвКругом». Оба запоминаются, как Круг, «Авто» повторяет их до повтора набора: у ½ Круга строка возвращается через L / НОД(k, L) прыжков. У одной строки нечётной длины два полуоборота — L−1 сдвиг, о чём и говорит сообщение. Проверено на 240 случайных наборах: ½ Круг и ½ ИнвКруг, в обе стороны, совпадают с k честными тактами — биты, флаги, пометки.

Layers v1.642 — по снимку группы «Круг»: «сделай им отдельную кнопку Шаг и Авто — которые при находке продолжают нажимать, а Шаг — это вручную». Внизу группы — ▶ Шаг (один раз нажимает запомненную, подсвеченную кнопку Круга: ◄/► Круг, ½ Круг, ИнвКруг, ½ ИнвКруг) и 🚀 Авто — тот же прогон, что у общей «🚀 Авто», но находка его не останавливает даже при включённом «🛑 Стоп»: захватывается как обычно, и прогон крутит дальше — до конца цикла вариантов или до повторного нажатия (на кнопке тогда «⏹ Стоп»). Итог прогона теперь говорит, сколько было находок, а не «совпадений не найдено». Проверено с подставной находкой на каждом пятом ходу: общая «Авто» встаёт на ходе 5 из 84, «Авто» Круга проходит все 84 (17 находок).

Layers v1.643 — «почему не включил следующую строку, нашёл же её паттерн» (у пользователя был выключен «🧲 Захват», но при разборе нашлась и настоящая ошибка). Число вариантов прогон считал один раз на старте, по исходному выделению (у строк 1–2 — 2 хода), и после захвата вставал на этом старом пределе, будто всё перебрано, — следующая строка не успевала найтись. Било по «🚀 Авто» Круга (оно на находке не стоит) и по общей «🚀 Авто» без «🛑 Стоп». Теперь, если захват поменял набор строк, цикл вариантов пересчитывается для нового набора и идёт заново с текущего положения. Проверено на шаблоне с «🧲 Захватом»: прежде «► Круг» вставал на «2 из 2» со строками 1–4, теперь выделение растёт дальше (за 8 с — до 1–22, ½ ИнвКруг — до 1–26). С «⏩ Турбо» тоже: за 6 с 6370 ходов против 485 без него, захват идёт, повторное нажатие останавливает.

Layers v1.644 — «но при Шаге должен работать автозахват, а при Круге он безразличен; Авто — сделай просто дублем старой версии» и «перемести поближе к Авто, третьей в ряду» (по снимку «🧲 Захват»). ▶ Шаг группы «Круг» нажимает запомненную кнопку Круга и захватывает находку, даже если «🧲 Захват» выключен (на время нажатия захват включается и сразу возвращается как был); сами кнопки Круга захватывают по галке, как всегда. 🚀 Авто группы «Круг» — теперь ровно общая «🚀 Авто»: тот же обработчик, при «🛑 Стоп» встаёт на находке; особый режим «не стоять на находке» из v1.642 снят. Галка 🧲 Захват переехала из «Поиска» (группа «Совпадение») в группу «Круг», третьей в ряд: «▶ Шаг · 🚀 Авто · 🧲 Захват». Проверено при выключенном захвате: «► Круг» выделение не трогает, «▶ Шаг» добавляет найденную строку, галка после него остаётся выключенной.

Layers v1.645 — «сейчас при находке не сбрасывает накрученные строки — надо кнопку: если вкл, то сбрасывает» (выбран вариант «вернуть биты»), «и счётчик пересчитать, потому что всё по новой», и по снимку «↺ Сброс» рядом с «🚀 Авто»: «последнее нажатие запоминать для Авто — то есть я про эту». Кнопка в разделе «Ход» рядом с «🚀 Авто» теперь ↺ Сброс при находке — переключатель (подсвечена — включено, запоминается с настройками); сброс цепочки к шаблону остался «↺ Сбросом» верхнего меню, копией которого она была. Если включено и находка захватывает строку, все уже накрученные строки (и та, что окно выбросит сверху) возвращаются к виду до начала кручения — биты, флаги «перевёрнут», пометка «новый», — найденная добавляется, и весь набор крутится заново, счётчик вариантов с нуля. Исходный вид (rotBase) снимается перед первым сдвигом строки в серии; серия кончается при ручной смене выделения, смене режима, сбросе; номера едут вместе со строками при достройке сверху. Работает в «Авто», на кнопках Круга и в «▶ Шаг». Проверено с подставной находкой: вручную (► Круг) и в «Авто» (► ИнвКруг) со сбросом строки возвращаются к исходному виду и счёт идёт с нуля, без сброса накрутка сохраняется; состояние кнопки переживает перезагрузку.

Layers v1.646 — по снимку «Вар: 110654/1441440»: «правильно считает общее количество? для 32 строки… полуоборот… 32 бита». С нижней строкой в 32 бита такого числа у полуоборота быть не может: строка короче 32 бит возвращается через нечётную часть своей длины (прыжков), 32-битная — через 2, так что в пределе двойка стоит не выше первой степени, а 1 441 440 = 2⁵·45 045 (это ½ ИнвКруг с нижней в 17 бит). В «Авто» полуоборот считался верно, и после захватов предел пересчитывался; неверным был ручной счётчик: после нажатий «½ Круг / ½ ИнвКруг» он считал такты Круга / ИнвКруга (2·НОК длин), а не прыжки, и расходился с «Авто» в k раз (строки 29–33: 9 493 440 вместо 287 680). Теперь и вручную одно нажатие — один ход, предел — halfTurnTotal, как в «Авто». Проверено: строки 28–32 — 1/188790, 2/188790…; 9–17 (½ ИнвКруг) — 1/1441440.

Layers v1.647 — «🧲 Подтянуть… удали её», «она выключена должна быть». Галка «🧲 Подтянуть» (найденный паттерн переезжал в колонке паттернов наверх, к первому ненайденному; с «🧲 Захватом» её путали — тот про выделение строк) снята из «Поиска», а само подтягивание выключено насовсем: st.pull = false и в умолчаниях, и при чтении галок, а старое сохранённое «вкл» больше не читается. Порядок паттернов теперь не меняется от находок.

Layers v1.648 — «лог лагает, не показывает после 13-й находки, хотя они только что были» и «также туда запиши, каким инструментом — Круг, Инв… — найдено, и компактнее всё». Запись в «Лог находок» делал только render(), а «Авто» (тем более с «⏩ Турбо») за кадр делает пачку ходов и рисует один раз: из нескольких находок пачки в лог попадала лишь последняя, а с «🧲 Захватом» без «🛑 Стоп» находки идут одна за другой. Теперь прогон пишет находку сам, на своём ходу (bgFindLogHit), render() её не повторяет. У записи — инструмент (st.lastDirMode): столбец «чем» — ◄/► Круг, «и» — ИнвКруг, «½» — полуоборот, полное имя в подсказке, по нему можно сортировать. Компактнее: в «стр» и «шаг» — голые числа, строки ниже, столбцы режимов уже (4,8em вместо 6,2em). Проверено: «Авто» ► ИнвКруг с «Турбо» и захватом — 20 захватов, 20 записей в логе (раньше большая часть терялась), у каждой «►и».

Layers v1.649 — «нужен анализ: кнопка, которая так же, как Авто, будет находить, но не захватывать, пока весь цикл не пройдёт, и запишет потом для каждой строки, в каком шаге нашлась и по какому поиску». В группе «Круг» — 🔬 Анализ: тот же прогон, что у «🚀 Авто», по запомненной кнопке Круга, весь цикл вариантов, но без захвата, без «🛑 Стоп», без «⚖ Стоп при балансе» и без записи в лог по ходу. На каждом ходу запоминается, какие строки нашлись — под выделением и все ниже (для этого на время анализа включён тот же обход строк ниже, что у «🔻 Полного прохода», только с полным списком поисков на строку), — и какими поисками. В конце, или при остановке повторным нажатием («⏹ Стоп анализа»), в «Лог находок» ложится запись на каждую пару «строка — шаг» (по строкам, внутри по шагам) с поисками по столбцам и инструментом в «чем», а сообщением — сводка: сколько строк, сколько находок, первые шаги по строкам. Цикл больше 10 млн вариантов анализ не начинает. Лог держит теперь до 2000 записей (было 200) и пересобирается, только когда изменился (раньше — на каждом кадре). Проверено на шаблоне: строки 4–6, ► ИнвКруг — 120 из 120, 8 строк, 370 находок, все 370 в логе, выделение не тронуто; остановка на полпути пишет найденное к тому моменту; обычная «🚀 Авто» после анализа работает как прежде. (За «полный цикл» строки не обязаны вернуться точно домой, если включено «⊙ На «1»»: Круг тогда прыгает до единицы — так и у «Авто».)

Layers v1.650 — по снимку «Подсветок»: «сюда нужна подсветка неизменных символов при реверсе КРАСНЫМ, и кнопку не менять неизменные для Круг — ИнвКруг» (выбран вариант «запомнить на старте»). В «Подсветках» — ⇄= со своим цветом (по умолчанию красный, --crk-hl): двойник «⇄🔎 Реверс: неподвижные» — жмёт её и повторяет её состояние; красит биты, которые не изменятся при развороте строки (палиндромные позиции). В «Круге» — 📌 Не менять неизменные (переключатель, запоминается): перед первым сдвигом строки в серии снимаются её подвижные позиции (бит ≠ зеркальному), и при ◄/► Круге, ИнвКруге, ½ Круге, ½ ИнвКруге палиндромные стоят на месте весь прогон, а по кругу едут только остальные, между собой (у ИнвКруга бит, прошедший их шов, переворачивается). Серия — как у «↺ Сброса при находке». Счётчик вариантов и полуобороты считают только подвижные биты. Проверено на 200 случайных наборах: неизменные не сдвигаются, прыжок ½ совпадает с шагами, за посчитанный цикл строки возвращаются домой; пример: 1011001 — подвижны 2-й и 4-й биты, три «► Круга» меняют их местами, «Вар: 3/4».

Сравнение v0.008 — «не применилась правка?» по GIF-кадру «4/8 · ×276» (оказалось — не обновлена страница). Чтобы такое было видно сразу: если в наборе есть таблица без мест («разные»), рядом с «🎞 GIF по размерам» пишется, в каком файле мест нет и что там кадры пойдут по разным рисункам (и как выгрузить все места), — и при загрузке, и в итоге сборки.

Layers v1.651 — «также Реверс — подключи к Авто, Шагу». В группе «Круг» — ⇄ Реверс как режим Круга: нажатие разворачивает выделенные строки (ничего не выделено — все) и запоминается, как ◄/► Круг; «▶ Шаг», «🚀 Авто» и «🔬 Анализ» повторяют разворот — с поиском, захватом, логом (в «чем» — «⇄») и счётчиком. Цикл — 2 хода (второй разворот возвращает строки; если все строки палиндромы — один). Пометки «перевёрнут» и «новый» разворачиваются вместе с битами. Предел вариантов для всех режимов Круга теперь считает одна функция (shiftModeTotal) — и в «Авто», и при ручных нажатиях, и при пересчёте после захвата. Старая «⇄ Реверс» в «Строках» — как была. Заодно «🔬 Анализ» на пустом выделении говорит «крутить нечего», а не «цикл больше 10 млн». Проверено: разворот и обратно «▶ Шагом» (1/2, 2/2), «Авто» — 2 из 2 и строки дома; с захватом — 7 находок, окно со строк 5–6 доехало до 12–13; анализ — 2 из 2.

Layers v1.652 — «добавь кнопку реверс+инверс: по кругу сначала реверс, потом инверс этой строки — цикл свой для каждой строки, и также с Авто» и «это убрать, оно есть уже в Зазеркалиусе» (по снимку «GF(2)» и «Лин. сложн.»). Рядом с «⇄ Реверсом» — ⇄🔁 Реверс+Инв, режим Круга: ход по очереди — разворот, инверсия, разворот, инверсия… Очередь у каждой строки своя (revInvPhase): захваченная посреди прогона начинает со своего разворота. Цикл строки — 4 хода (s → R·s → I·R·s → I·s → s), у строки, чей разворот равен её инверсии (1100, 110100…), — 2; у набора — 4 или 2. Запоминается, работает с «▶ Шагом», «🚀 Авто», «🔬 Анализом», захватом, логом («⇄и» в «чем») и «↺ Сбросом при находке» (сброс возвращает и очередь). Раздел «Анализ» (🧮 GF(2) с выбором операции и t, «Лин. сложн.») снят — есть в Зазеркалиусе; код остался. Проверено: 1011 → 1101 → 0010 → 0100 → 1011 (1/4…4/4); строка, вошедшая посреди, — с разворота; «Авто» с захватом — 4 из 4, 3 находки; анализ — 4 из 4.

Сравнение v0.001 (новая страница sravnenie/) + Хаб v0.032 — «мне как также потом сделать» (про сравнение ромбов Layers с таблицами Аниматрицы, которое сделано было скриптом). Страница без скриптов: файлы .tsv общего формата — в «Набор А» и «Набор Б» (по нескольку), «Сравнить». Фигура сравнивается по виду и рисунку; у шага 2 — ещё и подрешётками «чёт»/«нечёт» (иначе Треугольник с Layers на «½» не сравнить); галки — зеркальные одинаковы, с подрешётками, без однотонных (фигуры из одних 0 или 1 совпадают почти всегда и заслоняют остальное). Итог — сводка по видам и высотам «совпало из», таблица совпадений (крупные первыми, на экране 500, все — в «💾 совпадения .tsv»): как совпало (целиком / чёт / нечёт), где впервые в А и в Б, у скольких форм Б. Файлы читаются в странице, никуда не отправляются. В хабе — «Compare» в «Знаке и записях»; hub-link.js знает папку sravnenie.

Хаб v0.033 — «перенеси в черновики первым» (снимок кнопки «Код»). Code больше не главная кнопка хаба: он встал первым в «🔬 Черновики», перед Genezis; остальные черновики — как были, по порядку создания. Главными остались Triangle и Results; у Triangle, теперь первой, снят верхний отступ, который был нужен под Code.

Хаб v0.034 — «Zerkalius-genezis-webgl.html: сравни с Генезисом — по-моему, это мёртвая ветка, удали, если нет ничего эксклюзивного». Сравнение подтвердило: это старая копия Genezis (v0.330 против v0.427, на ~3600 строк короче). Все 123 её id есть в Genezis. WebGL-рендер (PIXI, «⚡ WebGL-рендер») в Genezis тоже есть и развит дальше. Её «свои» функции — остатки старой раскладки (вкладки правой панели, полоса кнопок плеера) или локальные имена. «◀ Turbo / Скор ▶» — в Genezis те же ползунки с теми же id, только кнопки значками. Ключи памяти браузера те же. Страница перенесена в archive\_retired\ (на этой машине папка заведена сейчас, с описанием ЧТО-ЗДЕСЬ.txt), кнопка «WebGL Engine» снята с хаба; прежние версии страницы — в archive\Zerkalius-genezis-webgl\.

Результаты v0.002 + Треугольник v0.027 — «Zerkalius · результаты: ссылки на переход с заготовкой и нажатым плеером Аниматрицы для каждого случая разобранного». У каждой карточки «Результатов» — «▶ в Треугольнике»: открывает Треугольник с заготовкой этого случая и уже запущенной Аниматрицей (плеер — целыми циклами, как сняты картинки). Заготовка передаётся адресом: ?n=строк, r=правило (90), s=сид (1), trim=0 — без обрезки фона, rh — ромбическая сетка с этим шагом, let=1 — буквы в ромбах, bands=1 — полосы периодов, axis=1 — ось симметрии, pass=0 — плеер по шагам. Треугольник читает адрес при запуске, строит треугольник, ставит свой стартовый вид и нужные галки, пишет в строке состояния, что это заготовка, и чистит адрес. Чтобы не затереть работу пользователя, пока страница открыта по ссылке, Треугольник не пишет в память ни состояние, ни строки: F5 возвращает обычный Треугольник. В выборе шага ромбической сетки добавлены 128, 256 и 512 — под крупные ромбы цикла 1024. Карточки сопоставлены по картинке: 1024 строки — весь цикл и семь размеров ромбов; 128 — цикл, лист, полосы периодов, разгон, родник, ромбы изнутри, зеркало; правила 30, 110, 150; без обрезки фона.

Треугольник v0.029 + Результаты v0.003 — вопрос про карточку «Ромб 512 · 3 в кадре»: GIF-ы «Все ромбы цикла» собраны переписью — в кадр шёл только ромб, какого ещё не было. Так работала кнопка 📦 в Треугольнике (с 35.74) и скрипт archive\_issledovanie-treugolnik-1024\tri_cycle.py. Пользователь: «структуру не ломаем волны! так можно только для сжатия, но когда записывать GIF или ещё что — надо нумерацию-повторения учитывать, а то получим рваную волну; но, возможно, так и надо — только уникальные собрать, поэтому этот вариант оставим, но чётко различим; добавь вариант со всеми кадрами». Сделано: кнопка 📦 переименована в «Уникальные ромбы цикла», в подписи кадра — «уникальный №i/всего разных», файлы …-unikalnye-…. Рядом новая «🎞 Все ромбы цикла подряд»: каждый ромб каждого прохода в порядке волны, повторы не выбрасываются; в подписи — проход, место ромба в кадре и №рисунка из того же словаря, «новый» или «повтор (впервые — проход q)»; файлы …-podryad-…. Картинка хранится по разу на рисунок, кадр — ссылка на номер. Кадров подряд — сколько влезет в ~120 МБ на размер, не больше 3000 (крупные ромбы — сотни проходов, мелкие — меньше прохода); когда предел набран у всех размеров, волна дальше не гонится. В «Результатах» раздел переименован в «Уникальные ромбы цикла» и помечен: словарь, а не ход волны. Сами GIF не пересняты.

Треугольник v0.035 — «поправь»: строка состояния заготовки из ссылки (v0.027) писала «Аниматрица запущена», даже когда в ссылке anim=0 и галка Аниматрицы снята. Замечено при проверке кнопок ромбов цикла в браузере. Теперь текст берётся из самой галки: «Аниматрица запущена, плеер целыми циклами / по шагам» или «Аниматрица выключена».

Zazerkalius v0.038 — «проверь» (адрес страницы). Страница не запускалась с v0.037: в zz-ui.js «SyntaxError: Unexpected end of input». Причина — моя правка v0.037 («+ Столбик» становится эталоном ⚑): комментарий // встал посреди строки обработчика и закомментировал её конец — say(…) и закрывающую «};». Комментарий перенесён в конец строки, zz-ui.js проходит проверку синтаксиса. Архив v037 тоже сломан, рабочие — v036 и v038. Урок: после правки JS — node --check на каждый изменённый файл, прежде чем отдавать версию.

Zazerkalius v0.039 — там же, при проверке: окно «🧊 Вид» стояло развёрнутым, но пустым. Оно было помечено свёрнутым (collapsed), а правило v0.026 «#w-view .wbody{display:flex}» — селектор по id — перебивало общее «.win.collapsed .wbody{display:none}»: тело свёрнутого окна оставалось на экране, а рисовать в свёрнутое окно renderView отказывается. Общему правилу дан !important — свёрнутый «Вид» снова свёрнут, двойной щелчок по заголовку разворачивает. Вторая половина той же беды: при разворачивании «Вид» не перерисовывался (пока был свёрнут, отрисовку пропускал) и стоял пустым до первой правки строк — теперь «–» и двойной щелчок сразу зовут renderView.

Zazerkalius v0.040 — «🧮 Лин. сложность: при смене выделения строки вживую бы обновлять сразу результаты». Окно теперь считает само при каждой отрисовке страницы — смена текущей строки (щелчок, стрелки, выбор в «Виде»), правка, новые строки, — а также при смене «текущая строка / все строки подряд» и при разворачивании окна. Свёрнутое окно не считает (длинная лента «все строки подряд» — Берлекэмп–Мэсси, квадрат от длины). Кнопка «🧮 Найти правило» осталась — пересчитать вручную.

Zazerkalius v0.041 — «давай» на предложение: собрать операции Зазеркалиуса в одно семейство и спросить у строки её самый короткий адрес в этом мире. Новое окно «🔎 Адрес»: перебор цепочек из 11 операций — как есть, зеркало, антизеркало, инверсия, разворот, повтор, Туэ–Морс, код 1→10/0→01, 🔺 Паскаль (k шагов), ▽ спуск (край), круг. Цена честная: номер операции 4 бита, числа — кодом Элиаса γ, сдвиг круга — ⌈log₂ N⌉, длина всей строки известна (размер файла). «Как есть» = 4 + N, поэтому у случайной строки адрес на 4 бита длиннее её — плата за мир. Перебор с отсечением по цене и памятью; каждый адрес собирается обратно и сверяется. Живой пересчёт — глубина 4 и 250 мс, «🔎 Искать глубже» — 6 и до 4 с; ответ по строке запоминается, чтобы глубокий не затирался живым. Проверено перебором вне страницы: Туэ–Морс 16 → 5 бит, палиндром 16 → 16 (4 + 12), «101»×6 → 14, строка Паскаля 16 (1…0…1) → «Паскаль(повтор)» 15, случайные 64 и 200 бит → «как есть» +4; все адреса собрались обратно.

Zazerkalius v0.042 — «прогнал: на 4 длиннее строки, структуры нет — всегда; давай искать структуру другими методами», и следом: «может, исходить из номеров ряда», «длина строки и её номер, как пишутся в битах — сравнить со строкой», «и ещё длина строки с такой же по Серпинскому». Новое окно «🧪 Структура»: разные способы записать строку и честная цена каждого в битах (+4 на номер способа, «как есть» = N + 4) — счёт единиц (перекос), серии, контекст (адаптивный код Кричевского — Трофимова, лучший порядок до 16), повторы кусков (LZ), почти-зеркало / антизеркало / период / Туэ–Морс с поправками (γ(k+1) + log₂ C(n, k) — сколько ошибок и где), линейное правило, адрес из «🔎», из номера и длины строки (двоичная запись номера и длины — нулями слева, по кругу, задом наперёд, Грей, номер XOR длина; строка Серпинского той же длины; Туэ–Морс со сдвигом на номер), из соседней строки (та же, инверсия, разворот, 🔺+1, ▽, сдвиги, +1, XOR двух выше). Внизу — строка бит в бит против каждого кандидата «из номера и длины»: совпавшие тускло, несовпавшие красным. Режим «все строки подряд» добавляет построчный способ: каждая строка — из номера, из соседней или как есть. Проверено вне страницы: случайные 64 бит — «как есть» лучший; строка Серпинского 40 — 9 бит вместо 45 (из длины, точно); двоичный номер 8 бит — 9 вместо 12; строка 200 бит с 10% единиц — 106; столбик Серпинского 64 строки — 442 бита вместо 2084; столбик из случайных — ничего. Живой пересчёт укладывается в ~0,1–0,2 с.

Zazerkalius v0.043 — «за край всей нижней границы — цепление для изменения размера» (по окну «🔎 Адрес», где текст не влезал). У каждого окна вдоль всего нижнего края — полоса 7 px: тянешь — меняется высота, при наведении подсвечивается линией. Угол справа внизу остался (ширина и высота сразу). Высота запоминается, соседи ниже подстраиваются, как после угла; у свёрнутых и вынесенных в отдельное окно полосы нет.

Zazerkalius v0.044 — «проверь или объясни» по снимку «📡 Сигнала по базе»: «Прочитано строк: 71 (все)», сообщение — каша с «?», «не решено 9». Не поломка: без выделения окно читало весь столбик, и строки треугольника (не сигнал) декодировались как сигнал — «?» там, где строка одинаково далека от базы и от отступа. Теперь без выделения читается последний отправленный сигнал, если его строки на месте (с того же места и той же длины); иначе — весь столбик, но с прямым предупреждением. И строки, далёкие и от базы, и от отступа (ближе, чем запас, нет ни к чему), считаются «не похожими на сигнал» — сколько их, пишется сверху.

Zazerkalius v0.045 — по снимку «Цикла и памяти»: «это тоже живое изменение, вообще всё живым надо сделать». Живыми стали и остальные окна-расчёты: 🔁 Цикл и память, 🧮 GF(2), 🧬 Лента (оси через стык или ядро децимации — в последнем выбранном кнопкой режиме), 🔎 Орбита, ⇅ Сортировка сдвигов. Считают сами при смене текущей строки, правке строк и смене своих настроек (операция, t, режим ленты, «кусками»), если окно открыто; свёрнутое не считает, развернул — досчитает. Чтобы любое действие не гоняло все расчёты, у каждого окна ключ — от чего оно зависит (строка, номер, настройки, для ленточных — весь столбик); не изменился — не считает (так же теперь и 🧮 Лин. сложность). Тяжёлое — по кнопке: GF(2) у строк длиннее 256 бит, сортировка сдвигов длиннее 4096. Живой ⇅ не трогает поле «№ для обратного хода» — его ставит только кнопка.

Zazerkalius v0.046 — «что если каждую строку в треугольнике считать кольцевой» → «да, сделай режим кольцом». В «△ Треугольник из строки» — режим «◯ кольцом от строки (цилиндр)»: следующая строка — XOR с соседом справа по кругу (то же правило, что «x ⊕ сосед справа» в «Цикле и памяти»), все N строк одной длины. Сообщение пишет вход μ и петлю λ и строку, на которой всё умерло в ноль. Перебором всех строк: длина — степень двойки (4, 8, 16) — любая за n шагов в ноль; нечётная — через шаг чистый цикл (7 → 7, 5 → 15, 9 → 63); смешанная (6, 12) — вход 2 / 4, потом цикл. Шаг теряет 1 бит (у следующей строки единиц всегда чётно), поворот проходит сквозь весь цилиндр.

Zazerkalius v0.047 — «△ Треугольник из строки: пусть строится от выделенной, поля рядом с кнопкой удали». Поля «строка или маска» и «строк N» убраны: строится от текущей (выделенной) строки, число строк — само: 🔺 Паскаль и маской — по длине строки, но не меньше 16; ▽ спуск — до одного бита; ◯ кольцом — пока строка не повторится (μ + λ + 1, не больше 256). Остались выбор режима и «△ Построить».

Zazerkalius v0.048 — «только я о конусе имел в виду: строка 111 как ни крути — 111, а 1000 — это 0100…» → «◯ конус — да, но его нужно видом сверху, кольца расходящиеся, и чтоб крутить можно было руками каждое». Новое окно «◯ Конус»: строка k — кольцо k от центра наружу (треугольник, свёрнутый в конус), бит — дуга кольца. Тянешь по кольцу — крутится только оно, отпустил — встаёт на целый бит; щелчок — строка текущая (обведена золотом). Жёлтая черта сверху — место бита 0 неповёрнутой строки. Поворот — только вид; «⤓ в строки» записывает повороты в строки (↩). «◯ к наименьшему» ставит каждое кольцо в наименьший вид (ожерелье) — одинаковые кольца встают одинаково; одинаковые обведены одним цветом. Внизу: в сколько положений встаёт текущее кольцо (у 111 — 1, у 1010 — 2, у 1000 — 4), его наименьший вид, строки с тем же кольцом, сколько разных колец в столбике. Ожерелье — zzNecklace в zz-core.js. Рисуется до 160 колец.

Zazerkalius v0.049 — «ок, масштаб там по колесику» (в «◯ Конусе»). Колесо — масштаб ×0,3…×60 вокруг курсора (точка под курсором остаётся на месте), тянешь мимо колец или с Ctrl — сдвиг вида, двойной щелчок мимо колец — как было. Масштаб пишется внизу окна.

Zazerkalius v0.050 — по снимку номеров «18 7 · 19 8·11…»: «выровняй номера и числа неменяющих — балансов также; и надо окно, где каждой строке вживую будет сопоставляться баланс, общий баланс до текущей строки по всем; также и по числу неменяющихся с общим; и также неменяющиеся лентой до текущей». Номер строки — в своей колонке (не уже 3 знаков, по правому краю), числа у номеров — колонками: левое число по правому краю, правое по левому, разделитель посередине, цифры одной ширины (tabular-nums) — столбик ровный при любых длинах. Новое окно «⚖ Балансы»: у каждой строки — 0:1 и перевес, те же нарастающим итогом от строки 0, неподвижные при развороте · меняющиеся и их итог, и «лентой» — неподвижные у строк 0…i, выписанных подряд и развёрнутых целиком. Текущая подсвечена и видна (прокрутка к ней), сверху — её итоги словами; щелчок по строке таблицы — она текущая. Лента — до 400 строк / 200 000 бит.

Zazerkalius v0.051 — по снимку «◯ Конуса»: «конус — супер; надо ещё чётче разграничить кольца, и выделять при наведении; цвета брать из поля строк, в том числе и символов; и если меняется там — то и здесь, и если крутить тут — то там». Кольца — с зазором (биты занимают 72 % кольца) и тонкой чертой между ними. Наведённое кольцо обводится, его строка в поле подсвечивается. Цвета — те же, что у бит в поле (--b1 / --b0, неподвижные красным при включённом «неподв.»); когда дуга крупная (приблизил колесом), рисуется и сам символ 0 / 1 шрифтом поля. Фон — как у поля. Поворот кольца теперь крутит саму строку: пока тянешь, строка в поле поворачивается на каждом целом бите, отпустил — записано, ↩ вернёт весь поворот разом. Правка строк в поле — кольца меняются сразу (как и было). Кнопки «↺ как в строках» и «⤓ в строки» сняты — поворот больше не только вид; «◯ к наименьшему» поворачивает сами строки.

Zazerkalius v0.052 — «при изменении текста всё дёргается, на многих меню так же» (по снимку текста под конусом). Живые тексты окон меняют число строк — при смене строки, при наведении (в конусе строка «под мышью» то появлялась, то пропадала), — и всё под ними прыгало: холст конуса сжимался и перерисовывался, таблицы и виды ехали вверх-вниз. Теперь у каждого текста окна высота запоминается наибольшей: растёт один раз и назад не сжимается; растянул окно (угол или нижний край) — меряется заново. В конусе строка «под мышью» есть всегда («наведи на кольцо…», когда мышь не над кольцом).

Zazerkalius v0.053 — по снимку «🧊 Вида» с кольцами-плоскостями: «когда выделена плоскость — с Ctrl и ещё кнопкой — сделай, чтобы по этой плоскости перпендикулярно вставать» и «стрелки сейчас вверх-вниз перпендикулярно — пусть лево-право». Ctrl + щелчок по кольцу — его плоскость выделена, и камера сразу встаёт перпендикулярно: смотрит прямо на плоскость (с той стороны, откуда уже смотрели), «вправо» экрана — ближайшая к прежнему ось мира в этой плоскости. Кнопка ⊥ под стрелками — то же для уже выделенной плоскости (потянул за кольцо). Стрелки при выделенной плоскости: ◀ ▶ — вращают в ней (вокруг её оси), ▲ ▼ — наклон поперёк (вокруг горизонтали экрана), выделение не снимается; прежде все четыре крутили вокруг оси.

Zazerkalius v0.054 — по снимку пустой шапки: «сюда — возможность закреплять кнопки для вывода вверх панелей». В шапке — 📌 (режим закрепления) и полоса закреплённых. В режиме щелчок по любой кнопке с именем кладёт её копию в шапку (копия жмёт оригинал, в том числе в вынесенном окне), щелчок по шапке окна — кнопку окна: разворачивает, поднимает наверх стопки, прокручивает к нему и на миг обводит золотом. Правый щелчок по закреплённой — открепить; выход из режима — 📌 или Esc; в режиме кнопки и шапки окон обведены пунктиром, сами не срабатывают и не таскаются. Набор (Z.pins) запоминается.

Zazerkalius v0.055 — по снимку «◯ Конуса»: «сюда галку, включённую по умолчанию, — запрет сдвига строк; и галку включения лучей к центру от граней бит — от каждого кольца выделенного или всех сразу». «Запрет сдвига строк» (включён сразу): кольца мышью не крутятся, строки в поле не меняются — тянешь, двигается весь вид, щелчок по кольцу — выбрать строку; «◯ к наименьшему» при запрете не работает и говорит, что снять. Выбор «без лучей / лучи от текущего кольца / лучи от всех колец»: от каждой границы бит кольца — луч к центру (у текущего ярче, у всех — бледно), видно, какие биты соседних колец лежат на одном луче.

Zazerkalius v0.056 — по снимку лесенки сверху: «кнопку сохранения вида до 3 пресетов; кнопку — включает линию, соединяет концы, с подсчётом пересечений об себя же; площадь прямоугольников, площадь описанного квадрата или круга». В «🧊 Виде» — ① ② ③: пустой щелчком запоминает вид (поворот, масштаб, сдвиг), занятый щелчком возвращает, правый щелчок перезаписывает, Shift + щелчок стирает; занятые подсвечены. «⟋ концы» (для одной строки, у лесенки): золотая пунктирная хорда от начала до конца, пересечения с лесенкой — красные точки (смена стороны хорды: знак x·Z − z·X), касания — кружки. Внизу площади: под лесенкой — сумма прямоугольников «шаг 1 × нулей до него» (число пар «0 раньше 1»), над ней — X·Z минус это; между лесенкой и хордой — ∫|z(x) − Z/X·x| dx и перевес стороны; описанные прямоугольник X·Z, квадрат max(X, Z)², круг π(X² + Z²)/4. Для хорды и пересечений в drawSegs добавлен слой поверх (cam.overlay).

Zazerkalius v0.057 — по снимку «◯ Конуса»: «выделение колец золотым цветом — непонятно, какой-то раздел кольца делает, путает». Золотая обводка текущего кольца — две окружности (по внутреннему и внешнему краю) — рисовалась одним контуром, и canvas соединял их отрезком справа, на угле 0: выглядело как черта поперёк кольца. Теперь каждая окружность — своим контуром, перемычки нет.

Zazerkalius v0.058 — «разложить — свернуть все окна» и (по снимку «🔴 неподв.») «сюда же реверс-инверс». «📐 Разложить» теперь раскладывает окна по местам и сворачивает все (кроме подсказок и вынесенных) — видны одни шапки; Shift + 📐 — разложить, не сворачивая. «неподв.» — три положения по кругу: выкл → 🔴 ⇄ неподвижные при развороте (бит = зеркальному, красным) → 🟢 ⇄🔁 неподвижные при реверс-инверсии (бит ≠ зеркальному — разворот с инверсией кладёт его на то же место, зелёным) → выкл. Режим действует в поле строк, в наложении полей, в конусе и в числах у номеров.

Zazerkalius v0.059 — «в левое меню» (по снимку шрифта и размера в шапке). Выбор шрифта цифр и ползунок размера перенесены из шапки в левую панель — раздел «Шрифт» перед «Шаблонами»; в режиме значков (◂) раздел скрыт. В шапке освободилось место под 📌 закреплённые кнопки.

Zazerkalius v0.060 — по снимку кнопок шапки окна: «сюда кнопку — на всю оставшуюся половину окна после поля строк, а все остальные под ним». В шапке каждого окна — ⛶: окно встаёт наверх стола во всю его ширину и видимую высоту (всё место справа от поля строк), свёрнутое — разворачивается, окно под полем строк — возвращается на стол; остальные окна — ниже (с «⤒ К верху» их укладывает раскладка, без него — сдвигаются на высоту окна). ⛶ у такого окна — золотая; ещё раз ⛶ — прежнее место и размер.

Zazerkalius v0.061 — по снимку кнопок над полем строк: «замок на изменение строк». 🔓 / 🔒 перед «неподв.»: пока закрыт, строки не меняются ничем. Сделано в одной точке: почти каждая правка начинается со snapshot() (точки отмены) — при закрытом замке он прерывает правку до изменения особой ошибкой ZZ_LOCK, которую общий обработчик ошибок глотает молча; правка на месте и ↩ проверяют замок сами. Попытка — сообщение внизу; у поля слева золотая черта. Смотреть, выделять, копировать, крутить виды, считать окна — можно. Замок запоминается.

Zazerkalius v0.062 — по снимку текста «🧊 Вида» (сверху, хорда, площади, описанные): «всё это в табличном виде по каждой строке». Новое живое окно «📐 Лесенки — таблица»: по строке — единиц и нулей, C(n,k) (сколько лесенок в ту же точку; длинное — коротко «1,23·10^30», наведи — полностью) и его чётность по Серпинскому (нечётно ⇔ X AND Z = 0), пересечения и касания хорды концов, площади под / над лесенкой, между лесенкой и хордой и перевес стороны, описанные прямоугольник, квадрат, круг. Сверху — итоги по всем строкам; текущая подсвечена и видна; щелчок по строке таблицы — она текущая. До 400 строк в таблице.

Zazerkalius v0.063 — по снимкам «1 поле · наложением · по центру» и поля ввода строки: «это — слева от поля ввода строки, а поле сузить». Выбор числа полей, колонками / наложением (с ⊕ и кнопками осей и итога, когда наложение) и выравнивание строк перенесены из верхней полосы поля в строку ввода, левее поля; поле ввода сужено (180–340 px), строка при нехватке места переносится.

Zazerkalius v0.064 — «да» на «проверю точно или добавлю в 🧪 Структуру способ „горы Дика“» (разговор о строке 0010010011011011 — симметричной неразложимой горе). Перебором всех 65 536 строк по 16 бит: баланс 8:8 — 12 870, горы Дика — 1430 (C₈), одна гора — 429 (C₇), симметричные — 70 (C(8,4)), симметричная одна гора — 35 (C(7,3)); сказанное «в уме» число 35 подтвердилось. В «🧪 Структуре» — способ «горы Дика»: узнаёт строку-хребет (0 вверх или 1 вверх, не ниже земли, в конце на земле), вид (одна гора или несколько, симметрична ли) и цену: 3 бита + log₂ числа таких гор. Для 0010010011011011 — 3 + log₂ 35 ≈ 8,1 → 9 бит (+4 на номер способа = 13) против 20 «как есть».

Zazerkalius v0.065 — «добавь кнопки: инверсия и реверс». В «Построениях» слева — 🔁 Инверсия (0 ↔ 1) и ⇄ Реверс (задом наперёд): над выделенными строками, ничего не выделено — над текущей; выделение остаётся, ↩ вернёт, замок 🔒 их держит. Попутно в «горах Дика» — «симметричные горы» вместо «симметричная горы».

Zazerkalius v0.066 — по снимку своего шаблона «Столбик · 70 стр.»: «при клике заменять текущие, а не достраивать вниз». Свой шаблон щелчком теперь заменяет: столбик — весь столбик, строка — текущую строку (↩ вернёт; замок 🔒 держит). Shift + щелчок — как раньше, вставить под текущей. Встроенные шаблоны — как были (вставляют под текущей).

Zazerkalius v0.067 — по снимку «📐 Разложить»: «не раскрывает окна… надо ещё кнопку Свернуть». 📐 Разложить снова раскладывает окна по местам и разворачивает все (как до v0.058). Рядом — ▭ Свернуть: сворачивает все окна на своих местах (кроме подсказок и вынесенных); если все уже свёрнуты — разворачивает все.

Zazerkalius v0.068 — по снимку «◯ Конуса» (⛶ горит, окно узкое): «эта кнопка — на всю ширину, оставшуюся после поля строк, а все остальные вверх или вниз». Ошибка v0.060: соседи уезжали ниже только без «⤒ К верху»; с ним раскладка сперва ужимала окно по соседям справа, а потом, видя его узким, оставляла соседей рядом. Теперь соседи всегда сначала уходят ниже окна, потом раскладка — окно на всю ширину стола, остальные под ним. Если окно уже помечено развёрнутым, но узкое, ⛶ не возвращает его, а разворачивает как надо.

Zazerkalius v0.069 — по снимку «🔁 Инверсия»: «* только неподвижных». Рядом — «🔁* Инв неподв.»: переворачивает только неподвижные биты (по режиму «неподв.»: выкл и 🔴 — при развороте, 🟢 — при реверс-инверсии), у выделенных строк или текущей, ↩ вернёт. Заметка: инверсия неподвижных при развороте даёт ровно реверс-инверсию строки (пара «a a» → «ā ā», пара «a ā» стоит), как «Инв меняющихся» даёт разворот.

Zazerkalius v0.070 — «меню: разложить треугольник на треугольники и ромбы по размерам». Новое живое окно «△ Разложить на ▲ ▼ ◇»: треугольник (строки с длиной +1 — решётка Паскаля; выделенные, иначе весь столбик; можно и не с вершины) режется размером S на полосы по S строк: ▲ вершиной вверх (сторона S), между ними ▼ вершиной вниз (сторона S−1), ромб ◇ — ▲ и ▼ под ним; все ◇ и нижний ряд ▲ — весь треугольник. Таблица по размерам 2…64 и степеням двойки: сколько ▲, ▼, ◇ и сколько разных рисунков / форм (зеркальные — одна форма); щелчок по размеру — галерея разных фигур этого размера (◇, ▲ или ▼ — выбор вверху), самые частые первыми, «×n». Геометрия — zzTiles / zzTileCensus в zz-core.js.

Zazerkalius v0.071 — по снимку треугольника в поле: «кнопку — треугольник в 90°», «подобрать межсимвольный». Над полем — ◸ 90°: межсимвольный интервал подбирается сам — шаг символа = 2 × шаг строк (ширина цифры меряется пробой шрифтом поля, шаг строк — по настоящей строке), тогда каждая следующая строка, сдвинутая по центру на полсимвола, уходит ровно на свою высоту: стороны под 45°, угол при вершине прямой. Слева тот же отступ, чтобы центр не съезжал. Пересчитывается при каждой отрисовке (шрифт, размер); в наложении полей не действует.

Zazerkalius v0.072 — «инверсия второй половины строки». В «Построениях» — «🔁½ Инв второй половины»: биты правой половины наоборот, левая на месте, у нечётной длины средний бит тоже на месте; у выделенных строк или текущей, ↩ вернёт. Палиндром чётной длины от этого становится антипалиндромом и обратно.

Zazerkalius v0.073 — «поправь» по снимку «Построений»: правый столбец кнопок уехал за край панели — длинные подписи новых кнопок распирали сетку. Колонки теперь не шире половины (minmax(0, 1fr)), длинная подпись обрезается многоточием (целиком — в подсказке); подписи укорочены: «🔁½ Инв ½», «🔁* Неподв.».

Zazerkalius v0.074 — «нет 90» (◸ 90° горит, треугольник прежний). Проверил в браузере: строка поля (.rw) — не блок, номер и биты стоят прямо в сетке поля, и её высота 0 — шаг строк мерился нулём, интервал выходил 0. Теперь шаг строк — расстояние между битами двух соседних строк. Попутно (v0.073) укорочены три подписи слева: «🔺+1 Строка», «🔢+1 Номер», «⇅ Вокруг тек.» — теперь все кнопки «Построений» целиком в панели.

Zazerkalius v0.075 — «убери выделения текста» (снимок: полоса кнопок «◯ Конуса» залита синим выделением). Кнопки, подписи, выборы, полосы инструментов, шапки окон и панелей, холсты, заголовки таблиц больше не выделяются как текст — ни щелчками, ни перетаскиванием рядом. Тексты-итоги окон, строки и поля ввода выделяются и копируются, как прежде. Попутно (v0.074): при включении ◸ 90° поле прокручивается к середине треугольника — на 70 строках он шире 2800 px.

Zazerkalius v0.076 — по снимку «◯ Конуса»: «галку — скрыть все, кроме выделенных; выделение нескольких — по Ctrl». Ctrl + щелчок по кольцу — выделить его / снять (Ctrl + перетаскивание, как прежде, двигает вид); выделение то же, что в поле строк (щелчок по номеру, Ctrl, Shift) — выделенные кольца обведены голубым, их строки выделены в поле, и обратно: выделил номера в поле — видно в конусе. Галка «только выделенные» скрывает остальные кольца (текущее видно всегда), лучи — тоже только у видимых. Кольца остаются на своих местах.

Zazerkalius v0.077 — «текст дёргает поле» (снимок: «70 стр. · 2485 бит · текущая 13 (14 бит) · против «Столбик · 70 стр.»: изменено 1 стр.» в две строки). Строка над полем меняла длину и переносилась, полоса над полем росла и сжималась — строки прыгали. Теперь она всегда в одну строку: не влезает — многоточие, целиком — во всплывающей подсказке.

Zazerkalius v0.078 — по снимку крупного кольца «◯ Конуса»: «как-то чётче границы внутри кольца и цвета ярче — сливаются». Заливка плотнее: у единиц и неподвижных — почти сплошная (и крупно, с символами — 80 %), у нулей — заметная; символ на единице — цветом фона, жирно (контраст), на нуле — своим цветом; между битами — тёмные черты, по краям кольца — контур.

Zazerkalius v0.079 — по снимку кольца с лучами: «лучи — то есть сектора закрасить полупрозрачно до центра своими цветами, можно градиент до центра» → «только когда одна выделена или несколько, но не все». Галка «сектора к центру»: у выделенных колец (Ctrl + щелчок; ничего не выделено — у текущего) каждый бит закрашивает свой клин от кольца до центра своим цветом (единица и неподвижный — плотнее, ноль — бледнее), к центру прозрачнее; кольца рисуются поверх.

Zazerkalius v0.080 — «теперь, когда видим кольца, нужен для них другой реверс — неменяемых; всё, что через центр, как-то должно реагировать». Зеркало кольца — ось через центр: на кольце начала нет, осей n, отражение m кладёт бит j на место (m − j) mod n (обычный ⇄ строки — m = n − 1). Выбор в «◯ Конусе»: без оси / лучшая ось (больше всего неподвижных) / как у строки / вручную ◀ ▶ (на полбита) / через центр 180° (пары диаметрально напротив). Для выделенных колец (или текущего): ось — золотой пунктирный диаметр, неподвижные при этом отражении — красным (при 180° — зелёным), пары бит через ось соединены хордами: золотом равные, серым разные. Внизу — неподвижных сколько и сколько даёт лучшая ось («кольцо зеркально само себе», если все). «⇄ по оси» — отразить строки по их оси (реверс кольца), при 180° — повернуть на полкруга; ↩ вернёт.

Zazerkalius v0.081 — наблюдение пользователя: «центр сектора бита через ось кольца выходит либо ровно между битов (01, 10, 11, 00), либо на какой-то бит» — так и есть: при чётной длине напротив бита бит, при нечётной (n = 2k + 1) — ровно граница между битами j+k и j+k+1; в конусе кольца чередуются. «Конечно!» — режим «через центр 180°» теперь работает и на нечётных кольцах: от центра каждого бита — прямая через центр в границу напротив, бит красится по паре напротив: зелёный — совпал с обоими, золотой — с одним, красный — ни с одним; внизу счёт трёх видов.

Zazerkalius v0.082 — «похоже, нужно будет поднять этот конус в высоту ещё, чтобы всё это разглядеть — нити, лучи». В «◯ Конусе» — галка «3D» и ползунок «высота» (0…4): кольцо i стоит на своей высоте, вершина сверху; камера — поворот вокруг оси конуса и наклон (90° — вид сверху, 0° — сбоку). Рисуется по глубине: сектора к центру своего кольца, биты дугами (те же цвета и неподвижные, что в плоском), потом нити — ось конуса, оси зеркал колец, хорды, лучи к центрам колец. Тянешь — вращать, Ctrl — сдвиг, колесо — масштаб, двойной щелчок — вид по умолчанию. Крутить кольца и выделять щелчком — в плоском виде.

Zazerkalius v0.083 — «похоже, луч, проходящий между битов, надо продолжать во внешнее кольцо!». В режиме «через центр 180°» у нечётного кольца луч от бита через центр, дойдя до границы напротив, продолжается пунктиром наружу — в следующее кольцо, и там точка цветом бита, в который попал (единица / ноль; фиолетовая — если снова ровно в границу). И в плоском виде, и в 3D (нить вниз, к внешнему кольцу). Внизу — сколько лучей ушло в единицы, в нули, в границы и сколько попало в такой же бит, как исходный.

Zazerkalius v0.084 — «надо сохранять положение, изменённое вручную, для каждого кольца». Ручная ось зеркала теперь у каждого кольца своя (Z.coneAxisOffs по номеру строки, сдвиг от оси строки ⇄ в полубитах) и запоминается: ◀ ▶ поворачивают оси выделенных колец (или текущего), не трогая остальные; правый щелчок по ◀ / ▶ — вернуть оси этих колец к оси строки. Кольца без своей оси берут общую, как раньше.

Zazerkalius v0.085 — «замок может… индивидуальный». Замок сдвига у каждого кольца свой: «🔒 кольца» запирает / отпирает выделенные кольца (или текущее), правый щелчок — снять свой замок (кольцо снова по общей галке «запрет сдвига строк»). Запертое кольцо теперь не стоит, а крутится мышью только на вид — строка не меняется, а положение запоминается у кольца (Z.coneRot, целыми битами); незапертое, как прежде, крутит саму строку. Сдвиг всего вида — мимо колец или с Ctrl. «◯ к наименьшему»: запертые — на вид, незапертые — сами строки. Внизу — заперто ли текущее кольцо, своим замком или общим, и на сколько повёрнуто на вид.

Zazerkalius v0.086 — по снимку кольца из одного бита: «у единицы не должно быть луча — только в центр, то, что уже есть: сектора, градиент». У кольца из одного бита больше не рисуются оси зеркала, хорды, луч «через центр» с продолжением наружу и лучи к центру (плоско и в 3D) — остаётся только сектор-градиент к центру.

Zazerkalius v0.087 — «похоже, границу внутреннюю и внешнюю кольца надо как-то различать, цветом». У каждого кольца внутренний край — голубой, внешний — оранжевый (прежде оба серые); у текущего кольца те же цвета, толще (прежде оба золотые). Попутно (v0.086) золотая метка начала — короткий штрих снаружи колец, а не черта от центра, которую принимали за луч.

Zazerkalius v0.088 — «справа сделай таблицу с номерами строк — замков, строк, как в поле строк; теперь его свернём, а это — на первое место, просто то будет дублем». В «◯ Конусе» справа от холста — строки столбика: номер, замок кольца (🔒 / 🔓; золотая рамка — свой замок), сама строка в цветах поля, «↻k» — кольцо повёрнуто на вид. Щелчок — текущая, Ctrl + щелчок — выделить (то же выделение, что в поле), щелчок по замку — запереть / отпереть это кольцо, правый — снова по общей галке. Текущая подсвечена, таблица держит её в виду; перерисовывается только при изменениях.

Zazerkalius v0.089 — по снимку кольца «11»: «есть лучи от центров бит, а есть от границ — от границ, похоже, не надо; оставь только границы на кольце, чтобы туда запускать лучи от бит других». Лучи («лучи от бит текущего / всех колец») теперь идут от центра каждого бита (середины дуги) к центру — и плоско, и в 3D; лучей от границ больше нет, границы — только черты на самом кольце, куда попадают лучи бит других колец.

Zazerkalius v0.090 — «граница — цветом, сами построятся», «где надо». Границы бит на кольцах красятся по тому, что разделяют: где биты разные — яркая черта (0→1 по часовой — сиреневая, 1→0 — бирюзовая), где одинаковые — тонкая бледная. Края серий видны сразу, и узор границ по кольцам проступает сам. В плоском виде и в 3D.

Zazerkalius v0.091 — по снимку узкого поля строк с конусом под ним: «строки перемести с их меню туда — справа от конуса, или просто конус дай располагать слева от поля строк». В шапке — «⇆ поле справа»: колонки меняются местами — окна (конус и остальные) слева, поле строк со своими кнопками справа; ещё раз — как было; запоминается. Разделитель тянется в ту же сторону, что поле (при поле справа — влево шире). Окно, прикреплённое под полем, остаётся под ним — его перетащить на сторону окон.

Zazerkalius v0.092 — по снимку таблицы у конуса: «это тогда не нужно — прямо на строках расположи, у номеров, перед номерами замки (значки)». Замок кольца теперь — значком перед номером строки в поле: 🔒 заперто, 🔓 открыто (бледно), золотая рамка — свой замок, «↻k» — кольцо повёрнуто на вид; щелчок — запереть / отпереть, правый — снова по общей галке. Таблица строк справа от конуса убрана, холст — снова на всю ширину окна.

Zazerkalius v0.093 — по снимку номеров строк: «тут шрифт и значки покрупнее, и выровняй всё, может, столбики — границы между ними тонкие». У номера строки — ровные столбики: замок | поворот ↻ | номер | неподвижные·меняющиеся | 0:1; между ними тонкие черты; шрифт 13 px (был 11), замок 14 px, числа 12 px. Столбик поворота есть всегда (пустой, если кольцо не повёрнуто) — чтобы столбики не съезжали. Попутно (v0.092): колонка номеров — всегда по содержимому.

Zazerkalius v0.094 — два снимка: «верхняя граница поля конуса — до конца, заголовок — внутрь поля» и «все остальные кнопки в левом режиме убрать под меню левое» (стопка свёрнутых шапок окон). Холст «◯ Конуса» теперь на всё окно, от верхнего края; шапка, строка кнопок и текст внизу лежат поверх него полупрозрачно. При «⇆ поле справа» свёрнутые окна не стоят на столе, а кнопками — в левой панели, раздел «Окна» под шаблонами; щелчок — окно разворачивается на стол; свернул («–», ▭) — снова в панель. Без «поле справа» — как прежде.

Zazerkalius v0.095 — по снимку развёрнутого «◯ Конуса»: «нет — не занимает по высоте и ширине». ⛶ ставил окно с отступами 12 px, а раскладка ещё сдвигала его на 12 px вниз. Теперь развёрнутое окно — вплотную: от левого и верхнего края стола во всю ширину и видимую высоту, без рамки и тени; раскладка держит его на самом верху, ширину не ужимает.

Zazerkalius v0.096 — «номера гуляют при выделениях» (снимок: у выделенных 55 и 63 весь ряд у номера сдвинут влево). Столбики чисел у номера были «по содержимому» и прижаты вправо: у выделенной строки цифры жирные, шире — и ряд уезжал. Теперь у каждого столбика постоянная ширина (замок, поворот, номер, два столбика чисел), ряд прижат влево — выделение ничего не сдвигает.

Zazerkalius v0.097 — «в 0-й строке не должно быть ничего, с 1-й строки вписываем биты». Строки теперь нумеруются для глаза с единицы: в поле строк (и у замков), в таблицах «⚖ Балансы» и «📐 Лесенки», на карточках «🧊 Вида», у строк сигнала, в текстах окон и сообщениях («текущая», «строка», «кольцо», списки одинаковых колец). Строка треугольника номер k — k бит. Внутри счёт по-прежнему с нуля — ничего не пересчитывается.

Zazerkalius v0.098 — «3D — это, конечно, нечто шедевральное», «поставь кнопку крутить вправо-влево — всю, потом, похоже, каждое по отдельности». В «◯ Конусе»: «весь: ⟲ ⟳» — крутить весь конус (плоский — вокруг центра, в 3D — вокруг оси): щелчок — 15°, держишь — крутится плавно; правый щелчок — к началу. «кольца: ◁ ▷» — выделенные кольца (или текущее) на бит против / по часовой: запертое — на вид (запоминается), открытое — сама строка (↩ вернёт).

Zazerkalius v0.099 — «Esc — снять выделение со строк всех». Esc снимал выделение и раньше, но только когда фокус не стоял на галке, выборе или кнопке — после щелчка в окне (например, в «◯ Конусе») клавиша пропускалась. Теперь Esc снимает выделение со всех строк и там (в поле строк и на кольцах сразу), из поля ввода — сперва уводит фокус; внизу пишется, сколько снято.

Zazerkalius v0.100 — «я всё понял — это пирамида!» и «3» — на «зеркало под основанием, как в знаке». В «◯ Конусе» — галка «⧗ зеркало вниз» (включает 3D): под последним кольцом, общим основанием, — та же пирамида вниз: кольцо i отражено через основание, биты инвертированы (0 ↔ 1) — как в «Октаэдре», знаке Zerkalius (пирамида и её зеркало под общим основанием). Основание — на середине картинки, ось конуса продолжается до нижней вершины; неподвижные при развороте красятся так же.

Zazerkalius v0.101 — по снимку отметок «↻1 ↻3 ↻4» у номеров: «как это снять — накрутку?». Щелчок по «↻k» у номера строки — снять накрутку этого кольца (при наведении отметка зачёркивается); в «◯ Конусе» — «↺ снять ↻»: у выделенных колец, ничего не выделено — у всех. Строки при этом не меняются — снимается только поворот «на вид».

Zazerkalius v0.102 — «как запустить кручение — пока что обычное, всех сразу» и «и видеозапись». В «◯ Конусе»: «▶ крутить» — весь конус крутится сам, без остановки (плоский — вокруг центра, 3D — вокруг оси), скорость — ползунок рядом (град/с, минус — в другую сторону), ещё раз — стоп; «⏺ видео» — запись самого холста конуса (без кнопок) в .webm, 30 кадров/с, на кнопке — время; ещё раз — стоп, файл скачивается. Общий recorder.js не взят: он склеивает все видимые холсты страницы, а здесь их несколько.

Zazerkalius v0.103 — «лампа Аладдина запущена» → «как её зажечь». В «◯ Конусе» — галка «✨ свет»: из центра расходится тёплое свечение, единицы и неподвижные биты светятся своим цветом (ореол), в 3D ближнее ярче дальнего. На тёмном фоне — ярче всего. Ореол тяжелее для отрисовки: на больших столбиках кручение может идти медленнее.

Zazerkalius v0.104 — «гит и это» — на «▶ крутить с выбором: всё целиком / каждое по биту / навстречу». Рядом с «▶ крутить» — выбор режима: всё целиком (весь конус одним углом, как было); каждое по биту (все кольца на одно число бит — маленькие вертятся быстрее, рисунок закручивается спиралью; скорость ползунка / 10 — бит в секунду); навстречу через одно (чётные по часовой, нечётные против, одинаковым углом). Поворот кольца на экране — его поворот «на вид» плюс кручение; строки не меняются. Правый щелчок по ▶ — всё на места. Пишется через ⏺ так же.

Zazerkalius v0.105 — «режим дзен». В «◯ Конусе» — «🧘 дзен»: только конус на весь экран (и во весь экран браузера) — шапка, левая панель, поле строк, остальные окна, кнопки и текст конуса спрятаны; кручение, свет, 3D, октаэдр — как настроены; мышь и колесо работают. Выйти — Esc (или выход из полноэкранного режима). Подсказка «Esc — выйти» внизу гаснет через три секунды.

Zazerkalius v0.106 — «по Esc не снимается выделение одной строки». Проверено в браузере: Esc выделение снимал, но у той же строки оставалась подсветка текущей строки (фиолетовая полоса и черта у номера) — она и выглядела как выделение. Теперь Esc гасит и её; щелчок по строкам или стрелки / PageUp / PageDown / Home / End возвращают подсветку.

Zazerkalius v0.107 — «у строк снялось, но в кольцах 3D осталось». Esc теперь гасит и золотую обводку текущего кольца в конусе — и в 3D, и в плоском виде; вернётся вместе с подсветкой текущей строки (щелчок по строкам или по кольцам, стрелки).

Zazerkalius v0.108 — «не снимается». Проверил на настройках пользователя: включено «только выделенные», выделения нет — конус показывал текущее кольцо с осью зеркала и хордами, и после Esc оно оставалось. Теперь кольца «в фокусе» — выделенные, без выделения — текущее, а после Esc — никакое: ось, хорды, сектора и лучи «текущего» снимаются, а «только выделенные» при пустом фокусе показывает все кольца. Щелчок по строкам или кольцам, стрелки — фокус на текущем снова.

Zazerkalius v0.109 — «пока это всё делай без меня» — на три предложенных, но не сделанных вещи. ⬡ Многоугольники (галка в «◯ Конусе»): строка из n бит — правильный n-угольник вместо кольца, бит — сторона, границы бит — вершины; конус становится ступенчатой пирамидой, в плоском виде и в 3D. Вершины лежат на прежней окружности, углы у бит те же, что у дуг, — поэтому лучи, оси, хорды, «луч во внешнее кольцо», кручение и попадание мышью считаются по-прежнему, меняется только расстояние от центра; строки из 1 и 2 бит остаются кругами. ▲ Пирамида Паскаля — новое окно: этажи-треугольники, клетка нового этажа — XOR трёх соседей этажом выше. От «1» — тетраэдр Серпинского (на этаже k единиц 3^m, m — единиц в двоичной записи k; окно это пишет); от текущей строки — строка ложится нижним краем верхнего этажа, и грань под ней растёт ровно как 🔺+1; от строк поля — столбик становится верхним этажом. Этаж хранится строками r = a + b, и правило в них — «сама клетка ⊕ 🔺+1 строки над ней»; поэтому каждая грань — обычный треугольник Паскаля по модулю 2. Вращение, масштаб, срез «до этажа» и «только он», «▶ расти», «⟳ крутить», «⤓ этаж в строки» (обратно — затравкой «от строк поля»). Больше 120 000 единиц не рисуется — этажей тогда меньше, и окно об этом пишет. ▭ поле строк (кнопка в шапке): поле строк с разделителем прячется, окна берут его место; строки живут дальше, кнопки слева работают. Запоминается.

Zazerkalius v0.110 — «почему так? может, надо крест и точку?» — на «строки из 1 и 2 бит остаются кругами». Кругами они остались потому, что многоугольнику нужно три вершины: у одного бита вершина одна, у двух бит обе «стороны» легли бы на один отрезок и два бита слились бы. Теперь при «⬡ многоугольниках» строка из 1 бита — точка (диск в центре, цветом бита), из 2 бит — крест: биты — две руки поперёк (каждая по середине своего бита, своим цветом, крупно — с символом), границы между ними — две руки вдоль, цветом границы (0→1 сиреневая, 1→0 бирюзовая, одинаковые — бледная). Крест крутится вместе с кольцом; в 3D и в «⧗ зеркале вниз» — так же. У треугольника Паскаля сверху теперь точка, крест вокруг неё, дальше треугольник, квадрат, пятиугольник.

Zazerkalius v0.111 — по снимку «всё равно круг, тут что-то не так; давай сделаем 2 бита двумя Г в разные стороны на одной плоскости — сверху будет крест» и «углами по центру». Точка была диском во всё нулевое кольцо — при масштабе выходил большой круг; теперь это маленькая точка в самом центре, рисуется поверх всего. Два бита — две Г углом в центре: у каждого бита руки идут на четверть и на три четверти его половины круга, под прямым углом, вторая Г — напротив; вместе — косой крест, в центре — точка. Граница между битами — короткая черта у края в щели между Г (0→1 сиреневая, 1→0 бирюзовая). Символ бита — внутри своей Г. В 3D и в «⧗ зеркале вниз» — так же.

Zazerkalius v0.112 — «под нижней строкой последней поставь линию-границу; если за неё вверх — пусть скрывает строки ниже неё, делая их бесцветными, и этих строк как будто нет». Под нижней строкой поля теперь черта-граница. Тянешь её вверх — строки ниже черты становятся серыми и уходят из счёта: окна, конус, кнопки, «+ Столбик», сохранение в .txt и строка внизу поля видят только строки над чертой («… · за границей N стр.»). Вниз — строки возвращаются на свои места; двойной щелчок по черте — вернуть все. Почему хранятся отдельно: в приложении больше полутора сотен мест читают строки поля напрямую — «как будто нет» надёжно выходит только так: спрятанные лежат своим хвостом у каждого поля, а поле — это только строки над чертой; поэтому всё прежнее их просто не видит. Черта одна на все поля (колонками и наложением): у каждого над ней остаётся не больше того же числа строк, хотя бы одна. Спрятанные строки не выбираются и не правятся. Перенос черты — правка: ↩ вернёт; замок строк её не держит — биты не меняются. Запоминается.

Zazerkalius v0.113 — по снимку конуса с «секторами к центру»: «из центра — посмотри, что за синие полосы идут». Это были швы, а не данные: каждый бит закрашивал свой клин отдельно, полупрозрачно, и на общей кромке двух соседних клиньев сглаживание каждого покрывает пиксель лишь наполовину — вместе выходит меньше, чем внутри клина, и сквозь кромку просвечивает фон. На кольце из сотен бит — сотни тонких светлых (на тёмном — синеватых) черт из центра, даже между двумя единицами. Замер на кольце из одних единиц: внутри клина 146, на каждой кромке 157. Теперь подряд идущие биты одного цвета закрашиваются одним клином — внутри него кромок нет вовсе (замер: ровно 146–147); черта остаётся только там, где цвет и правда меняется (0↔1, неподвижный бит). Так же в 3D и у многоугольников.

Zazerkalius v0.114 — «после нижней черты, которую ты сделал, в Конусе сделай как бы строку для заполнения из пустых ячеек по числу +1» и «одну из них заполни 1». Сразу под чертой-границей — строка пустых ячеек (пунктир): их на одну больше, чем бит в нижней строке над чертой, первая уже «1». Щелчок по ячейке — пусто → 1 → 0 → пусто. «+» у её номера — строка встаёт в поле под нижнюю (пустые ячейки — нулями), ↩ вернёт; под чертой — следующая, снова +1. В конусе она же — пунктирное кольцо снаружи всех колец (бит 0 сверху, как у всех), его ячейки щёлкаются так же; видна в плоском виде. Черновик запоминается; сменилась длина нижней строки — строка для заполнения начинается заново. Сразу в строки она не уходит, даже когда все ячейки заполнены: щелчок крутит ячейку через 1 и 0, и строка уходила бы на полпути; поэтому — «+».

Zazerkalius v0.115 — «надо сохр настройки и все биты в файл, чтобы на другом компе». В шапке — «💾 Всё» и «📂 Всё». «💾 Всё» скачивает файл zazerkalius-vse-ГГГГММДД-ЧЧММ.json: все четыре поля строк, строки за чертой, черновик строки для заполнения, свои шаблоны, окна и их места, конус, вид, тема — всё, что страница помнит. «📂 Всё» (или файл, перетащенный на страницу, — прежний 📂 его тоже узнаёт) спрашивает и заменяет всё разом. Почему так: всё состояние и так живёт в одном объекте (его же страница пишет в память браузера), поэтому файл — этот объект целиком, а открытие кладёт его в память и перезагружает страницу: разложить по полям и спискам сотню настроек вручную значило бы что-то забыть, а при перезагрузке их раскладывает тот же код, что всегда. Прежнее состояние перед открытием остаётся в памяти браузера отдельной копией — на случай не того файла. ↩ открытие не отменяет. 💾 рядом с полем строк по-прежнему пишет только столбик в .txt.

Zazerkalius v0.116 — «пусть с центра через все кольца в стороны проходит луч, который проходит между границами битов, и когда он дойдёт моментом хоть до нижней строки — то место, куда он упадёт, пометить 1; как часы, между зубьями; а так луч держится стенами колец; в 1 строке». В «◯ Конусе» — галка «⌖ луч-часы». Из центра через каждую границу строки 1 (у строки из одного бита граница одна — это стрелка) идёт золотой луч. Кольцо он проходит только в щель — там, где у кольца граница между битами; попал на бит — стоит у стены (красная черта поперёк). Прошёл все кольца над чертой — падает в кольцо для заполнения, и ячейка под ним становится «1» (в поле — тоже). Щель — четверть градуса. «Хоть моментом»: при кручении щели сходятся на миг, который легко проскакивает между кадрами, поэтому между кадрами положение пересчитывается мелкими шагами (сколько нужно, чтобы самое быстрое кольцо сдвигалось меньше щели), и пойманный миг показывается вспышкой луча. Что видно сразу: поворот кольца на целое число бит не меняет, где у него границы, поэтому стоящие кольца, «всё целиком» и «каждое по биту» пропускают луч только там, где границы общие у всех колец (у строк 1…9 бит — только сверху, в ячейку 1). Новые места даёт «навстречу через одно»: чётные и нечётные кольца едут друг против друга, и щели сходятся в других местах. Видно в плоском виде; в 3D кольца для заполнения нет, и луч не метит.

Zazerkalius v0.117 — «луч пожирнее и поярче, а пустая строка тоже должна крутиться». Луч-часы теперь широкий: золотое тело со свечением и светлая сердцевина поверх, у дошедшего до края — ещё шире и со светлой точкой на конце; стена — толще. Кольцо для заполнения крутится вместе со всеми — как следующее за нижним кольцо: «каждое по биту» — на тот же бит, «навстречу» — по своей чётности, «всё целиком» — вместе с конусом; щелчок по его ячейке попадает в ту, что под мышью, как бы оно ни стояло. Луч метит ячейку, которая под ним в этот миг. Что это меняет: в «каждом по биту» щели всех колец сходятся сверху на каждом целом бите, а кольцо для заполнения к этому мигу повёрнуто уже на следующую ячейку — луч, как стрелка часов, по тику метит ячейки одну за другой (в v0.116 он попадал только в первую).

Zazerkalius v0.118 — «как удалить нижнюю строку — пустую — и заново». У номера строки для заполнения, между «+» и номером, — «✕»: черновик стирается, строка снова пустая, в первой ячейке «1». В конусе то же — правый щелчок по её пунктирному кольцу. Строки поля не трогаются; ↩ стёртый черновик не возвращает — он не правка строк, а заготовка. Раньше начать заново можно было только сменой длины нижней строки.

Zazerkalius v0.119 — две просьбы подряд про луч-часы. «Сделай кнопку остановка по проходу лазера, пауза, потом вручную продолжить, и показывай цикл — сколько прошло кругов и сколько их всего». Рядом с «▶ крутить» — «⏸ на проходе»: как только лазер дошёл до края, кручение встаёт ровно в этом положении (луч виден проходящим), дальше — снова ▶. Проход — это миг, когда щели сошлись; пока они держатся вместе несколько шагов подряд, это один проход, а не десяток; после паузы тот же проход второй раз не останавливает. Рядом — счёт: «⟳ круг K из T · проходов лазера P». Круг — оборот стрелки (строки 1). В «каждом по биту» кольцо из n бит возвращается на место через n бит, все кольца вместе с кольцом для заполнения — через НОК их длин; у строк 1…9 и кольца из 10 ячеек это 2520 кругов. НОК считается в BigInt: у сотни разных длин он астрономический и пишется как «a,bc·10^k». Когда цикл пройден, внизу сообщение. В «навстречу» все кольца поворачиваются на один угол, поэтому цикл — 1 круг (360°). Правый щелчок по ▶ обнуляет и счёт. Фаза «навстречу» больше не обрезается каждые 100 оборотов, иначе сбивался счёт. «В 1 строке сделай 4 выреза для направления луча — там я вручную сначала его направлю». В кольце строки 1 — четыре выреза (↑ → ↓ ←), прорезью цветом фона, крутятся вместе с кольцом; выбранный — золотой. Щелчок по кольцу строки 1 при луч-часах выбирает ближайший вырез, и луч идёт только через него. Прежде луч шёл через границы строки 1, у строки из одного бита это был единственный путь вверх; теперь направление задаётся вручную.

Zazerkalius v0.120 — «дай возможность ось соединять вручную со следующим кольцом в щели, при этом крутя внутреннее кольцо, а не внешнее». При луч-часах кольцо строки 1 (с вырезами) тянется мышью само по себе и плавно, а остальные кольца стоят. Когда луч подходит к щели кольца 2 (границе его бит) ближе примерно 10 пикселей, кольцо защёлкивается, и луч встаёт ровно в щель; внизу пишется, куда он дальше: проходит все кольца или какое кольцо его держит. Короткий щелчок без движения, как раньше, выбирает вырез. Кнопки «⌖◁ ⌖▷» доворачивают строку 1 так, что луч встаёт в соседнюю щель кольца 2; правый щелчок по ним снимает довод. Почему плавно, а не битами: прежний поворот кольца мышью шёл целыми битами, а у строки из одного бита целый бит — это полный оборот, то есть луч никуда бы не сдвинулся. Поэтому у строки 1 теперь свой довод в градусах (Z.coneAimRot), он прибавляется к её повороту и вместе с кручением крутит и вырезы. Строки при этом не меняются.

Zazerkalius v0.121 — «убери из 1 строки 4 выреза, оставь один». Вырез в кольце строки 1 теперь один, золотой: там, где бит 0 строки 1 (сверху, пока кольцо не довёрнуто). Направление луча задаётся только доводом кольца — тянуть кольцо строки 1 мышью (защёлкивается в щелях кольца 2) или «⌖◁ ⌖▷»; короткий щелчок по нему вырез больше не выбирает, а подсказывает. Если до этого был выбран другой вырез (→ ↓ ←), при запуске он переводится в довод на 90°, 180° или 270° — луч остаётся там же, где был.

Zazerkalius v0.122 — «как сбрасывать накрученные биты, чтобы по умолчанию вернулось» → «нужна кнопка, которая сбрасывает биты всех строк». Сброс был в трёх местах: «↺ снять ↻» (накрутка «на вид»), правый щелчок по ▶ (кручение), правый щелчок по ⌖◁ ⌖▷ (довод строки 1). Теперь в «◯ Конусе» есть «⟲ всё на места»: разом у всех колец снимает накрутку, останавливает кручение и обнуляет его вместе со счётом кругов и проходов, снимает довод строки 1. Строки не трогает: если строку сдвигали открытым кольцом, это настоящая правка бит, и вернуть её может только ↩.

Zazerkalius v0.123 — «вернуть сами биты всех строк к начальному набору (1, 11, 101…)» — «это». В «Построениях», рядом с «🧹 Очистить», — «↺ Начальные»: рабочее поле снова тот столбик, с которого страница начинается (1, 11, 101, 1111, 10001, 110011, 1010101, 11111111, 100000001). Строки за чертой этого поля тоже убираются, иначе черта при перетаскивании вернула бы прежние под начальными. Другие поля не трогаются; ↩ вернёт прежние строки. Положение колец в конусе кнопка не меняет, для этого есть «⟲ всё на места».

Zazerkalius v0.124 — «чем задана ширина лазера и междубитья в кольцах?» → «да» на предложение сделать их одним числом. Раньше это были три разных числа: лазер рисовался толщиной 5–14 пикселей (22% шага колец), прорезь между битами — по 1,5 пикселя с каждой стороны, а в расчёте щель была четверть градуса, то есть меньше пикселя. Толстый луч мог лежать поверх стены и не проходить. Теперь в «◯ Конусе» рядом с «⌖ луч-часы» есть ползунок «щель» (градусов во всю ширину, 0,2…10, по умолчанию 2; двойной щелчок — 2°), и одно это число задаёт всё сразу: допуск в расчёте, прорезь между битами в кольцах (при луч-часах черты границ тонкие, чтобы щель была видна пустой), вырез в строке 1 и ширину лазера. Лазер — клин той же угловой ширины: у центра узкий, к краю шире, ровно как щели, которые тоже по углу. Кольцо он проходит, если его середина (светлая черта) в щели, то есть луч хотя бы наполовину в ней. У колец с мелкими битами щель не шире 0,9 бита, иначе в щель превратилось бы всё кольцо. Совсем узкий клин рисуется не тоньше 3 пикселей на конце, чтобы его было видно. Шаг расчёта между кадрами подстраивается под самую узкую щель.

Zazerkalius v0.125 — «сделай кнопку сохранения настроек и битов всех полей, чтобы при сбросе и Начальные — это применял, и когда файл загружен с другого компа — то тоже он становится умолчанием». В шапке — «⭐ Умолчание»: запоминает снимок всего состояния (биты всех полей со строками за чертой и строкой для заполнения, положения колец, настройки) — всё, кроме раскладки окон: она у каждого экрана своя. Горит, когда своё умолчание есть; правый щелчок — забыть. «↺ Начальные» теперь берёт из него биты всех полей (без него — встроенный столбик 1, 11, 101…), «⟲ всё на места» — положения колец, кручение, довод строки 1 и настройки конуса (луч-часы, щель, пауза на проходе, режим и скорость кручения, свет, многоугольники, сектора, 3D, лучи, зеркало, замки; без умолчания — нулевые положения, как было). Файл, открытый «📂 Всё», сам становится умолчанием — об этом спрашивает и подтверждение. ↩ после «↺ Начальные» возвращает прежние строки.

Zazerkalius v0.126 — «также надо зафиксировать: если луч, пройдя все между битами, пройдёт и между ячейками пустой строки — это будет выход луча и остановка кручения полная». Луч, прошедший все кольца, теперь проверяется и на кольце для заполнения: попал в границу его ячеек (в пределах той же щели с ползунка) — это выход. Ячейку он не метит, а уходит за край конуса: клин до края холста, зелёная сердцевина, зелёное кольцо-метка там, где вышел. Во время кручения выход всегда останавливает его полностью, даже без «⏸ на проходе», и записывается: счёт «🚪 выходов N» рядом со счётом кругов и журнал последних 50 выходов в состоянии страницы (фаза, круг, время; едет и в файл «💾 Всё»). Внизу — сообщение, на каком круге. Один выход засчитывается один раз; после остановки ▶ крутит дальше и тот же выход второй раз не ловит. Счёт выходов обнуляется там же, где счёт проходов. Что из этого следует сразу: в начальном положении щели всех колец и граница ячеек пустой строки сходятся сверху, так что без довода строки 1 луч стоит на выходе. В «каждом по биту» на каждом целом бите кольцо для заполнения тоже повёрнуто на целую ячейку, поэтому любой проход сверху — выход, и кручение встанет на первом же тике (в v0.117 такие проходы метили ячейки по очереди). Разные места дают довод строки 1 и «навстречу».

Zazerkalius v0.127 — «хотя не так: дострой до 256 строк после последней — пустые, можно еле заметными показать, но если луч пройдёт — помечать 1, если 2 и более раз — всё записать в бит, пусть там будет хоть три 111 в одном бите». Выход луча с полной остановкой (v0.126) убран. Вместо него при луч-часах за строкой для заполнения — пустые кольца до строки 256 (галка «▦ до 256», включена): еле заметные контур и черты ячеек, каждое кольцо на ячейку длиннее предыдущего, как строка для заполнения, и крутится по тем же правилам. Стен у них нет: луч, прошедший строки, идёт сквозь все пустые кольца до края и в каждом метит ячейку, через которую прошёл (попал в границу ячеек в пределах щели — прошёл между ними, ничего не метит). Счёт проходов: каждый проход луча прибавляет каждой ячейке на пути единицу, и она пишет «1», «11», «111»… (где влезает текст; закраска тем плотнее, чем больше проходов). В строке для заполнения — то же: «1» ставится, как раньше, а при 2+ проходах ячейка показывает «11», «111». Проход засчитывается один раз, пока щели держатся вместе; засчитывается и во время ▶, и когда луч довели до края вручную (мышью, ⌖◁ ⌖▷, ползунком щели); не засчитываются загрузка страницы, включение луч-часов и «⟲ всё на места». Счёт хранится у страницы (едет в «💾 Всё» и в ⭐ умолчание); сменилось число строк или длина нижней — начинается заново; «✕» у строки для заполнения стирает и его. Под конусом — сколько ячеек помечено, сколько проходов и самый большой счёт. Цена: колец становится 256, поэтому кольца строк тоньше — колесо мыши приближает; без луч-часов пустых колец нет. Цикл кругов по-прежнему считается по строкам и строке для заполнения — с пустыми кольцами НОК стал бы числом в сотню знаков.

Zazerkalius v0.128 — по снимку конуса (лазер виден сквозь всё, «ещё не запускал») — «понял; все пустые строки — 0, без 1 начальной». Лазер виден без запуска потому, что в начальном положении щели всех колец сходятся сверху, и луч проходит сразу. А «1» в первой ячейке строки для заполнения ставила сама страница (так просили в v0.114), и её легко принять за метку лазера. Теперь строка для заполнения начинается пустой: все ячейки пусты, при «+» — нули. Черновик, оставшийся от прежнего начала (ровно «1» и пусто), при первом запуске новой версии очищается один раз; черновик с другими отметками не трогается. «✕» тоже даёт всю строку пустой.

Zazerkalius v0.129 — «совсем не видно граней у пустых — сделай хотя бы у ближайшей более заметными, и после того как прошли через какое-то кольцо — ловить лазер следующим кольцом, его битами, и т. д.». Грани: пустые кольца теперь гаснут постепенно — ближнее (сразу за строкой для заполнения) ярко, с обоими краями и более толстыми чертами ячеек, дальше каждое бледнее (×0,88 на кольцо, не бледнее 0,12). Ловля: в v0.127 пустые кольца были без стен, и луч метил по ячейке в каждом. Теперь они тоже стены: луч, прошедший строки, идёт дальше только в щель между ячейками, а первое кольцо (начиная со строки для заполнения), где он попал в ячейку, его ловит — там луч и стоит, точка на конце, и эта ячейка получает единицу (1, 11, 111…). Прошёл щели всех пустых колец — уходит за край, ничего не метит (так в начальном положении: все щели сверху). Вспышка при кручении — тоже до поймавшего кольца. Под конусом пишется, какое кольцо и какая ячейка поймали луч.

Zazerkalius v0.130 — «не работает» (сразу после отправки v0.129 в git). Страница не запускалась вовсе: SyntaxError: Missing initializer in const declaration в zz-ui.js. Причина — правка v0.129: комментарий «// пойман пустым кольцом» лёг посреди объявления const rs = …, px = …, py = …, после px, и закомментировал его конец — px остался без значения, и весь файл перестал разбираться. Комментарий перенесён в конец строки. Урок тот же, что с */ в блочном комментарии: дописывая комментарий в середину длинной строки, смотреть, что стоит после него.

Zazerkalius v0.131 — «не идёт лазер дальше 2 строки, хотя проход есть», «так стена — это ячейка бита 3 строки», «там должен её покрасить и поставить 1», «смысл в том, что лазер красит все биты, на которые упадёт», «все ячейки изначально пустые». Краска: у колец строк появился свой слой краски, сначала пустой. Луч упёрся в бит (стена) — эта ячейка закрашивается золотом и получает «1»; упал на неё снова (ушёл и вернулся) — «11», «111»…, как у пустых колец (v0.127). Пока луч стоит на той же ячейке, это одно попадание; красит и когда тянут строку 1, и на каждом шаге ▶ кручения. Биты самих строк не меняются. Счёт лежит там же, где у пустых колец (Z.voidHits, ключ «кольцо:бит»), и «✕» у строки для заполнения стирает его вместе с ними. Проход: довод строки 1 (защёлка при перетаскивании, ⌖◁ ⌖▷) ставил луч ровно в середину щели кольца 2. После ▶ с паузой кольца стоят не на целых битах, и щель кольца 3 могла лежать чуть в стороне: щели перекрываются, проход есть, а середина луча уже мимо — стена. Теперь луч встаёт в середину общего прохода — пересечения щелей колец 2, 3, 4…, пока оно не пусто. Проверено перебором 2000 положений: дальше, чем раньше, — в 97, ближе — ни в одном.

Zazerkalius v0.132 — «что значит красить поверх? да там пустые ячейки строк чёрные, когда лазер попадает — 1 ставить». В v0.131 кольца строк при луч-часах по-прежнему показывали свои 0/1, а краска лазера ложилась поверх — отсюда и «поверх». Теперь, пока включены ⌖ луч-часы, ячейки колец строк пустые: все чёрные, без символов 0/1 и без цветных границ 0→1 / 1→0 (щели между ячейками видны как были). Ячейка, в которую упал лазер, закрашивается и получает «1» (снова упал — «11», «111»…). Биты строк в поле не трогаются; луч-часы выключены — кольца снова показывают строки.

Zazerkalius v0.133 — по снимку (одна строка «1», луч чуть правее верха упирается в строку для заполнения) — «не идёт дальше 2». Довод строки 1 — защёлка при перетаскивании, ⌖◁ ⌖▷ и середина общего прохода (v0.131) — искал щели только в кольцах строк, начиная с кольца строки 2. Когда строка одна, кольца строки 2 нет: следующее кольцо — строка для заполнения, за ней пустые. Защёлки не было, ⌖◁ ⌖▷ отвечали «кольца 2 нет», а рукой в щель шириной 2° не попасть — луч оказывался на ячейке строки для заполнения, и она его ловила. Теперь кольца для довода — все подряд, как их видит луч: строки, строка для заполнения, пустые до 256. С одной строкой: защёлка ставит луч в верхнюю щель (проходит всё), ⌖▷ — в нижнюю щель кольца 2, там его ловит кольцо 3.

Zazerkalius v0.134 — «тут надо лог вести: на каком проходе какая ячейка какой строки, и также переход сквозь щель», «нужна кнопка вперёд-назад для Плея, вручную, чтобы смотреть», «пусть лазер, когда светит на границу какого-то кольца, не в щель, подсвечивает её», «когда прошёл через щель, то в месте этом убери свечение на толщине кольца, чтобы видно было эту щель». 📜 Лог лазера — под текстом конуса (виден при луч-часах): всякий раз, когда конец луча сменился (упёрся в другую ячейку, пойман другим кольцом, ушёл за край), — запись: номер, угол луча, где он кончился и что стало в ячейке (1, 11…), и сквозь какие щели прошёл («2: 2|1» — строка 2, между ячейками 2 и 1; длинный путь — первые 10 и «ещё N»). До 1000 записей, новые сверху, ⧉ — скопировать, ✕ — очистить. Счёт единиц у пустых колец теперь тоже по смене конца луча, как у стен (раньше — только когда луч начинал проходить все строки, и ячейка, поймавшая луч сразу после другой пустой, оставалась без единицы). ◀ ▶| рядом с ▶ крутить — кручение тем же режимом (по биту / навстречу) до прошлого / следующего события лазера; каждый шаг в логе и в строке сообщений. Подсветка: луч упёрся — край этой ячейки светится красным во всю ширину; лёг ближе трёх ширин щели к щели — золотом светятся и края этой щели. Щели видно: на толщине колец, чьи щели луч прошёл (и выреза строки 1), золотой клин со свечением вырезан — остаётся тонкая сердцевина. Попутно: при пустой текущей строке окно «Орбита» зацикливалось (поиск кусков: indexOf("") никогда не даёт −1) и вешало страницу — пустой кусок теперь пропускается.

Zazerkalius v0.135 — «сделай паузу при клике на поле, а плей — только по кнопке; устрани дёргание кнопок, когда там что-то меняется, и сгруппируй их чётче по функциям» (по снимку панели конуса одной сплошной лентой). Пауза: щелчок по конусу или по полю строк, пока кольца крутятся, — пауза; дальше — только «▶ крутить». Дёргание: кнопки шли одним потоком с переносом, и всё, что меняло ширину — «▶ крутить» ↔ «⏸ стоп», часы записи на «⏺ видео», число у ползунка щели, строка «⟳ круг … · проходов лазера …» посреди кнопок, — переносило ряды. Теперь у этих кнопок постоянная ширина, а строка счёта кругов — отдельной строкой постоянной высоты под кнопками (длинная обрезается многоточием). Проверено: во время ▶, записи видео и после остановки все кнопки на тех же местах. Группы: ВИД (к наименьшему, одинаковые цветом, только выделенные, сектора, многоугольники, 3D, зеркало вниз, высота, свет, лучи) · КОЛЬЦА (запрет сдвига, замки, по биту ◁ ▷, ось и ⇄ по оси, снять ↻) · КРУЧЕНИЕ (весь ⟲ ⟳, режим, ▶ крутить, ◀ ▶|, скорость, всё на места) · ЛАЗЕР (луч-часы, до 256, щель, ⌖◁ ⌖▷, на проходе) · ЗАПИСЬ (видео, дзен) — каждая в рамке с подписью.

Zazerkalius v0.136 — по снимку строки для заполнения в поле — «тут, когда бит покрасил в строке, покажи остальные нулями, заполни». Лазер ставит «1» в ячейку строки для заполнения — остальные пустые ячейки этой строки сразу становятся 0: строка готова целиком (например, .... → 0010). Следующее попадание в ячейку с 0 делает её 1. «✕» — снова все пустые. Руками по ячейке — как было (пусто → 1 → 0 → пусто).

Zazerkalius v0.137 — по снимку ползунка скорости — «эта скорость непонятная: раздели — одна только скорость, а противоход задавать другой кнопкой, и слева-справа стрелки шаг». Ползунок шёл от −120 до 120, середина — стоп, левая половина — против часовой. Теперь ползунок — только величина (5…120), направление — кнопка «↻ по часовой / ↺ против» рядом с «▶ крутить» (постоянной ширины). Шаги ◀ ▶| стоят по бокам ползунка, одним блоком, и идут относительно выбранного направления: ▶| — туда, куда крутит ▶, ◀ — обратно. Сохранённая скорость со знаком читается как была: знак — направление, число — ползунок. При правке — та же ошибка, что уронила v0.129: комментарий, вписанный после запятой в середину объявления const d = …, key = …, съел key; поймано проверкой синтаксиса до отправки, комментарий — в конец строки.

Zazerkalius v0.138 — «в тот момент, когда первая ячейка строки покрасится битом, этот диск (кольцо) останавливай — то есть все внутренние не будут крутиться». Лазер впервые закрасил ячейку кольца (строки, строки для заполнения или пустого) — это кольцо и все внутри него встают на фазе этого мига; внешние крутятся дальше (режимы «по биту» и «навстречу»; «всё целиком» кольца друг относительно друга и так не сдвигает). Строка 1 — источник луча — крутится всегда: первый прогон, где встала и она, показал, что луч тогда упирается в только что закрашенную ячейку навсегда и всё замирает. В логе — «⏹ встали кольца 2–k». Остановленные снова крутятся после «✕» у строки для заполнения, «⟲ всё на места», правого щелчка по ▶ и смены строк. Заметно сразу: в начальном положении все щели сверху, и первая краска обычно падает далеко в пустые кольца (в прогоне с 4 строками — кольцо 164), так что встают сразу кольца 2–164, а дальше луч, крутясь, закрашивает ячейки остановленных колец: 1, 11, 111…

Zazerkalius v0.139 — «а в самом начале, когда лазер из центра идёт в 1 строку, то его положение относительно выхода из 1 кольца, где одна щель, установи в противоположной стороне, сам лазер пусть стоит неподвижно», «и направлен вверх», «то есть кольцо останавливается только в момент выхода лазера из него наружу», «и так все кольца пройдёт наружу». Лазер теперь неподвижный и всегда светит вверх (раньше луч шёл из выреза и крутился вместе со строкой 1). Вырез строки 1 в начале — внизу, напротив лазера, и крутится вместе с кольцом строки 1: выход открыт, только когда вырез проходит мимо лазера (в пределах щели), иначе луч упирается в строку 1 изнутри («стоп: стр 1» в логе). Тянешь строку 1 — вырез защёлкивается на лазере; ⌖▷ / ⌖◁ — крутят строку 1 по / против часовой, пока вырез не встанет на лазер, открыт — закрывают (вырез напротив). Остановка (вместо v0.138): кольцо встаёт в тот миг, когда луч вышел из него наружу — строка 1, когда вырез прошёл мимо лазера, дальше каждое кольцо, чью щель луч прошёл; краска остановки не вызывает. Так луч проходит кольца по одному наружу; вышел за край — «▶ крутить» сам встаёт на паузу: «⏹ Лазер вышел наружу — все кольца на его пути встали». Прогон «навстречу», 5 строк, до 256: 41 событие, кольца вставали пачками от 1 до 84 и луч ушёл за край. В режиме «по биту» на каждом целом бите щели всех колец сходятся вверху, поэтому там луч выходит наружу почти сразу, одной пачкой.

Zazerkalius v0.140 — по снимку лога (361 запись вида «№361 · 0° · за край · сквозь щели: 2: 1|2, 3: 2|3 … ещё 245») — «это всё записывай справа и компактнее». Текст конуса и лог лазера — колонкой справа поверх холста (не шире 380 px), от низа кнопок до низа окна; лог занимает всё, что осталось под текстом, мелким моноширинным шрифтом, строки через одну подкрашены. Запись — одной строкой: 39 ◎ 163п:2→1 ⏹120–162 ‖2–162 — номер; ▮ упёрся (строка:ячейка→что стало), ◎ пойман (п — пустым кольцом, з — строкой для заполнения), ↗ край, ■ закрыт (вырез строки 1 в стороне); ⏹ — встали кольца, ‖ — прошёл щели этих строк, номера диапазонами. Угла больше нет — лазер всегда вверх. Полная запись (с ячейками у каждой щели) — в подсказке при наведении и в копии ⧉.

Zazerkalius v0.141 — по снимку группы «ВИД» конуса — «нужна своя html для этого, с полем строк, вообще всё без других вкладок». Страница «◯ Конус» — zazerkalius\Zerkalius-konus.html, кнопка «Cone» в хабе (v0.037) рядом с Zazerkalius. Своего кода у неё нет: она ведёт на Zerkalius-zazerkalius.html?solo=cone, и Zazerkalius, видя ?solo=, показывает поле строк с левой панелью и одно окно — конус — во весь стол; остальные окна скрыты и не пересчитываются, кнопки про окна (📌, ⤒, 📐, ▭ Свернуть, 📖) и ⛶ ⧉ – у конуса спрятаны, окно не таскается. Память своя (ключ zazerkalius_solo_cone): при первом запуске строки и настройки берутся из Zazerkalius, дальше живут отдельно, и раскладку окон Zazerkalius страница не трогает. 💾 / 📂 Всё — тот же файл, переносится между обеими.

ПОЧЕМУ НЕ КОПИЯ СТРАНИЦЫ

Копия HTML с одним окном разошлась бы с Zazerkalius на первой же правке конуса, а zz-ui.js обращается к элементам всех окон — добавь в Zazerkalius новое окно, и копия без него упала бы при запуске. Один код с ключом в адресе всегда совпадает с Zazerkalius; тем же ключом отдельной страницей открывается и любое другое окно (?solo=pyr — пирамида и т.п.).

Zazerkalius v0.142 — по снимку текста конуса («Наведи на кольцо…», «Кольцо 4 заперто…», «Разных колец 9 на 9 строк»), стоявшего колонкой справа поверх конуса, — «это всё вообще под строки». На странице «◯ Конус» текст конуса и 📜 лог лазера теперь в поле строк, под самими строками (до 45% высоты поля, дальше прокрутка), а конус занимает весь стол. В Zazerkalius — как было, справа в окне конуса.

Zazerkalius v0.143 — «исправь дизайн: слишком черно, ничего не видно, режет» (страница «◯ Конус»). Режет: кнопки конуса лежали полупрозрачной плашкой поверх холста (так задумано в окне Zazerkalius, v0.094) и закрывали его верх и левый край. На странице конуса кнопки теперь сплошной полосой сверху, конус — под ними на всё оставшееся место, шапки окна нет (название — в шапке страницы). Черно: у страницы конуса своя тёмная палитра, светлее и контрастнее: фон #171b26 вместо почти чёрного #0b0d12, панели и рамки светлее, подписи #b0b9cc, нули на кольцах #8f99ae. Её читает и холст конуса. Светлая тема (☀) и Zazerkalius — без изменений.

Zazerkalius v0.144 — «кнопки слишком высокие, сделай компактнее» и по снимку номеров строк (🔒, ↻3, номер) — «тут слева отступ ненужный». Отступ: ячейка номера — сетка из пяти колонок: замок, ↻ накрутка, номер и две по 4.6em под счётчики «⇄ н·м» и «0·1». Счётчики выключены — а колонки под них оставались, и между номером и строкой зияло около 120 px пустоты. Теперь колонки счётчиков появляются, только когда счётчики включены (в Zazerkalius тоже). Кнопки конуса на странице «◯ Конус» — ниже и плотнее: шрифт 12 px, почти без внутренних отступов, галки и ползунки меньше, группы теснее; полоса кнопок заметно ниже, конусу больше места.

Zazerkalius v0.145 — после трёх переделок полосы кнопок конуса по словам и двух макетов («в общем, как дизайн страницы делается — может, макет сперва?», «это проблема постоянная — есть что-нибудь такое, конструктор какой?») — «сделай тогда сначала это: чисто поля настроим, просто прямоугольные, чтобы мог создавать я руками». Первый шаг режима раскладки, пока на странице «◯ Конус»: кнопка ▦ Раскладка в шапке кладёт поверх стола сетку, на ней рисуются поля-прямоугольники — тянешь по пустому месту — новое поле, тянешь поле — двигается, за край или угол — размер (шаг 8 px), двойной щелчок — имя, правый — цвет, Del — удалить, Esc или «✓ Готово» — выйти; «+ Поле» — новое посреди стола. Поля хранятся в долях стола (Z.lay) — на другом экране встанут так же — и едут в «💾 Всё». Пока это только разметка; следующий шаг — разложить по полям кнопки конуса. Неудачная попытка v0.145 «панели в четыре колонки» (на узком окне колонки не помещались и резались) в git не ушла — откачена до выбора макета.

Zazerkalius v0.146 — «все кнопки стандартизируй и дай мне перемещать». Стандарт: на странице «◯ Конус» каждая кнопка, список, ползунок и галка — одинаковая плашка высотой 24 px, шрифт 12 px, одна рамка и скругление; галка стала кнопкой-переключателем (включена — голубая рамка и фон). Перемещать: в «▦ Раскладке» каждую такую плашку (и подписи групп, и строку счёта кругов) можно утащить куда угодно, в том числе на свои поля. Первый вход в раскладку снимает их с полосы кнопок ровно там, где они стояли, — ничего не прыгает; дальше полоса кнопок пуста и спрятана, конус на весь стол, а кнопки живут на столе сами по себе (Z.lay.items, доли стола, едут в «💾 Всё»). Пока раскладка открыта, кнопки не нажимаются — только тянутся. Поля теперь видны и вне раскладки — цветными панелями под кнопками. «↺ Кнопки на место» (в раскладке) возвращает кнопки на полосу; поля остаются.

Zazerkalius v0.147 — «готово; затем в редактировании дай прикреплять к полям сразу кнопки и двигать вместе, и размеры кнопок выровняй по стандарту». Прилипание: в «▦ Раскладке» кнопка, брошенная центром на поле, прилипает к нему — поле под ней подсвечивается, у прилипшей рамка цвета поля, у имени поля — «📎 число кнопок». Тянешь поле — его кнопки едут вместе с ним; тянешь поле за край — кнопки стоят на месте. Брошенная мимо полей — отлипает. Удалил поле — его кнопки остаются на местах свободными. Прилипшая хранит сдвиг от угла поля в px, свободная — место в долях стола. Стандарт размеров: высота 24 px, ширина — кратна 32 px без зазора 4 px (28, 60, 92, 124…), подписи по центру; с шагом сетки 8 кнопки встают ровными рядами и колонками.

Zazerkalius v0.148 — по снимку подсказки над полем строк («№ — выделить · Del · Ctrl+C/V · двойной щелчок — править») — «эти все подсказки текстовые вообще не делаем на HTML, если не попрошу: они из-за текста двигают панели». Правило для всего сайта (записано и в правила проекта). Здесь убраны: подсказка над полем строк (осталась всплывающей у слова «Строки»), строка «Наведи на кольцо… / Под мышью — строка N» в тексте конуса, «(двойной щелчок мимо колец — как было)» у масштаба и полоса подсказки внизу «▦ Раскладки» (всё это есть во всплывающих подсказках кнопок).

Zazerkalius v0.149 — «проверь, там все кнопки съехали». Стандартная ширина v0.147 (кратна 32 px) сделала кнопки шире — «одинаковые — цветом» из 162 px стала 188 — а места у них остались прежние, и соседи в ряду наехали друг на друга. ⇶ Выровнять (в «▦ Раскладке»): кнопки каждого поля и свободные делятся на ряды по высоте, ряд встаёт на сетку 32 px, кнопки в ряду — слева направо, не ближе 4 px к соседу (с шириной 32k − 4 это ровно следующая клетка), порядок сохраняется. Раскладка, сделанная в v0.146–0.148, выравнивается так один раз сама при загрузке; кнопки, впервые снятые с полосы, сразу встают ровными рядами через 32 px. Кнопки теперь тянутся по сетке 32 px (поля — по-прежнему 8).

Zazerkalius v0.150 — по снимку раскладки после автоматического ⇶ (кнопки торчат из своих полей влево и вверх: «одинаковые — цветом» из «Поля 8», стрелки «по биту» из «Поля 5»). Выравнивание v0.149 ставило кнопки по сетке всего стола, и у поля, чей угол не на этой сетке, кнопка съезжала за его край. Теперь у каждого поля своя сетка — от его угла, 8 px слева и 24 px сверху (под имя поля): и ⇶, и перетаскивание ставят кнопку в клетку поля, над которым она, не левее и не выше его края, а если помещается — и не правее и не ниже; не влезла в ряд — на новую строку от левого края поля. Свободные кнопки — по сетке стола, как было. Попутно по правилу «видимых подсказок не делаем» с холста 3D конуса и пирамиды убрано «— тяни: вращать, Ctrl: сдвиг, колесо: масштаб, двойной щелчок: как было» (осталось «поворот · наклон · высота»). И — «поле 4 — это то, что удалить, и поле 7» (в «Поле 4» пользователь сложил подписи групп и «весь:», ненужные на столе): в раскладке Del у выбранной кнопки или подписи убирает её со стола; всё убранное возвращает «↺ Кнопки на место». Выбрано поле — Del удаляет поле, как раньше (его кнопки остаются на местах).

Zazerkalius v0.151 — по снимку раскладки — «верни как было всё» (выбрано: «страницу как до раскладки»). Код Zazerkalius и страницы «◯ Конус» — снова как в v0.144: полоса кнопок конуса сверху, компактная, режима «▦ Раскладка» (v0.145–v0.150: поля, свободные кнопки, прилипание, ⇶, Del) больше нет. Оставлено только то, что к раскладке не относится, — видимые подсказки убраны по правилу пользователя (v0.148, v0.150). Раскладка, которую пользователь расставил руками, была испорчена автоматическим выравниванием v0.149 (оно записало новые места поверх) — и вернуть её было нечем: копии не осталось. Урок: не менять сохранённое пользователем без его команды, а перед любой такой правкой — копия.

Zazerkalius v0.152 — «поправь отображение битов в конусе: раньше цвет символа в строках был фоном сектора в кольце, сектор — бит». С v0.078 сектор единицы заливался её цветом почти сплошь (80%), а сектор нуля — на 28%, и нули читались тусклыми полосками, а не цветом своего символа. Теперь каждый сектор — сплошь ровно тем цветом, каким его символ стоит в поле строк (у 0 и у 1; неподвижные — красным/зелёным, как в поле), а цифра поверх — тёмная, цветом фона. В 3D — так же. Касается и Zazerkalius, и страницы «◯ Конус».

Zazerkalius v0.153 — три просьбы подряд. (1) «В строках уменьши межстрочный отступ до 0.7 минимум, когда не все строки помещаются по высоте»: межстрочный поля строк — переменная --rlh (обычно 1.25); после каждой отрисовки и при изменении высоты поля оно меряется, и если строки не влезают, шаг сжимается ровно настолько, чтобы влезли, но не ниже 0.7 — дальше прокрутка. У ужатого поля колонка номеров (замок, поворот, номер, числа) держится в высоту строки и мельчает вместе с ней — иначе значок 🔒 не дал бы строке стать ниже. Проверено замером (fs 18, поле 554 px): 20 строк — 1.25 как было, 26 — 1.07, 30 — 0.90, 34 — 0.80, 60 — 0.70 и прокрутка. ◸ 90° пересчитывает межсимвольный от нового шага. (2) По снимку левой панели — «все кнопки по 2 в строку умести, сократи текст названий и добавь значки, где нет»: построения (⇉ Код тоже — режим 1→10 остался в подсказке), треугольник (список пополам с кнопкой, пункты короче: 🔺 Паскаль, ▽ Спуск, ◯ Кольцо, ▦ Маска, 〰 Лента — полные — в подсказках), шрифт и размер в один ряд, шаблоны по два (свои, с ⚑ и ✕, — во всю ширину); значки шаблонам без них: ⇉ Туэ–Морс, 🪞 Палиндр., 🔁 Антипал., 〰 0101…, ⚠ Сбой 011…, 🎲 Случ. 16. Ни одна подпись не обрезается при ширине панели 249 px. (3) По снимку полосы конуса — «этой группе кнопок задай свой цвет полупрозрачный»: группа «Кручение» — золотистым полупрозрачным фоном и рамкой, подпись группы — золотом.

Zazerkalius v0.154 — «div tools (полоса кнопок конуса) — убери фон»: у полосы кнопок конуса подложки больше нет ни на странице «◯ Конус» (была сплошная цветом панели, черта снизу осталась), ни в окне конуса Zazerkalius (была полупрозрачная поверх холста). Цветные группы (v0.153 «Кручение») теперь лежат прямо на фоне страницы.

Zazerkalius v0.155 — четыре снимка подряд. (1) Строка «⟳ круг 0 · цикл — 1 круг (360°), каждый круг все кольца на местах · проходов лазера 0» — «текст удали»: её на полосе конуса больше нет (сам счёт цикла работает, «⟳ Цикл пройден» — сообщением внизу, как было). (2) «🧘 дзен» — «наверх перед Сохр.»: кнопка в шапке, перед «💾 Всё». (3) Группа «Запись» с «⏺ видео» — «в одну квадратную кнопку внизу холста слева»: группы нет, ⏺ — квадрат 32 px в левом нижнем углу холста (в записи — ⏹, время — в подсказке; в дзене скрыта; на видео не попадает — пишется только холст). (4) «⎯ граница» у черты под строками — «убери надпись»: подписи нет, черта тянется как была; сколько строк за ней — в строке сведений поля. Попутно вопрос «одинаковые — цветом — работает или дубль?»: не дубль и работает — обводит одним цветом кольца, которые поворотом совпадают (одна длина, одно ожерелье), но только в плоском виде; в треугольнике все строки разной длины, совпадать нечему — поэтому галка ничего не показывает.

Zazerkalius v0.156 — (1) «в один размер все, минимальный который» (выбрано: левая панель): кнопки и списки левой панели — одной высоты по самой низкой, 24 px (как «+ Строка»; прежде построения, шаблоны и «△ Строить» были 26, списки 25), с одними отступами; ширина и так одна — пополам (113 px), уже только список шрифтов, у которого значок 🔤. Столбик значков (◂) — как был. (2) По снимку «70 стр. · 2485 бит · текущ…» — «эту надпись серым текстом в поле строк сверху влево»: сведения поля ушли из полосы «Строки» в само поле — над строками, слева, мелко и серым; полоса кнопок поля осталась как была.

Zazerkalius v0.157 — (1) «пауза и двойной щелчок — воспроизведение по полю»: щелчок по конусу — пауза (как с v0.135), двойной щелчок по конусу — ▶ крутить. Сброс вида (масштаб, сдвиг, в 3D — поворот и наклон), который прежде висел на двойном щелчке, — теперь Ctrl + двойной щелчок. (2) По снимку выделенного треугольника — «выделения символов поправь»: полоса выделения браузера — во всю высоту шрифта (у Roboto Mono ~1.32 кегля), а шаг строк 1.25, в ужатом поле (v0.153) до 0.7 — полупрозрачные полосы соседних строк налезали друг на друга ступенями. Ячейка бит теперь режет всё, что выше и ниже своей строки (overflow-y: clip, по горизонтали — нет), выделение идёт ровными полосами. (3) «В поле конуса кнопки управления для 3D»: в правом нижнем углу холста, только когда включено 3D, — ⟲ ⟳ поворот по 15°, ▲ ▼ наклон по 10° (0…90°, как мышью), − + масштаб к центру, ⌂ вид по умолчанию; держишь — повторяется; в дзене скрыты.

Zazerkalius v0.158 — (1) По снимку текста конуса и лога лазера — «это всё в отдельное окно с полным закрытием, плавающим везде, кнопку в верхнее меню»: текст и лог ушли из окна конуса (справа) и из-под строк (страница «◯ Конус») в своё окно 📝 Текст конуса и лог лазера — поверх всего, на обеих страницах; тянется за шапку (не уходит за край экрана), размер — за правый нижний угол, ✕ закрывает совсем, «📝 Текст» в шапке открывает и закрывает. Открыто ли, место и размер — запоминаются. В дзене скрыто. (2) По снимку кнопки ↩ — «и повтор — слева от всех кнопок»: ↪ Повторить (Ctrl+Y или Ctrl+Shift+Z) возвращает то, что отменил ↩; новая правка строк повторы стирает. ↩ и ↪ — первыми в шапке, сразу за названием.

Zazerkalius v0.159 — снова «div tools — убери фон» (снимок из инструментов разработчика). У самой полосы кнопок конуса фона нет с v0.154 — цвет под ней давала подложка всего окна конуса (цвет панели, #1f2533). На странице «◯ Конус» окно конуса — весь стол, его рамки не видно, поэтому подложка у него убрана: под кнопками — фон страницы. В Zazerkalius окно конуса — как было, с подложкой (оно окно среди окон).

Zazerkalius v0.160 — по снимку колонки у строк — «сначала номера, потом замки, потом кручение»: столбики у каждой строки теперь номер | замок 🔒/🔓 | поворот ↻k | счётчики (прежде замок | ↻ | номер). Так же у строки для заполнения (номер | + | ✕) и у строк за чертой; щелчки по замку и по ↻ — как были.

Zazerkalius v0.161 — по снимку списка кручения: «Всё / Каждое / Встреч Стр / Встреч Бит — так же, как Каждое, но через строку одно направление». Пункты переименованы (всё целиком → Всё, каждое по биту → Каждое, навстречу через одно → Встреч Стр) и добавлен Встреч Бит: каждое кольцо поворачивается на бит за шаг, как в «Каждое», но строки 2, 4, … — в обратную сторону. Всё, что зависит от шага по биту, у него как у «Каждое»: скорость (бит в секунду = скорость / 10), шаги ◀ ▶, лазер и остановка колец на его проходе, счёт цикла (кольцо из n бит на месте через n бит в любую сторону — цикл тот же, НОК длин). Проверено: при фазе 1.5 кольца 1–4 повёрнуты на −1.5, +1.5, −1.5, +1.5 бита (в «Каждое» — все −1.5).

Zazerkalius v0.162 — три снимка. (1) По клиньям «сектора к центру» — «в секторах пиши биты 0 и 1, к центру низом»: в каждом клине — его бит, повёрнутый низом к центру (верх — наружу, к кольцу), на 0.8 радиуса кольца; кегль — по ширине клина там (до 64 px), клин уже 5 px — без цифры. (2) По снимку плоского конуса — «вид сверху на все — пиши 1 и 0 на секторах, на гранях этих»: цифры на секторах колец были и раньше, но только с 8 px и в 0.8 ширины кольца — у колец уже ~10 px их не было. Теперь символ почти во всю ширину кольца (0.95) и с 5 px; повёрнут так же — низом к центру. Проверено подсчётом на холсте 317 px: при ×3 — 613 цифр (кегль 8 px). При луч-часах ячейки по-прежнему пустые — 1 ставит лазер. (3) По снимку «◯ Конус» в шапке — «клик — перезагрузка»: щелчок по названию страницы в шапке перезагружает страницу.

Zazerkalius v0.163 — по снимку текущей строки (подсвечены только биты, у номера и замка — фон) — «выделяй всё со значками». У столбика номера подложка непрозрачная (при прокрутке вбок он стоит на месте, и биты под ним не должны просвечивать), и у текущей строки она была цвета фона, у выделенной — полупрозрачной. Теперь у текущей — тот же сиреневый, что у бит, у выделенной — тот же бирюзовый, у строки под мышью — как у бит, всё непрозрачное: строка подсвечена целиком, с номером, замком, ↻ и счётчиками. После Esc (нет текущей) — снова фон.

Zazerkalius v0.164 — по снимку кнопок 3D на холсте — «сюда же «Всё на места» — значком, зелёным»: в свободной клетке внизу слева — зелёная ↺, то же, что «⟲ всё на места» у кручения (накрутка колец, кручение, счёт, довод строки 1). Панель теперь есть и в плоском виде — там на ней одна эта кнопка на том же месте, кнопки 3D спрятаны.

Zazerkalius v0.165 — по снимку группы «Кручение» — «это всё так же, как менюшка выше, в таком примерно стиле, но цвет другой»: панель кнопок у холста конуса — группой, как «Кручение» (полупрозрачный фон, рамка, скругление), но бирюзовая; кнопки на ней — сплошные, цвета панели. В плоском виде, где на панели одна зелёная ↺, рамки и фона нет.

Zazerkalius v0.166 — по снимку «Кручение · весь: ⟲ ⟳» — «крутить по длине 1 бита нижней строки или выделенной — нижней самой, если несколько»: ⟲ ⟳ поворачивают весь конус не на 15°, а на один бит (360° / длина) самой нижней из выделенных строк, а если ничего не выделено — нижней строки конуса; держишь — дальше тем же шагом (раз в 0.14 с, прежде — плавно по 2°). Внизу пишется, по какой строке шаг и сколько градусов. Правый щелчок — к 0°, как было. Проверено: без выделения, нижняя 34 бит — 10.59°; выделены 4 и 10 — по строке 10 (9 бит) — 40°.

Zazerkalius v0.167 — два снимка. (1) Сведения поля «70 стр. · 2485 бит · текущая 54» — «надпись вправо, над замками — центральный замок (общий)»: сведения прижаты вправо, а слева в той же полоске, ровно над столбиком замков у строк, — общий замок колец (галка «запрет сдвига строк» в «Кольцах»): 🔒 — все кольца без своего замка заперты, 🔓 — открыты; щелчок — как по галке. Место по горизонтали ставится по замку первой строки (колонки номера — в em и мельчают в ужатом поле). (2) Полоса «Строки» — «удалить пустоту и текст, и так всё понятно»: полосы больше нет, её кнопки (⇄ н·м, ◸ 90°, 0·1, 🔓, неподв.) — в конце полосы ввода строки.

Zazerkalius v0.168 — по снимку «◯ к наименьшему» — «рядом с кнопкой — Неподв.» (уточнено вопросом): кнопка «🔴 неподв.» (неподвижные биты в строках и на конусе, щелчок — по кругу) перенесена из полосы ввода строки в группу «Вид» у конуса, сразу за «◯ к наименьшему».

Zazerkalius v0.169 — по снимку «1 поле» и замка под ним — «замок общий — на место «1 поле», его — вправо»: общий замок колец (галка «запрет сдвига строк») — кнопкой первым в полосе ввода строки, на месте списка полей; «1 поле» — в конце той же полосы. Полоска над строками — теперь только сведения, серым, справа.

Zazerkalius v0.170 — по снимку поля «впиши или вставь строку из 0 и 1» — «удали это поле»: поля ввода строки больше нет. Строки по-прежнему вставляются Ctrl+V прямо в поле строк (проверено: две строки встали под текущей, ↩ убрал), грузятся 📂 из файла, правятся двойным щелчком по строке.

Zazerkalius v0.171 — по снимку светлых толстых полос прокрутки (поле строк, окно текста конуса) — «нормальные скролы: чёрные, тонкие»: на всей странице полосы прокрутки тонкие, ползунок — цвета линий (в тёмной теме тёмно-серый), дорожка прозрачная.

Zazerkalius v0.172 — по снимку полоски «70 стр. · 2485 бит · текущая 8» над строками — «текст ниже — пустое устранит»: у сведений больше нет своей полоски — они лежат поверх поля строк, в правом верхнем углу (над вершиной треугольника пусто), на полупрозрачной подложке, мышь проходит сквозь; строки начинаются сразу под полосой кнопок.

Zazerkalius v0.173 — на вопрос о правиле «биты на конусе ↔ строки» — «покажи бит, щелчок с Ctrl — смена бита». В плоском конусе бит под мышью обведён золотом, тот же бит подсвечен золотом в его строке в поле (Highlight API браузера — строки не перерисовываются), в подсказке холста — «строка k, бит m: 0/1». Ctrl + щелчок по сектору меняет этот бит 0 ↔ 1 в самой строке (↩ вернёт, замок строк не пускает). Бит определяется по углу с учётом поворота всего конуса и накрутки кольца. Прежний Ctrl + щелчок (выделить кольцо) — теперь Shift + щелчок; сброс вида (v0.157: Ctrl + двойной щелчок) — теперь Alt + двойной щелчок. Проверено: строка 5, бит 3 — рамка, в строке подсвечен тот самый 0; Ctrl + щелчок — 10000 → 10100, ↩ — снова 10000. И на вопрос «нужен ли второму замку свой значок» — «да»: замок на изменение строк теперь ✎ (открыт) / ⛔ (закрыт), не путается с общим замком колец 🔒/🔓.

Zazerkalius v0.174 — по снимку «снять ↻» и «⟲ всё на места» — «это всё одна кнопка — сброс на начальные биты… или нет, по-другому — цветом отличи»: кнопки остались разными, но «⟲ всё на места» — зелёная (как ↺ на панели у холста), «снять ↻» (только накрутка колец на вид) — бирюзовая.

Zazerkalius v0.175 — «пауза — не один, а двойной щелчок»: одиночный щелчок по конусу или по полю строк кручение больше не останавливает (так было с v0.135); двойной щелчок по конусу — и пуск, и пауза (с v0.157 он только запускал). С Ctrl, Alt, Shift двойной щелчок кручение не трогает. Проверено: двойной — ▶, одиночные по конусу и полю — крутится дальше, ещё двойной — пауза.

Zazerkalius v0.176 — «режим дзен с показом кнопок пульта, по колесику-щелчку вкл/выкл, масштаб, перемещение — всё мышкой» и «кнопками стрелки». В дзене виден пульт у холста (кнопки 3D и зелёная ↺). Щелчок колесом по конусу (не сдвигая мышь) — дзен вкл/выкл; тянуть с зажатым колесом — сдвиг вида, в плоском и в 3D, в дзене и без него. Колесо — масштаб, как было. В дзене стрелки двигают вид (с Shift — шагом вчетверо крупнее), + − — масштаб к центру. Проверено: щелчок колесом — дзен, пульт виден; ← — сдвиг на 40 px; + — ×1.2; перетаскивание колесом — сдвиг, дзен не выключился; ещё щелчок колесом — дзена нет.

Zazerkalius v0.177 — по снимку полосы групп конуса — «возможность перетаскивать каждую группу в любое место, с фоновым перекрытием всех ниже»: группу (Вид, Кольца, Кручение, Лазер) тянут за её подпись — она выходит из полосы и висит поверх холста на непрозрачной подложке (у «Кручения» — со своим золотистым оттенком), с тенью; последняя тронутая — сверху; за край стола не уходит. Двойной щелчок по подписи — обратно на полосу. Места запоминаются (Z.cgrpPos, едут и в «💾 Всё»); меняет их только перетаскивание — сами группы не выравниваются и не переставляются (урок v0.149–0.151). Проверено: «Кручение» утащено на холст — поверх, место запомнено; двойной щелчок — снова на полосе, место стёрто.

Zazerkalius v0.178 — по снимку окна «📝 Текст конуса и лог лазера» — «скролл, места много внизу»: текст конуса был ограничен 60% высоты окна и прокручивался при пустом низе. Теперь он занимает всё свободное место окна, а когда виден лог лазера — они делят окно пополам. Проверено: окно 300 px — текст 265 px из 273 без лога; с логом — 132 и 132.

Zazerkalius v0.179 — по снимку пульта у холста — «перемещаемым»: в пустой клетке пульта — ручка ⠿; за неё (или за фон между кнопками) пульт тянут куда угодно по холсту, за край не уходит; двойной щелчок по ручке — обратно в правый нижний угол. Место запоминается (Z.padPos), меняет его только перетаскивание. Проверено: утащен на 100 влево и 150 вверх — место запомнено; двойной щелчок — снова в углу.

Zazerkalius v0.180 — по снимку группы «Вид» (две строки, список лучей уехал вниз) — «пересобрать, дать значки, сократить текст»: ◯ к мин., 🔴 неподв., 🎨 одинак., 👁 выдел., ◔ сектора, ⬡ многоуг., 🧊 3D, ⧗ зеркало, ↕ (высота), ✨ свет, лучи — ✳ нет / ✳ выдел. / ✳ все. Полные названия — в подсказках (у «одинак.» и «к мин.» дописаны в начало подсказки). На широком экране группа — в одну строку.

Zazerkalius v0.181 — по снимку галок «Вида» — «все галки в кнопки»: все десять галок на полосе конуса (🎨 одинак., 👁 выдел., ◔ сектора, ⬡ многоуг., 🧊 3D, ⧗ зеркало, ✨ свет, запрет сдвига строк, ⌖ луч-часы, ▦ до 256) — кнопками-переключателями: сама галка спрятана, щелчок по кнопке переключает её, как раньше; включённая — как нажатая кнопка, с золотой рамкой (как у других кнопок-переключателей). Логика не менялась — только вид.

Zazerkalius v0.182 — «кнопка пресетов цветовой гаммы»: в шапке, перед ☀ — 🎨 гамма: щелчок — следующая, правый — предыдущая. Семь гамм: Исходная (как было), Янтарь, Океан, Лес, Роза, Огонь, Контраст. Гамма задаёт цвет единиц, нулей и акцент — ими красятся строки, конус и окна; у каждой свой набор для тёмной и светлой темы (переключение ☀ и смена темы системы — подхватывают). Выбор запоминается и едет в «💾 Всё». Проверено: «Океан» — единицы в строках и на конусе #38bdf8, нули приглушённо-синие; по кругу — снова «Исходная».

Zazerkalius v0.183 — по снимку группы «Вид» в одну длинную строку — «в каждой полоске подели длину пополам, расположи в 2 ряда, кнопки ровно друг под другом»: каждая группа конуса — сетка в два ряда: подпись группы слева на оба ряда, дальше столбцы (их — половина видимых кнопок группы, с округлением вверх); кнопки одного столбца — одной ширины, ровно одна под другой. Группа вдвое короче; не влезает в ширину стола — переносится целиком на следующую строку. Проверено замером: в «Виде» левые края кнопок верхнего и нижнего ряда совпадают, ширины в столбце равны.

Zazerkalius v0.184 и Хаб v0.038 — по снимку конуса-октаэдра в дзене — «на обои вместо — в index поставим?» (выбрано: вместо обоев, надпись оставить) и «старые обои — перенести в Обои». Живой фон хаба — теперь конус Zazerkalius: новый режим страницы ?solo=cone&bg=1 — только конус (3D, зеркало вниз, свет, высота ×2.6, наклон 12°), строки — Серпинский на 64, медленно крутится целиком; ни кнопок, ни подсказок, ни сообщений; память не читает и не пишет — настройки и строки страницы «◯ Конус» фон не трогает. Кадр ~20 мс — фоном не чаще 20 кадров в секунду. Надпись Zerkalius ⇄ Зеркалиус прежде рисовали обои — теперь её даёт сам хаб (#hubTitle, переливается, язык меняется, как раньше). Старые обои (Серпинский с дождём) — по кнопке «Обои» в хабе, как и были.

Zazerkalius v0.185, Битмультфильмы v0.006, Хаб v0.039 — «сохранил пресет — как его дальше, например в Мультфильмы? тебе прислать или скрипт сделаем?» (выбрано: живой конус). Файл «💾 Всё» нашёлся сам в «Загрузках». Пресеты конуса: папка zazerkalius/presety/, скрипт dobavit.py <файл.json> <имя> "Название" ["подпись"] кладёт пресет файлом <имя>.js (не .json — чтобы открывался и с диска) без лишнего (раскладка окон, места групп и пульта, свои шаблоны, копия умолчания — 96 КБ → 23 КБ) и дописывает его в spisok.js; --del <имя> — убрать. Страница конуса с ?solo=cone&preset=<имя> показывает пресет как фон хаба: только конус и кручение, память не читает и не пишет. В «Битмультфильмах» — раздел «Конусы — живые пресеты»: карточки строятся сами по списку, конус крутится в карточке, щелчок — на весь экран. Первый пресет — «Октаэдр · 70 строк» (встречное кручение по строкам, лазер, многоугольники, зеркало через центр). Попутно: в дзене на узком экране у конуса был отступ окна 8/16 px — убран. И «может, название не нужно? … мешает — лучше убери»: большой надписи Zerkalius над конусом в хабе больше нет.

Хаб v0.040 — по снимку кнопки «Код» в Черновиках — «сюда напиши Зеркалиус»: кнопка Zerkalius-code.html теперь Zerkalius / Зеркалиус (была Code / Код); язык меняется, как у остальных.

Хаб v0.041 и общий _js/hub-link.js — «oktaedr — лого на сайт, и на значок „в Хаб“ на всех; поменяй расположение кнопки хаб, как тут сделал». Знак Zerkalius (oktaedr/zerkalius-mark.svg, песочные часы в два цвета) стал значком вкладки у хаба и у всех страниц, где своего нет, и заменил ⌂ на значке «в Хаб». Сам значок перенесён из левого нижнего угла в шапку, перед заголовком страницы (#appTitle или первый h1), как в Zazerkalius v0.321. Если заголовка нет или он спрятан, значок стоит в левом верхнем углу. Правка одна, в общем модуле, поэтому страницы своих версий не меняли.

Общий _js/hub-link.js — «Zerkalius-treugolnik — поправь кнопку Хаба» и «кнопка хаба должна быть как в лого, но 3D, и крутящаяся, светящаяся». Значок «в Хаб» на всех страницах теперь не картинка, а знак Zerkalius объёмным октаэдром на тёмной плашке: верхняя пирамида голубая, нижняя золотая, пояс светлый, как в логотипе. Октаэдр медленно крутится вокруг оси, рёбра светятся, свечение дышит; ближние рёбра ярче дальних. Когда значок спрятан (дзен, фон хаба) или вкладка не видна, он не рисуется. Место прежнее — перед заголовком страницы (у Треугольника — в «Zerkalius Треугольник» над левой панелью); щелчок ведёт в Хаб и не перезагружает страницу.

Хаб v0.042 — по снимку кнопки «Зазеркалиус» — «под Треугольник, Битмультфильмы — в Записи, из Черновиков убрать Конус». Главные кнопки хаба теперь Треугольник и под ним Зазеркалиус (из Черновиков). «Битмультфильмы» переехали в «Знак и записи». Стрелки Треугольник → Битмультфильмы сняты: они вели к кнопке, которая уехала. «Конус» убран из Черновиков, но сама страница цела: ссылки из Битмультфильмов (?solo=cone&preset=…) работают.

Zazerkalius v0.538 — по снимку свёрнутой левой панели — «как-то криво стрелка меню лежит». Стрелка ▸ (#bPaneIcons) в столбике значков оставалась со сдвигом из развёрнутого вида, где она стоит в углу панели (right 12 px, top 8 px): с position: relative он сдвигал её на 12 px влево — за край — и на 8 px вниз. В столбике сдвиг снят: стрелка по центру, над 💾 (центры совпали, 18,5 px).

Zazerkalius v0.537 — «здесь заготовка тоже — выбираться вместо 90 и 30, чтобы при растяжении вниз она продолжалась». Список «📋 заготовка…» под чертой — четвёртый способ достройки рядом с 🔺 Серп 90 / 30 / маской: выбор заготовки, как прежде, заполняет поле, и она же становится способом достройки (Z.cutGen = "p:" + значение; «⤒ из-под черты» гаснет, либо-либо как у 90 / 30). Черта вниз достраивает строки по номеру — строка i та же, что дала бы заготовка с нынешним сидом и столбом (cutPresetRows: правила — с фоном за краем, как сама заготовка; последовательности — их продолжением). Выбранная заготовка остаётся в списке и горит золотом; 90 / 30 / маска — список снова «заготовка…». Проверено: R30 16→40, Паскаль 16→33, R18 8→20, Туэ — Морс 10→25 — строка в строку с заготовкой.

Zazerkalius v0.536 — по снимку свёрнутого «Звука» полоской в заголовке окна конуса — «скрылась за заголовком и никак не вытащить; пусть при двойном клике по заголовку группы она сворачивается и перемещается влево вверх поля». Причина: place() держал группу не выше верха окна (wb — само окно, его верх — верх заголовка), и группа могла встать под полосу заголовка, где её не схватить. Теперь верхняя граница — низ заголовка окна (wbTop; в дзене заголовка нет — верх окна); сохранённая выше — сама встаёт под него. Двойной щелчок по заголовку группы на окне конуса: свернулась — уезжает в левый верхний угол, свёрнутые — столбиком одна под другой, прежнюю высоту не держит (Z.cgrpMin = −1); развернул — обратно на своё место (Z.cgrpMinPos, и на поле строк тоже). В дзене и на левой панели — как прежде.

Zazerkalius v0.535 — «534 также» (прыгает и после v0.534). Замер из консоли пользователя (10 с при Аниматрице): ширина группы стоит (341), а у «весь:» основа переключается 3 ↔ 6 сторон, при 6 — «⟳» строкой ниже. Причина — cgbSnap (v0.339, подбор ширины «1 / 2 / 4 кнопки»; при Аниматрице — каждый кадр): подписи .glab2 и заголовку он ставил ширину кнопки (83 px) простым style.width, поверх своей; triTag видел чужую ширину и считал её заданной (round(83 / 2t) = 6), а пересчёт без cgbSnap — снова по тексту, 3. Теперь cgbSnap подписи и заголовки групп из треугольников (конус, левая панель) не трогает — их меряет только triTag. Проверено на экспорте: cgbSnap и triTag поочерёдно и 3 с Аниматрицы — «весь:» всегда 3, ⟳ в первом ряду. Урок: при v0.534 не воспроизвелось, потому что в проверке не было кадров Аниматрицы с cgbSnap — замер у пользователя из консоли нашёл за один заход.

Zazerkalius v0.534 — по двум снимкам «Кручения» (⟳ то в первом ряду, то строкой ниже) — «прыгают кнопки при Аниматрице включённой». У группы с заданным размером (ромб) tzJustify раскладывал ряды при заданной ширине, а под конец подрезал группу до самого длинного ряда (383 вместо 390); следующий пересчёт — их зовут перемены надписей и классов, при Аниматрице постоянно — начинал уже от другой ширины, и раскладка переключалась: «весь:» растягивался то на 3, то на 6 сторон, ⟳ переносился. Перебор ширин 330–426 px на экспорте пользователя: прежде на большинстве ширин два состояния (например 341 / 396), теперь группа ровно своего размера и пересчёт даёт одно и то же (12 подряд; с Аниматрицей и кручением 3 с — без перемен). Группы без заданного размера — как прежде.

Zazerkalius v0.533 — по снимку «Кручения» — «прыгают кнопки при Аниматрице включённой, и перенеси кнопки шагов, поставь по бокам от Крутить». По свежему экспорту: блок «◀ крутить ▶|» стоит после ползунка «бит/с» (перестановка ✎ пользователя), а «◀» рисовался стрелкой-шевроном в 29 px (значок ◀ — признак формы-стрелки, RH_TRI) и сливался с ползунком. Шаг назад теперь «|◀» — обычная полукнопка шириной с «▶|»: |◀ ▶ крутить ▶|. Прыжки при Аниматрице на экспорте не воспроизвелись (1366 и 1600 px, обычный вид и дзен, с кручением и без, первые секунды после загрузки) — ждут уточнения.

Zazerkalius v0.532 — первый шаг по слову «в процессе понемногу исправляй кнопки все под стандарт треугольников, сам смотри по дизайну» (только Zazerkalius). Кнопки в шапках всех окон (? ⛶ ↗ ⧉ – и свои, как «⇄ строки» у октаэдра) — цепочкой из треугольников, как верхнее меню: первая остриём, следующие выемкой на остриё соседки, вплотную (lpWin, вызывается следом за lpTop). Обводка — цветом прежней рамки (⛶ развёрнутого окна — золотом; при «▱» — цветом фона). Высота шапки прежняя (поля сверху и снизу 2 px вместо 4). Правила шапки сильнее общих (:is(.whead.lpt, #zzNo#zzNo)), иначе общие поля t + 2 обрезали значки.

Zazerkalius v0.531 — по снимку «Вида» — «поправь расположение и ширину ползунка, один слишком маленький». Ползунок высоты ↕ был нарисован в «△ Сетке» уже стандарта, и показывался крошечным (v0.523 подрезала только лишнее, а нехватку не добавляла). Теперь ползунок, нарисованный уже 12 сторон, показывается стандартным: столбцы дорисовываются справа (на чётное t), а кнопки правее в тех же рядах сдвигаются ровно на нехватку места (стоят с просветом — не двигаются). Рисунок не меняется; сдвиг учтён в виде «Сетки» (_tzcSh).

Zazerkalius v0.530 — по снимку ↩ ↪ — «сделай обе шире и одинаковой ширины, тут сделай пропуск между ними — ромб, стрелка влево, вправо». ↩ — стрелка влево (остриё слева, выемка справа), ↪ — вправо (выемка слева, остриё справа); стоят встык уголками, между ними ромб фона; обе шире ещё на ромб (data-tzw=2) и одной ширины. Кнопка заходит на соседку, только если у той справа остриё (выемка к выемке — встык); «📝 Текст» по-прежнему заходит на остриё ↪.

Zazerkalius v0.529 — по снимку «📌 ✦ Развёртка» — «дальше кнопки вогнутые (внутрь), и прижми кнопки, и так везде, чтоб не было пустот». Шапка — цепочка «остриё в выемку», как в группах конуса: у каждой кнопки справа остриё, у следующей слева выемка, и она заходит на соседку на t (прежде — выемка к выемке, ромбик фона между, и пары 📌 / ↩ ↪ стояли отдельно с промежутком). Цепочки по-прежнему делятся только надписью и распоркой. ↩ — первая в своей цепочке (остриё с обеих сторон), ↪ — стрелка вправо, как и все следующие. Перенеслась на новую строку — начинает её остриём. На 1600 px шапка входит в строку без уменьшения шрифта.

Zazerkalius v0.528 — по снимку 📌 в шапке — «тут у кнопки стрелки обе наружу сделай». 📌 (закрепить наверху) — шестигранник: остриё и слева, и справа (data-tzl / data-tzr, v0.527); стоит отдельно от закреплённых кнопок, с промежутком.

Zazerkalius v0.527 — по снимку ◂ у «Страница целиком» — «высота стрелки не как у кнопки: у кнопки обводка съедает высоту, у стрелки так же надо»; и по снимку стрелок шапки — «вправо стрелка — надо форму кнопки так же стрелкой вправо». ◂ (свернуть панель): светлая обводка шла по самому краю, и стрелка казалась выше заголовка; теперь край — тёмный, как у заголовка (та же заливка, те же 24 px), а светлая обводка — внутри, в 1,5 px от края (::before — обводка, ::after — сердцевина). Шапка: ↩ — кнопка-стрелка влево (остриё слева, выемка справа), ↪ — вправо (выемка слева, остриё справа); пара стоит отдельно от соседних кнопок (data-tzl / data-tzr в lpTop — свой край кнопки).

Zazerkalius v0.526 — по снимку стрелок шапки — «стрелки пошире на 1 ромб, правую сделай стрелкой вправо, а не как сейчас, и перемести их правее, перед кнопкой Текст». ↩ отменить и ↪ повторить (v0.158, были первыми в шапке) стоят теперь прямо перед «📝 Текст» и шире на ромб (data-tzw — сколько ромбов прибавить к ширине по надписи, lpTop). Повтор — та же стрелка ↩, отражённая вправо (прежний знак ↪ в шрифте выглядел не парой к ↩). Шапка на 1600 px по-прежнему в одну строку.

Zazerkalius v0.525 — «убери изначальную прозрачность в группах Конуса у кнопок». Кнопки, поля и галки, что не действуют в нынешнем режиме («Лазер» в 3D, ↔ без «⁑ авто» и т. п., v0.208 / v0.373), были прозрачными целиком (35 %) — сквозь них просвечивал конус. Теперь они непрозрачные — фон и обводка как у всех, а неактивность видна по бледной надписи. Проверено: 31 такой элемент — непрозрачные, других прозрачных в группах нет.

Zazerkalius v0.524 — по снимку шапки — «либо текст сократи, либо кнопки увеличь — не помещается». Ширина кнопки шапки считалась без выемок на стыках (они съедают место у надписи с обеих сторон) — надпись упиралась в края. Теперь кнопка — надпись, поля и выемки. Кнопки от этого шире, и на узком окне шапка может не влезть: тогда шрифт её кнопок мельче (до 10 px), а если и так тесно — поля у надписей уже. Проверено: 1600 px — 12 px и широкие поля; 1366 px — 10 px, узкие поля, вся шапка в окне, ни одна надпись не обрезана.

Zazerkalius v0.523 — по снимку «Вида» — «ширина кнопок — стандарт». Рисунок группы конструктора снимали, когда ряды растягивались до края, — кнопки в нём шире своих (у пользователя «👁 выдел.» — 141 px, список лучей — 147, ползунок — 231). Теперь кнопка, нарисованная шире стандартной (полкнопки 3 стороны, кнопка 6, двойная и ползунок 12, tzcStd), показывается стандартной: лишние столбцы справа не в счёт; рисунок не меняется. Заодно кнопка из разнесённых кусков — только левым: громкость «Звука» (клетки вперемешку с темпом) — снова полной длины. Проверено на настройках пользователя: в «Виде» и «Звуке» — 92 и 175 px.

Хаб v0.074 и Zazerkalius v0.522 — «не видно бегающего бита по треугольнику» и «убери выделение текста кнопок». Хаб, открытый файлом (file://), не может читать фон напрямую — страницы-файлы для браузера разные «адреса», и звучащие биты (zzSndHeads), по которым на треугольнике горит бит, до хаба не доходили (звук шёл — команды фону уходят сообщениями). Теперь фон сам шлёт хабу звучащие биты сообщением { zerkHeads } на каждом шаге. На компьютере треугольник был вполсилы целиком (с бегущим битом); теперь бледнее только его биты, бегущий — во всю яркость. Текст хаба больше не выделяется (щелчками по кнопкам выделялась надпись «Треугольник»). Проверено: «Ми» — за 2 с пришло 11 сообщений, жёлтый бит виден на треугольнике.

Хаб v0.073 — «убери включение по щелчку 7 нот; изначально пусть все неактивны, и только при нажатии начинает играть та, на которую нажал». Первый щелчок по хабу больше ничего не включает (v0.072 включал все семь). Нота включает и выключает только себя; кнопка меню просто ведёт дальше; щелчок по пустому месту — пауза / дальше, только когда что-то звучит (из тишины ничего не включает). Правый щелчок по пустому месту — сброс, как был (все семь с начала). Проверено: пустое место — ноты не горят; «Ми» — горит и звучит только она; пустое место — пауза.

Zazerkalius v0.521 — по снимку шапки — «сделай меню верхнее в стиле треугольников также». Кнопки шапки — из тех же треугольников (lpTop, вслед за левой панелью): стоящие рядом — одна цепочка, как ряд левой панели (по краям острия, на стыке выемка к выемке — ромбик фона): ↩ ↪ 📌 и закреплённые окна — одна, «📝 Текст … 📖 Подсказки» — другая. Длина — по надписи, поля 4 px (надпись заходит в острия — шапка не шире прежней). Обводка — цветом прежней рамки кнопки: включённые «⤒ К верху», «⇆ строки…» — золотом, «📝 Текст», «🎨 Гамма» — своим. Свои же правки шапки наблюдатель изменений не принимает за повод пересчитать (takeRecords) — без зацикливания.

Zazerkalius v0.520 — по снимку «Заготовок» — «выровняй все кнопки под стандарт ширин». Кнопки одного ряда левой панели — одной ширины: две в ряд — ровно пополам (121,8 px при панели 261), во всех разделах одинаково, одна — во всю ширину; ширина делится по самой ширине, а не по числу сторон (у кнопок края разные — остриё и выемка). Если какой-то надписи доля мала — как прежде, лишнее по стороне по кругу.

Zazerkalius v0.519 — по снимку «Страница целиком ▷ ‹» — «наверное, надо обводку стрелки сделать, чтобы по высоте с заголовком стала стрелка». Стрелка ◂ (свернуть панель) уже стояла вровень с заголовком и его высоты (24 px), но светлой заливкой без края казалась крупнее. Теперь она — как заголовок: та же тёмная заливка, по краю — светлая обводка (внутренняя стрелка на 1,5 px меньше); наведение — ярче. У свёрнутой панели — то же, стрелкой вправо.

Zazerkalius v0.518 — «при скрытии невозможно потом развернуть левое меню». Кнопка ◂ / ▸ (v0.516 — «стрелка» из треугольников, значок спрятан) в панели значками стоит в колонке, и пустая кнопка сжималась по высоте в 0 — развернуть было нечем. Теперь у неё высота ряда, не сжимается; проверено: свернул — стрелка вверху колонки значков, нажал — панель развернулась.

Zazerkalius v0.517 — по снимку списка заготовок и полосы под чертой — «эти заготовки перенеси под горизонт строк, вот сюда», и «здесь значки удали из заголовков». «📋 заготовка…» (из «Аниматрицы») с её «стр.» и «сид» — под чертой поля строк, за «Серп 90 / 30 / маска» (▦ 256 осталась в «Аниматрице»). Заголовки левой панели — без значков: «Страница целиком», «Треугольник из строки», «Нарезать треугольник», «Группы конуса»; свёрнутость, записанная под прежним текстом, переходит на новый. Ширина панели уже заголовков больше не записывается своей — это ширина по умолчанию (по заголовкам).

Zazerkalius v0.516 — по снимку узкой левой панели — «помести текст в минимальную ширину и сделай её по умолчанию; цвет серый слишком яркий для кнопок-заголовков, а у подкнопок наоборот слишком незаметно — выровняй дизайн», и по рисунку из «Сетки» — «эту кнопку сделай из треугольников». Ширина левой панели — не меньше той, в которую входит самый длинный заголовок раздела целиком (lpMinW: текст, поля, значок, у первого — место под ◂), она же по умолчанию (прежде 250 px); тянуть уже нельзя, сохранённая уже — поднимается. У первого заголовка снято старое поле в 44 px под ◂ (место уже вычтено из ширины). Заголовки — тусклее (13 % акцента на фоне панели), кнопки — заметнее (16 % акцента на своём фоне, светлая надпись). ◂ (свернуть панель) — «стрелка влево» из четырёх треугольников, у свёрнутой — вправо; ▾ / ▸ у заголовков — равносторонние треугольники ▽ / ▷.

Zazerkalius v0.515 — по двум рисункам из «Сетки» — «боковое меню сделай так: для заголовков — 2-й рисунок, для 2 кнопок в ряд — 1-й», и «убери пустоту по вертикали, выровняй кнопки по ширине с краями заголовка». Заголовок раздела — шестигранник во всю ширину (острия с обеих сторон). В ряду кнопок края ряда — остриём, на стыке у обеих кнопок выемки: кнопки касаются уголками, между ними ромбик фона; ряд из одной кнопки — шестигранник во всю ширину. Ряды теперь раскладываются по расчётной ширине (прежде — как ляжет перенос, и после растяжки кнопки перескакивали в другой ряд, края путались, в «Нарезать» ✂ и ▲ раздувались); поле «16» стоит в ряду своей шириной. Ряд дотягивается до края заголовка точно: остаток меньше стороны треугольника отдаётся кнопке дробной долей. «Заготовки» больше не растягиваются на всю свободную высоту (пустота до «Окон» ушла), их кнопки снова в общем виде (обёртки .tpl растворены — проверка видимости их отбрасывала).

Хаб v0.072 и Zazerkalius v0.514 — «индекс: убери блокировку кнопок, и при любом нажатии запускай все ноты сразу, и в комп. версии не видно треугольника почему-то». Замок меню (v0.055 — притушено и не нажимается, пока не загорятся все семь нот) снят: меню живое сразу. Первое нажатие где угодно — по пустому месту, по ноте или по кнопке меню — включает все семь нот разом: фон (Zazerkalius) на включение и на щелчок из тишины теперь включает все семь головок, а не До и Ре; нота при первом нажатии не переключается сама. Серпинский из ромбов прежде был только на сенсорном узком экране; теперь и на компьютере — один, по центру во всю высоту, фоном за нотами и меню, приглушённо; звучащие биты горят цветом своих нот. Проверено: щелчок по пустому месту и по «Ми» — горят все семь; на телефоне хаб как был.

Zazerkalius v0.513 — «посмотри мобильную версию» (проверено на 375 × 812 с настройками пользователя). Окно конуса на телефоне схлопывалось до 60 px: холст лежит в нём поверх (absolute), а группы — по своим настольным местам; теперь на узком экране (≤ 760 px) холст сверху квадратом во всю ширину окна, группы под ним стопкой своим ходом. Ширина группы, заданная ромбом на большом экране, на телефоне — не больше ширины окна (tzSzW: и обычные группы, и группы конструктора — «Звук» раскладывал рисунок под 681 px и обрезался). Блоки шире экрана («🎵 музыка × щель …» в «Лазере», 381 px) переносятся внутри себя. Шапка — в несколько строк (уходила вправо за край). Ручка ширины левой панели на телефоне спрятана (вылезала на 3 px). Полоса над строками по-прежнему одной строкой с прокруткой вбок — так решено в v0.217. Страница больше не шире экрана.

Zazerkalius v0.512 — по снимку «Аниматрицы» — «дёргается ширина при нажатии некоторых кнопок». Ширина группы шла по самому длинному ряду, а кнопки, которые показывают и прячут поля (▮ Столб — «8» и «0»), меняли самый длинный ряд — и с ним ширину всей группы. Теперь у группы с размером, заданным ромбом, ряды дотягиваются до самого размера, и ширина от показанного почти не зависит: «Аниматрица» (375) — 369 px и с полями, и без. Группа без заданного размера — по-прежнему по самому длинному ряду.

Zazerkalius v0.511 — по снимку «Кручения» — «тут прыгают все кнопки при смещении ползунка, и перемести кнопку Крутить между стрелками шагов, и последняя нажатая шаг задаёт вращение направление, и кнопка Против — лишняя»; по снимкам левой панели — «не работает скрытие, тут кнопка наложилась, сделай фон менее заметным». Блок шага теперь ◀ ▶ крутить ▶| (один неразрывный блок, .cunit — сохранённая перестановка «Встреч Стр» перед «крутить» встаёт перед ним), ползунок скорости — следом. ◀ ставит направление кручения против часовой и шагает, ▶| — по часовой и шагает; горит стрелка нынешнего направления. «↻ по часовой / ↺ против» скрыта (пульт ↻ работает через неё). Раскладка «Кручения» проверена с включёнными фоновыми пересчётами при движении ползунка — одна, 341 × 72. Левая панель: свёрнутый раздел снова скрыт (display:flex блока перебивал скрытие), первый заголовок не заходит под ◂, заголовки — приглушённый акцент со светлой надписью, в одну строку и не сжимаются.

Zazerkalius v0.510 — по снимку левой панели — «в этом же стиле попробуем тут». Разделы левой панели (Страница целиком, Шаблоны, Построения, Треугольник из строки, Нарезать, Заготовки, Окна) оформлены как группы конуса: заголовок раздела — залитая «стрелка вправо» цветом акцента с тёмной надписью (свёрнутый раздел — бледнее), кнопки и списки — из тех же треугольников, цепочкой «остриё в выемку», вплотную. Длина кнопки — по надписи (значок — полкнопки), и каждый ряд дотягивается до правого края панели, по стороне на кнопку по кругу. «Окна» — по одной кнопке в ряд во всю ширину. Раскладку ведёт lpTag (после triTag, при изменении размера и состава блоков). В режиме «панель значками» (◂) всё как было.

Zazerkalius v0.509 — «так меняет высоту при изменении ползунка» (снимки «Кручения» в своём порядке кнопок), «сделай норм стрелки и кнопку плей и пауза по стандарту» (блок ◀ ⏵ ▶ «Звука»), «у звука ползунок громкости». Добивка ряда дотягивала ряд до края впритык, и доли пикселя то влезали, то нет — ⟳ перескакивал строкой ниже при каждом пересчёте. Теперь перед растяжкой у группы запас в 1 px; проверено при 360…400 px на всех значениях ползунка — высота одна. ◀ ⏵ ▶ в группах — обычные значковые кнопки (полкнопки) со значками ◀, ⏵ / ❙ / ⏸, ▶: прежде стрелки были формой без значка (значок прозрачный), со своей чертой-разделителем. Ползунок громкости короткий из-за рисунка конструктора: клетки ♩ и 🔊 в нём перемешаны через полосу (♩ — столбцы 0–22 и 32–37, 🔊 — 23–31 и 38–46) — так рисунок сняли раньше, когда число и значок ползунка стояли поверх соседнего. Свежий снимок даёт каждому ползунку один кусок.

Zazerkalius v0.508 — по снимку «Вида» — «ромб растяжки, который внизу должен быть, где-то гуляет». В v0.507 ромб садился на нижнюю из кнопок, доходящих до правого края, — у группы конструктора это мог быть средний ряд. Теперь ромб всегда в нижнем ряду, у правого края группы: на последней кнопке ряда, если она дошла до края, а у короткого ряда — на рамке справа. Проверено на всех группах с настройками пользователя: ромб в правом нижнем углу.

Zazerkalius v0.507 — по снимкам «Вида» — «ширина огромная» — и «Кручения» — «прыгает высота при ползунке». Три причины. (1) В рисунке конструктора элемент без id помнится по номеру среди детей блока («@18»), а номер считался вместе со служебным слоем обводки (.tzco): «👁 выдел.» перенесли в конец, слой встал на её номер и растягивался как кнопка на 596 px, а сама кнопка терялась — группа раздувалась. Слой и ручка в счёт номеров больше не идут. (2) Ромб-ручка стояла на последней кнопке нижнего ряда — у группы конструктора нижний ряд короткий, ромб оказывался у левого края, и сузить группу им было нельзя. Теперь ромб — на самой нижней из кнопок, что доходят до правого края. Ширина рисунка при переносе — не меньше самого широкого блока (прежде группа ужималась уже ползунка). (3) Нижняя граница ширины обычной группы считалась по блоку «◀ ползунок ▶|» вместе с уже растянутым ползунком — растяжка поддерживала сама себя, группа не сужалась, ряды перескакивали. Теперь растяжка кнопок внутри блока вычитается: «Кручение» при 355 px — 340 × 96, высота при любом значении ползунка одна.

Zazerkalius v0.506 — по снимку «Звука» — «ползунок не там ставит цифры своего значения», «и Вид так же». В группах, собранных в конструкторе, у ползунков не был задан размер треугольника --t (его ставит только раскладка обычных кнопок), и правило места числа и значка (calc с var(--t)) становилось недействительным: число прилипало к левому краю ползунка, значок терял ширину. Теперь --t задан на все группы сразу. Число, которому нет места ни справа, ни слева от бегунка, остаётся справа, а не уходит за левый край. Проверено на настройках пользователя: во «Виде», «Звуке» и других группах число стоит сразу за бегунком, значок — в нём.

Zazerkalius v0.505 — по снимку «Вида» в одну строку — «ширина съехала» (и «у звука»). В настройках пользователя у «Вида» (группа конструктора) был размер 3922 × 48 px. Ромб-ручка при отпускании запоминала видимую ширину группы, а группа конструктора при переносе рисунка бывает шире заданной — каждое касание ромба прибавляло (проверено: сдвиг на 3 px записал 492 вместо 350). Теперь запоминается не больше того, что задано ручкой. Размер шире экрана считается сбоем и при загрузке снимается — группа встаёт по своему рисунку («Вид» — 513 × 120). «Звук» прицеплен под «Видом» (v0.502) и встаёт под ним.

Zazerkalius v0.504 — «проверь подсказки кнопок у всех групп», «внутри ползунков покажи сетку» (по рисунку) и «ползунки раздолбались — надписи и значки ушли». Подсказки проверены у всех элементов групп: своя есть у всех, у кого нет (стрелки ◂ ▸ и поле ползунка, кнопки внутри блоков) — берётся подсказка блока. Устаревшие поправлены: у «Звука» (кнопок «♫ звук» и «■» больше нет — ⏵ играть, ❙ пауза, ⏸ стоп; ⏺ пишет то, что играет ⏵), у скрытого «запрета сдвига» (служебная пометка «v0.212: скрыта»), у «Своей» и цветов 1 / 0 / а (показывают цвета выбранной гаммы, правка — в «Свою»). В поле каждого ползунка — сетка из тех же треугольников (косые под ±60° и средняя черта), бледно, цветом группы. Бегунок (v0.501) на малых значениях был тёмным, и тёмный значок в нём пропадал — теперь он не темнее 82 % цвета группы.

Zazerkalius v0.503 — по снимку «Звука» — «поправь все кнопки у звука». Блок ◀ ⏵ ▶ (сцепка, v0.419) в группах рисовался по-старому: своей формой и с косой сеткой внутри — отсюда крестики между кнопками. Теперь его кнопки — в общей цепочке из треугольников, как все (◀ и ▶ — стрелки, ⏵ — полкнопки), старая сцепка в группах не применяется. В группе, собранной в конструкторе (△), ползунки, поля, списки и подписи не получали общего оформления (только кнопки) — ползунки оставались браузерными, с синим кружком. Теперь у всех элементов рисунка общее оформление: бегунок-стрелка цветом группы, без рамок браузера.

Zazerkalius v0.502 — по снимку «Вида» и «Аниматрицы» рядом — «примагничивать к левой группе, размагничивать при перемещении правой», и «верхняя — нижняя так же, верхняя главная». Группа, поднесённая к соседней сбоку, входит в неё зубцами: выемки левого края — на острия правого края соседки (заходит на глубину зубца), ряд в ряд. Поднесённая снизу (или сверху) встаёт рамка на рамку, левые края вровень, если близко. Отпустил так — группы сцеплены (Z.cgrpLink): правая — к левой, нижняя — к верхней. Главную двигают, растягивают, перестраивают — прицепленная едет следом, цепочкой через несколько групп. Прицепленную потянул — отцепилась. Окно конуса по-прежнему держит группу целиком внутри: если справа места нет, прицепленная упрётся в край окна.

Zazerkalius v0.501 — по снимку ползунка — «бегунки цвета группы, наверное, и может как-то градиентом менять». Бегунок («стрелка вправо») теперь цветом своей группы, а не акцентом гаммы, и с градиентом: от хвоста к острию светлее. Насыщенность меняется со значением: у левого края ползунка бегунок тусклее (55 % цвета группы), у правого — во весь цвет (--thp, считает tzSliders).

Zazerkalius v0.500 — по снимку «Гаммы» — «тут цвета менять при нажатии на другие, а при нажатии на Своя — вернуть свои; но если изменить цвета, то это всё сохр. в Своя». Цвета 1 / 0 / а рядом со «Своей» показывают цвета выбранной гаммы (прежде всегда цвета «Своей»): выбрал «Янтарь» — в них цвета «Янтаря», «Своя» — снова свои. Если поменять цвет, когда выбрана другая гамма, её три цвета с этой правкой становятся цветами «Своей» (прежние свои заменяются), и выбирается «Своя».

Zazerkalius v0.499 — по снимку «Кручения» — «наладь тут размеры». Блоки внутри групп (режимы кручения, шаг «◀ ползунок ▶|», «Своя» с цветами) получали ширину по сетке --bu: режимам — 2 клетки, и они вставали по одному в строку; шагу — 4 клетки, с пустым хвостом. Теперь блок — по своему содержимому и не переносится. Добивка ряда тянет и кнопки внутри блока, если он стоит одной строкой. Значки (◀ ▶| ⟲ ⟳) тянутся, только если в ряду больше нечего тянуть. Подписи («весь:», «↻ бит») — по длине текста, от 3 сторон. Группа сразу не уже самого широкого блока, а посчитанную ширину браузер больше не ужимает: прежде доли пикселя переносили последнюю кнопку ряда. «Кручение» теперь в 4 ряда вместо 7: заголовок, «весь:», ⟲ ⟳ / четыре режима / ▶ крутить, ↻ по часовой / ◀ ползунок ▶| — все ряды до правого края.

Zazerkalius v0.498 — «сделай её толще, а обводку всей группы сделай цветом». При «▱» обводки кнопок цветом фона холста теперь вдвое толще: 2 px с каждой кнопки вместо 1. То же у стыков в группах конструктора и у колец. Рамка группы снова цветом группы (её заголовка) и лежит поверх швов: по краю группы — цветная линия, внутри — тёмные швы между кнопками.

Zazerkalius v0.497 — «сделай её в цвет фона холста». При включённой «▱ обводке» обводки в группах уже не прозрачные, а цветом фона холста (--bg): между кнопками и по краю групп — тёмные швы, будто кнопки вырезаны из фона. Это обводки кнопок, ползунков, заголовков, колец, стыков в группах конструктора и рамки групп. Цвет берётся из темы, так что в светлой теме швы светлые. Щелчок по «▱» — обводки снова цветом группы.

Zazerkalius v0.496 — «тест: вообще убрать обводку — прозрачной сделать». Новая кнопка «▱ обводка» в шапке переключает обводки в группах: кнопок, ползунков, заголовков, рамок групп, колец и стыков в группах конструктора. По умолчанию теперь прозрачные; щелчок — вернуть как было (Z.noLn). Кнопки различаются только заливкой и нажатые — цветом группы.

Zazerkalius v0.495 — по снимку «Колец» — «нет верхней обводки, и переделай — у каждой группы независимый цвет фона нажатой кнопки свой пусть». Рамка группы шла линией ровно по краю, и видна была только её внутренняя половина, 1 px; при дробной координате группы верх сглаживался до невидимого. Теперь верх и низ рамки на полпикселя внутри края. Фон нажатых кнопок (и галок, и наведения) больше не общий акцент гаммы (v0.471), а цвет самой группы — тот же, что у заголовка и обводок. В заголовке появился ◆, закрашенный этим фоном: щелчок — выбрать группе свой цвет, правый щелчок — снова цвет группы (Z.cgrpOnC).

Zazerkalius v0.494 — по снимку «Гаммы» в одну строку с заголовком во всю длину — «ширина у заголовка — поправь». При снимке в редактор заголовок стоял в ряду один, и добивка ряда (v0.484) растянула его до края — так он и попал в рисунок. Теперь заголовок добивкой не тянется никогда; а если в рисунке он уже шире своего, эти клетки не в счёт: заголовок своей обычной ширины стоит первой кнопкой (рисунок не тронут — лишнее можно стереть в «Сетке»). Первая строка рисунка садится выемкой на остриё заголовка; если не сходится по чётности сетки — заходит на него на полтреугольника, а не оставляет щель.

Zazerkalius v0.493 — по снимку режимов «Кручения» во всю ширину — «проверь ширину». Добивка ряда до края (v0.484) тянула кнопки и внутри блоков — режимы кручения стоят в своём блоке по одному в строке, и каждый растягивался на всю группу. Теперь тянутся только кнопки, стоящие прямо в группе, и недостающее место делится между ними поровну (по стороне на кнопку по кругу), а не уходит одной кнопке: «🔮 просчитать» — 202 px вместо 326.

Zazerkalius v0.492 — «горизонт у ползунков убери вообще»: линии оси у ползунков в группах больше нет — только стрелки, бегунок и обводка по контуру.

Zazerkalius v0.491 — «проверь двойной высоты обводки, чтоб не было нигде» (снимок «Гаммы», шов между «Своя» и «Янтарём») и «кн. свет между ползунками». В группе конструктора кнопки сходились краями ровно на границе, и сглаживание оставляло тёмный шов рядом с линией стыка — выглядело двойной обводкой. Теперь треугольники каждой кнопки чуть больше (на 0,6 px), коробка кнопки на 1 px шире со всех сторон — соседи перекрываются, шов закрыт заливкой; линия стыка — 1 px ровно по пикселю (прежде 1,5 px посередине границы). В обычных группах проверено при увеличении — между рядами одна линия. «✨ свет» в «Виде» — между ползунками «↕» и «▬».

Zazerkalius v0.490 — по снимку «🔴 неп. ⇄» и «🟢 неп. ⇄🔁» — «эти кнопки как все сделай размером». У них надписи длиннее обычной кнопки, и замер делал их двойными. Теперь они помечены data-w1: всегда обычного размера (6 сторон), надпись чуть плотнее (11 px) и влезает целиком. И дотягивание ряда до края (v0.484) берёт самую правую из кнопок, которые можно тянуть; стрелки, цвета гаммы и такие кнопки не тянутся.

Zazerkalius v0.489 — «сам ползунок тоже стрелкой — прибавь ему треугольника 2 слева». Бегунок ползунка — «стрелка вправо» из восьми треугольников (выемка слева, остриё справа, ширина 5t; прежде шестигранник из шести); значок в нём и число рядом подогнаны под новую ширину.

Zazerkalius v0.488 — по рисунку двух «>» — «левый край ползунков как у кнопок надо». Левая стрелка ползунка — тоже «>» (выемка слева, остриё справа), как у всех кнопок; прежде (v0.485) была «песочными часами».

Zazerkalius v0.487 — «у ползунков горизонт тоньше линию, и верни им обводку». Линия оси ползунка — 1 px (была 2); обводка по контуру ползунка — снова, как у кнопок (снята была в v0.464); своей заливки у ползунка по-прежнему нет.

Zazerkalius v0.486 — по рисунку «стрелки вправо» — «Своя также сделай, и эта группа в редактор не идёт почему-то». «Своя» и цвета 1 0 а теперь тоже «стрелки вправо» цепочкой (прежде «Своя» была остриём слева и выемкой к цветам, а просветы между цветами закрашивались её цветом — это снято). Редактор: с v0.473 блок кнопок растворён в группе (display: contents), его прямоугольник нулевой, и снимок для конструктора выходил пустым — «группу не видно». Теперь снимок меряется по самой группе, а заголовок идёт в рисунок как обычная кнопка (своя кисть, место и форма по рисунку). Найдено при проверке: снимок точками экрана молча терял кнопки, закрытые другим окном (у меня — «Сеткой») — на миг снимка окно конуса и группа поднимаются поверх всего, а если кнопка всё равно не попала, конструктор об этом говорит; и общая чистка формы снимала её с заголовка (он вне блока кнопок).

Zazerkalius v0.485 — «заголовки жирным текстом, все кнопки пусть по умолчанию, если не редактировать, — стрелки вправо, вот такие, и у ползунков» (рисунок: длинная кнопка с выемкой слева и остриём справа, «песочные часы» и «>»). Все кнопки, галки, списки, поля и подписи групп теперь «стрелки вправо»: слева выемка, справа остриё — остриё соседа всегда входит в выемку. Кнопки ◀ и левая стрелка ползунков — «песочные часы» (выемки с обеих сторон: слева — в стрелку соседа, справа — под бегунок), правая стрелка ползунков — «>». Заголовки групп — жирным. Группы, переделанные в конструкторе △, — как нарисованы.

Zazerkalius v0.484 — по снимку «Гаммы» с пустым местом справа — «пустой длины не должно быть, а нижний ромб-размер накладывай на кнопку». В обычных группах последняя кнопка каждого ряда дотягивается до правого края целыми сторонами, а группа подрезается по самому длинному ряду; ромб-ручка встаёт на правый конец последней кнопки нижнего ряда. У группы конструктора кнопки нарисованы — там группа только не шире рисунка, ромб тоже на последней кнопке. Найдено при проверке: (1) минимум ширины группы считался по уже растянутым кнопкам — исправлено; (2) старая ловушка: правило «на время замера — ширина по содержимому» проигрывало правилам «двойная/четверная кнопка», и «двойная» при нулевых зазорах (её ширина 2 кнопки + 3 px) мерилась шире двойной и навсегда становилась «четверной» — правило замера сделано сильнее. Осталось: ряд с блоком, у которого своя ширина (в «Лазере» «◎ до строки»), дотягивается не до конца.

Zazerkalius v0.483 — по снимку «Колец» во весь экран — «длина сама вытягивается у этой». Самоподпитывающийся цикл: ширину подписи («↻ бит») и заголовка я брал из их же ширины; с v0.479 первая кнопка ряда шире на t (выемка), и это давало n + 0,5 стороны, а округление — n + 1, так что при каждом пересчёте (у «Колец» он частый) подпись прибавляла по стороне. Теперь своя ширина (её ставит сам конструктор форм) за «заданную» не принимается, а нужное место заголовка считается без своих краёв. Проверено: 50 пересчётов подряд — ни одна ширина не сдвинулась. Размер группы, уже сохранённый растянутым, сам не сжимается — его сужают ручкой-ромбом.

Zazerkalius v0.482 — по снимку полосатого уголка — «это замени: последний ромб сделай цветом группы, и за него тянуть». Ручка размера группы теперь — ромб из двух треугольников (▲ над ▼) цветом группы в правом нижнем углу, ровно в последнем острие рамки. Найдено при проверке: рамка пересчитывалась на долю секунды позже размера, и угол с ромбом на миг оказывался вне неё — ромб не хватался; теперь рамка пересчитывается сразу.

Zazerkalius v0.481 — по снимку «Гаммы» — «нижняя обводка потерялась». Кнопки с v0.478 на 1 px выше ряда (чтобы между рядами была одна линия), и нижний ряд закрывал нижнюю линию рамки группы. Рамка теперь рисуется поверх кнопок — она тонкая и идёт только по краю группы.

Zazerkalius v0.480 — по снимку суженной «Гаммы» — «группа не может быть короче, чем самая длинная группа кнопок; тут Своя + 3 цвета — это совмещённая кнопка». Кнопки одного блока-обёртки (как «Своя + 1 0 а») в конструкторе теперь одна единица переноса — переносятся только целиком. И группу уже не сузить ручкой меньше её самой широкой неразрывной части: у конструктора — самого широкого блока переноса, у обычной группы — самой широкой кнопки или блока (заголовок тоже). Проверено: «Гамма» и «Вид» при попытке сузить до 100 px встают на 167 и 176 px, ничего не вылезает за край.

Zazerkalius v0.479 — «левая граница у групп пусть будет стрелкой вправо всегда — кнопку дорисовывай, если надо, при изменении положения» и «у всех заголовков убери прозрачность». Левый край группы теперь выемкой (стрелка вправо, правый край — остриём, как был); первая кнопка каждого ряда (в том числе заголовок) получает выемку слева и ложится в край вплотную; ряды перестроились (ширина, перенос) — первые кнопки пересчитываются сами. Заголовки — сплошь цветом группы с тёмной надписью (прежде заливка была на четверть, и значки 🧘 △ ✕ полупрозрачные); 🧘 у не отмеченных для дзена — серым. Найдено при проверке: у галок ширина держалась ещё и через flex, и замер «сколько нужно места» брал прежнюю ширину — выемка (+t) раздувала их до 4 кнопок; теперь на замер снимается и flex. И цвет группы читается из цвета надписи заголовка, поэтому тёмную надпись даёт заливка букв, а не color.

Zazerkalius v0.478 — по снимку «Вида» — «когда кнопки одна под другой — обводка у них одна пусть будет, между ними не двойная» и по снимку «Лазера» под другой группой — «магнитить только там, но без щелей — обводка на обводку ложить». Всё в группах теперь на 1 px выше ряда и заходит на ряд ниже (шаг рядов по-прежнему 24 px): нижняя кнопка рисуется поверх и своей верхней линией закрывает нижнюю линию верхней — между рядами одна линия; у нижнего ряда лишний 1 px срезает рамка группы. Магнит: группа к группе встык заходит на 1 px — их рамки ложатся одна на другую; к краям окна и полю строк — как было.

Zazerkalius v0.477 — по снимку края «Вида» — «убери боковые отступы у групп». Поля слева и справа у групп сняты: острия крайних кнопок теперь прямо в зубцах рамки — у них та же форма (остриё 120° на каждый ряд), так что край кнопки и рамка группы совпадают.

Zazerkalius v0.475–v0.476 — по снимку «Гаммы», где заголовок висел строкой над рисунком, — «заголовок — это как кнопка, в её строке надо их ставить», и «убери вообще жирность обводки». У группы конструктора заголовок теперь тоже шестигранник и стоит первой кнопкой первой строки: рисунок первой строки сдвигается вправо на его ширину, а у группы с заданным размером, если тесно, первая строка уходит под заголовок. Ширина заголовка — по надписи со значками, кратно полкнопке (короткие — 6 сторон, длинные — 9), прежде длинные надписи обрезались. Жирной обводки больше нет нигде: у нажатых кнопок и галок её убрал совсем — нажатую видно по заливке гаммы, обводки «⬚» из редактора всегда тонкие.

Zazerkalius v0.474 — по снимку ползунка «Аниматрицы» — «какая-то лишняя обводка». Сверху и снизу дорожки шли две линии: у самого поля ползунка осталась рамка 1 px от общего правила для всех полей ввода (края прятались под стрелками). У ползунков в группах она снята, заодно и рамка фокуса после щелчка.

Zazerkalius v0.473 — «заголовок группы — это самая первая кнопка, и все следующие размещать на её же строке, если размер позволяет» (рисунок — длинный шестигранник) и «ползунки так поправь» (рисунок: «<» ⬡ «>», у края шестигранник входит в выемку стрелки). Подпись группы теперь — шестигранник в начале цепочки, залитый цветом группы; блок кнопок растворён, и заголовок с кнопками текут одним рядом с переносом под заголовок. Группа без заданного размера — не шире 520 px. У групп конструктора △ заголовок прежний — их раскладку задаёт рисунок. Бегунок ползунка — шестигранник из шести треугольников (значок в нём), у краёв заходит остриём в выемку стрелки; число по-прежнему едет рядом. Рисунок рамки с ромбом внутри — на заметку, пользователь пока не просил.

Zazerkalius v0.472 — по снимку «Своя 1 0 а Янтарь» — «тут жёлтая обводка не в тему, это те кнопки, что в редакторе делал, — надо там не разрешать другого цвета». Обводки из редактора — и «⬚», и линии ╱ — рисуются только цветом группы: на странице, в живом виде и в сетке; прежние, сделанные своим цветом, тоже. Поле выбора цвета у «⬚» убрано. Попутно: при правке два `//`-комментария легли посреди строки и закрыли остаток кода — заменены на /* */ до коммита (поймал node --check).

Zazerkalius v0.471 — по снимку «Гаммы» — «у всех кнопок должна быть обводка цвета самой группы, а фон выделенной задаётся Гаммой», «гамма — на все кнопки любой группы, фон выделенной». Контур каждой кнопки, галки, списка, поля и подписи — цветом заголовка своей группы (как её рамка); толстая обводка нажатой — тоже цветом группы; в конструкторе цветом группы и линии стыков, и живой вид. Фон нажатой кнопки и включённой галки во всех группах — акцент текущей гаммы (смешанный с фоном кнопки, чтобы читалась надпись), в том числе в сцепке «Звука»; прежде был золотой.

Zazerkalius v0.470 — по снимку «Гаммы» — «после редактирования жирность не уходит у обводки, которую сделал в редакторе; жирная — только у выделенной кнопки». Правило для всех обводок «⬚» стало одним: видна всегда, но тонкая, 1 px; жирная (своей толщиной «═», не тоньше 2 px) — пока нажата хоть одна из её кнопок. Это заменяет правило v0.468, где обводка вокруг одной кнопки пряталась, а вокруг нескольких всегда была жирной.

Zazerkalius v0.469 — по снимку свёрнутой «Гаммы» — «лишняя высота». Высота группы теперь ровно ряды по 24 px: поля сверху и снизу у группы и у её кнопок — 0, подпись без отступа, ряды внутри блоков (режимы кручения) тоже вплотную. Так зубцы рамки идут ровно по рядам кнопок. Свёрнутая группа — высотой ровно в заголовок, 24 px; прежде она держала свою прежнюю высоту (v0.207). Проверено: все группы конуса — кратны 24 (96, 120, 192, 216, 240).

Zazerkalius v0.468 — по снимку «Гаммы» — «Роза нажата, но смотри — жирная обводка у других есть». Нажата была одна «Роза»; красная вокруг «Своя» и жёлтая вокруг «Янтаря» — обводки «⬚», сделанные раньше вокруг одной кнопки. Удалять их молча нельзя, поэтому смысл у них теперь такой: обводка «⬚» вокруг ОДНОЙ кнопки — знак «нажата», видна, только пока эта кнопка нажата (горит или галка включена), своим цветом. Обводки вокруг нескольких кнопок (блоки) видны всегда. Кнопки загораются и гаснут и сами (гамма, режимы), поэтому сверка идёт раз в 300 мс.

Zazerkalius v0.466–v0.467 — «значок прямо в ромбе ползунка, а числа бегают с ним справа или слева» и, на «жирная обводка была только у нажатых кнопок», — «так и надо». Ползунки в группах: значок (↕, ▬, ⚡…) стоит в ромбе-бегунке, число едет рядом с бегунком — справа, а если справа тесно, слева. Они двигаются вместе с бегунком и при перетаскивании, и когда значение меняет сама страница (сверка раз в 300 мс). Нажатые кнопки и включённые галки: толстая обводка внутри своей формы (видна половина линии, 2,5 px), на соседей не заходит; цвет — подсветка кнопки (у гаммы — свой цвет гаммы, у прочих — золото). Так и в обычных группах, и в конструкторе — там обводка идёт по границе своих треугольников.

Zazerkalius v0.465 — по снимку широкой «Гаммы» в две строки — «не даёт в одну строку размер группы» и «жирная обводка — и перекрывает обводку других кнопок». Перенос в конструкторе работал только на сужение. Теперь группа, которой задан размер, течёт, как текст, в обе стороны: следующая строка рисунка подтягивается на текущую, если влезает, иначе переносится. Без заданного размера рисунок стоит, как нарисован. Обводка «⬚» лежала посередине границы, и половина линии заходила на соседние кнопки; теперь она рисуется только внутри своей области (линия двойной толщины, обрезанная по области), так что видимая толщина ровно «═», а соседей она не задевает. Найдено при проверке: если группы не видно на экране, △ снимал пустой рисунок — теперь группа сперва прокручивается в вид, а если её всё равно не видно, конструктор не открывается и говорит об этом.

Zazerkalius v0.464 — четыре просьбы подряд. «Пусть у группы обводка цветом, как у её текста»: рамка-зубцы группы теперь цветом её заголовка. «Обводка — толщина почему-то только толстая»: у обводки «⬚» своя толщина — из поля «═» в момент создания (прежние стали 1,5 px вместо 2,5); рамка группы тоньше, 1 px. «Стрелки у ползунков», «сам ползунок», «и тонкая линия по оси» (рисунок: «<» —◆— «>»): у ползунков в группах стрелки ◂ ▸ — шевроны из четырёх треугольников во всю высоту ряда, остриями в концы ползунка, цветом группы; между ними — тонкая линия по оси того же цвета; бегунок — вертикальный ромб из двух треугольников цветом акцента; своей заливки и рамки у ползунка нет. Значок и число остались на месте.

Zazerkalius v0.463 — «вообще переделай сам у всех групп кнопок, включая ползунки и выпадающие списки, чтоб всё было стандартно», «и края самих полей групп теми же ромбами надо», «не переспрашивая, делай как знаешь». Из треугольников теперь всё, что стоит в группах окна конуса и левой панели: кнопки, галки-кнопки, выпадающие списки, ползунки, поля чисел, подписи вроде «весь:» и «↻ бит». У всех один вид — заливка, без рамки, края-острия, обводка по контуру — и одна цепочка «остриё в выемку». Длина — целое число сторон: полкнопки 3, кнопка 6, двойная и ползунок 12, подпись — по своей ширине. Галка горит, как включённая кнопка; у списка своя стрелка ▾. Ряды кнопок стоят вплотную, без зазора, как и кнопки в ряду. Бока каждой группы — зубцами из тех же треугольников, по острию на каждые 24 px (ряд кнопок); рамка прежнего цвета группы. Левая панель — так же: та же мерка (кнопка 6 сторон) и без зазоров.

Zazerkalius v0.462 — на «после этого раскладка с переносом становится самим рисунком» — «а на те, что были, нельзя?». Впечатывание v0.461 снято. Рисунок группы теперь всегда исходный, длинными рядами, а в сетке — ВИД, как на экране: каждая кнопка сдвинута так, как её сдвинул перенос. Правка в сетке записывается в рисунок с обратным сдвигом той кнопки, чьей кистью закрашено; линия ╱ — по кнопке с одной из сторон ребра. Шире группу — кнопки снова собираются в длинные ряды, уже — переносятся, и сетка сама следует за этим, в том числе пока тянут ширину. Найдено при проверке и исправлено: обратный перевод брал новые сдвиги к старому виду и портил рисунок; теперь сетка помнит, по каким сдвигам построен её вид. После «↺ как было» у группы оставались сдвиги прежнего рисунка — теперь сбрасываются; треугольники с битыми номерами вычищаются.

Zazerkalius v0.461 — по снимку «Гаммы», перенесённой в четыре ряда, — «пусть в редактор попадает в таком расположении, в каком нажата кнопка в редактор». Прежде сетка показывала исходный рисунок, а страница — его же с переносом рядов под ширину группы. Теперь при △ перенос впечатывается в рисунок: треугольники, линии ╱ и свои цвета переезжают туда, где кнопки стоят на экране. Сетка показывает ровно то, что видно, кнопки на странице не сдвигаются. Дальше рисунок уже такой: если расширить группу, он сам обратно в длинные ряды не развернётся.

Zazerkalius v0.460 — по снимку «Своя 1 0 а» — «обводка как-то криво работает, пусть просто берёт крайние выделенные кнопки и общей обводкой их». Обводка «⬚» шла по границе самих треугольников выбранных кнопок, поэтому между ними (в просветах «Своя») появлялись линии вокруг каждой кнопки. Теперь в каждом ряду обводка охватывает всё от первого до последнего треугольника выбранных кнопок, включая просветы и то, что между ними, и идёт одной линией по внешнему краю. Так же выглядит и пунктир выбора.

Zazerkalius v0.459 — «обводка в редакторе кнопок: нужен режим, когда группы кнопок только выбираются, и потом, когда снова нажать кнопку режима, — всё объединит одной обводкой, и цвет обводки разный, чтоб задавать». В строке конструктора — «⬚ обвести» и поле цвета. Включил — щелчки по кнопкам в сетке их выбирают (ещё щелчок — снимает), выбранные обведены пунктиром, закраска не меняется. Нажал «⬚» ещё раз — выбранные кнопки получают одну общую обводку по границе своих треугольников, цветом из поля. Обводок сколько угодно, у каждой свой цвет; список обводок — рядом, щелчок по обводке её снимает. Обводка видна на странице, в живом виде и в сетке. Обведённые вместе кнопки при переносе рядов держатся одним блоком. Есть своя обводка — автоматическая общая граница не рисуется.

Zazerkalius v0.458 — по снимку квадратов с щелями — «квадраты вплотную надо бы, по общим граням сетки квадратной». В виде «■ квадраты» квадрат теперь во всю ячейку, а шаг рядов подогнан под ширину символа, так что ячейка квадратная и соседи делят грани. У строк, сдвинутых на полсимвола (треугольник 1, 2, 3… бит), получается кладка «кирпичом»: в ряду — целые общие грани, между рядами — половинки.

Zazerkalius v0.457 — по снимку «Своя 1 0 а» — «обводку не могу нормально положить для третьей кнопки, похоже, обводку надо отдельно рисовать». Общая граница v0.454 строится по правилу «всё между крайними кусками кнопки», и третью кнопку оно не всегда захватывает так, как задумано. Теперь обводку можно рисовать руками: в конструкторе инструмент «╱ линия по ребру» рисует обводку самой группы, у каждой группы она своя. Цвет — любой из палитры или кисть кнопки: щёлкни кисть, пока горит ╱. Толщина — «═». Линии сразу появляются на странице и в живом виде; при переносе рядов линия едет с кнопкой, к которой прилегает. Как только в группе есть хоть одна своя линия, общая граница сама больше не рисуется. Свои линии, что были в сетке до конструктора, откладываются вместе с закраской и возвращаются по «✓ готово».

Zazerkalius v0.456 — по снимку поля строк — «добавь отображение квадратами вместо бит и ромбами; ромбами — только когда чёт-нечет строки длиной идут, чтобы ромбы вкладывались друг в друга». На полосе поля, рядом с выравниванием, — список вида бит: «01 цифры», «■ квадраты», «◆ ромбы». Цифры остаются на месте, только прозрачные, поэтому выделение, щелчок по биту, Del и вставка работают как прежде; фигура рисуется поверх цветом бита, нули — бледно. Ромб шириной в символ и высотой в два ряда. У строк, чья длина отличается от соседней на нечётное, ряды сдвинуты на полсимвола, и ромбы соседних рядов входят друг в друга сплошной решёткой: треугольник 1, 2, 3… бит становится решёткой ромбов. У прочих строк и при выравнивании не по центру — квадраты. В этом виде у рядов нет обрезки и фона, иначе ряд ниже закрывал бы кончики ромбов ряда выше.

Zazerkalius v0.455 — «кнопки под одной обводкой — не переносятся на другие строки». Кнопки под общей границей — кнопка из нескольких кусков и те, что стоят между её кусками (как «Своя» с цветами 1 0 а), — теперь один блок. При сужении группы блок переносится целиком, а не рвётся посреди. Если блок шире заданного размера группы, группа расширяется по нему, чтобы его не обрезало.

Zazerkalius v0.454 — конструктор, четыре просьбы подряд. «Как-то надо указывать, что это относится к кнопке такой-то; у каждой кнопки пусть свой цвет»: у каждой кнопки группы теперь своя кисть — свой цвет и её надпись, кисти стоят в строке конструктора. Закрашенное кистью кнопки принадлежит ей, где бы ни стояло, куски не обязаны касаться. Обычные цвета палитры — просто рисунок. Надпись кнопки в сетке одна, на самом большом куске; прежде символ стоял на каждом куске. Старый рисунок (v0.452–0.453) переводится в кисти сам, и при открытом конструкторе тоже: сетке подставляется тот же рисунок, иначе она записала бы поверх старый, и кнопки потеряли бы хозяев. «Номера закрашенных скрывай»: номер в сетке остался только у пустых треугольников. «Каждой кнопке, если между её гранями другие, — общую границу цвета»: кнопка из нескольких кусков, между которыми стоят другие (как «Своя» с цветами 1 0 а), обводится общей границей своим цветом. Граница видна на странице, в живом виде и в сетке. «Правой кнопкой по закрашенному — берёт его при следующем клике»: правый щелчок — пипетка, берёт цвет треугольника (в конструкторе — кисть его кнопки). Раньше правый щелчок стирал; стирать теперь — ластиком или тем же цветом ещё раз.

Zazerkalius v0.453 — по снимку «Гаммы» в конструкторе — «потерялись надписи и не перестраиваются при изменении длины группы» и «при редактировании покажи кнопки с надписями онлайн — как будет выглядеть». Надписи: блок «Своя + цвета» держало своё сильное правило (inline-flex !important). В конструкторе он схлопывался в точку, и его обрезка шестигранником (v0.450) срезала «Своя» и все три цвета. Теперь обёртки в конструкторе сильнее — без своего места, обрезки и фона. Перенос: группа, которой задан размер (ручка в углу), переносит ряды рисунка целыми кнопками. Что не влезло, уходит строкой ниже к левому краю; сдвиг — на чётное число шагов, чтобы треугольники не переворачивались. Без заданного размера рисунок стоит, как нарисован. Живой вид: в «△ Сетке» под строкой конструктора — кнопки группы в настоящую величину, ровно по рисунку, с цветами и надписями как на странице. Перерисовывается с каждой правкой.

Zazerkalius v0.452 — по снимкам «Гаммы» и «△ Сетки» — «сделай кнопку рядом с заголовком, маленький значок: при нажатии данная панель отображается конструктором; здесь и тут я правлю руками кнопки». У заголовка каждой группы конуса — △. Щелчок открывает «△ Сетку», привязанную к этой группе: каждая кнопка (и цвет, поле, список) нарисована своей фигурой из треугольников своего цвета, с подписью. Соседние кнопки — разных цветов, горящая — золотая. Рисунок снят с самой группы: страница опрашивает точку в центре каждого треугольника и смотрит, какая кнопка под ней. Дальше правишь в сетке, а кнопки на странице сразу встают по рисунку: место и форма — ровно те треугольники, что за кнопкой числятся. Фигура одного цвета принадлежит той кнопке, за которой большинство её треугольников. Если закрасить кусок цветом соседки, он отходит ей. Кусок без хозяина отходит ближайшей кнопке того же цвета, поэтому кнопка может состоять и из нескольких кусков (подпись — на самом большом). Обводка рисуется одной линией на каждый стык. Что в рисунок не попало, стоит ниже обычным рядом. Пока идёт конструктор, своё содержимое сетки откладывается в сторону; «✓ готово» его возвращает, раскладка группы остаётся. «↺ как было» снова делает группу обычным рядом.

Zazerkalius v0.451 — по снимку «Янтарь ❯ Океан» — «убери двойную обводку между кнопками». Каждая из сцепленных кнопок обводила общий край со своей стороны, а между двумя линиями просвечивал тёмный шов: оба края сглаживаются, и фон проступает сквозь них. Теперь следующая кнопка заходит на соседку ещё на 1 px, её край ложится прямо на линию соседки, и на стыке остаётся одна линия. Шаг кнопок не изменился.

Zazerkalius v0.450 — по снимку трапеций и рисунку 215…302 — «три цвета короче; Своя и цвета — между цветами цвет фона Своя, и далее другие». «Своя» начинается остриём, а заканчивается выемкой; в неё входит цвет единиц, за ним цвет нулей и акцент. Все три — маленькие шестигранники из 6 треугольников, остриё к острию. Треугольные просветы между ними закрашены цветом «Своя», и блок читается как одна кнопка с тремя окошками цвета. Блок снова шириной в две кнопки. Дальше «Янтарь» и другие — как были. Трапеции v0.449 сняты.

Zazerkalius v0.449 — по снимку «Своя 1 0 а» — «что за квадраты 3?? вот так их можно» (рисунок: после стрелки — голубая, сиреневая и красная трапеции встык). Квадраты — это выбор цветов своей гаммы: единиц, нулей и акцента. Теперь в конусе это трапеции из целых треугольников, по 4 стороны: первая и третья узкие сверху, вторая — снизу. Так они ложатся полосой без щелей. Заливка — сам цвет, граница — та же светлая обводка. Сцепка стала общей для любых краёв: остриё, выемка, скос / или \. Соседи сходятся серединами краёв, если края не лезут друг на друга. Кнопка берёт выемку, когда слева от неё остриё, иначе начинается остриём. Соседом считается и крайний элемент блока, поэтому «Янтарь» прижат к последней трапеции, а первая трапеция — к «Своя».

Zazerkalius v0.448 — по снимку «Своя» (сквозь кнопку видна сетка) и рисунку цепочки 215…303 (сиреневая, зелёная, розовая, серая — одна за другой) — «внутри кнопок не надо сетку, все кнопки без зазора — прижать друг к другу, разделяй их обводкой». Сетки внутри кнопок больше нет. Кнопки ряда сцеплены, как на рисунке: первая в строке начинается остриём, каждая следующая — выемкой, в которую входит остриё соседки (заходит на t, как в сцепке «Звука»). После поля, списка или подписи кнопка снова начинается остриём. Граница между кнопками — светлая обводка по контуру каждой, у соседей она общая. Сцепка считается по раскладке: кто в одной строке, тот сцеплен. Длина кнопки от этого не меняется — шаг по-прежнему 3s / 6s / 12s.

Zazerkalius v0.447 — по рисунку из «△ Сетки» (шестигранники и ромбоиды из целых треугольников) — «можем все кнопки привести к такому ромбовиду?»; выбрано: «как на рисунке», «пока только в группе Конус»; стрелки — по второму рисунку (46 47 / 102 103). Кнопки групп окна конуса теперь рисуются, как сцепка «Звука»: заливка и сетка треугольников внутри, без рамки; наведение — сиреневая заливка, включённая — золотая, «идёт само» (▶ волна, ▶ крутить) — мигает заливка, а не рамка. Обычная кнопка — шестигранник с остриями 120° на концах, длиной в целое число сторон s: полкнопки — 3s, кнопка — 6s (≈ 83 px, прежде 99), двойная — 12s; ◀ ▶ — шеврон из четырёх треугольников (3t), а не из шести. Зазоров по горизонтали нет: по правилу «всё по сетке t» кнопки встают вплотную. Левая панель и ▲ ▼ — как были. Ромбоиды (скошенные в одну сторону) пока не назначены ни одной кнопке — ждут, каким кнопкам их дать.

Zazerkalius v0.446 — «лазеры должны крутиться и двигать биты». С v0.443 головки 🎵 стояли на своих углах, и двигались только кольца. Теперь головки снова идут по кругу по часовой — за шаг на 1/T круга (T — бит в самой длинной строке), и в пути, и на кольце. Кольцо, на котором стоит головка, едет ей навстречу на 1 − n/T бита за шаг (n — бит в его строке). Вместе это ровно бит за шаг: головка проигрывает кольцо целиком, ни одного бита не пропуская, а на экране движутся и головка, и биты. У самого длинного кольца оно почти стоит — головка бежит по нему сама; у внутренних бегут биты. Если бы кольцо ехало на целый бит, как в v0.443, головка вместе с ним проходила бы по два бита за шаг и пропускала каждый второй. Бит под головкой теперь считается от бита входа и числа шагов, а не пересчётом угла, — так дробные сдвиги колец не сбивают счёт. Головки в пути, крутясь, сами находят щели — «граница» больше не ждёт «▶ крутить».

Zazerkalius v0.445 — по снимку центра конуса — «всё встало тут»: все головки 🎵 бились о кольцо строки 1 красными точками. Это щель «граница» (v0.444) зациклилась. У строки 1 из одного бита граница одна, наверху, а кольцо само не двигается. Головка, упёршись в «0», стояла и писала «1»; на следующем шаге эта «1» была стеной — гасла в «0», головка отражалась сквозь центр и упиралась снова. Через центр не проходил никто. Теперь, упёршись в «0», головка сама подвигает кольцо, пока граница перед этим битом (против часовой от неё) не встанет под головку, и встаёт на кольцо — то самое «встаёт в щель и двигает её». При «пишет» этот «0» становится «1» и звучит первым. «1» по-прежнему стена. Заодно кольцо, которое крутит головка, больше не округляется до целого бита: иначе подвинутая к головке граница уезжала бы из-под неё на первом же шаге.

Zazerkalius v0.444 — на «щель: сейчас «0», другой вариант — граница между битами, как у луч-часов; вход в щель: головка ставит там «1»» — «делай». У 🎵 музыки щель теперь выбирается: щель 0 (как в v0.443) или граница. При границе головка встаёт на кольцо, только когда под ней граница бит — в пределах половины ползунка «щель», ровно как луч-часы, — и крутит кольцо, стоя на ней; звучит бит по часовой от границы. Не на границе головка упирается в бит: «1» — стена (гаснет, отражение сквозь центр), перед «0» головка стоит, а при «пишет» этот «0» становится «1», и на следующем шаге это уже стена. Головки при границе стоят ровно на 360° / число, без сдвига на полбита: головка на 0° видит границы всех неповёрнутых колец. Умолчанием осталась «щель 0»: при границе свободные кольца стоят, и без «▶ крутить» (по биту / навстречу) щели почти не приходят к головкам. У строки 1 из одного бита граница вообще одна, наверху, — остальные головки бились бы о центр. Вход в щель по умолчанию ставит «1» — это подтверждено тем же «делай».

Zazerkalius v0.443 — «пусть лазер, попадая на строку, занимает её, пока всю по кругу не пройдёт; остальные проходят мимо неё; как проиграл — к следующей идёт; встаёт на строку только в щель и двигает её; при выходе идёт дальше; если 1-ца — отражается и идёт в другую сторону, сквозь центр даже; 1 при этом становится 0». Головки 🎵 музыки больше не бегут по кругу: каждая стоит на своём угле (через 360° / число) и идёт из центра наружу, кольцо за кольцом. Щелью здесь считается «0» под головкой, как в «☀ Без щелей», где «0» — проход, а «1» — стена. Граница между битами, как у луч-часов, не годится: головки стоят на месте, и на границу бита они почти никогда бы не попадали — музыка вставала бы. В щели головка встаёт на кольцо, занимает его и двигает на бит за шаг; «1» под ней звучит её нотой. Полный круг (шагов столько, сколько бит в строке, и кольцо вернулось на место) — головка выходит к следующему кольцу. Занятое кольцо другие проходят мимо. «1» — стена: она гаснет в «0», а головка отражается сквозь центр на противоположную сторону (угол + 180°) и снова идёт наружу. Щель, в которую встала головка, по умолчанию становится «1» (пишет) — то самое «в 0 стреляет — 0 переворачивается в ноту» из v0.441. Без этого единицы только гасли бы от отражений, и музыка затихала бы; режим читает оставляет её «0». Правило «счёт / копит» ушло вместе с бегом по кругу. Кольцо двигается «на вид» (накрутка кольца, как у запертого мышью), строка не сдвигается. Прошедшая все строки головка по-прежнему пишет в строку для заполнения 1-0-1-0 и возвращается в центр. На конусе занятое кольцо обведено цветом своей головки, отражение — красной точкой и бледным отрезком.

Zazerkalius v0.442 — «7 лазеров пусть — у каждого своя нота, по углу 360 на 7; и если на последней строке 0, то продолжаем — пишем в неё биты 1-0-1-0». У 🎵 музыки головок теперь несколько: поле «×» рядом, 1…12, по умолчанию 7, через 360° / число, идут по кругу вместе. У каждой своя нота — ступень лада «Звука» от До (в мажоре ровно До Ре Ми Фа Соль Ля Си, отсюда и семь), свой тембр и свой цвет луча (радуга нот, как у головок хаба). Высоту раньше давала строка; теперь нота — за лазером, а строка задаёт только октаву (внутренняя треть колец — низ, средняя — середина, внешняя — верх), иначе «своя нота у лазера» потерялась бы в разбросе по строкам. Луч, прошедший все строки, больше не уходит за край, а продолжает в кольцо для заполнения (оно же строка под чертой в поле): там ячейка всегда перещёлкивается 1 → 0 → 1 → 0 при любом правиле, «1» звучит. Строку для заполнения лазер только пишет; в поле её по-прежнему отправляет +. Головки за шаг идут по очереди, и общая ячейка (у строки 1 она одна на весь круг) достаётся им цепочкой — каждая видит то, что оставила предыдущая. Одинаковые ноты за шаг звучат один раз, голосов разом — до 12. Лучи рисуются поверх кольца для заполнения, чтобы головку в нём было видно.

Zazerkalius v0.441 — «конус — сделай музыкальный инструмент, автомузыкальный: лазер — это головка, ходит по кругу — музыкальный режим лазера; на битах ноты, биты сам делает: в 0 стреляет — 0 переворачивается в ноту, в следующий раз попадает в неё — там уже 1 — нота; нота — в зависимости от строки». В «Лазере» конуса — 🎵 музыка. Головка — луч из центра — идёт по кругу по часовой, за шаг на 1/T круга (T — бит в самой длинной строке), темп — ♩ «Звука». На каждом шаге луч идёт наружу кольцо за кольцом: «1» под ним звучит нотой своей строки, и луч идёт дальше; «0» становится «1» (нота записана), и луч здесь стоит. Правило для «1» после звука выбирается рядом: счёт (по умолчанию) — она снова «0». Так каждый луч работает как двоичный счётчик с младшим битом в строке 1: строка 1 звучит через шаг, строка 2 — реже и так далее, и ритм складывается сам, как в драм-машине — отсюда и имя репозитория. Буквальное «1 остаётся» (копит) тоже есть, но в нём рисунок только растёт, пока каждый луч не станет сквозным аккордом всех строк, — поэтому это не умолчание. Высота — по строке: строка 1 ниже всех, дальше вверх по ладу «Звука» (три октавы по кругу). Тембр «🎨 разные» у каждой строки свой, голосов разом не больше 8. Биты пишутся прямо в строки поля, а не в отдельный слой краски, как у луч-часов: так новый рисунок сразу виден и в поле, и на конусе, и с ним работают все прочие окна. При пуске ставится точка отмены (↩ вернёт строки), а луч-часы и солнце выключаются: у них ячейки колец пустые. ∅ обнуляет все строки той же длины, и лазер набирает ноты с нуля. Головку на конусе видно золотым лучом до записанной ноты, звучащие биты — обводкой «◉ показать».

Zazerkalius v0.440 и Гранидус v0.069 — «самое главное — натянуть Аниматрицу на ТриРамидус», «ромбы из кадров», «раскадровка — развёртка есть», «на html — Зазеркалиус»; на вопрос выбрано: кадры листаются, видеть и на развёртке, и на 3D-теле. В «✦ Развёртке» — ◇ ромбы из кадров, высота ромба (8 / 16 / 32 / 64 строки поля, как шаг ◇ сетки в Code), ⏱ мс на кадр и ⏸. Поле строк режется на ромбы в своих координатах (строка r, место q, в строке r + 1 бит): ромб высотой 2h с вершиной (e·h, j·h) — стороны вдоль двух диагоналей треугольника, ряд e — e + 1 ромб, как в Code. Горизонтальная диагональ режет ромб на две грани тела: верх — на Ui (ряд k от T), низ — на Di (ряд k от B, место 0 у того же угла экватора, что у верха), так что на ребре экватора половины сходятся; пара Ui + Di — это и есть ромб развёртки «В». Пары граней берут ромбы подряд, кадр сдвигается на один каждые N мс; при идущей Аниматрице ромбы меняются вместе с волной. Низ ромба — настоящий низ картины, а не инверсия верха, поэтому Гранидус научился держать у нижних граней свои биты (botBits): их приносит новое сообщение zz-rhombs; любая другая новая картина (строки, свои биты, ↻) снимает их — низ снова зеркало. В Гранидус ромбы уходят при «⇄ строки → грани», по одному на пару граней (у Зеркалидуса три, у октаэдра четыре). На развёртке ромбы — только на крупной; малые картинки — как были.

Просмотр GIF v0.002 — «вооот, супер; тут надо масштабировать колёсиком, а также клик — выбор определённого набора GIF и его раскладки, и т. д., так же с размерами ромбов и треугольников». Колесо над картинкой — масштаб к курсору (точка под курсором стоит), мышью — тянуть, когда картинка больше окна, клавиша 0 — вписать. Галка у GIF в списке — в набор (☑ все / ☐ никого); набор играет разом, кадр в кадр (короткие — по кругу), раскладкой: ⇢ в ряд, ⇣ столбиком, ▦ сеткой, △ треугольником (ряды 1, 2, 3 …), ◇ ромбом (1, 2 … n … 2, 1). Клетка — самый большой GIF набора, GIF по центру, между клетками тёмная щель; у треугольника и ромба — размер в рядах (0 — наименьший, куда влезает набор), клетки заполняются GIF набора по кругу — так один ромб складывается в большой треугольник или ромб. 💾 раскладку GIF — все кадры с выбранным шагом одним файлом, 🖼 PNG — то, что на экране.

Треугольник v0.044 — по снимку «🔺 Формы → Правило 90» — «разве это 90? каждая строка же на 1 бит должна быть больше» и «да, добавь Паскаль mod 2». Правило 90 нарисовано верно: строка растёт на 2 бита (клетка смотрит на левого и правого соседа, узор за шаг расходится на клетку в обе стороны), а половина её нулей — клетки чужой шахматки, пустые всегда. Без них остаётся треугольник Паскаля по модулю 2, где строка растёт ровно на 1 бит. В «Генератор Форм» добавлен пункт 🔺 Паскаль mod 2 (+1 бит): от сида (любая строка из 0 и 1, иначе «1») каждая следующая строка — обкладка нулями по краям и XOR каждой пары, n бит → n + 1, как 🔺+1 в Zazerkalius. Строки разной длины и рисуются по центру, каждая следующая — со сдвигом на полсимвола. Без «Обрезать фон» строки дополняются нулями с обеих сторон почти до прямоугольника: длины через одну отличаются на 1, иначе полусдвиг пропал бы. При «Вживить» строки встают по центру фигуры, а не от левого края. В «◆ ромбах» у таких строк шахматки нет: каждый бит — ромб шириной в символ и высотой в две строки, ряды вкладываются друг в друга. Распознаётся по длинам первых двух строк разной чётности.

Треугольник v0.043 — «в режиме ромбов нужно строки вкладывать как бы друг в друга: нижний треугольник ромба на уровне верхнего треугольника следующей строки». Биты «◆ ромбы» на главном холсте были ромбами, вписанными в свою клетку (ширина символа × интервал): клетки треугольника стоят шахматкой, и между рядами оставались пустые ромбические щели. Теперь у клетки на шахматке вершины (x + y той же чётности, что вершина) ромб на две строки и два символа — полудиагонали равны интервалу и ширине символа; соседи по диагонали делят с ним ребро, и нижняя половина ромба стоит вровень с верхней половиной ромбов следующей строки — сплошная ромбовая решётка. Клетки вне шахматки (в тексте бывают, например «1 10101 1») рисуются маленьким ромбом в клетке поверх, в узле, где сходятся четыре больших, — иначе большие налезали бы друг на друга (так было в Просмотре GIF v0.013). Обводка клеток и мелкий кегль (запись в буфер) — тем же размером. Прежний вид — пунктом «◇ ромб в клетке». При 🔝 закрепе первая строка опускается ещё на полстроки, чтобы верхний ромб не срезался. Следом — «эти режимы вынеси кнопками прямо на холст»: 10 ■ ◆ ◇ строкой по центру холста, сразу под полосой вкладок (у краёв холст обычно закрыт плавающими окнами — первая попытка поставить их у правого края и у столбца круглых кнопок пряталась под «Движением» и «3D»). Кнопка ставит значение списка «Биты» и шлёт ему change — выбор запоминается так же; выбранная подсвечена. Место под полосой меряется наблюдателями; 🔝 закреп опускает строки и под кнопки. В дзене кнопки прячутся вместе с прочими.

Треугольник v0.042 — по снимку верха холста (полоса «👁 Вид · 🎨 Цвет · ◇ Сводка · 🔍 Крупно» поверх вершины треугольника) — «когда прижат к верху 1 строка — опусти ниже, меню закрывает биты». Полоса вкладок висит поверх холста (fixed, 8 px от верха), а при 🔝 закрепе первая строка рисовалась у самого края холста — прямо под ней. Теперь при закрепе строки начинаются под полосой: отступ — её низ от верха холста + 4 px. Меряется не на каждом кадре (getBoundingClientRect заставляет браузер пересчитывать раскладку — то, от чего Code уже уходил), а наблюдателями: размер полосы и холста, окно, класс body. В дзене полосы нет — отступ 0, первая строка снова у края. Выбор щелчком в «🔍 Крупно» берёт тот же startY, сдвиг его не сбивает.

Просмотр GIF v0.020 — по снимкам ромба 4 в «■ квадратах» и «◆ ромбах вплотную» и снимку холста Треугольника — «тут нужно только ромбы, почему вместе с квадратами? Вот так надо, как в Треугольнике». При нарезке всё, что в рамке ромба, но вне его, заливалось серой щелью раскладки (16, 18, 24). У форм клеток щели рисуются квадратами поверх, чтобы ромбы в раскладке набора резались по рамке клетки, — и вокруг ромба вставали серые квадраты, а крайние ромбы-клетки обрезались по ним. Теперь вокруг ромбов нарезки — свой фон: на вид чёрный (0, 0, 1), для поиска нулей он граница куска, как щель, но квадратами не рисуется. Так же чёрным — лента кадров «по одному» и 💾 GIF нарезки. Сцене нарезки дано поле в одну клетку: штамп ромба вплотную выходит за свою клетку на полклетки, и на вершинах большого ромба его обрезал край холста.

Просмотр GIF v0.019 — по снимку «🔍 Крупно» Треугольника — «неправильно режет ромбы, смотри как в Треугольнике все норм». Сетка ромбов в нарезке та же, что в Треугольнике (вершина и наклон из кадра: у GIF 526–781 — клетка в 1 px, вершина (512, 18), наклон 1), отличалась граница. В Просмотре ромб был полуоткрытым: клетка на ребре доставалась одному ромбу — тому, у кого это верхнее ребро, так что у каждого ромба оставались верх и боковые верхние рёбра, а нижние рёбра и нижняя вершина уходили соседям; высота — s строк вместо s + 1. В Треугольнике ромб замкнутый (строки 0 … S, полуширина min(d, S − d)): все четыре ребра его, соседи делят общее ребро. Теперь и в Просмотре так же; проверено функциями страницы — у ромбов 2, 8, 64 каждая клетка каждого ромба совпадает с формой Треугольника. Нижний ряд ромбов берётся, только если нижняя вершина внутри кадра: у 1025 × 530 ромбов 64 стало 105 (ряды 0 … 13), как в «Сводке» Треугольника, а не 120.

Просмотр GIF v0.018 — «каждый второй ромб всё равно так же». Разобрали сам GIF 526–781: нечётные проходы (526, 528 …) — редкая шахматка, как положено; чётные (527, 529 …) — тот же узор, нарисованный дважды со сдвигом на одну клетку («двойная экспозиция»): заняты обе шахматки, клетки стоят парами и столбиками. Каждая шахматка по отдельности — чистый узор; вторая почти совпадает со следующим проходом, сдвинутым на строку вниз (расхождение ~10 %), — похоже, Code писал GIF с включённым зеркалом или вторым слоем. Значит, наложение — не от формы клеток: любая форма на таком кадре налезает. Переключатель шахматка рядом с формой: ◇ вершины (по умолчанию) / ◆ вторая / ▦ обе — гасит клетки другой чётности x + y на холсте, в ленте кадров «по одному» и в PNG (GIF-файлы — исходными пикселями). С одной шахматкой даже «◆ ромбы вплотную» дают чистую ромбовую сетку без «сердечек».

Просмотр GIF v0.017 — по снимку ромба 128 (белые поля, тёмные ромбы-«сердечки» с откусанными углами) — «как так накладывается?». Воспроизведено функциями страницы: это «◆ ромбы вплотную» на чётном кадре, где в GIF заполнены обе шахматки — ромбы одной сливаются в белые поля, точки другой рисуются узлами и откусывают углы у ромбов-нулей. А вплотную стояло само: до v0.013 значение «rh» было у «◆ ромбов», с v0.013 — у «вплотную», и Chrome при F5 восстановил выбор по значению. Урок: меняя смысл значения в списке, браузерное восстановление формы подставит старое. Списку формы клеток — autocomplete="off": после обновления всегда ◆ ромбы в клетке.

Просмотр GIF v0.016 — по снимку «◇ Нарезка по ромбам · Резать · ромб 512» — «при включённой кнопке чтобы сверху на холсте появилось меню всех размеров сразу, ромбы от 2, 4 … до 512 (максимум определить по размеру самого GIF), при нажатии на один — показать внизу кадр за кадром в строку, а на холсте в центре одну, и когда проигрывать — внизу выделять текущий». При «◇ Резать» поверх холста — полоска размеров 2, 4, 8 … (до наибольшего, что влезает от вершины до низа GIF; у 1025 × 530 — 512). Щелчок — раскладка «по одному»: в центре холста один ромб (первый, сверху), под холстом — лента его кадров (высота 56 px; мелкий ромб — крупными клетками, крупный — уменьшенным), подпись — номер кадра, текущий подсвечен жёлтым и держится на виду, щелчок — к кадру; «нечётные / чётные» прореживают ленту. Картинки ленты рисуются кусками по 25 мс. Лента «по одному» теперь — фильм ОДНОГО ромба: прежняя «все ромбы × все кадры» у ромба 2 (130 тыс. ромбов × 256) — 33 млн мест. Соседний — ◇◀ ▶◇ / PageUp PageDown (за последним — следующий размер у «всех»); при игре без 🔁 в конце фильма открывается следующий ромб (так «по очереди» из v0.010 сохранилось), с 🔁 — этот же по кругу. В выбор размера добавлены ромбы 2 и 4.

Треугольник v0.041 и Просмотр GIF v0.015 — «в Треугольнике есть сетка?» — ответ: ▦ в 🗻 3D (v0.040), «◇ Ромбическая сетка» (диагонали через N символов) и слой «Сетка» (шахматка 1010 за строками), а обводки каждой клетки на холсте нет; «да» — добавить, и следом «в кнопках отдели сетку-фоновую от этой новой». Новое везде зовётся обводкой клеток, фоновое — Сетка-фон (подпись в палитре; кнопка «Сетка» в «Файле» не тронута). Главный холст: строка «▢ Обводка клеток» с цветом (выключена) под «Битами» — контур каждой клетки 0 и 1 в её форме: у «◆ ромбов» ромб клетки, у «■ квадратов» и знаков — прямоугольник клетки; контуры копятся в один путь и обводятся 1 px в конце кадра; на кегле меньше 4 px и в кольцевом виде не рисуется. «🔍 Крупно», лента кадров, сводка — та же галка и цвет (ромб чуть больше вписанного, квадрат — внутри клетки; от 4 px). В 🗻 3D «▦ сетка» переименована в «▢ обводка», в Просмотре GIF кнопка ▦ стала ▢.

Треугольник v0.040 — по снимку окна «🗻 3D» (поле пирамид, клетки на гранях квадратами) — «сюда тоже сетка и ромбы». Текстура граней была кадром «клетка = пиксель», при увеличении — квадраты. Теперь она в m точек на клетку (3 … 8, не больше ~12 млн точек; у текста 512 строк — m = 4), клетка — ◆ ромб, вписанный в неё, как на главном холсте (или ■ квадрат — выбор в новой строке окна), и ▦ сетка — галка (выключена) и цвет: тонкая обводка каждой клетки 0 и 1, у ромбов кольцом вокруг, у квадратов по краям (верх и лево всегда, низ и право — у края, чтобы линия между соседями не двоилась). Грань рисуется тем же аффинным отображением, источник берётся в ks раз крупнее; при уменьшении включено сглаживание — иначе ромбы рябят. Цвета собираются номерами в байтах и разворачиваются одним проходом. Огромный текст (меньше 3 точек на клетку) — квадраты. То же и в 🎞 GIF / видео цикла: каждый кадр строит ту же текстуру.

Просмотр GIF v0.014 — «добавь возможность показа сетки, по умолчанию отключи, и настройки цвета её (это граница, обводка тонкой линией всех ромбов-квадратов)». Рядом с формой клеток и «0» — кнопка ▦ (выключена) и выбор цвета (по умолчанию серо-синий #56627a). Сетка — обводка каждой клетки в её форме: светлых и нулей на шахматке, у квадратов — всех точек внутри картинки (как пиксельная сетка). Первый вариант обводил по краю самой формы — у ◆ ромба в клетке при m = 4 в нём всего несколько точек, и край съедал его целиком: единицы стали неотличимы от сетки. Теперь у ромбов и кругов обводка — кольцом снаружи клетки и рисуется под клетками: форма целая, у ромбов вплотную кольцо ложится в щель между соседями. У квадратов — линия по верху и левому краю поверх, соседи делят её, и сетка выходит в одну линию. Сетка включает крупную картинку и у квадратов.

Просмотр GIF v0.013 и Треугольник v0.039 — по снимку «почему-то каждый 2-й кадр с наложением ромбов на пол-размера» и следом «в основном холсте норм». Замер по GIF 526–781: в нечётных кадрах у вершины светлые точки только одной чётности x + y (шахматка, 6474 : 0), в чётных — обеих поровну (4506 : 4424): заполнены и промежутки между клетками (у вершины «###» вместо «#.#»). Ромб «вплотную» (радиусом в клетку, v0.011 / v0.038) на такой картинке налезает на соседей на полразмера. Пробовали оставить вплотную и рисовать точки вне шахматки маленькими узлами — узлы сшили соседние ромбы в сплошные пятна. Решение — как на главном холсте Треугольника, который пользователь назвал нормальным: ромб вписан в свою клетку и ни с кем не смыкается. Просмотр GIF: «◆ ромбы» по умолчанию — вписанные; «◆ ромбы вплотную» — отдельным пунктом (шахматка — от вершины треугольника, в нарезке ромбы встают со сдвигом, не сбивающим её; точки вне шахматки — узлами). Треугольник, «🔍 Крупно» и всё, что рисует та же функция: подложка фигуры — тусклыми квадратами, 0 и 1 — вписанными ромбами.

Треугольник v0.038 — по снимку окна «🔍 Крупно» (ромб из квадратных клеток) — «в Треугольнике тоже по умолчанию нужно представление ромбами» (следом за «◆ ромбами» Просмотра GIF v0.011). Крупная картинка, лента кадров под ней, грани пирамиды, ⊕ XOR и строки сводки рисуются одной функцией — теперь она рисует клетку ромбом радиусом в клетку вокруг её центра: биты текста правила 90 стоят шахматкой (между ними пробелы-прокладки), поэтому соседние по диагонали ромбы смыкаются рёбрами. Сперва пробелы (тускло), поверх 0 и 1; на каждый цвет — один путь и одна заливка. Мельче 3 px ромб не разглядеть — там по-прежнему квадраты. Галка ◆ ромбы рядом с «такие же» (включена) возвращает квадраты. Главный холст не тронут: у него своя «Форма битов» (1 0 знаками / ■ / ◆) во «Фигуре».

Битмультфильмы v0.011 — «Иероглифы Аниматрицы — уменьши картинки на странице, огромные там». Карточки растягивают снимок на всю ширину колонки (~390 px), а снимки иероглифов узкие и высокие: столб «пингвин» 144 × 682 вытягивался почти до 1900 px в высоту, «交» 292 × 670 — до ~900. В этом разделе рамка теперь одной высоты — 340 px, снимок вписан в неё целиком (object-fit: contain, поля чёрные), клетки не размываются (pixelated); щелчок по-прежнему открывает крупно. Остальные разделы не тронуты.

Просмотр GIF v0.012 — по снимку «5000 / с · ▲ ▼ 0 · сдвиг 543 столб.» — «тут дёргается при изменении текста, и скорость ещё больше надо». Подписи скорости и сдвига меняли ширину с каждой цифрой, и строка кнопок переливалась. Теперь это поля постоянной ширины (15 и 20 знаков) с цифрами одной ширины — тот же приём, что у счётчика кадров в v0.003. Скорость прокрутки — до 1 000 000 прыжков в секунду (было 5000); ползунок 0 … 1000 вместо 0 … 100, чтобы на больших скоростях шаг был мельче; по умолчанию — те же ~30 / с. Число скорости — с пробелами по разрядам. Сдвиг при таких скоростях растёт быстро; раньше за 10¹² он сбрасывался в ноль (скачок картинки), теперь сворачивается по W·H: у каждой полосы сдвиг × целый множитель берётся по модулю W и H, поэтому картинка остаётся той же.

Просмотр GIF v0.011 — «в просмотрщике можно менять форму 1 и 0? сейчас там квадраты, хотелось бы по умолчанию ромбы». Разобрали GIF 526–781: у вершины клетки лежат чистой шахматкой (x + y одной чётности — соседние строки сдвинуты на полклетки), это и есть ромбовая сетка; ниже строки 274 около 9 % клеток другой чётности (слои накладываются). Рядом с масштабом — форма клеток: ◆ ромбы (по умолчанию; ромб радиусом в клетку вокруг её центра — соседи по диагонали смыкаются рёбрами с тонкой щелью), ◇ ромбы в клетке, ● круги, ▪ квадраты (как в самом GIF). Кнопка 0 (включена) — нули внутри картинки тусклыми клетками той же формы: чёрные между первой и последней светлой в строке (по кускам между щелями раскладки нарезки), той же чётности, что первая светлая, — видна вся сетка. Сцена рисуется в m раз крупнее (3 … 12, не больше ~12 млн точек; у GIF 1025 × 530 — m = 4), прокрутка и масштаб берут её вместо исходной; форма включается от увеличения ×2 — мельче её не разглядеть, а сглаживание замылило бы. Первый вариант строил кадр 0,4 с: 32-битные цвета (больше 2³¹) в горячем цикле с вызовом штампа движок упаковывает поштучно. Переделано: цвета — в номера 0…255, штамп — строками по байтам, цвет разворачивается одним проходом в конце; буферы общие на все кадры — 40–90 мс на кадр. PNG сохраняется с формой клеток, GIF-файлы — исходными пикселями.

Просмотр GIF v0.010 — на вопрос «все группы рядом, каждый размер своим GIF или каждый ромб своим маленьким фильмом?» — «каждый ромб своим маленьким фильмом, но это прямо тут сохранить — отдельной кнопкой, если нужно будет, а так всё в редакторе». Раскладка по одному ромбу: лента — весь фильм ромба 1, потом ромба 2 … (ряд за рядом, слева направо), по выбранным размерам (все — от мелких к крупным). ◇◀ ▶◇ и PageUp / PageDown — соседний ромб на том же кадре; двойной щелчок по ромбу в группе — он один, тот же кадр. 💾 ромб — фильм этого ромба одним GIF, только по кнопке (мелкий ромб увеличивается, до 256 px). Внутри: ромбы размера режутся один раз (откуда в кадре и где в своей рамке), группы «на местах / в строку / сеткой» собираются из них. Полоска-график считается раз на ленту и при ленте длиннее полоски берёт наибольшее по столбику: «все, по одному» — это 2667 ромбов × 256 кадров ≈ 680 тыс. мест. Проверено функциями страницы на GIF 526–781: ромбов 16 — 2016, 64 — 120, 128 — 28, 256 — 6, 512 — 1; площадь ромба 64 — 2048 px (64·64/2), сумма ромбов = пиксели группы.

Просмотр GIF v0.009 — по снимку «◇ 64 × 0» — «пустые картинки». Размер ромба в v0.008 умножался на «строку … px» из прокрутки, а у пользователя там стояло 64: ромб 64 стал 4096 px и в кадр 530 px не влез ни одним — группа из нуля ромбов. Размер ромба теперь — px кадра, от прокрутки не зависит. Проверено функциями страницы на том же GIF: вершина (512, строка 18), наклон 1; ромбов 8 — 8128, 16 — 2016, 32 — 496, 64 — 120, 128 — 28, 256 — 6, 512 — 1. Заодно «в строку» переносится по ширине кадра: была лента до 8192 px, и в окне всё мельчало до ×0.1.

Просмотр GIF v0.008 — по снимку столба ромбов (вершина треугольника, под ней чёрный перевёрнутый треугольник, крест, снова ромбы) — «как по сетке ромбов разрезать и потом их проиграть по порядку своих размеров в группу». ◇ Резать (левая панель, под набором): кадр режется по сетке ромбов от вершины треугольника — вдоль обоих рёбер, шагом в размер ромба; берутся только целые ромбы, ряд r — r + 1 ромбов. Вершина и наклон находятся сами: цвет клеток — самый частый не чёрный (подпись «проход … · кадр …» жёлтая и не мешает), вершина — первая строка с ним, наклон — полуразмах самой глубокой строки на её глубину. Ромбы одного размера показываются группой: на местах (раздвинуты зазором), в строку (ряд за рядом, слева направо) или сеткой. Размер — 8 … 512 строк или все: весь фильм ромбами 16, потом 32, 64, 128, 256, 512 (или от крупных к мелким), группы идут подряд. Строка — px из поля «строка» у прокрутки. Нарезка строится картой «откуда — куда» один раз на размер и раскладку, дальше кадр кладётся одним проходом. 💾 GIF — нарезка одним GIF, группы по центру общего поля. Попутно: чётность кадров (нечётные / чётные) теперь по номеру кадра в GIF, а не по месту в ленте — в склейке и нарезке они разные.

Просмотр GIF v0.007 — разбирали GIF «Аниматрица шаг1 проходы 526–781» (256 кадров): ромбы то растут, то сбрасываются, а соседние кадры мигают — чётные вдвое плотнее нечётных (кадр 3 — 13 % светлого, кадр 4 — 41 %), поэтому смотреть надо через кадр. Слово пользователя: «да (поле кадра, только нечётные), и потом надо разобрать весь гиф, поделить на ромбы различной длины и сортировать по чёт / нечёт, и ещё как, и просто по порядку». Сделано: поле кадр №; все кадры / нечётные / чётные — листание, игра и участок в склейку идут только по своим кадрам (шаг 1 становится 2). ◇ Разобрать — в каждом кадре доля пустых ромбов: чёрных мест не меньше 15 px в поперечнике, считая только внутри картинки (в строке — от первой светлой точки до последней, фон вокруг треугольника не в счёт). По ней GIF режется на участки отдельно по нечётным и чётным кадрам: ромб — пока дыры есть и не падают больше чем на 10 %, упали — сброс, новый ромб; без дыр — шум. Участки ложатся в склейку (только ромбы / весь GIF / только шум; чёт, нечёт или оба). У этого GIF ромбы вышли длиной 6, 5, 16, 5, 16, 16, 16 кадров на каждую чётность — похоже на счёт степенями двойки. Порог сброса сперва был 15 %, и чётные 210 → 212 (падение 14 %) не резались, а нечётные 211 → 213 резались — поставлен 10 %, чтобы чёт и нечёт делились одинаково. ⇅ сортировать склейку: по порядку, нечётные / чётные вперёд, длинные / короткие вперёд, крупные / мелкие ромбы вперёд, ромбы потом шум, наоборот, вперемешку. Под ползунком — полоска-график дыр по кадрам (нечётные жёлтым, чётные голубым), щелчок и протяжка — к кадру.

Просмотр GIF v0.006 — «очень занимательно, надо постолбцовую ещё свёртку, нарезку» и «если не ромбовую…». У ⇅ Прокрутки — ось: ≡ по строкам (как было), ‖ по столбцам, ↘ и ↙ по диагонали — вдоль рёбер ромбов; направление — вперёд, назад, туда-сюда. Нарезка: сцена режется на полосы шириной в прыжок поперёк движения (по столбцам — горизонтальными лентами, иначе — вертикальными): целиком — всё вместе; полосы встречно — соседние едут в разные стороны; полосы лесенкой — каждая следующая сдвинута на прыжок больше, картину скашивает и закручивает. Точка экрана берёт точку сцены со сдвигом по кругу, каждая полоса — до четырёх кусков сцены.

Просмотр GIF v0.005 — «у GIF общая сцена — надо строчную прокрутку вверх-вниз, туда-сюда, на огромных скоростях; задавать шаг прыжков размерами ромбов или треугольников». Новая строка под участками: ⇅ Прокрутка — сцена (один GIF или вся раскладка) крутится по кругу, как барабан строк: ↓ вниз, ↑ вверх, ↕ туда-сюда (размах — прыжков в одну сторону, потом обратно); прыжок — 1, 2, 4, 8 … 512 строк (размер ромба или треугольника), строка — сколько px в GIF (у GIF из Code клетка 2–4 px); скорость — 1 … 5000 прыжков в секунду, на больших за кадр экрана делается сразу много прыжков. ▲ ▼ и стрелки ↑ ↓ — прыжок вручную, 0 — сдвиг в ноль; кадры при этом играют и листаются как обычно. Картинка сцены строится заново, только когда сменился кадр или набор, — прокрутка лишь сдвигает её при выводе, поэтому быстрая. (Сделано поверх v0.003–v0.004 другой сессии.)

Просмотр GIF v0.004 — «пауза по щелчку». Щелчок по картинке без протяжки ставит паузу и снова запускает, как пробел; протяжка мышью, как и прежде, двигает вид.

Просмотр GIF v0.003 — по снимку «склейка кадр 13 / 64 · Zerkalius-romby-… #49 · 250 мс» — «тут текст прыгает, название файла надо в сторонку». Счётчик кадра и имя файла стояли одной строкой у ползунка; в склейке имя меняется от кадра к кадру, строка то длиннее, то короче, и ползунок с текстом дёргались. Теперь это два поля постоянной ширины: счётчик у ползунка, имя с номером кадра — в стороне, бледнее, длинное — с многоточием, целиком — в подсказке.

Zazerkalius v0.779 — по снимку торов: «у строки 3 вырез вверху — почему-то не соответствует», «2 подряд строки вверх битами». Причина: ⟲ «всё на места» расставляет кольца с вырезами симметрично (чётные — биты сверху, нечётные — вырез сверху) только в плоском виде (coneCutHome ждал coneCutOn, а в 3D он выключен). В 3D кольца вставали в повороты из ⭐, да ещё округлённые до целых бит (coneRotKeep). Теперь при ◎ торах с вырезами ⟲ расставляет так же, как на плоскости (и сбрасывает фазу кручения), а половины частей у колец сохраняются.

Zazerkalius v0.780 — «переходим в 3д Соляриус»: в 3D лазер и солнце были выключены целиком (с v0.373 все группы Solarius гасли). Теперь с «◎ торами» они работают: торы лежат в одной плоскости, поэтому расчёт ровно тот же, что в плоском виде (те же углы и кольца, строки за чертой строятся так же), а плоский слой света — лучи, освещённые сектора, кольцо за чертой, пустые кольца — рисуется на плоскость торов аффинной проекцией (cone3Aff). Масштаб торов — как у плоского вида (d = шаг кольца), кольцо строки i плоского вида [i·d, (i + 1)·d] = тор этой строки. Без ◎ (кольца на разных высотах) — как было: в 3D не считается, подсказка у групп говорит, что включить. Мышь в 3D по-прежнему вращает вид, кольца не берёт.

Zazerkalius v0.781 — «вообще надо к бипирамиде прийти: в каждой строке T−1 ячеек — это их предыдущей строки биты»; сперва в 2D, «два варианта надо смотреть». В «вырезах T−1» кольцо строки n — 2n − 1 частей, и вырез (n − 1 частей) как раз вмещает предыдущую строку, если в ней n − 1 бит. Кнопка «◇ пред.» в «Щелях» (Z.cutPrev): «блоком» — свои биты подряд, как были, вырез заполнен битами предыдущей строки по порядку; «через 1» — как ряд треугольника ▲▼▲▼▲ (часть 2j — свой бит j, часть 2k + 1 — бит k строки выше), то есть кольцо — ряд грани бипирамиды. Чужие биты бледнее своих, границы — между всеми частями; Ctrl + щелчок по чужой ячейке меняет бит в той строке. Видно и в 3D-торах. Пока это вид: лазер и солнце считают вырез как раньше (при «через 1» свои биты стоят не там, где их видит свет). Бипирамида в 3D — следующим шагом.

Zazerkalius v0.782 — «делай любой пока, потом посмотрю, без меня» (к бипирамиде): «◇ бипирамида» в группе «3D» (Z.coneBipy, вариант Z.coneBipyM, ряд кнопок «◇ нет / через 1 / блоком»). Конус в объёме без ◎ торов: кольцо строки n (n ≥ 2) — 2n − 1 ячеек, свои n бит и n − 1 бит строки выше; «через 1» — как ряд треугольника ▲▼▲ (выбран основным: так кольцо и есть ряд грани), «блоком» — свои подряд, чужие следом. Под основанием всегда зеркало с инверсией (0 ↔ 1), как в «Гранидусе», — вместе пирамида и её отражение, бипирамида. Биты строки выше бледнее, границы 0→1 / 1→0 — между всеми ячейками. Свой вариант заведён потому, что «◇ пред.» из «Щелей» живёт в группах Solarius, а они в чистом 3D гаснут. Кручение — целыми своими битами (через одну — две ячейки за бит).

Zazerkalius v0.783 — «адаптируй мобильную версию: там кнопки во весь экран, ничего не видно». Снимки в размере телефона (390 px) показали: первый экран целиком занимали группы левой панели, конус начинался ниже экрана; полоса над строками растягивала страницу до 955 px вбок; окно «Текст конуса» висело поверх строк; а при каждой перерисовке строк scrollIntoView текущей строки уводил всю страницу к полю (тронул кнопку под конусом — экран прыгнул). Теперь на узком экране: левая панель свёрнута в «☰ Панель» (ромбы записи и дзена — только при открытой); шапка и полоса над строками — одной строкой с прокруткой вбок; на «◯ Solarius» (solo) конус первым, сразу под шапкой, холст прилипает к верху, кнопки групп листаются под ним; «Текст конуса» — в общем потоке; текущая строка прокручивает только само поле (scrollNear). Порядок блоков задан явно: на столе у них свои order для сетки, и в столбике поле уезжало в самый низ. Стол (шире 760 px) не тронут.

Zazerkalius v0.784 — «◇ бипирамида тормозит: каждый круг остановка небольшая». Поворот кольца из 2n − 1 ячеек брался «в своих битах ×2» (блоком — ×1), а счёт кручения на каждом круге перескакивает с n на 0: у обычного кольца из n бит это незаметно, а здесь кольцо прыгало на ячейку назад — это и была остановка. Теперь поворот — тот же угол, что у обычного кольца (n бит оборота = 2n − 1 ячеек), круг замыкается без скачка.

Zazerkalius v0.785 — «делай» на «свет на бипирамиде не считается» и «кольца круглые, под 2n − 1 ячеек не подгонял». Грани: при «⬡ многоуг.» кольцо бипирамиды — (2n − 1)-угольник, ячейка — сторона (вершина — точка, строка 2 — треугольник, дальше 5-, 7-, 9-угольники). Свет: бипирамида вошла в coneSol3d — лазер и солнце в 3D считаются так же, как в плоском виде, и группы Solarius не гаснут. Плоский слой света на неё не кладётся (кольца на разных высотах — пробовал на плоскость основания, вышел один диск поверх фигуры), свет рисуется прямо на кольцах в объёме: ☀ — освещённые дуги по внутреннему краю колец, ⌖ — луч ломаной от вершины по кольцам до стены (красная точка) или насквозь за основание. При лазере / солнце в «вырезах T−1» кольца бипирамиды встают ровно в плоскую раскладку (поворот в частях и сдвиг выреза), чтобы свет падал на те же ячейки; «блоком» совпадает с расчётом точно, «через 1» — свои биты стоят не там, где их видит свет (как и у «◇ пред.»).

Zazerkalius v0.786 — по снимку: «текст этот под меню, и не вытащить его». Таблица «Σ расчёт» торов рисовалась на холсте у верхнего края, а вкладки групп и плавающие группы лежат поверх холста — таблица оказывалась под ними, и взяться за неё было нельзя (сперва пробовал тянуть её по холсту — мышь всё равно попадала в группы). Теперь это своя плашка (#coneTorInfo) в теле окна конуса, над группами: тянется мышью или пальцем за любое место, место помнится (Z.coneTorInfoXY), за край окна не уходит, двойной щелчок — на место по умолчанию (ниже вкладок). Галка «Σ расчёт» её прячет, как прежде.

Zazerkalius v0.787 — разбор с пользователем: кольцо строки n в ряду треугольника — ▲ свои биты и ▼ между ними; отражение строки вниз, через черту, ложится ровно на середину следующей строки. «1 с первой даёт 0 в центр 2, потом снова 1 в центр 3» — значит, зеркало инвертирует: ▼ строки n = НЕ ▲ строки выше (центр по строкам 1, 0, 1, 0…), а внутренняя ▲ = НЕ ▼ строки выше = ▲ строки через одну со сдвигом на одну: s[n][j] = s[n−2][j−1]. Свободны только два крайних бита каждой строки, строки 1 и 2 — целиком. «Да, делай оба»: (1) в «◇ пред.», торах и «◇ бипирамиде» биты строки выше в ▼ теперь инвертированы (в v0.781–v0.786 стояли как есть); (2) кнопка «◇ строить» (группа «3D», рядом с «◇ нет / через 1 / блоком») перестраивает строки поля сверху вниз по этому правилу — там, где они идут подряд по длине (n − 2, n − 1, n); крайние биты не трогает, ↩ вернёт, замок строк ⛔ не пускает. Проверено: 1, 10, 000, 1111, 00000, 110011 → 1, 10, 010, 1101, 00100, 111011.

Zazerkalius v0.788 — разбор продолжился: «1, 11, 111 → 1000 — это внахлёст? похоже сдвиг». Внахлёст (v0.787) строка 4 была бы ?11?; «1000» = 1 + не(111) — ▼ строки 4 (не ▲ строки 3 над ними) съезжают на полклетки и становятся её ▲. Правило пользователя: «с самого верха, 1 первый бит слева каждой T строки + 1» — строка n + 1 = её левый бит + инверсия строки n, строка 1 своя; «3 пробуем». Сделано: (1) «◇ сдвиг» в полосе над строками — перестраивает строки сверху вниз по этому правилу (где каждая на бит длиннее предыдущей; левый бит не трогает; ↩ вернёт): 1, 11, 111, 1000, 00000, 110011 → 1, 10, 101, 1010, 00101, 111010; (2) «▲▼» там же («в строках бы такую кнопку, чтобы всё так же показала») — поле строк треугольником: клетка — треугольник с цифрой, ▲ — бит строки, ▼ — инверсия бита над ним (бледнее), ряды по центру сами складываются в треугольник; только вид, щелчок по ряду — текущая строка, первые 400 строк. При сдвиге в этом виде каждая ▲ (кроме левой) равна ▼ слева от неё — пары одного цвета.

Zazerkalius v0.789 — «мне бы ещё спецочки для обнаружения изменённых треуглов — цветом выделить фоном, кнопку, а то всё очень интересно и очень запутанно». Рядом с «▲▼» — «👓» (Z.triGlass), щелчок по кругу: «👓 изм.» — золотом клетки (▲ и ▼), чьё значение другое, чем до последней правки (сравнение с ↩-снимком: после «◇ сдвиг», «◇ строить», правки строки); «👓 пары» — золотом ▲, которая не равна ▼ слева от неё, то есть где ломается правило сдвига; ещё раз — снять. 1 подсвечивается светлым золотом, 0 — тёмным, цифра видна. Сам включает «▲▼». Проверено: после «◇ сдвиг» на 1, 11, 111, 1000, 00000, 110011 — 12 изменённых клеток; при испорченной строке 4 «пары» показывают ровно две ▲ — в ней и в строке под ней.

Zazerkalius v0.790 — «вот Аниматрицу если так сделать в треугольниках и с фоновыми цветами изменённых бит до T-уровня… ковёр такой — долго глядеть можно, а то в Экселе тормозило всё». «▲▼» переведён с тысяч HTML-клеток на холст (#tvCv): треугольники одного цвета заливаются одним путём, сторона подгоняется под ширину поля (3…26 px; цифры — от 14 px), строк — до 2048; щелчок по ряду — текущая строка. «👓 изм.» теперь сравнивает с предыдущей другой картиной (на волне Аниматрицы — шаг, после «◇ сдвиг» и правок — их результат) и оставляет след: поменявшаяся клетка горит золотом и остывает в 4 ступени за T новых картин (T — строк в поле), так что за проход волны виден весь ковёр изменений. Замер: 64 строки (≈8 тыс. треугольников) — около 30 мс на кадр с пересчётом следа; на сотнях строк будет тяжелее.

Zazerkalius v0.791 — три правки. (1) По снимку «◇ сдвиг» — «тут бы цикл-кнопку: обратно чтоб ставила, а то сейчас не убрать»: «◇ сдвиг» и «◇ строить» — переключатели: первое нажатие перестраивает строки и помнит, какими они были, второе (пока строки — её результат) возвращает их; кнопка горит, пока строки — её результат, тронул руками — гаснет; оба шага в ↩. (2) «Сделай одной кнопкой, одной ширины, но с 3 разноцветными обводками»: «👓» убрана, «▲▼» — одна кнопка по кругу: поле → ▲▼ (голубая обводка) → ▲▼ + изм. (золотая) → ▲▼ + пары (розовая) → поле; надпись не меняется, ширина та же. Обводку полосы над строками красила общая раскладка кнопок — теперь она уважает свой цвет кнопки (data-gcol). (3) Попутно найдено при проверке: с v0.774 (кольца от точки центра) обводка текущего кольца строки 1 и наведённого кольца шла с отрицательным радиусом — canvas бросал IndexSizeError, когда текущей была строка 1; радиус теперь не меньше нуля.

Zazerkalius v0.792 — по снимку «слева | строки | справа»: «нужен ещё режим — только строки». В сцепку шапки четвёртой кнопкой встала «только строки»: окна (и стол, и пристыкованные под полем) прячутся, поле строк — на всю ширину за левой панелью. Почему прятать, а не закрывать окна: их места, размеры и свёрнутость не трогаются — вернуть одним щелчком, тем же или «слева» / «справа». «строки» в этом режиме тоже возвращает окна, а не прячет поле — иначе на экране осталась бы одна панель. Запоминается (Z.fieldOnly, класс body.field-only).

Zazerkalius v0.793 — по снимку «△ Сетки» и разбору «▲▼»: «вбок лев, прав; и вообще сетку бы такую же, как в Сетке, но с масштабом и всякими наездами, границами, тенями, фонами, аниматрицами — похоже, новое окно нужно Ромбоидам, не загромождать обычные строки». Новое окно «◇ Ромбоиды» (в шапке рядом с «△ Сеткой»): строки поля ковром из треугольников на своём холсте — колесо наезжает к мыши, тянешь — сдвиг, двойной щелчок — вписать. ▼ теперь берёт инверсию ▲ прямо над собой по месту в сетке, а не по номеру — иначе при сдвинутых рядах ▼ показывали бы чужие биты. Ряды: центр (как «▲▼» — равные строки столбиками, сетка не смыкается), ёлочка (ряд, который по центру ломает сетку, — на полклетки то влево, то вправо), ← вбок и вбок → (всегда в одну сторону — параллелограмм); растущие на бит строки во всех режимах по центру, потому что там сетка и так сходится. Границы по кругу: каждый треугольник, ромбы (▼ с ▲ справа — по правилу «◇ сдвиг» они равны, так что нарушение видно сразу), группы (между разными битами), без границ. «тени» — единицы отбрасывают тень на нули, рельеф групп. Свои цвета фона, 1, 0 и границ; «▦» — решётка на всё окно; «№» — цифры и номера строк (по умолчанию выключены — ромбы без номеров). «👓 изм.» и «👓 пары» — тот же след Аниматрицы до T-уровня, что в «▲▼»; кнопки ▶ ▷| ⤺ жмут те же кнопки волны, что в поле. Сам «△ Сетку» не трогал: у неё своё дело — рисовать руками и строить кнопки; если нужно, следующим шагом можно дать ей «из строк». «▲▼» над полем тоже остался как был.

Zazerkalius v0.794 — две просьбы. (1) По снимку поля «■ квадраты» — «вот эти бы тоже в ромбоиды из строк». В «◇ Ромбоидах» кнопка «▲ бит / ◇ бит»: при «◇ бит» каждый бит строки — ромб из двух треугольников, а ряды стоят так же, как строки в поле (◫ по центру, ◧ влево, ◨ вправо). Квадратная сетка поля в треугольной становится скошенной: при «вбок →» лесенка, выровненная влево, — ровный параллелограмм, столбцы бит идут наклонно. Почему наклон: два треугольника складываются только в ромб с углом 60°, и чтобы столбец бит не рвался, каждый ряд ниже сдвигается на полклетки; «← вбок» наклоняет ромбы в другую сторону, «ёлочка» — столбцы зигзагом. (2) «Да, особенно 3» — из трёх предложений сделаны все: «👓 возраст» — клетка цветом по тому, сколько проходов волны она не менялась (красная — только что, оранжевая, жёлтая, зелёная, голубая, синяя — до 16 проходов; дольше — своим обычным цветом: застыла; нули — тем же цветом бледнее). Часы — в проходах самой волны (номер прохода + доля строки), поэтому возраст не зависит от скорости и от того, сколько шагов уместилось в кадр; правки руками и ⤺ двигают часы на шаг, назад они не идут. Цифры теперь только при крупном наезде (треугольник от 22 px, ромб от 18): на общем плане они давали зернистость. «⇣» — пока идёт волна, вид сам едет за переписываемой строкой (она держится на 2/5 высоты окна).

Zazerkalius v0.795 — по снимку «▲▼»: «Аниматрица изначально строилась так, можно её тут: волна — зеркало по горизонтали на каждую строку до 1 строки и так по циклу; вариации — зеркало с инверсией, горизонт через 1, 2, 4, 8… строки вместо каждой, только чётные биты, только чётные группы по 2-4-8…» (проверит потом сам). В «◇ Ромбоидах» выбор волны для ▶ ▷| ⤺: «🌊 волна поля» (прежняя Аниматрица) или «⇕ зеркало» — своя. Шаг зеркальной: горизонт — нижний край строки a, всё над ним до строки 1 отражается вниз, строка a + k получает отражение строки a + 1 − k; горизонт сдвигается вниз, дошёл до низа — проход, и по кругу; повтор картины — сообщение о цикле. Как понято «зеркало по горизонтали» в треугольной сетке: отражение переворачивает треугольники, ▼ верхней строки ложится на ▲ нижней ровно под ним. Поэтому пишутся только биты строк (▲): ▼ — всегда инверсия ▲ над ним, и для отражённых строк это совпадает с зеркалом само. Читается только то, что над горизонтом, пишется только под ним — порядок внутри шага не важен. Варианты: «¬» — с инверсией; горизонт через 2, 4, 8, 16; биты — все, чётные (2-й, 4-й…), чётные группы по 2, 4, 8, 16 (вторая, четвёртая…); «⊕» — XOR со старым вместо замены; ⚡ — шагов горизонта в секунду. Замечено на пробе: простое зеркало на треугольнике быстро встаёт в цикл (часто период 1) — с ⊕, масками и шагом горизонта картина живее. Возраст клеток и «⇣» идут от той волны, что выбрана.

Zazerkalius v0.796 — по снимку «◇ сдвиг»: «сдвиг даёт ромбы, с виду сбоку как трапеции… это же не обязательно бипирамида — трирамида», и на разбор (ромб из двух треугольников бывает трёх направлений — «\», «/», «◆», — это три видимые грани кубика) — «да, делай кубы». В «◇ Ромбоидах» кнопка «🧊»: каждый ▲ берёт в пару равный по биту свободный ▼ из трёх соседей — слева («\»), снизу («◆»), справа («/»); с какого начинать — «сперва \ / ◆ / /», склейка жадная, сверху вниз, поэтому порядок решает, какие ромбы выйдут. Ромб красится гранью: «/» светлая, «◆» средняя, «\» тёмная — тем же цветом бита; треугольник без пары — бледный с красной обводкой. Что выяснилось сразу: у правила «◇ сдвиг» все ромбы одного направления «\» — одна грань кубиков, отсюда и «вид сбоку». И совсем без пар треугольник не складывается никогда: в треугольнике из n строк ▲ на n больше, чем ▼, так что n треугольников (у сдвига — левый край) всегда остаются одни; поэтому счёт показывает и «без пары», и сколько из них неизбежно, а разрывами считается только то, что сверх.

Zazerkalius v0.797 — «включил Аниматрицу в Ромбоиде, а играет в строках». Причина: ▶ в «◇ Ромбоидах» (волна поля) жмёт ту же кнопку волны, что в поле, а кадр волны перерисовывал только поле строк (renderRows — ради скорости, без всех окон); Ромбоиды обновлялись лишь на одиночном шаге ▷|, где вызывается полная перерисовка. Теперь каждый кадр волны рисует и Ромбоиды (если окно открыто). Сама волна по-прежнему меняет строки поля — она и есть Аниматрица над строками; чтобы смотреть только ковёр, поле можно спрятать («строки» в шапке).

Zazerkalius v0.798 — по снимку «◇ Ромбоидов»: «если в этой же сетке ромбовой тут и кнопки делать». Три ряда инструментов окна — .tools.lpw, тот же механизм, что у «▲ Пирамиды Паскаля» (lpTools): кнопки, списки и подписи с образцами цвета — шестигранники из треугольников, сцепленные остриё в выемку, ряды вплотную; перенесённая на новую строку начинает её остриём. Два дополнения в lpTools: обёртка, растворённая через display: contents (варианты зеркальной волны в #rmbWOpt), отдаёт свои кнопки в общую цепочку ряда; подпись с образцом цвета («фон», «1», «0», «граница») меряется по тексту + 22 px образца — по Range она сплющивала образец в полоску.

Zazerkalius v0.799 — по снимку «👓 возраст»: «не меняй ширину кнопок». Кнопки с надписью по кругу (👓, границы, «сперва …», ▲ / ◇ бит, ▶ / ⏸) брали ширину по нынешней надписи, и при каждом щелчке цепочка дёргалась. Теперь у них data-labels — все надписи через «|», и lpTools берёт ширину по самой длинной (мерит шрифтом самой кнопки); списки в рядах .tools.lpw — тоже по самому длинному пункту, а не по выбранному (касается и списка «▲ Пирамиды»). Проверено: три круга переключений — ширины те же.

Zazerkalius v0.800 — по снимкам «⌖✕ сброс» и ромбового пульта у холста: «сюда, наверх, в 2× размере». Сброс лазера — теперь ромб вдвое больше обычного (80 px) на вершине пульта, над 🧊 и ⧗: его нижние стороны ложатся на их верхние, решётка та же — пульт стал одним большим ромбом сверху. Пульт вырос вверх на полтора ромба (стоит у нижнего края, поэтому растёт вверх). Красный — чтобы не спутать с зелёной ⟲ «всё на места». Работает и в плоском виде, где прочие кнопки пульта приглушены. Как сделано: новая кнопка жмёт прежнюю ⌖✕ из «Алгоритма», а та спрятана — так весь её код, затемнение и откат остались как были, а сохранённые раскладки групп не трогаются.

Zazerkalius v0.801 — по снимку «Алгоритма»: «лишний полуромб внизу и тянуть не в углу». (1) Зубцы рамки группы идут шагом в ряд кнопок (24 px), а текст алгоритма под кнопками (#lasAlgo; так же строка вариантов цикла #coneVarN) — любой высоты: рамка внизу обрывалась посреди зубца. Теперь в tzgFrame текст дотягивается до целого ряда (min-height, пересчёт при каждом изменении ширины — текст переносится по-разному): группа — целое число рядов, низ — целым зубцом. (2) Ромб-ручка вставал на верхний край текста (бралась его верхняя граница как «нижний ряд»), теперь — в нижний ряд текста, в угол группы. Проверено на длинном тексте: группа 264 px = 11 рядов, ручка в правом нижнем углу.

Zazerkalius v0.802 — по снимку сводки солнца «☀ 1 · ☾ 0 · ◌ между 1 · лучей…»: «тут надо подсчитывать общий баланс всех открытых строк, 0 и 1; если равны — подсветить числа баланса; баланс сверху». Над сводкой — строка «Σ 1: x · 0: y · Δ ±d»: единицы и нули во всех строках на конусе (над чертой; строки за чертой не входят); поровну — «поровну», зелёным с рамкой и свечением. Видна, пока светит солнце (там, где сводка; при выключенных «☀ долях» — на месте сводки). Считается каждый кадр — по всем строкам конуса, это быстро.

Zazerkalius v0.803 — по снимку конуса с солнцем: «тут нужен режим ручного редактирования — вращения — с магнитной привязкой к осям симметрии, границам битов через центр, серединам, частям из Сканера и осям». «🧲 магнит» рядом с «✛ оси»: при нём кольцо тянется мышью без Ctrl и крутится свободно — только на вид, строка та же. Защёлкивается, когда что-то своё у тянутого кольца — граница бита, середина бита или ось симметрии его узора (зеркальная ось: s[j] = s[2c − j − 1]) — подходит в пределах 7 px к цели: ✛ вертикали или горизонтали, границе, середине или оси симметрии другого кольца, ⌖ оси Сканера или черте его частей. Пока тянешь, привязка видна золотой линией через центр; отпустил — поворот остаётся дробным, как защёлкнулся, а в сообщении — к чему («граница → граница кольца 5»). Почему отдельный режим, а не всегда: прежде поворот на отпускании округлялся до целого бита (или полбита в вырезах), и на этом держится весь счёт лазера и солнца; теперь у повёрнутого магнитом кольца метка Z.coneFree — его поворот не округляется, а обычный поворот без магнита метку снимает. Виды целей — пять маленьких кнопок рядом (видны при включённом магните): ✛ ⟷ ┆ · ⌖. Целей много (все границы и середины всех колец), поэтому магнит цепляет часто — лишние виды отключаются этими кнопками.

Zazerkalius v0.804 — «крутить побитно — это значит: биты-границы стоят во всех кольцах недвижно, перемещаются лишь сами 1 и 0 в них, одно смещение по кругу за шаг», и на вопрос «только на конусе или и в поле?» — «и в поле тоже». «▦ побитно» больше не поворачивает кольца: фаза кручения стоит, ячейки, границы и вырезы на месте, а каждая строка конуса за шаг сдвигается по кругу на один бит — в поле строк тоже (по часовой: бит из ячейки j переходит в j + 1; в «по биту навстречу» нечётные строки — в другую сторону). Без вырезов картина та же, что и прежний поворот ровно на бит, — разница была в вырезах T−1: там с битами по кругу ехал и сам вырез, и казалось, что движется всё кольцо. Не крутятся строки колец со своим замком 🔒 и кольца, остановленные лазером; общая галка «запрет сдвига строк» здесь не мешает — она про поворот руками, и по умолчанию включена, иначе не крутилось бы ничего. Проход лазера, закраска и строка за чертой у солнца — после каждого шага (у сдвига нет промежуточных положений, которые прежде просматривались между битами). ↩ возвращает весь прогон ▶ одним шагом (снимок — в начале). «½ бита» и «◫ части пред.» — по-прежнему поворотом колец.

Zazerkalius v0.805 — по снимку группы «Строка 1»: «нужен режим, где из центра через любую точку на первом кольце простая прямая толщины ноль, которая вместе с битом 1 строки по кругу с ним двигается, и когда попадает в свободные ячейки верхней строки, пройдя полностью длину бита там от и до, запишет в нём 1; также крупно показывать счётчик текущего вращения и кнопку ручного перехода на новую строку, чтобы её биты собирать». «⟋ нить» в «Строке 1»: прямая из центра до края холста через точку кольца строки 1 (по умолчанию — середина бита; щелчок по кольцу строки 1 — поставить в другое место), крутится вместе с ним. Ячейку строки за чертой нить метит «1», только пройдя её целиком: вошла через одну границу и вышла через другую в ту же сторону; повернула назад посреди ячейки — не метит. Слежение — в координатах кольца за чертой без разрыва, поэтому быстрое кручение (много ячеек за кадр) ничего не пропускает; в вырезах T−1 — по частям, вырез не метится. Плашка поверх холста (тянется, двойной щелчок — на место): крупно ⟳ — обороты нити относительно строки за чертой с её начала, под ним — сколько её ячеек уже «1», и «⤓ новая строка» — строку за чертой в поле (пустые — нулями), за чертой — следующая, счёт заново. Попутно: луч лазера падал с ошибкой arc «радиус отрицательный» — у дыры строки 1 внутренний край уходил ниже нуля (r0 = 0 с v0.774); радиусы дыр теперь не меньше нуля.

Zazerkalius v0.806 — по кнопке «вырезы T−1»: «* когда между битами каждый вырез» и «добавь». В «Щелях» пятый вид — «вырезы между» (по кругу: 1 щель → вырезы T−1 → вырезы между → вырезы 2n → все щели): те же 2n − 1 частей, но вырез не одним куском, а по части между каждыми двумя соседними битами — бит, вырез, бит, вырез… бит; последний и первый бит стоят вплотную (шов). Расстановка по умолчанию — середина узора сверху, шов снизу, симметрично вертикали. Сделано не отдельной веткой, а там, где вырезы T−1 жёстко считали «части 0…n − 1 — биты, дальше — вырез одним куском»: место бита (cutPos), бит под частью (cutBit), дуги вырезов (cutHoles) — в рисунке колец строк, кольца за чертой и пустых колец, в луче лазера, в солнце и луне (проход, стены, ⊕ xor, «целиком», ⟿ проход), в щелчке по кольцу. Границы между битами в этом виде рисуются только на шве — остальные края — золотые края вырезов. «◇ пред.» (биты предыдущей строки в вырезе) в этом виде не действует: вырезы здесь пустые; «щели между битами» — тоже (соседних бит нет).

Zazerkalius v0.807 — три просьбы подряд про солнце и луну в строке 1. (1) По снимку полукольца: «нужен режим, когда одна половина — солнце, другая — луна; на 180° обе светят», и (2) «а в 4 частях — также»: «☀☾» в «Строке 1» (при ◐ полукольце или ✚ 4 частях, солнце в вырезах) — открытая половина (чёрные четверти) светит солнцем, половина с битом (белые четверти) — луной; оба света из центра сразу и крутятся с кольцом строки 1. Луна здесь — свой свет, а не зеркало вылетевшего солнца, как прежде: идёт так же, как ходит луна (сквозь вырезы и «0», «☾ сквозь 1» — со счётом единиц), и ставит «0» в ячейку за чертой, накрытую целиком, — где угодно, без прежнего ограничения «только напротив, где солнце упёрлось». Половина (четверти) луны рисуется голубым, солнца — золотым. (3) «И ещё режим, где один оборот — солнце, другой — луна, полностью 360»: «☀/☾ оборот» — пока кольцо строки 1 делает чётный оборот, светит только солнце во весь круг, нечётный — только луна во весь круг; оборот считается по повороту кольца строки 1 целыми его длинами. Кто светит сейчас — кайма у диска строки 1 (золотая или голубая) и сводка «☀ · ☾» над конусом.

Zazerkalius v0.808 — «ещё режим: когда солнце ставит где-то 1, то в противолуче, в первом свободном кольце, на данном секторе ставить 0». «☀↔0» в «Солнце»: ячейка строки за чертой (первое свободное кольцо), получившая от солнца «1» на этом шаге, ставит «0» в пустые ячейки той же строки, которые сектор напротив неё (через центр, +180°) накрывает хотя бы наполовину. Проверено: в «вырезах между» солнце поставило «1111» — напротив встали нули, «001111». В обычных «вырезах T−1» напротив ячеек — сам вырез (ячейки подряд, вырез одним куском напротив), поэтому нулей там нет; в «вырезах 2n» — тоже вырез. Нули дальше, на пустых кольцах за строкой за чертой, не ставятся: те кольца — только вид и счёт «1».

Zazerkalius v0.809 — по снимку ковра Ромбоидов: «Zazerkalius — можно этим набрать?», выбрано «строками в поле, ёлочкой». «Аа» в «◇ Ромбоидах»: вписываешь текст — он ложится в поле строками пиксельного шрифта 5 × 7 (латиница, кириллица, цифры, немного знаков; строчные — как заглавные), буквы через столбец, по краям — строка и столбец нулей; «Zazerkalius» — 9 строк по 67 бит. Окно само переходит в «◇ бит» и «ёлочку»: каждый бит — ромб, ряды через один сдвинуты на полклетки, поэтому буквы стоят прямо (курсивом вышли бы при «вбок»). Почему строками, а не картинкой: это обычные строки — по ним идёт Аниматрица, ⇕ зеркало, 🧊 кубы, возраст, и слово можно разъедать волной. ↩ возвращает прежние строки.

Zazerkalius v0.810 — по снимку «ZAZERKALIUS»: «между I лишние пробелы справа, слева». У «I» в клетке 5 × 7 по пустому столбцу с каждой стороны, и с промежутком между буквами вокруг неё выходило по два. Шрифт «Аа» теперь пропорциональный: у каждой буквы срезаются пустые крайние столбцы, между буквами — ровно один (пробел, где клетка пустая целиком, так и остаётся пробелом). «Zazerkalius» — 65 бит вместо 67.

Zazerkalius v0.811 — по снимку ромба «⌖✕ сброс»: «эту кнопку прикрепить к вертикали через ось, чтобы всегда показывалась внизу, на переднем плане всех кнопок и бит». Ромб 2× снят с вершины пульта и стоит в теле окна конуса: на вертикали через центр конуса (едет за ним, когда конус сдвигают), нижним углом у нижнего края холста, поверх групп и колец. Место пересчитывается при каждой отрисовке конуса. Пульт снова прежней высоты (4 ромба). Жмёт, как и прежде, спрятанную ⌖✕ из «Алгоритма».

Zazerkalius v0.812 — две просьбы. (1) По снимку ✚ 4 частей с солнцем и луной сразу после сброса: «тут что-то не то, и 1 нижнюю не закрасил ещё, только верхнюю». Разобрано у себя: так выходит, когда включены оба режима — «☀☾» и «☀/☾ оборот». Оборотный главнее: в солнечный оборот солнце светит во весь круг, свет выходил через весь вырез (правая половина), а рисунок показывал четверти солнца и луны — картинка и счёт расходились. Теперь эти два режима — либо-либо (включаешь один — другой гаснет, в «Алгоритме» второй затемнён с причиной), а кайма «кто светит этот оборот» рисуется у строки 1 любой формы — и у полукольца, и у четвертей. (2) По снимку «Σ 1: 1 · 0: 0 · Δ +1»: «тут квадратные ромбы с фоном цвета, как у бит, и в них число без указок 1 и 0; если равно — знак равенства и подсветить» и «всё это также по вертикали и наверх». Баланс — два ромба столбиком на вертикали через центр конуса у верхнего края холста, поверх групп: сверху единицы на фоне цвета «1», ниже нули на фоне цвета «0», между ними «=» с зелёным свечением, когда поровну, иначе тусклое «≠»; подробности — в подсказке. Едет за центром конуса, как «⌖✕ сброс» внизу. Виден при солнце, как и прежняя строка.

Zazerkalius v0.813 — по снимку ромбового пульта: «это по горизонтали от центра прижми вправо и дай переместить влево». Пульт стоит на горизонтали через центр конуса (⌂ — ровно на ней) и едет за центром, когда конус сдвигают; прижат к правому краю холста. Тянешь за ⠿ или фон между кнопками и отпускаешь левее середины холста — встаёт слева, правее — справа (Z.padSide); двойной щелчок по ⠿ — на другую сторону. Прежнее свободное место пульта (тянулся куда угодно, Z.padPos) больше не действует — по правилу «сохранённое не переписывать молча» оно оставлено копией Z.padPos_pered_os. Вместе с «⌖✕ сброс» внизу и балансом наверху получается крест вокруг центра: вертикаль — баланс и сброс, горизонталь — пульт.

Zazerkalius v0.814 — «1 и 0 балансы — кнопки в одну строку, без знаков равенства, просто зажги их, когда равны». Ромбы баланса стоят в ряд, остриё к острию (единицы слева, нули справа), посередине — на вертикали через центр конуса, у верха холста; знаков «=» / «≠» больше нет. Не поровну — ромбы приглушены, поровну — оба загораются (ярче и с золотым свечением).

Zazerkalius v0.815 — «эти кнопки на первый план и выровни отступами снизу и сбоку» (ромбы ◎ дзена и записи внизу левой панели) и «чуть ниже — на кнопки залезли» (баланс 1 / 0 на вкладках групп). Ромбы дзена и записи — поверх окон и групп (z-index 1001); нижний ромб цепочки — на 8 px выше низа панели (не ниже низа окна), левый — на 8 px от её края: прежде цепочка стояла по низу панели с отступом 4 px и могла уйти за край окна. Баланс 1 / 0 ставится на 8 px ниже полосы вкладок групп конуса (#cgTabs), если она заходит на холст, а не от верха холста.

Zazerkalius v0.816 — по снимку «Алгоритма»: «это отдельно от нижнего текста: сам текст без фона и рамки помести на поле вправо вниз, и при клике по кнопкам или при наведении на кнопки показывай, потом при любом клике вне групп кнопок скрой». Строки алгоритма (#lasAlgo) ушли из группы на холст конуса, в правый нижний угол (lasAlgoPlace), без фона и рамки — светлый текст с тёмной тенью, чтобы читался поверх колец. Появляются при наведении на кнопку любой группы конуса или щелчке по ней, прячутся щелчком мимо групп (щелчок по самому тексту не прячет). Подсветка «кнопка ↔ строка» осталась. Группа «Алгоритм» стала ниже — под кнопками больше нет текста.

Zazerkalius v0.817 — по снимку цепочки ромбов внизу левой панели: «в один ряд их и на верхнее меню после назад-повтор». На широком экране ◎ дзена и кнопки записи (● mp4 🎞 ↻1 ⏸ 🔗 ▣) стоят одним рядом ромбов 28 × 28 в шапке, сразу правее ↩ ↪, острие к острию (класс body.recTop). Низ левой панели освободился: полоса 72 px под ромбы больше не держится. В дзене и на телефоне — как было. И по снимку «✛ оси» — «это в Вид»: кнопка осей переехала из «Колец» в «Вид» (это вид, а не действие над кольцами).

Zazerkalius v0.818 — по снимку пунктира «✛ оси» поверх подписи «☀ 1/2» и пульта: «оси за кнопки и текст». Оси теперь рисуются раньше лучей, света и подписей долей — те ложатся поверх. Пунктир просвечивал и сквозь кнопки пульта: в плоском виде недействующие кнопки были полупрозрачными (opacity .35). Теперь они притушены яркостью, а заливка плотная — оси уходят под них.

Zazerkalius v0.819 — по снимку полосы вкладок групп (Лазер · Солнце · … · Текст) в дзене: «в дзене это скрыть». В дзене полоса #cgTabs спрятана. Группы, отмеченные 🧘, остаются у конуса, как раньше.

Zazerkalius v0.820 — по снимку пульта: «на передний план и по горизонтали любое место». Пульт поверх групп, колец, ⌖✕ сброса и баланса (z-index 650). По вертикали он, как в v0.813, стоит на горизонтали через центр конуса. По горизонтали тянется куда угодно, место — доля ширины холста Z.padFx: 0 — у левого края, 1 — у правого, поэтому при смене размера окна пульт остаётся на том же месте относительно холста. Двойной щелчок по ⠿ по-прежнему ставит его к другому краю.

Zazerkalius v0.821 — по снимку «проход 0 · волна 0/0»: «фон и границу у текста убери, прижми вправо поля строк». У счёта волны (#animInfo) больше нет фона и рамки, только мягкая тень цветом фона, чтобы читался поверх строк. Он стоит в 4 px от правого края поля строк (было 14).

Zazerkalius v0.822 — по снимку ползунка размера шрифта: «все бегунки сделай ромбами, а этот тормозит при перемещении, когда число слева направо от него переходит». Бегунки в цепочках из треугольников — ромбы 24 × 24 (были стрелки 5t), значок в ромбе и число рядом считаются от него. Ползунки вне цепочек — тоже ромбом 16 × 16 цветом акцента на тонкой дорожке. Тормоз нашёлся замером: шаг ползунка стоил ~30 мс, а шаг, на котором число перескакивало на другую сторону, — 180–220 мс. Сторона числа ставилась классом .rvl у подписи ползунка, этот класс видел наблюдатель полосы кнопок над полем и пересобирал её целиком. Теперь сторона — data-side у самого числа, его наблюдатели не видят, и перескок стоит те же ~30 мс.

Zazerkalius v0.823 — три правки по снимкам. «Отступ поменьше, одинаково с левым» (левая панель значками): кнопки стояли в 4 px от левого края и в 4 px от правого, но справа ещё выступали зубцы рамки (8 px) — на глаз справа выходило втрое больше. Столбик теперь 44 px, правое поле блоков снято: кнопки в 4 px слева, а справа — вплотную к основанию зубцов. «Выровняй по вертикали отступы»: полоса кнопок над полем строк — 2 px сверху и снизу, как шапки окон (было 4), кнопки в одном ряду с кнопками шапок. «Строки: границу зубцами, так же как левое меню»: прямая черта у края поля (#fieldEdge::after) заменена зубцами — слой #fieldZigOv поверх окон, остриями в сторону стола, той же сеткой 24 px, что у левого меню; хват ширины поля остался на месте.

Zazerkalius v0.824 — «Вид», по двум снимкам. «Оси — свет: одна строка в меню, 2 кнопки»: в группе появился перенос строки (.cgnl — пустой элемент во всю ширину), за ним ✨ свет и ✛ оси — последней строкой, вдвоём. «(лучи) — одна кнопка: выкл, выдел., все»: три кнопки (выдел.)лучи(все) заменены одной, щелчок по кругу выкл → от выделенных → от всех → выкл, надпись показывает режим, горит, пока лучи включены (id прежний — coneRaysB). «Стандарт ширину со всеми»: у «🔴 неп. ⇄» была добавка ширины (data-tzadd) — снята, обе «неп.» теперь как все кнопки.

Zazerkalius v0.825 — две правки. «Ширина ползёт сама» (по снимку «Вида» после v0.824): перенос строки .cgnl — элемент во всю ширину группы, и его считали кнопкой два замера группы с заданным размером: «не уже самого широкого блока» (tzMinW — бралась вся ширина + 1 px + поле) и «прижать к правому краю самого длинного ряда». Перенос из обоих замеров исключён. «Магнит к зубцам» («правая колонка строки, левая», по снимку «За чертой» у края поля): зубцы левого меню и поля строк — такая же цель магнита, как группа-соседка (meshSnap). Поднёс группу — встаёт выемками на острия, ряд в ряд, ни к чему не прицепляется. У поля справа острия смотрят влево, поэтому его зубцы сдвинуты на полряда: острия приходятся на стыки рядов групп и входят в выемки их правого края на той же сетке, на которую группа встаёт при отпускании.

Zazerkalius v0.826 — три правки по снимкам. «Левая стрелка ползунка — два треугольника X: верхний вниз, нижний вверх, вершины в середине»: левая стрелка у ползунков в цепочках — ⧗ шириной в один треугольник (была «>» в полторы). «Эти две пересобери — они тупят всю группу» (🔴 неп. ⇄ и 🟢 неп. ⇄🔁): щелчок по ним перерисовывал все окна страницы (~200 мс на главной), а неподвижные биты видны только в поле строк и на конусе — теперь перерисовываются только они. «Если это жёлтая полоса изменённой строки — достаточно, как выделены номера, без полосы»: у номера изменённой строки снята золотая черта справа (box-shadow), золотые номера остались.

Zazerkalius v0.827 — «подтормаживает на каждом обороте кручения». Замер кадров при кручении (солнце, вырезы T−1, ✚ 4 части, «Каждое»): кадры по 130–200 мс приходились ровно на каждый целый шаг фазы, а сам расчёт и рисование конуса стоили около 8 мс. Время уходило на пересборку раскладки групп (cgbSnap + triTag): её будил наблюдатель групп, а внутри групп на каждом шаге меняется только текст-показ — число у ползунка (.rv) и строка «вариантов цикла… сейчас N». Такие правки кнопок не двигают — наблюдатель теперь их пропускает. За 4 с кручения было 109 кадров, стало 208; 90 % кадров — не дольше 33 мс (было 150).

Zazerkalius v0.828 — по снимку «⌖✕ сброс»: «добавь сюда «Крутить» ромбом сверху справа, уменьши размер ромба на 25 %». Ромб сброса — 60 × 60 (был 80), рядом, сверху справа, сторона к стороне — такой же зелёный ромб «▶ крутить» (#bC3Spin): жмёт ту же «▶ крутить» в «Кручении», при кручении горит и показывает «⏸ стоп». Оба стоят на вертикали через центр конуса у нижнего края холста, поверх групп (c3RstPlace).

Zazerkalius v0.829 — по снимку поля после «⌖✕ сброса» (над чертой одна «1», под ней пустая строка 2): «нужно строка 1 и строка 2, под линией горизонта». Сброс оставлял солнце и строку 2, только когда строк было больше двух; при одной строке над чертой так и оставалась одна «1». Теперь, если строки 2 нет, сброс ставит её («11»), и строка для заполнения — третья; ↩ вернёт прежнее.

Zazerkalius v0.830 — «строка 2 должна быть под горизонтом» (уточнение к v0.829, которая поняла просьбу наоборот и добавляла строку 2 над чертой). ⌖✕ сброс теперь оставляет над чертой только строку 1 — солнце; строка 2 — та, что заполняется, под чертой. Прежде (с v0.757) сброс оставлял солнце и строку 2. ↩ вернёт снятые строки.

Zazerkalius v0.831 — по снимку пульта: «эти такого же размера сделай, как Сброс». Ромбы пульта (🧊 ⧗, ▲ ▼, ↺ + − ⌂ ⟲ ⟳ ⠿, ▶ ↻) — 60 × 60, как ⌖✕ сброс и ▶ крутить у оси (были 40); значки крупнее. Вся раскладка пульта считается от одной величины --d, поэтому сетка ромбов не поменялась, пульт просто стал в полтора раза больше.

Zazerkalius v0.832 — по снимку края поля: «границу для захвата (изменение ширины полей) можно ли на зубцах расположить». Хват ширины поля строк — теперь сами зубцы края (#fieldZigOv): тянуть — шире или уже, двойной щелчок — ширина по умолчанию; при наведении и во время протяжки зубцы подсвечиваются. Нажатие передаётся прежнему хвату #fieldEdge — его полоса внутри поля, пока зубцы видны, выключена. Работает и при поле слева, и справа.

Zazerkalius v0.833 — по снимку ▶ ↻ внизу пульта: «эти убери оттуда». Ромбы ▶ крутить и ↻ направление с пульта убраны (спрятаны стилем, код у них прежний): крутить — ромбом у сброса на вертикали через центр (v0.828), направление — в «Кручении». Высота пульта прежняя, чтобы ⌂ остался на горизонтали через центр.

Zazerkalius v0.834 — по снимку подсвеченных зубцов края поля: «вертикальную линию можно убрать?». Прямая черта рядом с зубцами появлялась только при наведении: подсветка v0.832 (фильтр яркости) осветляла и заливку зубцов цветом поля, светлая заливка встык с тёмным полем давала ровную вертикальную границу. Теперь при наведении и протяжке меняется только сама ломаная — цветом акцента и вдвое толще, заливка остаётся цвета поля.

Zazerkalius v0.835 — две правки. «У левого меню также» (как у поля, v0.832 и v0.834): хват ширины левой панели — сами зубцы её края (#paneZigOv) — тянуть — ширина, двойной щелчок — по умолчанию; при наведении светится только ломаная цветом акцента, полоса #paneEdge больше не подсвечивается. В столбике значков ширина не тянется — там зубцы как были. Прямая черта рядом с зубцами меню на снимке — левая рамка окна на столе, к зубцам не относится. И по снимку пульта и ромбов у оси — «затемняй остальные при наведении, и тут сделай изменение курсора также»: навёл на ромб (пульт, ⌖✕ сброс, ▶ крутить) — остальные притухают; у действующих ромбов пульта курсор — рука.

Zazerkalius v0.836 — по снимку ленты перемотки внизу холста: «у ползунка внизу стрелки из ромба», «из 4 (X и X)». Обе стрелки ленты (#coneTapeBox) — ⧗ из двух треугольников (верхний вниз, нижний вверх, вершины в середине), высотой в ряд и шириной в треугольник, золотом ленты, без рамки; прежде — квадратные ◂ ▸.

Zazerkalius v0.837 — две правки. «При наведении не меняет курсор на руку» (пульт): курсор-руку ромбам дал ещё v0.835, но мышь до них не доходила — пульт лежал внутри холста конуса (#coneMain, z-index 0), и его z-index 650 действовал только там: полоса групп конуса, стоящая выше всего холста, накрывала ромбы. Пульт перенесён в тело окна, рядом с ⌖✕ и ▶ — теперь он правда поверх групп, и рука — у всех ромбов, в плоском виде тоже. И «да» — стрелки ленты перемотки из четырёх треугольников каждая: шевроны, как стрелки в группах, левая «<», правая «>» (вместо двух ⧗ из v0.836).

Zazerkalius v0.838 — по снимку ромба «⏸ стоп» у оси: «пусть мигает, когда крутится». Пока конус крутится, ромб плавно мигает (прозрачность 1 → 0,35 → 1 за секунду); остановился — горит ровно.

Zazerkalius v0.839 — по снимку ленты перемотки: «ползунок увеличь в 2 раза» — «бегунок». Бегунок ленты — ромб 32 × 32 (у прочих ползунков вне цепочек — 16); у самого поля ленты сняты рамка и фон, проступившие при новой высоте.

Zazerkalius v0.840 — по снимку ромбов у оси: «поменяй местами, и сброс сделай меньше на 1/8, но расположи в том же центре ромба, как с обычным размером». Теперь на вертикали через центр конуса, у нижнего края — ▶ крутить (60), а сверху справа — ⌖✕ сброс, 52,5 × 52,5 (7/8): его центр стоит там же, где был бы центр ромба 60 в этой клетке, так что между ромбами — зазор по 3,75 px.

Zazerkalius v0.841 — две просьбы. Первая, по ромбам у оси: «можно ли, чтобы эта же полоска кнопок появлялась при наведении на «крутить» там, на оси внизу, справа от неё, и кнопка появлялась сразу после «крутить» там справа — при изменённых положениях, не 0». Режимы кручения (Всё · Каждое · Встреч Стр · Встреч Бит) — полоской шестигранников справа от ▶ крутить, по середине ромба; видна, пока мышь на ▶ или на самой полоске, гаснет через полсекунды после ухода; щелчок жмёт ту же кнопку в «Кручении», горит выбранный режим. Зелёная ⟲ «на места» — ромбом 60 остриём к острию сразу справа от ▶, только когда есть что возвращать (накрутка колец, поворот всего конуса, фаза кручения, довод строки 1, кольцо за чертой, остановленные кольца); тогда полоска режимов — за ней. Вторая, по снимку текста алгоритма: «тут подсказка для каждой кнопки при наведении, а когда увести — этот текст как раньше; ширину и высоту постоянной, чтобы не дёргалось, текст наверх прижимай, когда его мало». Наведение на кнопку групп конуса — на месте строк алгоритма её подсказка (первая строка ярче), увёл — снова алгоритм. Коробка одного размера: ширина от холста, высота — самая большая, какую набирали строки при этой ширине (не меньше 8 строк), текст сверху; длинная подсказка обрезается по низу коробки.

Zazerkalius v0.842 — две правки. По снимку шапки окна: «кнопка «Лазер» — подвинь правее, наложилась на что-то, заголовок похоже». Шапка окна конуса лежит поверх его тела, а полоса вкладок групп — выше по слою и закрывала «◯ Solarius»; теперь первой в полосе стоит пустая вставка шириной до конца заголовка, «Лазер» начинается за ним. Вторая — на вопрос «как задать начальное положение вручную и запомнить его — список положений нужно где-то выбирать и удалять» и «да» на предложенный список. Раньше было только ⭐ Умолчание: одна ячейка, и запоминает она всё — биты всех полей и настройки. Теперь «📍 Положения» (кнопка 📍 в «Кручении» рядом с ⟲ и последней в полоске режимов у ▶ на оси): «+ запомнить» кладёт в список, как стоят кольца сейчас — накрутку каждого, поворот всего конуса, фазу кручения, довод строки 1, кольцо за чертой, сдвиги остановленных и повёрнутые магнитом; биты строк и настройки не входят. Щелчок по имени — кольца встают так, двойной щелчок — переименовать, ✕ — удалить (со спросом), ☆ → ★ — начальное: к нему ведут ⟲ «на места» и ⌖✕ сброс, а зелёный ромб ⟲ у оси появляется, когда кольца стоят не так, как в ★. Нынешнее положение в списке отмечено зелёной чертой. Хранится в памяти страницы и едет в «💾 В файл»; в ⭐ Умолчание не входит.

Zazerkalius v0.843 — две правки по снимкам. «Тут 1/3 кнопки — помести «На места» значком так же (Умолчание ⟲)»: на левой панели в ряду «⭐ Умолчание» справа — зелёная ⟲ на треть ряда, жмёт ту же ⟲ «на места», что в «Кручении» (с ★ из «📍 Положений» — к нему). В раскладке левой панели появилась кнопка «своей доли ряда» (data-lpfr="3" — треть): её ширина задана, остальное достаётся соседке. «Это убери в текст» — про плашку «◎ торы · мера d…» (Σ расчёт) на конусе: таблица торов теперь первым блоком в окне «📝 Текст конуса и лог лазера», над текстом конуса, без рамки и перетаскивания, листается, если не влезает; окна текста нет на странице — по-старому плашкой.

Zazerkalius v0.844 — по снимку окна «📝 Текст конуса и лог лазера»: «сделай столбами все списки рядом». Блоки шли друг под другом, и лог с вылетами сжимались в узкие полосы. Теперь на широком экране они стоят столбцами рядом: Σ расчёт торов | текст конуса | вылет из строк | прогноз | лог лазера; у каждого свой заголовок сверху и своя прокрутка. Столбцы делят ширину окна поровну, но не уже 220 px — если окно уже, оно листается вбок. Сделано одной сеткой: обёртка лазера растворена (display: contents), заголовки — первый ряд, списки — второй. На телефоне (до 760 px) — по-прежнему друг под другом.

Zazerkalius v0.845 — по снимку края левого меню: «какие-то артефакты видны при перетаскивании группы». Слой зубцов у края панели и поля ставится на ступень выше самого верхнего окна, а эта ступень растёт с каждым щелчком по окну и быстро переваливает за 2000 — слой тащимой группы. Зубцы и подсветка хвата ложились поверх группы. Теперь тащимая группа выше всего, а зубцы, пока её тащат, мышь не ловят и не подсвечиваются.

Zazerkalius v0.778 — «расписать бы всё там это и соотношение диаметров»: при ◎ торах на холсте (вверху слева, под строкой «3D · поворот…») — расчёт: мера d, часть тора π²d³/4; шар — диаметр, объём, сколько частей (и щель при «● = часть»); по каждой строке (до 10, дальше — формула) — частей, диаметры трубки, средней линии, внешний и внутренний, объём тора и одной части, отношение внешнего диаметра к диаметру шара; итог — у T−1 части равны, у 2n растут к π²d³/4, без вырезов разные. Видимый текст — по просьбе; галка «Σ расчёт» (по умолчанию вкл.) его прячет.

Zazerkalius v0.777 — «так там у них объёмы разные в 3D?» — да: шар d ≈ 4,19 d³, часть тора ≈ 2,47 d³ (1,70 части), весь тор строки 2 ≈ 7,40 d³. На «да» про кнопку: «● = часть» в «3D» (включает ◎ торы) — шар объёмом ровно в одну часть тора: радиус (3π/16)^(1/3)·d ≈ 0,838d, между шаром и тором строки 2 — щель ≈ 0,16d. Торы не меняются.

Zazerkalius v0.776 — разбор «если 1 бит в 1 строке — шар, какие диаметры колец? торовые»: тор с трубкой d и средней линией радиуса (n − ½)·d имеет объём π²d³(2n − 1)/4, частей в T−1 у него 2n − 1, значит каждая часть любого тора — π²d³/4 (по Паппу: сечение × длина средней линии, а длина части у всех — πd). Шар радиуса d (ровно в дырке тора строки 2) — 4/3·πd³ = 16/(3π) ≈ 1,70 такой части: в объёме шар больше клетки. На «да» про рисунок: «◎ торы» в группе «3D» — строка 1 шаром, кольца торами вплотную, всё в одной плоскости (высота конуса не действует, ⧗ зеркало выключено). В «вырезах T−1» / «2n» тор делится на части, вырез пуст, концы трубки у выреза — полусферы. Трубка рисуется средней линией толщиной d (в ортогональной проекции это и есть её силуэт), с бликом и тенью; кусок — до 0,25 рад, чтобы ближнее рисовалось поверх дальнего.

Zazerkalius v0.775 — на v0.774 (солнце точкой, строка 1 — полупрозрачный круг) — «кнопку для понятия надо, что 1 бит — солнце». «☀ = 1 бит» в «Строке 1»: строка 1 сама и есть солнце — золотой светящийся круг во всю строку, с цифрой бита (как было до v0.774). Выключено — как в v0.774. Свет считается одинаково, меняется только вид. При ◐ / ✚ / ▮ у строки 1 свой рисунок — кнопка затемнена.

Zazerkalius v0.774 — разбор площадей: в T−1 кольцо строки n при сомкнутых кольцах («Чистые») — π(2n − 1), частей у него 2n − 1, значит каждая клетка любого кольца — ровно π, и биты строки n по площади равны вырезу строки n + 1 (2/3 строки 2 = 2/5 строки 3 = 2π). Мешала дырка в центре (5 % радиуса), оставленная во всех режимах, кроме ◐ / ✚ / ▮. «Убери эти 5 % дырки — это лишнее, пусть будет круг (и полукруг), из центра которого луч лазера или солнце просто из точки лучами»: кольца теперь всегда от самой точки центра, строка 1 — круг. Солнце без ◐ / ✚ / ▮ — точка в центре (было — золотой диск во всю строку 1); строка 1 вокруг — полупрозрачный круг цветом своего бита с цифрой: свет её проходит, как и прежде. Луч, вставший в строке 1, — красная дужка у самой точки. Щель затвора строки 1 у лазера — минимальная видимая ширина по внешнему краю (внутренний теперь — точка).

Zazerkalius v0.773 — вопрос «какие есть механизмы — шестерёнки, перпендикуляры, — чтобы вместить в 3 места, где 2 заняты, то, что больше оставшейся 1/3, если рядом в центре есть 1/2?». По углу половина в треть не войдёт ни на каком радиусе; по длине дуги — входит (π · 1 < 2π · 2 / 3). На «да» про режим «по длине»: «📏 по длине» в «Щелях» (Z.cutLen, солнце в вырезах): свет переходит на следующее кольцо той же длиной дуги, а не тем же углом — как полоса параллельных лучей (так переносятся биты в треугольнике, откуда пришло T−1). Радиус кольца — номер строки; с кольца строки m на m + 1 каждый кусок света сужается по углу в m / (m + 1) вокруг своей середины. Свет во весь круг так и остаётся — середины у него нет. Луна, лазер и ✺ — по углу, как были.

Zazerkalius v0.772 — «объясни, какое по логике должно быть 1-е кольцо: если 3 бита — кольцо из 3 частей, то 1 бит — кольцо из 1 части, но у него нет выреза, и это круг, а не кольцо; 2 бита — 2 части и 2 выреза, а как ещё можно?». Объяснено: в T−1 кольцо из n бит — 2n − 1 частей, вырез n − 1 = длина строки внутри; внутри строки 1 — только солнце («строка 0»), поэтому у неё вырез 0 — сплошной круг. На предложение «правило 2n отдельным режимом сразу для всех колец» — «да»: в «Щелях» четвёртый режим «вырезы 2n» (Z.coneSlits = "cut2"): кольцо из n бит — 2n частей, n бит подряд и вырез из n частей одним куском; строка 1 — полкольца бита и полкольца выреза: солнце светит только через открытую половину (◐ включается само, кнопка затемнена), луч тоже выходит только через неё (в T−1 строка 1 для луча прозрачна). Всё прочее — как в T−1: число частей и вырез считаются в одном месте (coneCutP), им пользуются рисунок колец и кольца за чертой, пустые «до 256», луч, свет, мышь, ½ шаг, сканер. Порядок по кругу: 1 щель → вырезы T−1 → вырезы 2n → все щели.

Zazerkalius v0.771 — по снимкам «☾ ≈4/9» и «☀ 2 · ☾ 3 · ◌ между 5 · лучей 4» — «сделай кнопку откл этих подсчётов и показов, похоже, они тормозят». «☀ доли» в «Солнце» (по умолчанию включено, как было): выключено — доли частей круга за крайним кольцом и сводка над конусом не считаются и не рисуются. Тяжёлое там — подбор общего знаменателя долей (до 240 проб с округлением всех частей) на каждом кадре кручения.

Zazerkalius v0.770 — две вещи. (1) «Нужна кнопка, чтобы луна светила, когда солнце перекрыто единицами» (на ответ, что есть «☾ затм.», просьба повторена — значит, нужно другое): «☾ за 1» в «Солнце» рядом с «☾ затм.» — луна светит, когда хоть часть солнца упёрлась в «1» на любом кольце (до кольца за чертой включительно), и зеркалит через центр весь остановленный ими свет — вылетел остальной или нет. «☾ затм.» светила только при полном затмении и только зеркалом последнего кольца. Две кнопки — либо-либо (Z.moonBlk / Z.moonEcl). Весь круг, остановленный разом, луны не даёт (как и прежде у обеих). (2) «При такой скорости он пропускать будет пойманные биты?» (360 бит/с, ▦ побитно, «Каждое»). Между кадрами положения не проскакивают: кадр идёт мелкими шагами не шире самой узкой щели, а что не уложилось в ~12 мс — досчитывается следующим кадром (кручение медленнее, но без пропусков). Нашлись две дыры, обе закрыты: а) при ▦ / ½ / ◫ обрыв кадра падал на дробную фазу, и следующий кадр округлял её до целого бита вперёд — хвост и само целое положение не просчитывались; теперь шаги кадра — целое число на бит (полбита) и обрыв только на целом; б) строка за чертой, готовая посреди кадра, уходила в поле только в конце кадра — до того свет светил на готовую строку (с ⊕ xor мог перевернуть её биты), а следующая строка эти положения пропускала; теперь у солнца строка уходит сразу, и остаток кадра светит уже на следующую. У лазера (не солнца) уход строки — как был, в конце кадра.

Zazerkalius v0.769 — «…и частями кольца предыдущего» (на вопрос выбрано: «на клетку соседа внутри»). Третья кнопка рядом с «▦ побитно» и «½ бита» — «◫ части пред.»: ▶ крутить идёт скачками, и за шаг каждое кольцо поворачивается не на свой бит, а на угол одной клетки кольца внутри него — кольцо из n бит на n / n₋₁ своих бит (из 4 бит — на 120°, из 5 — на 90°, из 9 — на 45°); строка 1 — на свой бит. Так и у кольца за чертой, и у пустых «до 256». Учтено везде, где шаг кольца считается: поворот колец, мелкие шаги, которыми лазер ищет проход между кадрами, ✺ все лучи, ◌ поиск следующего шага солнца, и цикл возврата: кольцо с периодом p, n бит и соседом внутри из q бит встаёт на место через p·q / НОД(n, p·q) шагов. Три кнопки — либо-либо (Z.coneBitStep: true, 0.5, "prev"). Включение и выключение при ненулевой фазе поворачивает кольца на новые места сразу (фаза та же, шаг другой). Проверено: на строках 1…9 бит — градусы за шаг 360 360 180 120 90 72 60 51,4 45, цикл 2 520, кручение с лазером без ошибок.

Zazerkalius v0.768 — по снимку «▦ побитно» — «крутить ½ бита — также кнопку сюда». Рядом с «▦ побитно» (группа «Кручение») — «½ бита»: ▶ крутить идёт скачками по полбита в каждом кольце, с той же скоростью в бит/с; во «Всё» и «Встреч Стр» включает «Каждое». Кнопки — либо-либо (Z.coneBitStep: true — бит, 0.5 — полбита). «Частями кольца предыдущего» — в v0.769.

Zazerkalius v0.767 — по снимку полосы вкладок групп — «сильнее затемни или как-то иначе выдели неактивные кнопки от активных». Вкладка спрятанной группы была лишь чуть бледнее (фон — 22 % своего цвета, надпись — 60 %), и от видимой её было не отличить. Теперь она почти чёрная (6 % цвета на фоне страницы) и полупрозрачная, надпись тусклая, обводка едва видна; при наведении проявляется. Вкладка видимой группы — как была, залита своим цветом.

Zazerkalius v0.766 — по снимку группы «Вид» — «все 3D кнопки вынеси в отдельное». Новая группа «3D» (своя вкладка — сразу за «Видом», синяя): 🧊 3D, ⧗ зеркало вниз (октаэдр — сам включает 3D; список развёрнут рядом кнопок «⧗ нет · ⧗ выдел. · ⧗ все», как списки лазера в v0.762), 01 — цифры бит в 3D, ↕ высота конуса, ▬ толщина бит в 3D. В «Виде» остались «◠ дуги» и «✨ свет» — они работают и в плоском виде. Записи «кнопка переставлена внутри Вида» у уехавших в «3D» один раз сняты (копия — Z.btnMove_pered_3d, Z.cgrpMove_pered_3d).

Zazerkalius v0.765 — по снимку «Щелей», оторванных от «Лазера», — «блииин))) пусть всё можно отцеплять». Обычное перетаскивание групп лазера — снова как до блока (v0.758): тянешь любую группу — она отцепляется, а прицепленные к ней едут следом. Весь блок целиком — с Shift; с Alt — группа совсем одна (прицепленные к ней остаются на месте). «Алгоритм» в блок по-прежнему не входит. Проверено: Shift + «Лазер» — весь блок; «Щели» — одни; «Лазер» — со своими прицепленными, без отцеплённых «Щелей».

Zazerkalius v0.764 — по снимку блока лазера и «Алгоритма» справа — «алгоритм не могу отцепить». «Алгоритм» — табло с итогом, и теперь он сам по себе: в блок лазера не входит, сам ни к чему не прицепляется, а тянешь его — едет один, и всё, что было прицеплено к нему (у сборки v0.758 — «Лазер»), остаётся на месте. Блок тянется за свою верхнюю группу без «Алгоритма». При сборке «Лазер» по-прежнему встаёт под «Алгоритмом», но не прицеплен к нему. Проверено: «Алгоритм» уезжает один, блок за «Лазер» — без него.

Zazerkalius v0.763 — по снимку «◌ след.» — «это удали». Кнопки «◌ след.» (группа «Солнце», v0.695: куда солнце посветит после следующего шага — белым пунктиром) больше нет; пунктир не рисуется, даже если у кого-то он был включён (Z.lasPeek в памяти остался, но ни на что не влияет).

Zazerkalius v0.762 — по снимку «вырезы T−1» — «все кнопки-списки — вынеси на показ». В группах лазера кнопки, что щелчком перебирали значения по кругу, и список развёрнуты рядом кнопок, выбранное горит: «1 щель · вырезы T−1 · все щели» и «▥ центр · ◧ лево · ◨ право» (Щели), «щели · Без щелей» (Солнце), шаг ↻ «45° · 1/T · 1/(1+…+T)» (Лазер). Прежние кнопки и список спрятаны, но работают: щелчок по значению ставит перед прежней кнопкой предыдущее по кругу и жмёт её — её обработчик делает всё, что делал (сообщение, пересчёт; у «вырезы T−1» — кольца на места); у списка — значение и change. Затемнение и причина — у каждой кнопки ряда, как у прежней.

Zazerkalius v0.761 — по снимку «За чертой · Солнце · Строка 1» — «как-то неровно между этими». Одна пара стояла сцепленной зубцами (остриё в выемку), другая — просто приставленной край к краю, со щелью в шаг t. Теперь группы лазера, что стоят бок о бок (правая — в пределах двух шагов от зубцов левой, ряды перекрываются), сцепляются сами: правая прицепляется к левой ряд в ряд (сдвиг по высоте — целыми рядами по 24 px) и встаёт остриём в выемку. Уже прицепленную к чему-то не трогает. Срабатывает после отпускания группы лазера и один раз при загрузке. Проверено: «Солнце», поставленное к «За чертой» со щелью, после загрузки встало вплотную, зубцами.

Zazerkalius v0.760 — «подсказки не на всех кнопках — они там просто одинаковые для всей группы Лазер… и другие» и «прилипли друг к другу, не оторвать». Подсказка группы висела на всей группе и всплывала везде, где мышь не над кнопкой, — в просветах и на срезанных краях шестигранников (кнопки обрезаны по форме, за краем мышь уже «в группе»). Теперь у всех групп конуса она только на заголовке (первой, следом — как тянуть): над кнопкой — подсказка кнопки, над заголовком — что за группа, в просветах — ничего; в 3D «лазер не работает» — тоже на заголовке. Блок лазера (v0.758) едет целиком, только если тянуть верхнюю группу — ту, что сама ни к какой группе лазера не прицеплена; прицепленную тянешь — отрывается, как прежде (её прицепленные — следом); с Alt любая группа тянется совсем одна (прицепленные к ней остаются на месте). Проверено: «Алгоритм» тянет блок, «Солнце» отрывается вместе с «За чертой», Alt + «Алгоритм» — уезжает один.

Zazerkalius v0.759 — по снимку групп лазера, сбившихся у правого края, — «у меня строки справа, прилипают к правому краю, не даёт двигать группы меню». Две ошибки v0.758. Первая: блок не собирался — соседями считались группы с зазором до 3 px, а группы стоят по сетке рядов 24 px, и под «Алгоритмом» у «Лазера» зазор 7 px; «Алгоритм» уезжал один, остальные догоняли его сцепками и по одной упирались в край окна, наезжая друг на друга. Теперь соседи — сцепленные или с зазором до полуряда. Вторая: места при отпускании замерялись после того, как группа из «на весу» (от края экрана) становилась обычной (от края окна), — блок прыгал вбок на отступ окна. Теперь замер — пока на весу, и в окно загоняется весь блок общим сдвигом. Проверено с полем строк справа: блок туда-обратно ходит целиком, у края встаёт весь, не рассыпаясь.

Zazerkalius v0.758 — по снимку шести групп лазера, составленных вместе («Алгоритм» сверху во всю ширину, под ним столбцами Лазер · Солнце · За чертой · Строка 1 · Щели), — «затемнённые кнопки сделай некликабельными» и «как-то так объедини, не размагничивай их». Затемнённые больше не жмутся: нажатие (щелчок, двойной, правый, клавиша) перехватывается раньше всех и гасится, вместо действия всплывает, почему кнопка сейчас не действует; наведение, подсказка и колесо (приближение конуса) — как были, курсор — «нельзя». Группы лазера, стоящие поверх холста и соприкасающиеся друг с другом (по цепочке), тянутся одним блоком — за любую из них: сцепки внутри не рвутся (прежде потянутая правая отцеплялась), к чужим группам блок не цепляется и на левую панель / поле строк не встаёт. Один раз (Z.lasPack) группы лазера, ещё стоящие в общем ряду, собираются в такой блок под остальными группами: столбцы самой узкой ширины, «Алгоритм» во всю их ширину, не влезающие в окно столбцы — следующим рядом. Если группы лазера уже расставлены руками (как у пользователя), раскладку не трогает.

Zazerkalius v0.757 — «надо разобрать группу кнопок Лазера на подвиды… разграничить лазер от солнца, и разные режимы построения строк и симметрии, все кнопки сразу показывать и на что они влияют, затемнять кнопки, которые неактивны при нажатых уже других, и внизу подсказку писать, что в итоге получается за алгоритм», и «вкладку Конус переименуй в Solarius». Прежняя группа «Лазер» (35 кнопок, полей и ползунков вперемешку) — шесть групп, у каждой своя вкладка и цвет: Лазер (⌖ луч-часы, ✺ все лучи, число лазеров и угол, ↻ шаг, 📌, ⌖→ след., ⏸, 🎯, 🔮), Солнце (☀, щели / Без щелей, ◌ след., ☾ затм., ☾ сквозь 1), Строка 1 (✚ 4 части, ▮ щель 1 и ∠, ◐ полукольцо, ☀ накрыты, ⌖◁ ⌖▷), Щели — симметрия колец (1 щель / вырезы T−1 / все щели, ширина, центр / лево / право, ⌖ меж битами), За чертой — как строится строка (▦ любые, ⊕ xor, ⟿ проход, ▦ до 256, ✎ в поле 2) и Алгоритм (↶ откат, шаг ↷, ½ шаг, ⌖✕ сброс). Кнопки те же, с теми же id и подсказками. Не действует в нынешнем режиме — кнопка затемнена, первой строкой подсказки — почему («только при ☀ солнце», «только в вырезах T−1», «✚ 4 части главнее»…); жать её можно — настройка запомнится и вступит, когда режим сменят. Внизу «Алгоритма» — что в итоге делается, по строкам: источник, строка 1, кольца, за чертой, луна, ход; наведи на строку — золотом светятся её кнопки, наведи на кнопку — её строка. Видимый текст на странице — по прямой просьбе пользователя. Переносы кнопок «в группу Лазер», сделанные руками (Z.btnMove, Z.cgrpMove), вернули бы их из новых групп обратно — один раз такие записи сняты, прежние лежат копией: Z.btnMove_pered_razborom и Z.cgrpMove_pered_razborom. Окно «◯ Конус» теперь «◯ Solarius» (шапка, список окон, вкладка браузера). Проверено в браузере: без луч-часов гаснет всё, кроме включателей; при луче — кнопки солнца и вырезов; при ☀ — лучевые; в вырезах с солнцем появляется строка «Луна»; в 3D неактивны все шесть групп.

Zazerkalius v0.756 — «при перетаскивании групп кнопок пропадают зубцы у левого меню». Слой зубцов (#paneZigOv, v0.755) стоял на постоянном z-index 45, а окно поднимается каждым щелчком по нему: Z.z растёт и хранится между заходами, и щёлкнул по группе в окне у края — окно легло поверх зубцов. Теперь слой всегда на ступень выше самого верхнего окна (Z.z + 1, не ниже 45); пересчёт — при каждом нажатии мыши (в захвате: заголовок окна гасит всплытие) и при каждой перерисовке зубцов. Проверено: окно вплотную к панели, Z.z = 60, щелчок — окно 61, зубцы 62, видны; перетаскивание группы конуса — окно 81, зубцы 82.

Zazerkalius v0.755 — по снимку края левого меню — «вкладывай в зубья левого меню все кнопки группы и верхнее меню полоску». Зубцы были вырезаны внутри панели (острие — на её краю), а вкладки и группы окна у края начинаются за ним: выемки их левого края с остриями не сходились, между ними оставались ромбики фона. Теперь край панели прямой, а зубцы — цветом панели, с чертой — выступают наружу на глубину выемки, поверх окон (слой #paneZigOv, щелчки сквозь него проходят): острие входит в выемку вкладки или ряда группы, что стоит у края. Сетка зубцов та же — остриё на середине полосы вкладок. Проверено замером: окно у края — острие на 267,9 px, вершина выемки вкладки — 268,9 px.

Zazerkalius v0.754 — после снятия конструктора групп (v0.752) — «вроде сделал (рисунки), сбрось все, посмотрим». По слову пользователя один раз при загрузке рисунки групп (Z.cgrpTri) снимаются — кнопки групп снова в обычной раскладке. Прежние рисунки не стёрты: копия — Z.cgrpTri_pered_sbrosom (вернуть — командой в консоли Z.cgrpTri = Z.cgrpTri_pered_sbrosom; save(); location.reload()).

Zazerkalius v0.753 — по снимку «⟿ проход» — «за один проход, а не по накапливающей, то есть слева направо полностью или справа налево». Проход больше не складывается из кусков разных заходов: копится только непрерывный освещённый кусок ячейки, что тянется за светом без перерыва; свет ушёл с ячейки — заново; кусок, оторванный от света, отпадает. Дотянулся от края до края — ячейка красится. Проверено расчётом на 1, 11 с «▮ щель 1» 2°: луч идёт по кругу шагом 0,9° (без разрывов) — ячейка 2 стала «1»; шагом 7° (луч прыгает) — ничего.

Zazerkalius v0.752 — по снимку заголовка группы «🧘 △ ◆» — «убери редактирование кнопок». Значка △ (конструктор группы в «△ Сетке», v0.452) в заголовках групп больше нет; 🧘 и ◆ остались. Уже сделанные рисунки групп не тронуты — раскладка кнопок та же.

Zazerkalius v0.751 — по снимку «▮ щель 1» с солнцем — «дай задать угол щели вплоть до 360° — это будет как режим солнца». У щели строки 1 свой угол: ползунок «∠» рядом с «▮ щель 1», 1…360° (не задан — как общая «щель»; двойной щелчок — 180°). Шире щель — шире свет солнца из неё и выход лазера; 360° — во весь круг, как солнце без щели. Общая «щель» колец (до 10°) не меняется. Проверено расчётом на 1, 11: 2° — свет 179°…181°, 90° — 135°…225°, 180° — 90°…270°, 360° — весь круг.

Zazerkalius v0.750 — по снимку «▮ щель 1» с солнцем — «толщина 1 бита всегда равна всем остальным, и там 1 тоже покажи цифру». Бит строки 1 при ▮ был тоньше колец (от 0,42 радиуса) — теперь во всю толщину кольца, от самого центра, как у ◐ и ✚; при ▮ и у лазера кольца тоже начинаются от центра. На бите строки 1 — его цифра, как у битов прочих колец: у ▮ — напротив щели, у ◐ — посередине полукруга, у ✚ — на обеих белых четвертях. Заодно: лазер с ✚ (v0.743) падал при рисовании — у круга от центра радиус прорези уходил в минус; исправлено.

Zazerkalius v0.749 — «убери эффект, когда на первое кольцо навожу — всё остальное пропадает, скрывается». В v0.736 наведение не брало только полукруг строки 1 (◐); при целом солнце, ✚, ▮ и в лазере кольцо строки 1 по-прежнему бралось — сканер и обводка гасили всё прочее. Теперь кольцо строки 1 наведением не берётся вовсе: ни обводки, ни рамки бита, ни сканера. Shift + щелчок по нему, как прежде, меняет бит.

Zazerkalius v0.748 — «режим солнца, когда красит в 1 или 0 луной — когда любой луч прошёл весь бит от начала до конца». Кнопка «⟿ проход» рядом с «⊕ xor»: ячейка строки за чертой красится не только когда свет накрыл её целиком разом, а когда свет за кручение прошёл её всю — по каждой ячейке копится, какие её доли уже были освещены (по её длине, от начала до конца); набралась вся — 1 от солнца, 0 от луны (там, где луна ставит нули). Копится, пока строка за чертой та же (ушла в поле, ✕, ⌖✕ — заново). Проверено расчётом на 1, 11 с «▮ щель 1» (узкий луч, целиком ячейку разом не накрывает): довод по кругу — без прохода строка за чертой «...», с проходом «.1.».

Zazerkalius v0.747 — по снимку «🎵 музыка × 7 щель 0 пишет Ø» — «перекинь из Лазера в Звук, там подгруппу сделай Лазер». Ряд музыки лазера (🎵 музыка, число головок, щель, «пишет», Ø) переехал из «Лазера» в «♫ Звук» — в конец группы, под подписью «⌖ Лазер». Кнопки те же (по своим id), работают как прежде; в 3D они больше не гаснут вместе с «Лазером».

Zazerkalius v0.746 — по снимку «▮ щель 1 · ☀ солнце» — «а так надо: солнце из щели». При «▮ щель 1» и солнце строка 1 — кольцо-бит со щелью (края золотом), солнце — маленьким кругом внутри; свет выходит только через щель — сектор шириной в щель, там, где она сейчас (крутится с кольцом строки 1, довод ⌖◁ ⌖▷), дальше идёт сквозь кольца как всегда; кольца, как у ◐ и ✚, — от центра. «☀ накрыты» проверяет всё кольцо, кроме щели. Проверено расчётом на 1, 11: довод 0° — свет 179°…181° (и дальше на кольцо 2), 90° — 269°…271°, 180° — у верха.

Zazerkalius v0.745 — по снимку лазера с одной строкой — «почему тут лазер вышел из 1 бита не через его щель?». В вырезах T−1 строка 1 прозрачна — так решено в v0.665 («у 1 строки нет выреза — пусть мимо идёт»), и луч выходит при любом её положении. Кнопка «▮ щель 1» (рядом с «✚ 4 части»): у строки 1 и в вырезах — щель, как в прочих режимах: луч выходит, только когда щель на нём (ширина — ползунок «щель», крутится с кольцом строки 1, довод ⌖◁ ⌖▷); щель рисуется прорезью. Без кнопки — как было. Проверено расчётом на 1, 11: со щелью луч встаёт на строке 1 при доводе 0° и 90°, выходит при 180°; без — выходит всегда.

Zazerkalius v0.744 — «солнце тоже должно тут работать в 4 частях — просто маленьким кругом внутри его сделай, и так же лучи». «✚ 4 части» теперь и для солнца: строка 1 — тот же круг из четвертей (чёрная, белая, чёрная, белая), солнце — маленьким светящимся кругом в центре; свет выходит только через чёрные четверти — два сектора по 90° с лучами-краями, дальше идёт сквозь кольца, как всегда. «☀ накрыты» при ✚ проверяет белые четверти. Проверено расчётом на 1, 11, 111: свет за строкой 1 — 40°…130° и 220°…310°.

Zazerkalius v0.743 — «нужен вариант лазер-луча, который из центра проходит через щель первого бита T−1, и где T−1 бит состоит из 4 частей — круг, поделённый на 4 части: чёрн-бел-чёрн-бел». Кнопка «✚ 4 части» (рядом с «⌖ меж битами»), для лазера в вырезах T−1: строка 1 — круг от самого центра на 4 четверти, от верха по часовой чёрная, белая, чёрная, белая (края — золотом). Лазер из центра выходит только через чёрную четверть (щель), на белой (бит) встаёт; круг крутится, как кольцо строки 1, — на четверть за шаг; кольца, как у ◐, начинаются от центра. Проверено расчётом на 1, 11, 111: при повороте круга на 0, ½, 2 — луч встаёт на круге, на 1, 1½, 3 — проходит дальше.

Zazerkalius v0.742 — по снимку солнца с луной — «значок для вкладки Конус стилизуй», «без чисел». Вместо кружка «◯» у «Конуса» — свой значок: солнце в центре, золотой сектор света с двумя лучами, напротив — голубой лунный сектор, пунктирное кольцо; подписей и долей нет. Стоит в верхней полосе, в заголовке окна и на отдельной странице «Конус» (там же — значком вкладки браузера).

Zazerkalius v0.741 — «если 0, то не становится 1 по Xor, а должно». Ноль свет проходит свободно (v0.724), и попаданием он не считался — xor его просто не видел. Теперь при ⊕ xor ноль строки за чертой, накрытый светом целиком, — тоже попадание: ячейка переключается в 1 (свет в этот миг идёт сквозь неё дальше). Проверено расчётом на 1, 11: «00.», свет заново на ячейке 2 → «01.», затем на ячейке 1 → «11.».

Zazerkalius v0.740 — «сделай кнопку Xor: если второй раз солнце тут, а уже 1 там, то 0, и если было 0, то ставить 1 — всё, в общем»; «Xor только на строке за горизонтом». Кнопка «⊕ xor» рядом с «☀ накрыты»: ячейка строки за чертой, на которую свет солнца упал заново (не держится с прошлого шага), меняется — 1 → 0, 0 → 1, пустая → 1; строки поля не трогаются. Нули луны — как были. Без xor — свет ставит 1. Проверено расчётом на 1, 11: «11.», свет заново на ячейке 2 → «10.», затем на ячейке 1 → «00.»; свет, что держится, не переключает.

Zazerkalius v0.739 — по снимку группы «Лазер» — «как запустить в режиме лазера T−1, чтобы между битами лазер переходил наружу». В вырезах T−1 лазер проходил кольцо только через вырез — биты стояли стеной сплошь. Кнопка «⌖ меж битами» (рядом с «▥ центр»): луч проходит и через щель между соседними битами (ширина — ползунок «щель», как в «все щели») — у колец строк, у кольца за чертой и у пустых «до 256». Проверено расчётом на 1, 11, 111: перебор положений колец 2 и 3 — луч выходит в 546 из 3600 вместо 480.

Zazerkalius v0.738 — две правки. (1) «В режиме 256 сделай, чтобы можно было за горизонт тянуть вверх, скрывая строки — временно; но если они окажутся затронуты автоматикой, то надо автоматом и расширить горизонт вниз». Черта вверх прячет строки, как и прежде; при «до 256», как только во время кручения или шага свет солнца или луч лазера дойдёт до места спрятанных строк (кольцо за чертой и дальше), черта сама опускается и строки возвращаются (↩ поднимет снова); краска этого мига не ставится — её поставит следующий кадр по настоящим строкам. Простая отрисовка (протяжка черты) строки не возвращает. (2) «T−1 — сделай кнопку расположения нулевого (начала вырезов): первое — как сейчас, по центру симметрии, второе — по левому, и по правому третье краю». Кнопка рядом с «вырезы T−1», щелчок — по кругу: ▥ центр (как было), ◧ лево — левый край выреза каждого кольца на вертикали (вырез идёт от неё по часовой), ◨ право — правый край выреза на вертикали. Проверено: 1, 11, 111 — ◧: вырезы колец 2 и 3 начинаются сверху (0°…120°, 0°…144°), ◨: кончаются сверху; черта вверх на 1, 11, 111, 1101 с «до 256» — на шаге свет дошёл, строка 4 вернулась.

Zazerkalius v0.737 — «масштаб меньше не делается, чем кольца первое, почему-то». Отдалять конус (колесо, кнопки, клавиши) можно было только до 0,3 окна: при многих кольцах — а масштаб с v0.715 при новом кольце не меняется — внешние оставались за краем. Теперь отдалять можно до 0,02.

Zazerkalius v0.736 — «сейчас при наведении на 1 бит, когда он полукруг, — 0 — всё остальное пропадает, убери этот эффект». С ◐ строка 1 — полукруг от центра, и наведение на него брало бит строки 1: сканер и обводка кольца гасили всё прочее. Теперь полукруг строки 1 наведением не берётся — ни рамки, ни сканера, ни обводки строки.

Zazerkalius v0.735 — «сделай перемещение не по Ctrl, а по правой кнопке». На холсте конуса всё, что тянулось с Ctrl, тянется правой кнопкой мыши: кольца крутятся (строки 1 — довод, кольцо за чертой, любое кольцо строки), в объёме — сдвиг вида. Правый щелчок без движения ничего не выбирает; по кольцу за чертой — как прежде, стереть его (после протяжки правой — не стирает); меню браузера над конусом не всплывает. Ctrl по-прежнему работает, Ctrl + щелчок — выделить кольцо. Проверено: протяжка правой по кольцу 2 — повернулось на 2,5 части.

Zazerkalius v0.734 — «нужна кнопка: ось из центра — вертикаль и горизонталь». Кнопка «✛ оси» в группе «Кольца» (перед «⌖ сканер»): две пунктирные черты через центр конуса — вертикаль и горизонталь во весь холст; едут вместе с центром при сдвиге вида.

Zazerkalius v0.733 — «по идее оно (солнце) же должно быть 0 толщины, а у полукольца внутреннее кольцо 0 длины, то есть это круг». С ◐ кольца начинаются от самого центра: строка 1 — полукруг от центра до толщины кольца (внутренний край — точка), солнце — светящаяся точка в центре поверх него; кольцо 2 — следующее, все одинаковой толщины. Прежнего отступа на толщину кольца (v0.732) нет.

Zazerkalius v0.732 — после объяснения, что полукольцо (180°) помещается под двумя битами кольца из трёх частей (240°) с запасом по 30°, — «да, все кольца одинаковой толщины должны быть». С ◐ полукольцо было тоньше колец (треть радиуса солнца). Теперь кольца отодвинуты от центра ровно на толщину кольца (внутренний радиус = шагу колец), полукольцо строки 1 — во всю толщину кольца, как все, а солнце — в освободившемся центре. Без ◐ — как было.

Zazerkalius v0.731 — по снимку «☀ 1/12» — «всё равно светит, почему». При одной строке (только солнце) строка 2 — это кольцо за чертой, а его «☀ накрыты» не проверял (оно считалось ещё пустым), и солнце светило. Теперь проверяется и оно: бит строки 1 должен быть целиком накрыт поставленными единицами кольца за чертой; нет — света нет. На снимке солнце целое (◐ выключено) — такое закрыть нельзя вовсе, света не будет; полукольцо включается кнопкой ◐ (или заново — «☀ накрыты»).

Zazerkalius v0.730 — про «☀ накрыты» («если хоть одна не закрыта, свет останавливается на этом кольце»): «это пусть только 1 строки касается, то есть солнце светит тогда, когда 1 бит первой строки весь накрыт единицами из 2 строки». Проверка осталась одна: бит строки 1 (полукольцо) целиком накрыт по углу единицами строки 2 — солнце светит, нет — света нет. Прочие кольца больше не проверяются: свет идёт сквозь вырезы и нули, как обычно.

Zazerkalius v0.729 — про «☀ накрыты»: «полукольцо там считается тоже: солнце светит, когда оно всё закрыто снаружи единицами, только». Строка 1 теперь проверяется всегда: солнце светит, только когда его полукольцо целиком закрыто единицами кольца 2 (без ◐ — целое солнце, закрыть его нельзя, света нет). Чтобы так не выходило, «☀ накрыты» включает «◐ полукольцо» вместе с собой. Дальше — как в v0.728: из кольца в следующее — только когда все единицы закрыты.

Zazerkalius v0.728 — «ещё кнопку рядом с полукольцом: что солнце из текущего кольца светит дальше только тогда, когда все единицы этого кольца закрыты единицами внешнего кольца». Кнопка «☀ накрыты» рядом с «◐ полукольцо»: свет идёт из кольца строки в следующее, только если каждая «1» этого кольца целиком закрыта (по углу) единицами следующего; нет — свет встаёт на нём. Проверяются кольца строк (кольцо за чертой ещё пустое — не проверяется); строка 1 — только полукольцом (◐): целое солнце закрыть нельзя. Проверено расчётом на 1, 11, 111 с ◐: фаза 0 — полукольцо не закрыто единицами кольца 2, света нет; фаза 1 — закрыто, свет входит в кольцо 2 и встаёт на нём (его единицы кольцом 3 не закрыты).

Zazerkalius v0.727 — «ещё кнопку, которая для солнца и T−1 режима делает 1 строку (1) не цельной, как сейчас, а половинкой кольца, а солнце внутри него». Кнопка «◐ полукольцо» рядом с «☾ сквозь 1»: строка 1 — не целый диск, а полукольцо с битом (золотые края), солнце — меньшим диском внутри. Свет выходит только через открытую половину (у бита «0» — весь круг, v0.724); полукольцо крутится, как кольцо строки 1, — полоборота на шаг. Проверено расчётом на 1, 11: свет за строкой 1 — полкруга, сдвигается с фазой (фаза 0 → 9°…189°, ½ → 99°…279°).

Zazerkalius v0.726 — про «☾ сквозь 1»: «пусть не так, а условие другое: свет должен пройти по всей длине через одинаковое количество единиц» → «каждая ячейка отдельно». Луна по-прежнему идёт из центра, но «1» больше не останавливает её — проходит насквозь, считая их на пути каждого луча (свет ведётся по частям: сколько «1» прошёл). Ноль на кольце за чертой — только в ячейку, которую целиком накрыл свет с одним и тем же счётом; накрыта лучами с разным счётом — свет есть, нуля нет. Проверено расчётом на 1, 11, 111 с ☾ затм.: фаза 1 — ячейку 3 накрывают лучи с разным счётом, нуля нет (без кнопки — 0); фазы 0 и ½ — нули на месте.

Zazerkalius v0.725 — «сделай кнопку и включи, что луна может проходить только через одну 1». Кнопка «☾ сквозь 1» рядом с «☾ затм.», по умолчанию включена: луна идёт, как солнце, из центра наружу, кольцо за кольцом — сквозь вырез и «0» свободно, одну «1» на своём пути проходит насквозь, на второй встаёт (свет ведётся двумя частями: ещё не проходил «1» и уже прошёл одну). Направление луны и где она ставит нули — как прежде (v0.711–v0.724). Выключено — как было: луна начинается у кольца за чертой.

Zazerkalius v0.724 — «солнце проходит через 0 свободно! надо так». В вырезах T−1 бит «0» свет больше не держит: и солнце, и луна проходят его, как вырез, — у колец строк это нули строки, у кольца за чертой — поставленные нули (в «▦ любые» — тоже). Стены — только единицы. Заодно куски света, сходящиеся встык с погрешностью счёта, склеиваются в один (весь круг — снова весь круг). Проверено расчётом: 1, 00 — свет проходит кольцо 2 целиком; 1, 10, 101 — через ноль строки 2 свет идёт дальше на кольцо 3.

Zazerkalius v0.723 — «когда ставит 0, то нельзя ставить их через кольцо от того кольца, где солнце упёрлось в единицы, — только прилегающему (следующему от того кольца, где солнце упёрлось)». Ноль на кольце за чертой (N) теперь — только там, где напротив, через центр, солнце упёрлось в биты кольца N − 1: свет до него дошёл, но в N не прошёл. Ячейка — 0, только если луна накрыла её целиком внутри зеркала такого света; где солнечный свет дошёл до кольца за чертой (или дальше) — нулей напротив нет. То же — в «▦ любые». Проверено расчётом на 1, 11, 101 с ☾ затм.: солнце упёрлось в кольцо 2 — нули на кольце 3; свет дошёл до кольца 3 — нулей нет.

Zazerkalius v0.722 — «нужна кнопка: считать кольцо T−1 — все ячейки могут стать битами, но становятся только те, в которые первыми попал свет, потом переход на следующее кольцо по счёту» → «первые n — биты» и «первый бит уже определяет, что все последующие будут только у него рядом — он либо крайний, либо где-то средний, поэтому вырез всегда будет какой нужно». Кнопка «▦ любые» рядом с «☾ затм.»: у кольца за чертой все 2n − 1 частей — места, готового выреза нет. Часть, которую свет накрыл целиком (☀ — 1, ☾ — 0), становится битом, если это первый бит или она вплотную к уже стоящим; прочие пустые свет проходит. Набралось n — строка готова и уходит в поле: эти биты подряд, кольцо повёрнуто так, что они на своих местах, а оставшиеся n − 1 частей — вырез одним куском; дальше — следующее кольцо. |◀, ↶ и перемотка помнят части. Проверено шагами на 1, 11: части «11..1» (сомкнулись через верх) → строка 111, кольцо повёрнуто на −4 части; следующее (7 частей) набирает «....111».

Zazerkalius v0.721 — по снимку перемотки — «ползунок прямо под центром солнца и шириною в 4 раза больше, чем сейчас». Ползунок перемотки стоял посередине холста и, как все, был 140 px (общее правило v0.313). Теперь — 560 px (не шире холста) и середина его — прямо под центром солнца: место берётся при каждой отрисовке, сдвинул вид — ползунок следом.

Zazerkalius v0.720 — «крутить, когда с солнцем T−1, — надо ползунок показать внизу в середине, длинный, и на нём чтобы можно было перемещать взад-вперёд, откатывая — не то что шаги, а как будто перемотку назад кручения». Лента перемотки: пока солнце в вырезах крутится (▶ крутить, «шаг ↷», «½ шаг», |◀ ▶|), каждый кадр пишется — фаза и поворот конуса и ссылка на состояние (строки, краска, строка за чертой, лог); само состояние пишется заново, только когда сменилось. Ползунок внизу посередине холста: назад — всё как было в тот миг (кручение встаёт, показ ничего не красит), вперёд — до конца записанного. Крутить дальше с отмотанного места — запись впереди стирается и идёт заново. Только в памяти страницы; ⌖✕ сброс — лента с нуля. Проверено: 8 шагов на 1, 11 — назад к первому: строки 1, 11, «.1.»; в конец: 1, 11, 111.

Zazerkalius v0.719 — по снимку «⌖✕ сброс» — «пусть возвращает всё до начала, когда есть только солнце и 2 строка». Сброс стирал золото и строку за чертой и ставил кольца на места, но строки, ушедшие в поле по шагу или кручению, оставались. Теперь снимаются и они: остаются строка 1 (солнце) и строка 2, за чертой — пустая третья, масштаб подгоняется заново. Перед сбросом — снимок, ↩ вернёт строки.

Zazerkalius v0.718 — по снимку «▶ крутить» — «когда не через шаги, а в кручении крутит, то надо также расширять горизонт, когда все биты заполнит». Готовая строка за чертой уходила в поле только по шагу (v0.702). Теперь и при непрерывном кручении (луч-часы или солнце): как только строка готова (у солнца в вырезах — без пустых ячеек, иначе — вся «1»), она уходит в поле, черта опускается, кручение идёт дальше и красит следующую. Масштаб при этом не меняется (v0.715), |◀ возвращает строку за черту.

Zazerkalius v0.717 — «сделай кнопку, по которой луна будет светить, только когда всё солнце скрыто за единицами, также через лучи из центра в обратном направлении». Кнопка «☾ затм.» рядом с «◌ след.»: луна — только при затмении. Ничего не вылетело (весь свет лёг на биты) — зеркалится свет, упавший на последнее кольцо, куда он дошёл, через центр в обратную сторону; вылетело хоть что-то — луны нет. Дальше всё как обычно: от кольца за чертой, нули там, где накрыла ячейку целиком, на кольцо наружу. Выключено — прежнее: луна зеркалит вылетевший свет. Проверено расчётом на 1, 11: строка за чертой «.1.» — свет вылетел, при затмении луны нет; «111» — не вылетел, луна −60°…60°.

Zazerkalius v0.716 — по снимку «☀ 1/3 · ☾ 0» — «когда стык битов, не рисуются вообще лучи, хотя солнце вылетело, и оно неверно посчитано» → выбрано «насквозь пустой ячейки». Пустая ячейка кольца за чертой, которую свет накрыл не целиком, его больше не держит: свет проходит её, как вырез, и вылетает дальше — отсюда зарево снаружи, луна напротив и подпись ☀ вылетевшей доли. Накрытая целиком — краска (1 от солнца, 0 от луны), закрашенная — стена. То же правило — у луны на кольце за чертой.

Zazerkalius v0.715 — «когда кольцо добавляет — пусть масштаб не меняет». Шаг колец делился на число колец, и каждое новое кольцо (строка ушла в поле, |◀, ↶, новая строка руками) сжимало весь конус. Теперь делитель держится, пока колец стало на одно больше или меньше: новое кольцо выходит наружу, дальше — колесом. По месту пересчитывается, когда строк сменилось сразу много (загрузка, вставка), сменились режимы (до 256, 3D) или сброс вида (Alt + двойной щелчок, ⌂).

Zazerkalius v0.714 — по снимку «☾ 1/3» — «луну, как и солнце, показывай в следующем кольце». Вылетевшее солнце видно заревом на кольцо наружу, а луна там рисовалась, только если прошла и вырезы кольца за чертой, — у одной строки «1» напротив выреза биты, и в следующем кольце луны не было. Теперь луна — весь зеркальный сектор — показана в следующем кольце на тех же радиусах, что зарево солнца, синим. Считается всё как в v0.713.

Zazerkalius v0.713 — по снимку «☀ 1/15» — «вот тут 1/15 часть солнца вылетела только из всех колец — значит, такая же луна с другой стороны только». Луна — зеркало света, вылетевшего из ВСЕХ колец, включая кольцо за чертой (прошёл и его вырез), той же доли напротив; прежде зеркалился свет, дошедший до кольца за чертой, и луна выходила шире солнца (☾ 1/6 при ☀ 1/15). Начинается у кольца за чертой — красит там нули, где накрыла ячейку целиком, — и идёт на кольцо наружу. Не вылетело ничего — луны нет. Подпись ☾ — доля этого зеркала.

Zazerkalius v0.712 — по снимку — «свет от луны правильно покажи». Луна — те же солнечные лучи, продолженные через центр, а рисовалась только у кольца за чертой, от диска до него — один бледный пунктир; выглядело пятном, взявшимся ниоткуда. Теперь, как солнце, она выходит из диска: от диска до кольца, где начинает действовать, — слабое синее свечение между лучами и сплошные голубые края. Заодно сектор луны, разрезанный на 0°, больше не рисует ложный край на стыке.

Zazerkalius v0.711 — «свет от луны задать таким, что только от вылетевших лучей солнца угол задаётся — от тех, что вышли за все кольца через зазоры, имеющиеся до кольца ниже горизонта, а не как сейчас». Антисвет — зеркало только того солнечного света, что прошёл вырезы всех колец строк и дошёл до кольца за чертой; начинается у этого кольца. Не дошёл ничего — антисвета нет (прежде зеркалился первый же неполный пучок). Строки 1, 11: свет 120°–240° у строки за чертой → антисвет −60°…60°; 1, 11, 101: свет за черту не дошёл — антисвета нет.

Zazerkalius v0.710 — две правки. (1) По снимку — «свет лучей также продолжи на следующую строку во внешнюю»: антисвет шёл от самого центра и упирался в биты первого же кольца (напротив выреза у симметричного кольца — его биты). Теперь он начинается там же, где солнечный пучок, — перед кольцом, на которое пучок падает (свет вышел за крайнее — сразу за ним), и идёт дальше наружу; от диска до этого уровня — только голубые пунктирные лучи-края. Строки 1, 11: антисвет −60°…60° — у строки за чертой, сквозь её вырез — наружу. (2) «Верни отображение частей»: подписи частей за крайним кольцом пропадали, когда свет занимал весь круг или не доходил вовсе (делить нечего) — теперь всегда: тогда одна часть на весь круг («☀ 1/1» / «◌ 1/1») и сводка.

Zazerkalius v0.709 — «шаг назад также и строки из-под горизонта должен обратно возвращать». |◀ — зеркало шага вперёд: строка, ушедшая в поле по шагу, возвращается за черту первым же |◀ (черта вверх, со своей закраской, счётом попаданий, накруткой и поворотом кольца за чертой), ничего не крутя; крутит назад следующее нажатие (fillUncommit, память перед каждым fillAutoCommit; строки менялись иначе — забыта). Строки 1, 11, за чертой «111»: ▶| — «1, 11, 111» → |◀ — «1, 11», за чертой снова «111» → |◀ — кручение назад.

Zazerkalius v0.708 — на «сектор напротив солнца убран» — «нет, свет лучей — это антисолнце-лучами, как было: они так же, как солнце, светят, но синим, и только когда полностью бит осветят — тогда красить в 0». Антисолнце — лучи солнца, продолженные через центр в обратную сторону (как луна v0.690): направления — зеркало солнечного пучка (первый освещённый не весь круг; нет такого — свет, вышедший за крайнее кольцо). Светит, как солнце: из центра наружу кольцо за кольцом — сквозь вырез проходит, на битах останавливается; ячейка строки за чертой, накрытая им целиком, — 0. Рисуется синим перед каждым кольцом (у первого — от диска), прошёл крайнее — ещё на кольцо наружу; подпись ☾ — по нему. Правила «свет сквозь единицу» (v0.701–v0.707) сняты. Строка «1»: антисвет −60°…60° накрывает ячейки за чертой наполовину — нулей нет.

Zazerkalius v0.707 — по снимку — «тут луна только часть бита осветила, но поставила 0». Рисовалась одна «луна» (сектор напротив солнца через центр, v0.690), а нули ставила другая — свет, прошедший сквозь одну единицу (v0.701–v0.706). На вопрос, какая настоящая, выбрано «луна = свет сквозь 1»: синим теперь рисуется именно он — перед каждым кольцом, синеватым градиентом с голубыми краями; где синее накрыло ячейку целиком — там 0. Сектор напротив солнца снят; подпись ☾ за крайним кольцом — тоже по этому свету. Строки 1, 11: синее 240°–120° задевает крайние ячейки за чертой краем — за чертой «.1.», подписи «☀ 1/3 · ☾ 2/3».

Zazerkalius v0.706 — две правки. (1) «Откат не сработал»: история писалась только у «шаг ↷» и «½ шаг», а строки в снимке были лишь подписью — стоило черте опуститься (готовая строка уходит в поле), откат стирал всю историю. Теперь снимок полный (строки поля и за его границей, текущая, поворот кольца за чертой), откат возвращает и черту, и в историю идут все шаги: «шаг ↷», «½ шаг», |◀ ▶| и нажатие, которое только опускает черту (lasRec). Прежнее состояние пользователя не восстанавливалось — по его слову, это просто функция, которая должна работать. (2) «Пусть только за одной единицей луна красит в 0, а не за несколькими»: «нулевой» свет, упавший на вторую «1», гаснет, дальше идёт только сквозь вырез. Проверено и «частично — не красит в 0»: строки 1, 11, 111 — за чертой «.00.», крайние ячейки задеты краем и пусты.

Zazerkalius v0.705 — «красить 1 или 0 только когда весь бит будет лучами покрыт». В вырезах T−1 ячейка красится светом (1) или «нулевым» светом (0), только если он покрывает её дугу целиком; задетая краем — не красится и остаётся пустой (coneCellCovered). Строки 1, 11: за чертой «.1.» — целиком освещена только средняя; 1, 11, 101: у кольца 3 закрашен только средний бит, за чертой «0000» — нулевой свет покрыл все четыре.

Zazerkalius v0.704 — «в режиме лазера дай крутить последнее кольцо руками». Кольцо за чертой при луч-часах крутится мышью с Ctrl, как прочие кольца (v0.248): свой поворот Z.coneFillTurn поверх кручения; отпустил — на целую ячейку, в вырезах T−1 — на половину части. Ушла строка в поле — поворот переходит к кольцу этой строки (рисунок не прыгает), у новой строки за чертой — 0; ⟲ и вход в вырезы — тоже 0. Протяжка на 50° по часовой у кольца из 5 частей — на полчасти (4,5 из 5).

Zazerkalius v0.703 — «лучи прошли через единицы 2 строки и единицы 3 строки на 4-ю — там надо 0 ставить, почему-то не ставит». В v0.701 свет сквозь «1» красил только следующее кольцо и гас. Теперь «нулевой» свет идёт по кольцам: на кольце он красит нулями ячейки, куда упал, и проходит дальше сквозь вырез и сквозь биты «1» (на «0» гаснет); к нему добавляется основной свет, упавший на «1». На строке за чертой — нули, дальше нет. Строки 1, 11, 101: строка 4 за чертой — «0000».

Zazerkalius v0.702 — «когда строка вся битами заполнена, следующий шаг — сначала просто сдвинуть горизонт без кручения, а потом следующее нажатие крутить». Готовность строки за чертой проверяется в начале шага («шаг ↷», «½ шаг», |◀ ▶|): готова — это нажатие только уводит её в строки и опускает черту, ничего не крутит; крутит следующее. Строки 1, 11: «111» за чертой → шаг: «1, 11, 111», фаза 0 → шаг: кручение.

Zazerkalius v0.701 — «теперь так: пусть свет от лучей проходит, когда через единицы, — то он закрашивает следующую нулями; и когда все биты строки закрасятся либо 1, либо 0 — строка готова» («keys» — «лучи» в английской раскладке). Солнце в вырезах T−1: свет, упавший на бит «1» кольца строки, проходит его и красит ячейки следующего кольца нулями (по тем же расходящимся углам; дальше не идёт); свет через вырез — как был, единицами; единица сильнее нуля. Пустые ячейки строки за чертой больше не заливаются нулями сами («остальные — нулями» было для лазера), и строка готова, когда пустых нет — все 1 или 0; в поле она уходит по шагу, как прежде. Вне вырезов и у лазера — по-старому (готова, когда вся «1»).

Zazerkalius v0.700 — по снимку «☀ ≈2/15 · ☾ ≈2/15 · ◌ ≈4/11 · ◌ ≈4/11» — «потом остальное же 11/15, обе части — если их как 11/30? неправильно». Каждая часть округлялась сама по себе: у ◌ ближайшей простой вышла 4/11, и в сумме не выходил целый круг. Теперь доли частей подбираются к одному знаменателю q, при котором все части — целые p и Σ p = q: точный — первый такой; иначе (q до 60, ошибка до 0,004 у каждой, «≈») — заметно (вдвое) точнее прежнего найденного; дроби сокращаются по одной. ☀ ≈ 0,1335: «≈2/15 · ≈2/15 · ≈11/30 · ≈11/30».

Zazerkalius v0.699 — на вопрос «шаг в Лазере на сколько частей круга поворачивает?» (ответ: ни на сколько заранее — мелкими подшагами до следующего события) — «сделай кнопку — шаг ровно на 1/2 часть текущего кольца» (набрано «1.2»: в русской раскладке на месте «/» точка). «½ шаг» рядом с «шаг ↷»: поворот ровно на полчасти кольца текущей строки (частей n, в вырезах T−1 — 2n − 1), в выбранном направлении. «Каждое» / «Встреч Бит» — фаза +½ части, все кольца на полчасти своих; «Встреч Стр» — на 360° / частей / 2; «Всё» — весь конус на тот же угол. Запоминается для «↶ откат», готовая строка за чертой уходит в строки, как при шаге. Строки 1, 11, 101, текущая 2: кольцо 2 — на 60°, свет 120°–240° → 180°–300°.

Zazerkalius v0.698 — две правки. (1) По снимку «◐ 2/3 · ☀ 1/3» — «луна 2/3 показывает, солнце 1/3, а что остаётся между ними? покажи у каждой части её количество от целой»: «◐» был всей тёмной частью и читался как луна. Теперь круг за крайним кольцом делится на солнце ☀ (свет), луну ☾ (сектор напротив света через центр) и остаток ◌ между ними (оба сразу — ☀☾); у каждой части — доля целого круга, в сводке — сколько частей каждого вида и лучей. Строки 1, 11: «◌ 1/6 · ☀ 1/3 · ◌ 1/6 · ☾ 1/3». (2) «Только при шаге надо расширять линию горизонта вниз, а не автоматом»: готовая строка за чертой (вся «1») уходит в строки только по шагу — «шаг ↷» в «Лазере» или |◀ ▶| в «Кручении», по одной за шаг; само по себе (кручение ▶, отрисовка) — нет. Строка «1»: «11» ждёт за чертой → шаг → «1, 11» → шаг → «1, 11, 111».

Zazerkalius v0.697 — две правки. (1) По снимку солнца — «по краям за последним кольцом покажи, сколько частей разделило солнце светом, то есть сколько частей света и сколько лучей и между ними» (набрано в английской раскладке: «keys b vt;le» — «лучи и между»). Свет, дошедший до крайнего кольца (или вышедший за него), делит круг на светлые и тёмные части; за крайним кольцом у каждой — её доля круга: «☀ 1/3», «◐ 2/3» (не простая дробь — «≈»), сверху сводка «☀ частей 1 · лучей 2 · ◐ между 1». (2) «Убери клик по пустому биту, что делает его 1 и 0 по очереди — отмени это, удали»: щелчок по ячейке кольца за чертой на конусе больше её не меняет (было с v0.114), и само кольцо за чертой для щелчков — как пустое место (ни выделить, ни крутить). Щелчок по ячейке строки за чертой в поле строк остался.

Zazerkalius v0.696 — «если все биты заполнились единицами в кольце, то строка готова — её открывай в строках, линию под неё смещай, горизонт». Строка за чертой, ставшая вся «1» (лазером или солнцем), сама уходит в строки поля, черта — под неё (снимок ↩ на каждую; замок строк ⛔ не пускает). Счёт попаданий не теряется: кольца нумеруются так же, попадания в следующее кольцо (теперь оно за чертой) переходят в его ячейки — «1», остальные «0»; стала и она вся «1» — уходит следом (fillAutoCommit). Строка «1», солнце, T−1, «до 256»: «11» → в строки, следом «111», дальше свет перекрыт.

Zazerkalius v0.695 — по снимку «↶ откат · шаг ↷» — «при шаге показывай, куда будет светить солнце в следующем шаге, если включить кнопку; сделай кнопку рядом с кнопкой Шаг». «◌ след.» рядом с «шаг ↷» (Z.lasPeek): на конусе белым пунктиром — края секторов, куда ☀ будет светить после следующего шага, и слабая белая заливка. Следующий шаг ищется тем же ходом, что ▶| у солнца (фаза мелкими шагами, пока свет не упадёт иначе), на копии; итог запоминается и пересчитывается, только когда сменились фаза, строки, накрутка или режимы (coneSunPeek). Строки 1, 11, 101, «Каждое»: сейчас 120°–240°, показ 60°–180° — после шага ровно так.

Zazerkalius v0.694 — по снимку строк пустых колец под чертой — «строки наложились на номера». Строки поля стоят в сетке (у строки display: contents), а обёртка #voidRows встала в неё одной ячейкой — номер и биты каждой строки шли друг под другом. Обёртка теперь тоже display: contents, строки пустых колец — в сетке, как прочие.

Zazerkalius v0.693 — по снимку конуса с пустыми кольцами — «пусть вживую сразу дорисовывает биты в строках под чертой (и сдвигать черту при выходе на уровень — но это пока непонятно как), в общем под чертой проставь в режиме 256 сразу все 0000 и сразу их заполняй». При «▦ до 256» внизу поля строк (под строкой для заполнения и строками за границей) — строки пустых колец N + 1 … 255, каждая на бит длиннее: 0, где луч или свет ещё не попадал, 1 золотом — где попал (счёт Z.voidHits). Обновляются на ходу, когда счёт поменялся. Это вид, а не строки поля — в счёт и правку не идут. Сдвиг черты при выходе на уровень — отложен, пользователь сам сказал «пока непонятно как». Строка «1» под солнцем в T−1: свет сквозь вырез кольца за чертой — на кольцо 3, его строка сразу «111».

Zazerkalius v0.692 — три правки. (1) «▦ до 256 — не могу нажать при режиме T−1»: галку гасило «Без щелей» солнца (там пустые кольца не нужны), а в вырезах проход задают вырезы — теперь в T−1 «до 256» доступно и работает при любом выборе солнца (coneVoidOn, coneSunUi). (2) По снимку «Вида» — «ВИД)) к мин)неп)неп))одинак) и т. д. — направление стрелок вправо всё время»: каждая кнопка рисунка конструктора (два ряда, сплошь) показывается стрелкой вправо — слева выемка, справа остриё; кнопки строки — вплотную, остриё в выемку (прежде между ними оставалась щель в ромбик: следующая ставилась на столбец дальше нужного). Рисунок не меняется. (3) «Почему сканер при наводке на 1 синий тут не делает ничего»: ячейка кольца за чертой при ⌖ сканере — тоже «бит под мышью»: рамка и ось сканера (coneFillHoverAt).

Zazerkalius v0.691 — две правки. (1) По снимку «Вида» — «кнопки наложились тут»: на месте одной кнопки рисунка (номер места сдвинулся) стоит блок-обёртка из трёх кнопок «выдел. · ✳ лучи · все», и они вылезали на «1-й бит». Блок, которому мало места, теперь дорисовывается до размаха своих кнопок (у них своя ширина, от коробки не зависят), соседи справа сдвигаются — как у ползунка. Первая попытка мерила саму коробку, уже расширенную (+2 px), и группа росла по кругу при каждом пересчёте — «сама удлиняется группа, чуть монитор не вышибла справа»; поймано до коммита. (2) По снимку солнца с одной строкой — «лучи также пусть на 1 кольцо выходят из 2 в пустоту, и также зарево между ними»: свет, прошедший последнее кольцо, — золотое зарево и края-лучи ещё на одно кольцо наружу, напротив — луна.

Zazerkalius v0.690 — по снимку солнца — «у нижнего бита границ не видно совсем под солнцем; и покажи за солнцем — из через центр проходящих его лучей — в обратную сторону от выреза также подсвет, лунный, синевой, и всё продолжи даже немного дальше крайнего кольца». (1) Поверх золотого свечения — черты между ячейками колец, на которые падает свет (цветом фона), края вырезов — золотом. (2) Луна: края каждого светового сектора продолжены через центр в обратную сторону (голубые линии от диска солнца), сектор напротив — слабый синеватый градиент. (3) Пунктир солнца и лунные лучи — до чуть дальше крайнего кольца (на 0,6 кольца).

Zazerkalius v0.689 — по снимку «Вида» — «левая граница группы двойная почему-то». Рамка группы ждёт первую кнопку ряда выемкой у самого края (у границ рядов — 0, в середине — t), а раскладка конструктора ставит её со столбца 1 — её край тот же зубец, но на t правее: две одинаковые ломаные рядом. Теперь у группы с рисунком конструктора рамка на t правее, ровно по кнопкам (tzgFrame), а строка при переносе начинается со столбца 1 (выемкой в рамку) или 2 (остриём в её выемку), а не 0, где остриё срезалось рамкой (tzcApply).

Zazerkalius v0.688 — по снимку сканера («83%», «67%») — «а можно не в %, а в точных дробях? и показать линиями части; где 83% — сколько линий разделяет бит?». Проценты были там, где ось режет бит не в простой дроби: после шагов лазера кольца стоят на мелких фазах (−4,001 бита), и место разреза — не кратное части. Теперь подпись — дробь, где стоит ось от начала бита: точная (знаменатель до 64) — «5/6», бит поделён синими чертами на 6; иначе ближайшая простая дробь (знаменатель до 32, ошибка до 0,005) — «≈5/6», черты пунктиром; не нашлось — десятичная «0,83» без черт.

Zazerkalius v0.687 — «для лазера надо сделать отдельные кнопки кручения, которые как шаги можно откатывать назад, всё стирая закрашенное на место». В «Лазере» (последним блоком) — «↶ откат» и «шаг ↷». Шаг — тот же, что ▶| / |◀ (до следующего события лазера, выбранным режимом и направлением), но перед ним запоминается всё, что меняют кручение и луч: фаза и поворот конуса, накрутка колец, довод строки 1, краска и остановленные кольца (Z.voidHits), строка за чертой, лог, счёт проходов, память конца луча (и солнца). Откат возвращает последнее запомненное, подряд — дальше назад, до 500 шагов; шаг, который ничего не сдвинул, не запоминается. История — на время сессии; сменились строки — забыта. Строки 1, 11, 101, 1001, «Каждое»: 4 шага закрасили биты кольца 3 и ячейку за чертой, 4 отката вернули всё ровно к началу.

Zazerkalius v0.686 — по снимку солнца в вырезах — «между 2 лучами солнца как-то градиентом сектор золотой, несильно, только светить». Сектор между краями света — мягкий золотой радиальный градиент поверх колец: от места выхода (вырез кольца, сильнее) к внешнему краю кольца, куда свет упал (слабее). Сектор во весь круг (сразу за солнцем) не заливается — там своё свечение диска.

Zazerkalius v0.685 — сканер переделан: «сканер вообще не то делает: просто от середины бита, на который навёл, — линию через центр (ось, солнце) и наружу, и у всех битов и даже частей вырезов покажи, на сколько частей он делит; синими линиями — сам бит, то есть дострой разбивку этого бита на части» и «когда навожу на бит — затемни остальные, которые не участвуют в показе». Теперь одна золотая ось — через середину бита под мышью и центр, в обе стороны до крайнего кольца (строка за чертой). Каждая ячейка, которую она режет, — бит или часть выреза T−1, на любом кольце, и сам бит под мышью, — делится на q равных частей (место оси f = p / q, q до 64): синие черты на 1/q, 2/q…, подпись «÷q»; не сводится к дроби — проценты; ось по границе — точка. Всё, что ось не режет, — под вуалью цветом фона (ось по границе — обе соседние ячейки открыты). Прежние три луча и «p:q» сняты.

Zazerkalius v0.684 — «в режиме T−1, если включено «до 256», — сразу все кольца отобразить с вырезами и местами для битов, симметрично также». Пустые кольца за строкой для заполнения (каждое на ячейку длиннее) в вырезах — как кольца строк: 2n − 1 частей, n мест для бит, вырез n − 1, сдвиг по чётности (чётные — места по центру сверху, нечётные — вырез). На рисунке дуги — только над местами (вырез пустой), черты мест, края выреза золотом; луч в место — ловится, в вырез — идёт к следующему; солнце видит их так же; метки попаданий — по тем же местам (coneVoidCut).

Zazerkalius v0.683 — по снимку солнца в вырезах T−1 — «пусть показывает расходящиеся лучи от солнца, границы, до строки за чертой». Края каждого освещённого сектора — золотые линии: сплошные — от места, где свет вышел (вырез кольца), через кольцо, куда он упал; дальше — бледный пунктир, продолжение той же границы до внешнего края строки за чертой. Сектор во весь круг краёв не имеет, стык сектора через 0° — не край.

Zazerkalius v0.682 — две правки. (1) По снимку ромбового пульта — «сделай подсказки при наведении этим»: у всех кнопок пульта подсказки были, но шли в уведомление внизу по центру страницы (так с v0.294) — от пульта в углу далеко, не видно. Теперь у самой кнопки — плашка с коротким названием (до « — », «: », « (») слева от пульта; полный текст — по-прежнему внизу (#c3tip). (2) Сканер симметрии — «так и не показывает части разделённые; пусть ещё и следующую строку, крайнюю, — в общем все биты делит, которые проходит линия от бита»: лучи идут не на одно кольцо наружу, а через все кольца до крайнего (строка за чертой, если есть), и доли подписаны у каждого задетого бита. Строки 1, 11, 101, 1001, бит 1 кольца 2: кольцо 3 — «1:2», кольцо 4 — «5:1», остальное — в вырезах или по границам (точки).

Zazerkalius v0.681 — по снимку солнца с одной строкой «1» в вырезах T−1 — «в какой момент он будет красить?». Солнце красит сразу, без кручения (при каждой отрисовке), но попадания в кольцо за чертой шли только в счёт Z.voidHits и нигде не были видны: кольцо и строка за чертой показывают Z.fillCells, а туда пишет только лазер (coneClockMark). Теперь и солнце: освещённая ячейка строки за чертой — «1», пустые — «0» (coneSunPaint). Строка «1»: обе ячейки за чертой — «11», протяжка черты вниз в режиме «⌖ лазер» берёт их.

Zazerkalius v0.680 — по снимку сканера («2:1» на кольце за чертой) — «тут надо все части разрезать показать, вот тут на 3 части поделен будет». Лучи сканера, попавшие в один бит, теперь считаются вместе: подпись одна на бит, посередине него, со всеми частями по порядку по часовой — два разреза внутри дают «1:1:1», «1:2:3»… (общий знаменатель до 96, сокращено; иначе проценты). Луч по границе бит — по-прежнему точка (coneScanParts).

Zazerkalius v0.679 — по снимку полосы под чертой — «тут надо возможность отключать Серп 90, и чтобы когда вниз тянуть — заполнялось то, что подсвечено лазером, те биты». Новый способ достройки «⌖ лазер» (Z.cutGen = "las"): кнопка после «маски», и повторный щелчок по горящей «Серп 90» / «30» / «маске» выключает её и включает лазер. Черта вниз — новая строка из строки за чертой: ячейка, где лазер поставил «1» или куда попал луч / свет солнца (счёт попаданий кольца за чертой), — 1, остальные — 0; одна строка за протяжку, сколько бы ни тянул (для следующей лазер ещё не прошёл). Строки из-под черты при «⤒» по-прежнему возвращаются первыми (cutLaserRow в cutAt).

Zazerkalius v0.678 — по снимку края левого меню у вкладки «Лазер» — «так и осталась вертикальная полоса из-за фона». v0.675 брала цвет у края верно по месту, но у холста конуса — его CSS-фон (синий, 23 28 40), а холст сам заливается цветом темы --bg (чёрный, 11 13 18): выемки снова выходили синими. Теперь у холста берётся --bg — выемки того же чёрного, что рядом (paneZig).

Zazerkalius v0.677 — «режим солнца должен работать и на T−1: светит из первой (там 1), через вторую на 3, по расходящемуся». Прежде вырезы при ☀ выключались (coneCutOn требовал «не солнце»). Теперь при вырезах T−1 солнце видит кольца, как луч: кольцо строки — 2n − 1 частей, проход — только его дыра (n − 1 частей), биты — стена и ловят краску; свет из строки 1 идёт расходящимися секторами (угол сохраняется): через дыру кольца 2 на биты кольца 3, через его дыру дальше. Кольцо для заполнения — с вырезом, пустые за ним — сплошные (coneSunCutR в coneSunTrace). На строках 1, 11, 101, 1001: свет 120°–240° сквозь дыру кольца 2 ложится на все три бита кольца 3, его дыра сверху — дальше темно.

Zazerkalius v0.676 — «сделай кнопку — сканер симметрии: навожу на бит в кольце — из него в центр линии от его границ и наружу на 1 уровень, и от его середины также; когда эта линия проходит через другой бит — показать, на сколько частей он его делит». Кнопка «⌖ сканер» — последней в группе «Кольца» (в конце, чтобы номера мест в рисунках групп не сдвинулись; Z.coneScan). При наведении на бит — три луча из центра до внешнего края следующего кольца: границы бита золотом, середина — бирюзой пунктиром. На каждом другом кольце (строки и кольцо для заполнения, с учётом накрутки и вырезов T−1) луч попадает в бит на месте x; доля f = x − ⌊x⌋ подписана рамкой «p:q» — части бита по обе стороны (f = p / (p + q), знаменатель до 48; иначе проценты), луч по границе бит — точка. Кольцо из одного бита (строка 1) не подписывается — круг луч не делит, в дыре выреза бита нет (coneScanDraw / coneScanFrac).

Zazerkalius v0.675 — три правки по снимкам. (1) Край левого меню — «убери лишний фон у всех окон, когда раскрыты, сейчас это Конус, чтобы не было прямой вертикальной линии» (уточнение: «это зубцы левого меню»): выемки зубцов заливались цветом, взятым в 12 px от края и вверх по родителям, — попадал холст или группа внутри окна (синие выемки, а у самого края чёрный фон — прямая черта). Теперь цвет — вплотную к краю, по стопке слоёв (что видно глазом), в девяти точках по высоте, и пересчёт ещё раз после разворота или сворачивания окна (paneZig). (2) Группа «Вид» — «не должно быть такого пустого пространства»: рисунок конструктора помнит кнопки без id по номеру места, а порядок кнопок с тех пор сдвинулся — часть мест рисунка легла на спрятанные элементы (пустой ряд), «👁 выдел.» и «✨ свет» в рисунок не попали и стояли строкой под ним. Теперь спрятанное места не держит, а кнопки вне рисунка идут в поток после него стандартной ширины (tzcApply); рисунок не менялся — по экспорту «💾 Всё» вышло 5 плотных рядов. (3) «В режиме T−1 рисуй кольцо за чертой также с вырезом, и для битов части покажи их все»: кольцо для заполнения в вырезах — 2n − 1 частей, n ячеек своими контурами и вырез n − 1 (золотые края, части пунктиром), сдвиг по чётности, как у колец строк; луч в ячейку ловится, в вырез — идёт к пустым кольцам; щелчок в вырезе ячейки не трогает (coneFillCut / coneFillPart).

Zazerkalius v0.674 — «в конусе, когда лазер T−1, нужно расставить симметрично вертикали: кольца чётные — между центральными битами, нечётные — по средней границе-части выреза». Сама расстановка v0.673 верна (проверено по пикселям: у строк 2, 4, 6 у вертикали середина бит, у 3, 5 — середина дыры), но держалась только без своей накрутки: вход в режим оставлял прежнюю накрутку колец, а ⟲ и ⌖✕ сброс при умолчании ⭐ возвращали накрутку из ⭐. Теперь кольца с вырезом (строки 2, 3, …) встают на 0, общий поворот конуса и фаза кручения — тоже на 0, остановленные кольца отпускаются — при входе в «вырезы T−1» и при каждом сбросе в этом режиме (coneCutHome).

Zazerkalius v0.673 — по снимку колец 1–3 в вырезах — «не располагает: луч лазера — вертикаль вверх, по нему 1; 2 строка — так, чтобы между битами вертикаль; у 3 строки — вертикаль между 2 частями пустоты, и так далее». Начальная расстановка вырезов T−1 (накрутка 0) теперь чередуется по вертикали: у строк 2, 4, … по центру сверху биты (вертикаль между средними битами), у строк 3, 5, … — дыра (вертикаль между средними частями пустоты). Сдвиг в coneCutGeo по чётности строки; луч, мышь, рамки и сообщение о симметрии считают по нему. Сброс ⟲ возвращает к этой расстановке.

Zazerkalius v0.672 — по снимку колец 2 и 3 в вырезах T−1 — «не могу выстроить симметрично, кольцо само докручивается; его бы привязывать к осям симметрии и расположить относительно вертикали симметрично». У такого кольца одна ось симметрии — через середину бит и середину дыры; вертикальна она при накрутке 0 (биты по центру сверху) и n − ½ (дыра по центру сверху), а второе целыми частями не достать — кольцо докручивалось мимо. Теперь кольцо в вырезах встаёт на половины частей, полчасти запоминается (coneRotKeep вместо округления до целого), и сообщение говорит, когда положение симметрично. Остальные кольца — целыми битами, как было.

Zazerkalius v0.671 — «как войти в режим кручения по одному кольцу, для выставления начального уровня?» → «не крутит». Кольцо мышью крутится только с Ctrl (так с v0.248, по слову пользователя), без Ctrl протяжка двигает вид — подсказал. Заодно протяжка в режиме вырезов T−1: шаг был битом, а кольцо там из 2E − 1 частей — теперь поворот целыми частями, по кругу из 2E − 1, и только на вид (строку частью не сдвинуть).

Zazerkalius v0.670 — по снимку поля строк — «дай возможность менять строки прямо там по правому клику на строке». Правый щелчок по строке (биты или номер) — правка на месте, как F2 / Enter (editRowInPlace). Свои правые щелчки у замка, ↻, строки для заполнения и строк под чертой остались как были.

Zazerkalius v0.669 — «вырез тоже покажи разделённым на части»: в режиме вырезов T−1 внутри дыры кольца — границы её E − 1 частей, золотым пунктиром (края дыры — сплошные, как были). Видно, что дыра — те же части, что и биты.

Zazerkalius v0.668 — «почему-то кнопки сброса кручения и лазера делают потом 3D-вид». Причина — своё умолчание ⭐: «⟲ всё на места» (и «⌖✕ сброс», который его зовёт) брал из ⭐ не только положения колец, но и настройки конуса (v0.125) — 3D, октаэдр, свечение, лучи, зеркало, переключатели лазера; ⭐ было запомнено в 3D. Теперь сброс возвращает только положения и кручение (кольца, режим и скорость кручения, замки, оси, Аниматрица); вид конуса и лазер не трогает.

Zazerkalius v0.667 — по снимку вырезов T−1 — «не вижу у 2 кольца выреза в 1 бит; получается, всё кольцо разделить надо на E + E − 1 частей, где E − 1 — это вырез». Вырез v0.665 был только золотой полосой по краю, биты занимали весь круг. Теперь в режиме вырезов кольцо строки из E бит — 2E − 1 равных частей (coneCutGeo): E бит подряд и дыра выреза из E − 1 частей, на рисунке пустая, края золотые. Изначально биты по центру сверху, вырез снизу; накрутка «на бит» — на одну часть. По той же раскладке — расчёт луча, рамки попаданий, бит под мышью (в дыре бита нет), рамка бита под мышью, головки «Звука» и красная стена.

Zazerkalius v0.666 — по снимку конуса с лазером (вырезы T−1, всё в золотых полосах и чёрных ячейках) — «так ничего непонятно, надо биты показать, не надо затемнять, когда включён лазер, где 1, где 0 у строк». С v0.131 при луч-часах ячейки колец гасли в чёрные, а попадания заливались золотом с «1», «11»… — битов строк было не видно. Теперь кольца показывают биты как без лазера, а попадание — золотая рамка ячейки, повторные — «×2», «×3» мелко у внешнего края.

Zazerkalius v0.665 — «ещё режим: изначально расположить вырезы в порядке, как у строк» с уточнением «центры падают между 1–2 и 3–4 четвёртой строки, там 2 бита вырез; у каждой строки вырез = T − 1; у 1 строки выреза нет — пусть мимо идёт; изначально вырезы под битами следующей строки в своих местах». Кнопка «1 щель» стала трёхпозиционной: 1 щель → вырезы T−1 → все щели. Вырезы T−1: строки — треугольник по центру, центры бит строки k на строке k + 1 ложатся на её границы, между крайними k − 1 бит — это вырез кольца k (coneCutWin), дуга в бит следующей строки, изначально под её битами 2…k (стена — у верха, её первый и последний бит), крутится со своим кольцом. Строка 1 прозрачна, затвора и ⌖◁ ⌖▷ не нужно. На рисунке вырез — золотая полоса по внешнему краю кольца и золотые края; прорезей между битами нет.

Zazerkalius v0.664 — после разбора режимов лазера: «понял, в чём ошибка: выход из кольца — одна щель, только на границе между первым и последним битом строки-кольца, а не через каждый бит; нужен такой режим по умолчанию». Новая кнопка «1 щель / все щели» в «Лазере» (Z.coneSlits, по умолчанию — одна): у кольца строки один выход — граница «последний | первый бит», остальные границы — стена; на рисунке прорезь только там. Расчёт луча (coneClockTrace) — для луч-часов, ✺, 🎯 и 🔮 разом; золото и подсветка ближней щели у стены — тоже по одной щели. Не тронуто: вырез-затвор строки 1, кольцо для заполнения и пустые «до 256» (ловят как прежде), ☀ солнце со своим пропуском, 🎵 музыка. Прежнее поведение — «все щели».

Zazerkalius v0.663 — по снимку конуса, весь в золоте от лазера, — «как сбрасывается всё накрученное лазером?». Сброс был в два шага: ✕ у строки для заполнения стирает золото, её единицы, метки пустых колец и отпускает кольца, но кольца остаются где стоят; ⟲ всё на места возвращает кольца, но золото не трогает. «Да» на одну кнопку: «⌖✕ сброс» в группе «Лазер» делает оба шага. Строки поля и лог не трогает.

Zazerkalius v0.662 — по снимку «⌖◁ ⌖▷ ⏸ на проходе» — «тут непонятно, что это, обнови все подсказки». Подсказки всей группы «Лазер» переписаны: значок и имя в начале, «вкл / выкл» у переключателей, что значит «горит» и «не горит», дальше — что делает, по строкам. ⌖◁ ⌖▷ — «довод строки 1»: крутит только кольцо строки 1, пока вырез не встанет под лазер. У «щели» — что от неё зависит (золотые биты, кривизна остановленных колец, предел 0,9 бита). Только текст, поведение не менялось.

Zazerkalius v0.661 — по снимку шапки («🧪 Структура») и окна «🧊 Вид» — «здесь надо не Структура, а это окно, и его надо переименовать как-то». В ряду окон шапки (PIN_WINS) шестым теперь окно строк-лесенок, а «🧪 Структура» вернулась в список «Другое» слева. Окно «🧊 Вид» переименовано в «🧊 Лесенка»: оно рисует каждую строку лесенкой в объёме (1 — вправо, 0 — к себе), а «Вид» путался с одноимённой группой конуса.

Zazerkalius v0.660 — по снимку лазера с кольцом строки 1 из одного бита — «почему у 1 бита 2 щели?», выбран вариант «1»: убрать собственную. У кольца строки 1 при луч-часах были два прохода на рисунке: вырез-затвор (золотые края, v0.139) и напротив него щель бита с самим собой (v0.573). Луч из центра идёт только через вырез (coneClockTrace проверяет лишь его), так что вторая щель ничего не делала и путала. Теперь у затвора строки 1 нет ни щелей между битами, ни черт границ — один вырез. При ☀ солнце выреза нет, там всё как было.

Zazerkalius v0.659 — по снимку «△ Сетки» со сценами 1, 2 — «не вижу»: колец v0.658 не было. triState() зовётся ещё до load(): флаг Z.triRingsV вставал на умолчании вместе с кольцами, потом load() клал сохранённые сцены поверх (Object.assign), а флаг оставался и записывался — кольца больше не добавлялись. Теперь дописываются только после load() (zzLoaded), флаг новый (2), у каждого кольца метка ring — дважды не встанет.

Zazerkalius v0.658 — вопрос «какая минимальная фигура с внутренними зубцами кольцевая?» и «да» на «положить их сценами в △ Сетку». Посчитано перебором: самое малое кольцо — 12 треугольников вокруг одного (зубцы только снаружи, дыра — гладкий треугольник); вокруг шестиугольника — 18 (внутри тоже гладко); зубцы ВНУТРИ даёт только зубчатая дыра, и самая малая — шестиконечная звезда из 12, цельное кольцо вокруг неё — 30 (одни соседи по стороне, 12 штук, рвутся на куски, касающиеся вершинами). Три кольца золотом дописаны в конец сцен один раз (флаг Z.triRingsV) — свои сцены пользователя не тронуты, лишнюю убирает правый щелчок по номеру.

Zazerkalius v0.657 — по снимку ромбового пульта 3D — «эти все стандартного размера, как Дзен», «подсказки там сделай». Ромбы пульта — 40 × 40, как ◎ дзена и кнопки записи (были 34). Подсказки всех ромбов переписаны: значок в начале, что делает, «держи — дальше» у повторяющихся и «только в 3D» у тех, что в плоском виде тусклые; ⠿ — ручка пульта (тянуть, двойной щелчок — в угол).

Zazerkalius v0.656 — по снимку «Лазер» над прижатым «Звуком»: «убери отступ, который мешает зубцами синхронизироваться группе кнопок, когда прижата к верхнему меню, и фон у всех окон убери, чтобы не было вертикали, также и у поля строк». Полоса вкладок групп: снизу было 4 px поля и 4 px между рядами вкладок — теперь ряды шагом 24 px (25 с заходом −1, как кнопки), снизу поля нет. Полоса групп конуса под вкладками стояла с отступом 34 px (остался с v0.154, когда вкладок ещё не было) и 4 px между группами — теперь вплотную: группы идут прямо под вкладками и друг под другом, их высоты — по 24 px, поэтому каждая встаёт на ряд сетки зубцов левой панели (проверено: все шесть — на сетке, расхождение полпикселя). Плавающая группа, которую тянут, по вертикали тоже встаёт на ряды сетки — шагом 24 px от низа полосы вкладок. Окна и поле строк — фоном страницы (прежде свой, светлее: --panel у окон, --fieldBg у поля), граница между ними и зубцами больше не читается вертикалью.

Zazerkalius v0.655 — по снимку пульта 3D у холста конуса и образцу ромбового пульта — «пересобери в ромбовид». Пульт теперь из ромбов 34 × 34, касающихся сторонами (решётка, повёрнутая на 45°), своей подложки и рамки у него нет. ⌂ вид по умолчанию — в середине; ▲ ▼ (наклон) и ⟲ ⟳ (поворот) — по сторонам света, через клетку; вплотную к ⌂ — зелёная ↺ «всё на места», + и − (масштаб) и ⠿ ручка (тянуть пульт, двойной щелчок — на место); сверху 🧊 3D и ⧗ зеркало, снизу ▶ крутить (⏸ — пока крутит) и направление ↻ / ↺. Ромбы — как у дзена и записи: рамка цветом акцента, тёмная середина; включённое (🧊, ⧗, ▶) — золотом. В плоском виде кнопки 3D, как прежде, тусклые. Место каждого ромба задано в разметке (--x, --y).

Хаб v0.076 — по снимку «Сцены 1» из «△ Сетки» Zazerkalius (надпись из треугольников) — «в хаб надо как-то закинуть». Надпись встала на прежнее место заголовка хаба — сверху, над нотами (ряд под неё был оставлен ещё с v0.038, сама надпись снята в v0.039). Те же 126 треугольников из сцены 1 — маской (SVG; каждый треугольник чуть сжат к своему центру — между ними швы), заливка — та же переливающаяся радуга, что была у прежней надписи, с тенью. Не нажимается и кнопкам не мешает.

Zazerkalius v0.654 — по снимку ромба 🔗 — «правой кнопкой сохраняет текстовый файл со ссылкой». Правый щелчок по 🔗 — та же ссылка на всё состояние страницы, но не в буфер, а файлом zazerkalius-ssylka-ГГГГММДД-ЧЧММ.txt в «Загрузки»: одна строка. Открыть — скопировать её в адрес браузера.

Zazerkalius v0.653 — два вопроса. «Почему при F5 сначала показывает старый дизайн?» — ромбы, цепочки, зубцы границы и раскладку групп ставит zz-ui.js, а он большой (11 тысяч строк) и начинает работать, когда браузер уже нарисовал обычные прямоугольные кнопки из HTML: секунду-другую виден «старый» вид. Теперь шапка страницы сразу делает её прозрачной (html.zzload, opacity 0 — раскладка при этом считается как обычно), а скрипт снимает прозрачность, когда закончил: шрифты загружены и прошло три кадра на пересчёт. Если скрипт упал — прозрачность снимается сама через 8 с. «Пусть Гамма меняет цвет заголовка Zazerkalius» — надпись из треугольников теперь цветом единиц выбранной гаммы (--b1): Янтарь — золотой, Океан — голубой, Роза — розовый…, «Своя» — свой цвет единиц.

Zazerkalius v0.652 — по снимку окна «▲ Пирамида Паскаля» у левой панели: «тут дополнительный фон у Паскаля убери, и возможность без 0 биты показать». У холста пирамиды был свой фон (--panel2) со скруглёнными углами — темнее окна, отдельным прямоугольником; теперь холст прозрачный, под ним фон окна. Запись видео берёт фон окна сама (recBg). Новая форма точек 1 — биты без нулей: только единицы цифрами (рядом с «1 0», где нули бледнее).

Zazerkalius v0.651 — «Паскаль должен строить из строк, а не по-своему». Пирамида Паскаля по умолчанию берёт строки поля верхним этажом (выделенные, если их ≥ 2), а не свою «1»: строки поменялись — пирамида перестроилась. У всех, у кого был выбран «от 1», один раз переключено на строки (по прямому слову); дальше — как выберут. В списке первым — «из строк поля», затем «от текущей строки», последним — «от «1» — Серпинский».

Zazerkalius v0.650 — по снимку цепочки ◎ ● mp4 ↻1 ▣ внизу левой панели — «надо сохранять ссылкой, кнопку сюда». В цепочке новый ромб 🔗: всё состояние страницы (строки всех полей, окна, конус, лазер, сетка, настройки — Z целиком, кроме ⭐ умолчания, оно копия) — одной ссылкой в буфер обмена. Внутри: JSON → сжатие deflate (CompressionStream браузера) → base64url после #z= в адресе. С localhost и с диска ссылка всё равно ведёт на 1001100.online. Открыли ссылку: шапка видит #z=, страница раскрывает её (это не мгновенно), кладёт в sessionStorage и перезагружается — второй раз состояние берётся как пресет (?preset=…): память гостя не читается и не пишется (на первом, раскрывающем, открытии — тоже), в заголовке вкладки — «по ссылке от …». Вставили ссылку в адрес той же вкладки (браузер такую не грузит) — страница перезагружается сама. Проверено в чистом браузере: строки, сетка и прочее — как у отправителя, его память не тронута. Длиннее 60 000 знаков — сказано, что мессенджер может обрезать, надёжнее «💾 В файл».

Zazerkalius v0.649 (вместе с v0.648, одним заходом) — два снимка. «▲ Пирамида Паскаля»: «надо кнопку — зеркало вниз всей фигуры, и кнопки все покажи эти, и добавь точки — мелкие шарики, и чтоб чисто грани, если кубы или треугольники, — вид такой». Формы точек — теперь каждая своей кнопкой (● · ▲ ■ ◆ 1 0, горит выбранная) вместо одной по кругу; новая — · мелкие точки (видно насквозь всю структуру). ▱ грани — шарики, треугольники, кубы и ромбы одной обводкой, без заливки (каркас). ⇣ зеркало — под основанием та же пирамида, отражённая остриём вниз, вместе — бипирамида (и каркас штрихом тоже); середина вида — плоскость основания. Свёрнутая левая панель (столбик значков): «поправь синхрон с зубцами границы» — кнопки шли через 27 px (промежутки 3 px, поля и черта-разделитель блоков); теперь ровно по 24 px вплотную от сдвига зубцов — каждая кнопка на свой зубец, проверено по всем; между кнопками шов в 1 px. Колесо и в столбике листает по одной кнопке.

Zazerkalius v0.647 — по снимку выделенной «Z» в «△ Сетке» — «так, когда выделить надо — Ctrl, несколько, и цвет менять у выделенных». Ctrl + щелчок инструментом ☝ добавляет группу к выбранным или снимает её (Shift — как прежде, тоже). Пока ☝ горит и есть выбранные группы, щелчок по цвету палитры перекрашивает их все этим цветом — одним шагом ↩; инструмент остаётся ☝, выбор — тот же. Без выбранных групп палитра, как прежде, выбирает кисть.

Zazerkalius v0.646 — по снимку «▲ Пирамиды Паскаля»: «всё в ромбовидные кнопки, и менять шарики на треугольники, кубы, ромбы в построении и на биты 1, 0». Полоса инструментов окна — цепочкой из треугольников (lpTools, класс .tools.lpw — любое окно можно перевести так же): список, ползунки с подписью, галки (включённая — заливкой, без квадратика), кнопки; первая в ряду — остриём, следующие — выемкой на остриё соседки, ряды вплотную; перенос на новый ряд начинает его остриём. Новая кнопка ● шарики — форма точек по кругу (правый щелчок — назад): ● шарики → ▲ треугольники (остриём вверх, лицом к зрителю: в плоскости этажа при малом наклоне выходили щепки) → ■ кубы (видимые три грани, тремя оттенками, крутятся с пирамидой) → ◆ ромбы → 1 0 биты (единицы цифрами, нули тоже — бледнее, на своих местах). Совсем мелкие точки — квадратиками, как прежде. Форма запоминается.

Zazerkalius v0.645 — по снимку «▲ Пирамиды Паскаля», развёрнутой у левой панели: «у окон левую границу надо как-то убрать и продолжить фон под меню, чтобы не было вертикали». Своей левой рамки у развёрнутого окна нет — вертикалью была полоса прокрутки стола: она стояла у его левого края, вплотную к зубцам панели, и читалась границей окна. Теперь полоса — у правого края стола (у поля строк). Выемки между зубцами границы заливались фоном страницы, темнее окна, — теперь цветом того, что справа от панели (окно на столе — его фон; берётся тот цвет, что чаще на трёх высотах), и фон окна продолжается под зубцы.

Zazerkalius v0.644 — по снимку узкой левой панели с обводкой: «надо сузить название, чтобы в минимальную ширину левого меню влезло, или уменьшить масштаб», «у меню посмотри границы кнопок — где-то не видно», «стрелка сворачивания криво встала». Надпись в шапке — не шире левой панели (за вычетом значка Хаба): при узкой панели она мельче, при широкой — 222 px, как была. Нижняя черта последнего ряда кнопок раздела (ряд 25 px с заходом −1) после v0.638 ложилась под заголовок следующего раздела и пропадала — кнопки теперь рисуются поверх заголовков. ‹‹ (сворачивание панели в столбик) стояла на 4 px от верха, а ряды с v0.638 сдвинуты на сдвиг зубцов — теперь она на высоте первого ряда.

Zazerkalius v0.643 — по снимку «△ Сетки» — «тут надо, чтоб отмена, повтор работали». Правки сетки — шаги в общих ↩ / ↪ (и Ctrl+Z / Ctrl+Y), вперемешку с правками строк, по порядку: закраска и ластик (протяжка — один шаг), ✦ точка, ╱ линия, перенос групп ☝ (шаг — как только группа сдвинулась, простой выбор шагом не считается), обводка / сетка внутри / символ выбранной группы (правки одним движением — поле цвета, набор символа — в пределах 1,5 с один шаг), «как было» у группы, «✕ очистить» и открытая сцена (↩ вернёт то, что было в сетке). Шаг хранит снимок сетки целиком: закраска, настройки групп, точки, линии, выбор. Замок строк 🔒 шаги сетки не держит. Подсказка ↩ теперь говорит про сетку тоже.

Zazerkalius v0.642 — по снимку надписи «ZAZERKALIUS», выложенной треугольниками в «△ Сетке» (сцена 1, текст из «⧉ в буфер»), — «примерно так можно заголовок HTML?». Название в шапке теперь эта надпись: те же 126 треугольников в 4 ряда, вектором (SVG), залиты золотом, швы между треугольниками — цветом фона, как в сетке; высота 20 px. Номера из текста сцены переведены в места сетки (ряд, место) по правилу «номер = ряд · 216 + место + 1». Для чтения экраном у надписи остаётся текст «Zazerkalius». Щелчок по ней, как прежде, перезагружает страницу, а в «◯ Конусе» отдельно (?solo=cone) надпись — ссылка на всю страницу.

Zazerkalius v0.641 — по снимку надписи «ZERKALIUS», выложенной треугольниками в «△ Сетке», — «сделай, чтобы можно было перемещать выделенные группы цветов». Инструментом ☝ (или Alt + щелчок любым) группу теперь можно не только выбрать, но и сразу потянуть: выбранные группы едут по сетке целиком. Shift + щелчок добавляет группу к выбранным или снимает её — так двигается несколько букв разом. Сдвиг всегда такой, что треугольник остаётся той же ориентации (ряд + место — чётное число): иначе вверх смотрящие стали бы вниз смотрящими и буква развалилась бы. Нечётный сдвиг под мышью поправляется на соседнее место, ближнее к мыши. За край сетки группы не уводятся. Пока тянешь, всё, что лежало под ними, на месте; где отпустил — там группы встают поверх. С группой едут её обводка, «сетка внутри» и символ. Точки ✦ и линии ╱ стоят в узлах и рёбрах и не двигаются. Попутно: место, откуда тянут, берётся уже после выбора — строка «группа», появляясь над сеткой, сдвигает холст на ряд, и без этого группа прыгала.

Zazerkalius v0.640 — по снимку свёрнутой левой панели (столбик значков) — «поправь ромбоид для числа». Поле «16» (высота ▲ нарезки) в столбике оставалось прямоугольником со скруглёнными углами: ромбоид из v0.633 строится только в развёрнутой панели. Теперь и в столбике это такой же шестигранник, как кнопки рядом, — 24 px, острия по бокам, заливка акцентом; само поле прозрачное, цифры посередине, без стрелок-счётчиков (число — набором с клавиатуры или стрелками ↑ ↓ в поле).

Zazerkalius v0.639 — по снимку заголовка «Другое» — «сделай скрываемой группой, как все». Список окон «Другое» теперь сворачивается щелчком по заголовку, как остальные разделы левой панели, и свёрнутость помнится. Раньше его заголовок не трогался: его показывает и прячет код — смотря, есть ли в списке окна. Теперь показ остаётся за кодом, а свёрнутость — за щелчком. Скрытые кнопки шести окон шапки работают и при свёрнутом списке.

Zazerkalius v0.638 — по снимку «Построений»: «подгони стандартные высоту кнопок и отступы, чтобы все вписались изначально в зубцы границы, а потом сделай скролл ступенчатым по зубцам — одна кнопка скролл». Ряды левой панели теперь идут вплотную по 24 px: у заголовков разделов снят отступ 4 px сверху, у блоков кнопок — 4 + 1 px. Весь столбец сдвинут сверху на тот же сдвиг, что и зубцы границы (по вкладкам конуса, v0.636), и остриё каждого ряда приходится на остриё границы; проверено по всем 45 рядам. Колесо над панелью листает ровно на один ряд за щелчок, и место всегда кратно ряду. Листнули иначе (пальцем, клавишами) — по остановке панель встаёт на ближайший ряд. Светящиеся ▲ ▼ листают тоже целыми рядами. Список окон «Другое», если он длинный и листается сам, колесо листает как прежде.

Zazerkalius v0.637 — по снимкам кнопок записи (● mp4 🎞 ↻1 ▣) и шапки окон: «поставь под меню, где стоит Дзен, и пусть они работают на любое открытое окно», «и подсказки обнови». Кнопки записи ушли с холста конуса вниз левой панели: вместе с ◎ дзена это одна цепочка ромбов — ромбы касаются сторонами, каждый следующий на полромба правее и попеременно на полромба выше. Низ панели под неё — 72 px вместо 48. В дзене панели нет — цепочка записи стоит в левом нижнем углу экрана. ⏺, mp4 и ▣ теперь берут верхнее из открытых окон с холстом (поднятое последним; из шапки — нажатое): ◯ Конус, ◆ Гранидус (холст из его рамки), ✦ Развёртку, △ Сетку, ▲ Паскаля, 🧊 Вид. Окно берётся в миг старта и пишется до стопа, имя файла — по окну (Zerkalius-piramida-…, -setka-…, -granidus-…). Рамка ▣ встаёт у этого окна, вверху рамки — его имя и размер кадра. 🎞 и ↻1 крутят сам конус, поэтому они, как прежде, только для конуса — это сказано в их подсказках. Подсказки и сообщения переписаны под любое окно.

Zazerkalius v0.636 — два снимка. Про границу левого меню: «нет, граница пусть стоит, просто подвинь её так, чтобы кнопки эти (вкладки групп конуса) в неё вписались, а кнопки левого меню — пускай не всегда». Зубцы по рядам панели из v0.635 сняты: граница снова ровная сетка по 24 px и стоит на месте. Сетка сдвинута по высоте так, что остриё приходится на середину полосы вкладок «Лазер · Кручение · …» — оно входит в выемку «Лазера», а при переносе вкладок на второй ряд — и в выемку второго ряда. Сдвиг пересчитывается, когда вкладки могут уехать: листание стола, смена размера окна, отпущенная мышь. Про «Кручение — границы обводки»: у группы, растянутой ручкой, короткие ряды не доходили до рамки на 5–13 px, и справа шли две ломаные — острия кнопок и рамка. Ряд добирался только целыми сторонами треугольника; теперь остаток отдаётся долей крайней кнопке, как в левой панели, и острия всех рядов стоят у рамки. Ромб-ручка встаёт по остриям рядов, а не по краю коробки группы, и за рамку не торчит.

Zazerkalius v0.635 — по снимку «Оформления» у края левой панели: «отступ сверху для меню, чтобы вклинились зубцы». В v0.634 зубцы шли ровной сеткой по 24 px от верха панели, а ряды — со своими отступами: заголовок раздела начинается на 4 px ниже, между разделами ещё 4 + 1 + 4 px. Поэтому острия рядов попадали мимо выемок. Теперь зубец рисуется у каждого ряда панели (кнопки и заголовки разделов): остриё — на середине ряда, между разделами — прямая черта. Рисунок строится во всю высоту листаемого содержимого и листается вместе с рядами; пересобирается вместе с раскладкой панели (свернул раздел, сменил тему, поменялись ряды).

Zazerkalius v0.634 — два снимка. «Кручение — поправь границы»: под кнопками этой группы есть ещё строка «вариантов цикла» (не из треугольников), а ромб-ручка размера искал нижний ряд только среди кнопок и вставал на третий ряд, поверх зубца рамки. Теперь нижним рядом считается и эта строка, и ромб стоит в правом нижнем углу группы. «Сделай ромбовидной вертикальную границу левого меню»: прямая черта справа от левой панели заменена зубцами из тех же треугольников — ряд 24 px, остриё вправо посередине ряда, выемка на стыке, глубина t, как правый край групп. Зубцы нарисованы фоном панели у её правого края, поэтому стоят на месте, пока панель листается; за линией — фон страницы. Цвета берутся из темы и пересобираются при её смене. На телефоне панель стоит сверху — там граница прежняя.

Zazerkalius v0.633 — по снимку «Нарезать треугольник» (✂ ▲ 16) — «для выбора числа также ромбовидный». Поле высоты «16» стояло в ряду прямоугольником, своей шириной. Теперь оно — в ромбовидной подписи, как кнопки ряда: остриё на краю ряда, цифры посередине, само поле прозрачное и без рамки. Ширина у него постоянная: поле тянется по подписи, и мерить его, как надпись кнопки, нельзя — при каждом пересчёте оно росло бы.

Zazerkalius v0.632 — по снимку инструментов «△ Сетки» (☝ ✦ ╱ ⌫): «сделай настройку обводки — жирн и нет»; на вопрос выбрано — линии ╱ в сетке. В верхней строке окна, рядом с «═», — ▬ жирн: горит — все линии ╱ рисуются вдвое толще своей «═» (в сетке, в живом виде кнопок и в группах конуса, где линии — обводка группы); ещё щелчок — обычные. Толщина, записанная у каждой линии, не меняется: это только вид, поэтому переключать можно сколько угодно без потерь.

Гранидус v0.070 — по снимку окна «◆ Гранидус» в Zazerkalius, где раздел «⟳ Вращение» лёг поверх «🎲 Картины»: «окна друг на друга не ставим». Плавающий раздел больше не ложится на другой. Отпустил его на чужом месте или показал вкладкой, а место занято — он сам уходит на ближайшее свободное: вплотную к соседу (справа, слева, снизу, сверху) или по сетке через 12 px, в пределах окна. Прилипшие снизу едут вместе с ним. При открытии и при смене размера окна разделы, лёгшие друг на друга, разводятся на экране, но сохранённая раскладка переписывается, только когда раздел тронут руками.

Zazerkalius v0.631 — по снимку списка «Окна» слева: «переименуй — Другое, и убери из них дубликаты, что в верхнем меню теперь всегда». Список назван «Другое», и шести окон шапки (◯ Конус, ◆ Бирамида, ✦ Развёртка, △ Сетка, ▲ Паскаль, 🧪 Структура) в нём больше не видно. Их кнопки в списке не удалены, а скрыты: через них шапка сворачивает окна и показывает нажатое, и эту механику ломать незачем.

Zazerkalius v0.630 — по снимку: «✦ Развёртка» открылась из шапки, но в своём прежнем размере — «разворачивать сразу на все поле». Кнопка окна в шапке теперь, кроме того что сворачивает остальные пять, ставит нажатое окно на весь стол — тем же ⛶ из шапки окна (соседи уходят ниже, ⛶ горит, повторный ⛶ возвращает прежнее место). Если окно уже развёрнуто во всю ширину, его не трогаем: иначе ⛶ сработал бы наоборот и вернул его назад.

Zazerkalius v0.629 — по снимку шапки (◯ Конус · ◆ Бирамида · ✦ Развёртка · △ Сетка · ▲ Паскаль · 🧪 Структура): «если нажать — пусть либо-либо переключает: только одно окно оставляет, и сразу развёрнутым». Щелчок по любой из шести кнопок разворачивает и показывает это окно, а остальные пять из них сворачивает; горит одна кнопка. Окна вне этих шести не трогаются.

Zazerkalius v0.628 — «по проходам за шаг есть?» → «да, и в автоплей по проходам тоже». Рядом с «🌊 аниматрица» в окне пирамиды — «▷| проход»: один щелчок — один проход волны по всем этажам (идущий автоплей при этом встаёт). Автоплей и так идёт целыми проходами, по 6 в секунду; теперь на его кнопке, пока идёт, — «⏸ проход N», а на «▷|» — номер прохода от исходной пирамиды.

Zazerkalius v0.627 — «Паскаль — надо там Аниматрицу крутить». В окне «▲ Пирамида Паскаля» — кнопка «🌊 аниматрица»: по каждому этажу пирамиды (а этаж — треугольник) идёт волна, как в «Аниматрице»: строка переписывается операцией с уже переписанной строкой над ней, бит сверху берётся по углу, операция — та, что выбрана в «Аниматрице» (XOR по умолчанию). Шесть проходов в секунду, пирамида меняется на глазах; можно одновременно ⟳ крутить. «⤓ этаж в строки» берёт этаж таким, каким он стал. Вернуть исходную пирамиду — сменить «этажей» или затравку.

Zazerkalius v0.626 — по снимку кнопки «⤓ этаж в строки» (окно «▲ Пирамида Паскаля»): «класть с первой строки, а то, что было, — удалить». Этаж больше не вставляется под текущей строкой: он заменяет всё поле строк, начиная с первой; прежние строки убираются (↩ вернёт).

Zazerkalius v0.625 — по снимку поля строк с треугольником: «всегда при изменении строк — скроллить в середину видного поля, по первой строке, первому биту». Как только меняется число строк или их длина (достроил, срезал, заготовка, шаблон, другое поле), поле прокручивается по ширине так, что первый бит первой строки стоит посередине видимой части. Смена одних битов (волна Аниматрицы, щелчки по битам) прокрутку не трогает — иначе её было бы не сдвинуть рукой.

Zazerkalius v0.624 — по снимку кнопки «◆ Гранидус» в шапке: «Бирамида». В шапке кнопка этого окна — «◆ Бирамида»; само окно и список «Окна» слева — пока «◆ Гранидус».

Zazerkalius v0.623 — по снимку шапки справа от «🧪 Структура»: «какие-то скроллы тут». Это была полоса прокрутки ряда кнопок окон в шапке (тонкая, со стрелками ▲ ▼). Полосы больше нет ни при каких размерах; ряд в шапке и так не обрезается (v0.621).

Zazerkalius v0.622 — по снимку кнопки «▲ Пирамида Паскаля» в шапке: «Паскаль». В шапке кнопка окна — короче, «▲ Паскаль»; само окно и список «Окна» слева называют его по-прежнему полностью.

Zazerkalius v0.621 — по снимку «📌 ◯ Конус» в шапке: «(закреп)конус)». 📌 — остриями с обеих сторон, «◯ Конус» — выемкой слева, в которую входит остриё 📌, и остриём справа. Так и было задумано, но ряд кнопок окон обрезал по своему краю левый заход «Конуса» на 📌, и стык не сходился; теперь ряд не обрезает.

Zazerkalius v0.620 — «только этих» (по тому же снимку списка): в шапке — не все окна, а шесть: ◯ Конус, ◆ Гранидус, ✦ Развёртка, △ Сетка, ▲ Пирамида Паскаля, 🧪 Структура, в этом порядке; закреплённые 📌 из них второй раз не повторяются, прочие закреплённые кнопки — как были.

Zazerkalius v0.619 — по снимкам списка «Окна» и шапки: «эти все — дублируй в верхнее меню». В шапке после закреплённых 📌 кнопок — кнопки всех окон, как в списке слева: горит — окно развёрнуто на столе; щелчок по горящей — свернуть, по тёмной — развернуть, поднять и показать. Закреплённые окна второй раз не повторяются. Кнопки сами следят за окнами.

Zazerkalius v0.618 — по снимку раздела «Окна»: «у групп не скрывать внутри группы — только всё целиком скроллить». Список окон больше не листается сам внутри раздела: все разделы левой панели — во всю свою высоту, листается вся панель целиком (колесо мыши, светящиеся ▲ ▼).

Zazerkalius v0.617 — три правки. «Осталась граница» (по снимку левого края группы при выключенной ▱): обводка кнопок цветом фона ложилась по внешнему краю группы тёмной каймой; без обводки группа теперь обрезается на эти 2 px по всему контуру — швы между кнопками остаются, каймы нет. «Стрелки при скролле пусть перекрывают и не дают там нажать кнопки»: ▲ ▼ левой панели — сплошные, кнопки под ними не видны и не нажимаются. «Стрелки только две — вверху и внизу»: у списка окон своих ▲ ▼ больше нет — его листают те же две стрелки панели.

Zazerkalius v0.616 — по снимку шапки «Zazerkalius ◯ Конус»: «при клике на заголовок Zazerkalius — переход из соло-режима». На странице одного конуса слово «Zazerkalius» в шапке — ссылка: щелчок открывает всю страницу (тот же адрес без ?solo=cone), с полем строк, окнами и панелями; при наведении подсвечивается. У страницы конуса и у всей страницы настройки по-прежнему свои.

Zazerkalius v0.615 — по снимку правого края группы: «границы группы и кнопки наложить друг на друга». Острия кнопок кончались на 1,2–1,8 px левее края группы: ширина группы — целое число пикселей, а кнопки — из дробных треугольников; с линией рамки выходила видимая щель. Теперь правый зубчатый край рамки идёт ровно по остриям кнопок (проверено по всем группам — совпадает до сотых пикселя).

Zazerkalius v0.614 — по снимку «🎨 Гамма · ▱ обводка · ☀ Светлый» в шапке: «убери в левое меню, в верх; по умолчанию и в мобильной — Тёмный, без обводки». Три кнопки ушли из шапки в левую панель — первым разделом «Оформление», над «Страницей целиком»; в столбике значков — тоже. Тема по умолчанию теперь тёмная везде, и на телефоне (прежде шла за системой); выбранная руками — помнится, как раньше. Обводка по умолчанию и так выключена.

Zazerkalius v0.613 — по снимку «🔴 неп. ⇄ · 🟢 неп. ⇄🔁» в «Виде»: «выровняй ширину у этих малых кнопок». По размеру они и были одинаковы (по 91 px), но в цепочке остриё первой входит в выемку второй, и у первой видно на t (≈7 px) меньше. Первая теперь шире ровно на t — видимые части одинаковые. Для таких случаев у кнопок групп появилась пометка data-tzadd (на сколько t шире).

Zazerkalius v0.612 — «подсвечивай, когда есть что отменять, повторять». ↩ в шапке горит, пока есть шаги назад; ↪ — пока есть отменённое, что можно вернуть. Новая правка повторы стирает — ↪ гаснет.

Zazerkalius v0.611 — по снимку ↩ ↪ в шапке: «посередине горизонтали браузера». Стрелки «отменить» и «повторить» стоят ровно посередине шапки по ширине окна браузера, остальные кнопки — где были. На узком экране (телефон) — как прежде, в общем ряду.

Zazerkalius v0.610 — по снимку ◎ и ромбов записи: «подсказки проверь». Сверены с кодом. ◎ Дзен: значок теперь ◎, а не 🧘; дописано, что дзен — во весь экран браузера и что группы, отмеченные 🧘, остаются у конуса. ⏺ и mp4: наведение показывает рамку кадра, при записи рядом появляется ⏸. ↻1: названия режимов были старые («Всё целиком», «по биту») — теперь «Всё», «Встреч Стр», «Каждое», «Встреч Бит». 🎞, ⏸ и ▣ — верные, не менялись.

Zazerkalius v0.609 — по снимку низа страницы (◎ дзена слева и ромбы записи на конусе): «по вертикали выровняй». Ромб дзена теперь стоит на одной высоте с полосой кнопок записи на холсте конуса, когда она у низа экрана; окно конуса двигают или тянут — ромб подстраивается. Если полоса записи далеко, ромб — как был, у низа панели.

Zazerkalius v0.608 — по снимку «Лазера» поверх «Аниматрицы»: «группы не могут найти себе место и дёргаются туда-сюда по вертикали» и «не дай группам наезжать на кнопки меню». Дёрганье: раз в 0,3 с наложенные группы расталкиваются (v0.558); если подходящего места рядом не было, группу всё равно сдвигало, а потом её возвращало в пределы окна — она снова налезала, и так по кругу. Теперь двигается только туда, где есть место, иначе стоит. И верх, выше которого группа не встаёт, теперь — под полосой вкладок: группы на вкладки больше не заезжают. На странице одного конуса и полоса групп начиналась от самого верха, под вкладками; теперь она опущена на высоту полосы вкладок.

Zazerkalius v0.607 — по снимку «проход 0 · волна 0/8» поверх первой строки: «убери в самый низ поля». Счёт волны Аниматрицы стоял справа у первой строки и наезжал на неё; теперь он у нижнего края поля строк, справа.

Zazerkalius v0.606 — по снимку полосы вкладок и «Лазера» рядом с ней: «на уровне полоски меню невозможно захватить заголовок группы». Полоса вкладок (v0.593 — поверх групп) тянулась на всю ширину окна конуса и забирала щелчки и в пустом месте справа от вкладок. Теперь щелчки ловят только сами вкладки, пустое место полосы пропускает их к группе под ней — заголовок группы на этой высоте снова хватается.

Zazerkalius v0.605 — по снимку «Кручения»: «сюда кнопку — кручение побитно: один шаг — один бит крутится в каждом кольце». Новая кнопка «▦ побитно» рядом со скоростью: ▶ крутить идёт не плавно, а скачками — за шаг каждое кольцо поворачивается ровно на один бит, шагов в секунду — столько, сколько бит/с на ползунке. Включённая во «Всё» или «Встреч Стр» сама переводит кручение в «Каждое»; «Встреч Бит» тоже идёт скачками. Ещё раз — снова плавно.

Zazerkalius v0.604 — две правки. «(выдел)лучи(все)»: лучи к центру в группе «Вид» — сцепка из трёх: «выдел.» и «все» — шестигранники с остриями с обеих сторон, «✳ лучи» посередине — с выемками, в которые они входят. «Лучи» включает и выключает (помнит сторону), «выдел.» / «все» выбирают, от каких колец, и при выключенных лучах включают их; горят «лучи» и выбранная сторона, выключены — гаснут все три. И по снимку кнопок записи на холсте — «ромбами, как дзен»: ● mp4 🎞 ↻1 ⏸ ▣ — ромбы 40 × 40 с тонкой рамкой акцента и тёмной заливкой, как ◎ дзена; ⏺ — красным, идущая запись — золотом.

Zazerkalius v0.603 — по снимку низа столбика значков: «дзен накладывается на кнопки». В столбике значков панель листается, а ромб дзена был приколот к ней изнутри — ехал вместе с кнопками и ложился на них. Теперь ромб стоит на месте у низа панели, а нижняя полоса панели под ним срезана: кнопки при прокрутке уходят под её край, а не под ромб; ▼ светится над ромбом, пока ниже что-то есть.

Zazerkalius v0.602 — по снимку всей страницы: вкладка «ТЕКСТ» горит, а окна текста нигде нет. Причина — слои: у окон номер слоя растёт с каждым щелчком по ним, и окно конуса со временем уходило выше окна текста (у того был постоянный 900) — текст открывался, но под конусом. Теперь окно текста всегда выше всех окон.

Zazerkalius v0.601 — по снимку столбика значков: «всё равно показывает скролл». Родную полосу прокрутки левой панели v0.599 спрятала, но у панели с v0.270 есть ещё своя — тонкая полоса у левого края (её ставили, чтобы полоса не стояла вплотную к номерам строк). Эта своя полоса для левой панели снята; листать — колесом и светящимися ▲ ▼.

Zazerkalius v0.600 — «если кнопкой скрыть — потом не появляется» (окно текста конуса). В проверке окно пряталось и открывалось и на главной, и на странице одного конуса; не видно его бывает, когда оно сохранено свёрнутым до заголовка (полоса с пустой коробкой) или откреплено и стоит в стороне. Теперь «📝 Текст» всегда открывает его развёрнутым и в правом верхнем углу конуса; свёрнутое — одна полоса заголовка, без пустой коробки.

Zazerkalius v0.599 — по снимку столбика значков левой панели: «убери скролл слева, сделай светящиеся стрелки вверх-вниз, если уходят из видимости». У левой панели больше нет полосы прокрутки. Когда кнопки ушли за верх — над панелью светится ▲, за низ — ▼ (над ромбом дзена), так же, как у списка окон; щелчок по стрелке листает на три четверти высоты, колесо мыши — как прежде.

Zazerkalius v0.598 — «„Текст“ так и не появляется окно» и следом «может, просто в поле конуса текст писать — сверху справа». Приколотое окно текста конуса и лога лазера вставало вплотную под окном конуса, а оно обычно тянется до низа экрана — и текст уезжал за край. Теперь оно стоит поверх самого холста, в правом верхнем углу: шириной до 45 % холста, высотой не больше 70 %, полупрозрачное, ходит за конусом. Открепить и поставить куда угодно — по-прежнему, потянув за заголовок.

Zazerkalius v0.597 — по снимку столбика значков левой панели: «тут отступы поправь». Между кнопками — по 3 px, и от черты раздела до первой и последней кнопки — тоже по 3 px (было 6: разделы стояли вдвое дальше друг от друга, чем кнопки внутри). Стрелка вверху — на 4 px от края.

Zazerkalius v0.596 — по снимку «Страница целиком» и стрелки сворачивания левой панели: «стрелка криво лежит». В v0.592 заголовки разделов поднялись на 4 px от верха, а стрелка осталась на 8 — встала на 4 px ниже первого заголовка. Теперь она вровень с ним.

Zazerkalius v0.595 — по снимку «слева · строки · справа»: «строки и справа — обе подсвечены, либо вообще все три выключены, когда скрыты». Поле строк видно — горят «строки» и сторона, где оно стоит; спрятано — гаснут все три. Щелчок по «слева» / «справа» при спрятанном поле сперва его показывает (и ставит на эту сторону).

Zazerkalius v0.594 — по снимку свёрнутой левой панели (столбик значков): «эти кнопки тоже в ромбоид». В столбике значков каждая кнопка — шестигранник с остриями по бокам, как кнопки из треугольников, 24 px высотой, без рамки и скруглений; горящая (⭐ и др.) — ярче. Между кнопками — по 3 px.

Zazerkalius v0.593 — «?solo=cone — Текст, кнопка не работает». На странице одного конуса плавающие группы лежали поверх полосы вкладок, и щелчок по «📝 Текст» доставался группе под ней. Полоса вкладок теперь всегда над группами — «Текст» и вкладки групп щёлкаются.

Zazerkalius v0.592 — по снимку заголовков левой панели: «тут отступы и высоты стандартизируй». Заголовки разделов — 24 px, как ряд кнопок; между заголовками, между заголовком и его кнопками и после кнопок до следующего заголовка — везде по 4 px (было 8 над заголовком, 2 под ним и 8 после кнопок).

Zazerkalius v0.591 — по снимку «⇆ строки справа · ▭ поле строк»: «(слева(строки)справа) — вот так, включена либо-либо». Две кнопки шапки стали одной сцепкой из трёх: «слева» и «справа» — где стоит поле строк, горит одна из них; «строки» посередине — острия с обеих сторон, входят в выемки соседок; горит, пока поле видно, щелчок прячет его и возвращает.

Zazerkalius v0.590 — по снимку кнопки дзена Пирамиды: «вот дзен-значок из Пирамиды — сюда». Ромб дзена в левом нижнем углу левой панели теперь как в Пирамиде: ◎ в ромбе 40 × 40, тонкая рамка цветом акцента, внутри тёмная заливка, значок акцентом; при наведении рамка ярче.

Zazerkalius v0.589 — по снимку вкладки «Дзен»: «отсюда удали». Во вкладках групп конуса больше нет «Дзена»: это пульт, который виден только в режиме дзен, прятать и показывать его вкладкой было незачем.

Zazerkalius v0.588 — по снимку «🧘 дзен» в шапке: «в левое меню, вниз в угол, ромбоидным квадратной формы значком, без текста». Кнопка дзена ушла из шапки в левый нижний угол левой панели — ромбом 34 × 34 с одним 🧘 (что делает — во всплывающей подсказке). Панель держит под ним место, чтобы ромб не закрывал список окон; в столбике значков ромб — по середине.

Zazerkalius v0.587 — по снимку «📝 Текст» в шапке: «эту — в конус-кнопки перемести». Кнопка текста конуса и лога лазера ушла из шапки в полосу вкладок над группами конуса — последней, тем же шевроном, золотистым; горит, пока полоса текста открыта. Делает то же, что прежде.

Zazerkalius v0.586 — «кнопки конуса выглядят выше — почему? граница там, обводка?» Да: у кнопок из треугольников по краю обводка (при выключенной ▱ — 2 px цветом фона), а у вкладок групп её не было, и их заливка была на 4 px выше. Выбран первый вариант — дать вкладкам ту же обводку: при ▱ выкл — 2 px цветом фона холста, при вкл — 1 px светлая. Теперь вкладки и кнопки рядом одной видимой высоты.

Zazerkalius v0.585 — по снимку шапки над вкладками групп: «у верхнего меню отступ меньше, чем у этих, — сделай средний размер отступа для всех». Шапка, вкладки групп конуса и полоса над полем строк — теперь у всех по 4 px над и под кнопками (у шапки было 2, у вкладок и полосы — 6). Шапка — 34 px.

Zazerkalius v0.584 — по снимку вкладок групп: «нажатие на кнопки — скрывает и показывает сами группы». Не скрывало: вкладка меняла цвет, а группа оставалась на месте — правило раскладки групп в окне конуса (inline-grid / inline-flex с !important) было сильнее правила «спрятана». Теперь «спрятана» сильнее, и щелчок по вкладке (и двойной по заголовку) убирает группу и возвращает её.

Zazerkalius v0.583 — по снимку полосы над полем строк и вкладок групп рядом: «стандартизируй отступы по вертикали между кнопками». Вкладки групп конуса — той же высоты, что кнопки полосы над полем строк (25 px вместо 22), и с теми же отступами сверху и снизу (6 px вместо 2 и 4); перенесённый второй ряд вкладок — тоже через 6 px. Теперь обе полосы стоят вровень.

Zazerkalius v0.582 — по снимку вкладки «Лазер»: «первая кнопка также — )), а не !)». У первой вкладки левый край был прямым; теперь и у неё слева выемка, как у всех остальных.

Zazerkalius v0.581 — по снимку свёрнутой «Звука» под вкладками: «двойной клик по заголовку — просто скрыть всю группу и затемнить кнопку вверху». Двойной щелчок по заголовку группы больше не сворачивает её до заголовка, а прячет целиком — как щелчок по её вкладке; вернуть — щелчок по вкладке. Цвет вкладок перевёрнут: группа видна — вкладка горит своим цветом, спрятана — тёмная.

Zazerkalius v0.580 — по снимку меню «🎨 Гамма»: «цвета в „Своя“ — прямо в ней должны, 3 значка». Ошибка переноса v0.578: разметка строки «Своя» резалась по первому закрывающему тегу — он оказался внутри подписи «1», — и строка кончалась сразу после «1», а три выбора цвета вываливались под неё большими квадратами. Теперь 1, 0 и а — три ромба прямо в строке «Своя», справа от слова.

Zazerkalius v0.579 — по снимку свёрнутых групп рядком: «в конусе сверху так расположи кнопки вызова групп, и погашай их цвет при включении; сами кнопки на месте, а группы можно скрывать в них». Над группами конуса — полоса вкладок: Лазер · Кручение · Вид · Звук · Кольца · Аниматрица, каждая — шеврон цветом своей группы. Щелчок по вкладке прячет группу «в неё», ещё щелчок — показывает развёрнутой. Пока группа видна, вкладка погашена (бледная); спрятана — горит своим цветом. Вкладки стоят на месте, что бы ни делали с группами. Заодно показанная группа больше не уезжает на левую панель, если её не видно.

Zazerkalius v0.578 — по снимку «Гаммы» с ✕ («не закрывается крестиком») и следом: «сделай её не группой конуса, а просто в меню — списком вниз, но в стиле ромбов». Группы «Гамма» на конусе больше нет. Кнопка «🎨 Гамма» в шапке открывает под собой список: первой строкой «Своя» и три ромба цветов 1 / 0 / а, ниже — Янтарь, Океан, Лес, Роза, Огонь, Контраст; каждая строка — шестигранник, окрашенный цветами своей гаммы, выбранная горит. Выбор гаммы список не закрывает — можно перебирать; закрывает ещё щелчок по «🎨», Esc или щелчок мимо. Правый щелчок по «🎨» — следующая гамма, как раньше. (✕ у группы в проверке закрывал и открытую, и свёрнутую группу — причину у себя не поймал; с меню вопрос снят.)

Zazerkalius v0.577 — по снимкам «▱ обводка» и «Кручения»: «когда отключена — убери эту общую обводку у групп». Выключенная ▱ обводка теперь убирает и общую цветную рамку вокруг группы (зубчатый контур цветом группы); включённая — рамка на месте, как раньше.

Zazerkalius v0.576 — по снимку списка «✳ все» в группе «Вид»: «разложи на кнопки». Лучи к центру от бит выбираются тремя кнопками рядом — ✳ нет, ✳ выдел., ✳ все; горит выбранная. Список остался скрытым и держит значение — пресеты и сохранённые настройки читаются как раньше.

Zazerkalius v0.575 — по снимку шапки «📐 Разложить · ▭ Свернуть»: «эти не нужны, удали — всё переехало в Окна в левую панель». Обе кнопки сняты с шапки. И «Подсказки — сделай значком ?»: кнопка «📖 Подсказки» теперь просто «?», что она делает — во всплывающей подсказке.

Zazerkalius v0.574 — по снимку шапки: «высоту сократи, уменьшив отступы от кнопок по вертикали». Шапка страницы — 30 px вместо 40: кнопки те же (25 px), над и под ними осталось по 2 px; всё остальное поднялось на 10 px. На телефоне шапка, как и была, по высоте кнопок.

Zazerkalius v0.573 — по снимку конуса: «почему нет щели у 1 строки: 1 бит — одна щель должна быть». У кольца из одного бита граница одна — бит встречается сам с собой; расчёт лазера её и так знал (луч проходит строку 1 через неё), а рисунок щели ставил только там, где бит больше одного, и кольцо строки «1» выходило сплошным. Теперь у него одна щель и одна черта границы — в плоском виде, в объёме, у краски лазера и у стены.

Zazerkalius v0.572 — по снимку «Шаблонов» в левой панели: «обнови кнопки шаблонов в ромбовидном стандарте». Свои шаблоны («Столбик · 9 стр.» и др.) были прямоугольными рамками — их нарочно не брали в раскладку треугольниками. Теперь каждый шаблон — ряд той же цепочки, что «Сохр / + новый» над ним: имя — кнопка во всю ширину, ✕ — маленький ромб в конце ряда (при наведении краснеет). Текущий шаблон горит заливкой и золотой надписью, как раньше горел жёлтой рамкой.

Zazerkalius v0.571 — по снимку «Аниматрицы» на левой панели: «группы конуса не надо в левую панель, чтоб попадали». Группу конуса, которую тянут за заголовок, левая панель больше не ловит: нет ни магнита у её края, ни подсветки, группа остаётся там, где её отпустили. Группы, которые уже стояли на панели, при загрузке возвращаются на полосу конуса; список того, что там стояло, сохранён — если понадобится вернуть.

Zazerkalius v0.570 — «Аниматрица — так же подсказки». Подсказки группы сверены с кодом. У самой группы перечислено всё, что в ней есть, и сказано, что заготовки, сид и число строк живут под чертой поля строк. ▶ волна: пока идёт, на кнопке ⏸, а ↩ возвращает к тому, что было до пуска. ⤺ возврат: объяснено, что такое «до первой волны». ⏮: сколько истории хранится. ▦ 256: сид и число строк берутся из-под черты, карта остаётся открытой для перебора. ▮ Столб: сколько бит влево и вправо — в двух полях рядом (было «один столбец»). 🧱 Бит: на кнопке — сколько заморожено. У часов цикла появилась своя подсказка — что показывают стрелки и цифры.

Zazerkalius v0.569 — «обнови подсказки к кнопкам» (группа «Лазер»). Подсказки сверены с тем, что кнопки делают сейчас. У самой группы перечислено всё, что в ней есть (было только про луч-часы). ⌖◁ ⌖▷ доводят строку 1 до нынешнего лазера, а не до «смотрящего вверх». 🎯 сам переключает «Всё» на «Встреч Стр», отпускает остановленные кольца и не работает при ☀. ☀ и ✺ включают луч-часы и выключают друг друга. ✎ хранит прежнее поле в запасе. Свои подсказки получили поля ⌖× и «от °», поле номера у 🎯, ☀, переключатель «щели / Без щелей», ↻ и список шага.

Zazerkalius v0.568 — по снимку группы «Лазер»: «поправь кнопки, ничего не видно». В полях «⌖×» (сколько лазеров) и «от …°» (угол первого) числа не помещались: эти поля лежат во вложенной обёртке, и общее оформление полей групп до них не доставало — оставались узкие поля со стрелками и отступом под подпись. Теперь поля растянуты на всю кнопку, без стрелок, числа видны; подписи «⌖×», «от», «°», «×» сдвинуты со скошенного края, где их резало. И «45°» у ↻ больше не прячется под острием соседней кнопки.

Zazerkalius v0.567 — «только когда включена — красная». 🗑 под чертой выключена — рамка обычная, как у соседних кнопок; включена — красная двойная рамка и красноватая подложка. Значок остался крупным. Что делает включённая, не менялось: черта вверх — строки под ней стираются насовсем, когда черту отпускаешь (↩ вернёт).

Пирамида v0.105 — по снимку «↶ отменить | ✕ как было»: «подсвечивать, когда есть что отменять». ↶ отменить теперь горит цветом кнопки, пока есть шаги назад, и гаснет, когда отменять нечего. ✕ как было горит, пока на пирамиде есть что-то достроенное, сдвинутое или перевёрнутое, а когда всё стоит как было — приглушена.

Zazerkalius v0.566 — по снимку 🗑 под чертой поля строк: «корзина — красной обводкой и побольше значок». Рамка у 🗑 теперь красная всегда (раньше — как у всех кнопок, а включённая горела жёлтым, как прочие переключатели), сам значок крупнее. Включённая «стирать под чертой» — красная двойная рамка и красноватая подложка: сразу видно, что стирает.

Пирамида v0.104 — «пусть только по нажатию переключает». Свет по ярусам больше не бежит сам: каждый щелчок по ☼ зажигает следующий ярус, правый щелчок — предыдущий, после последнего подсвет выключается. Номер горящего яруса написан на ромбе.

Пирамида v0.103 — «нужна кнопка подсвета по ярусам». Наверху справа — ромб ☼: по ярусам бежит свет. Горящий ярус ярче и белее, остальные приглушены; свет идёт от верхнего яруса к нижнему (у звезды — от центра наружу), ярус за 0,4 секунды, и начинается снова. Работает во всех трёх режимах, вместе с вращением, размытием и видеозаписью. Включённый подсвет помнится и едет в ссылке 🔗.

Пирамида v0.102 — третий вариант: «у бипирамиды 2 вершины на оси и 3 на плоскости — пусть следующий уровень из двух ляжет на 2, а из трёх — на 3». Новая кнопка ✶ звезда рядом с «укладкой» и «бипирамидами». В центре одна бипирамида; второй ярус — две на её остриях, остриё к острию вдоль оси; третий — три на вершинах пояса, пояс к поясу, наружу. Дальше всё растёт так же от каждой новой бипирамиды: по оси — следующий ярус, через пояс — через один. Поэтому в третьем ярусе к трём на поясе добавляются ещё два продолжения столбика, и ярусы идут 1, 2, 5, 8, 14, 20… Бипирамиды друг в друга не входят: по высоте они стоят столбиками остриё к острию, а в плоскости их пояса касаются углами, как треугольники в узоре «кагоме».

Пирамида v0.101 и Битмультфильмы v0.012 — две ссылки 🔗 с пирамидой и слово «добавь в мультфильмы». В «Битмультфильмах» появился раздел «Пирамиды — живые»: обе пирамиды крутятся прямо в карточках, щелчок — открыть на весь экран с кнопками. Для карточек у Пирамиды завёлся режим «кино» (?kino в адресе): на экране только сама пирамида, а страница ничего не запоминает — чтобы карточка не перетёрла настройки того, кто смотрит. Заодно ссылка 🔗 теперь помнит размер экрана, и сдвиг вида на другом мониторе или телефоне пересчитывается — пирамида встаёт на то же место.

Пирамида v0.100 — «нужна кнопка типа размытие: кадр не сразу уходит». Наверху справа — ромб ≋: прежний кадр гаснет не мгновенно, а тянется за пирамидой шлейфом. Щелчок перебирает силу: выкл → 1 → 2 → 3 → 4 → выкл; на 1 шлейф короткий, на 4 — длинный, почти как засветка. На стробоскопических скоростях шлейф рисует узор, по которому видно, куда «бежит» картинка. Сила помнится, едет в ссылке 🔗 и попадает в видеозапись; 📷 со шлейфом сохраняет кадр ровно как на экране. Сделано так, чтобы старые кадры гасли до конца, а не оставляли вечную тень.

Пирамида v0.099 и общий recorder.js — «на всех видео это что, водяной знак?». Не водяной знак: это значок «в Хаб» — маленький вращающийся знак у заголовка, он тоже нарисован на холсте. Запись сводит в кадр все видимые холсты страницы и растягивает каждый до размера самого большого, поэтому крошечный значок ложился на весь ролик огромными размытыми песочными часами — и так на всех страницах, где есть и значок, и запись. Теперь значок (и любой холст с пометкой data-no-rec) в запись не попадает. Чинится сразу для всех страниц.

Пирамида v0.098 — «нужна кнопка — сохранить текущее движение, или, если можно, ссылкой». Наверху справа — ромб 🔗: щелчок кладёт в буфер ссылку на то, что сейчас на экране, — режим, слои, раздвинутость, срез, грани, рёбра, цвета, ось, поворот, наклон, вращение и его скорость, приближение и всё достроенное. Открыл ссылку — пирамида встаёт точно так же и крутится с той же скоростью. Ссылка заодно попадает в адрес вкладки, поэтому и обновление страницы возвращает этот вид.

Пирамида v0.097 — по снимку ромба: «так не нажимаются пауза и ×N». Их закрывал невидимый квадрат вокруг ромба видов — он ловил щелчки даже там, где пусто. Теперь пустое место вокруг кнопок щелчки пропускает, и ⏸ с ×N нажимаются, где бы ни стояли.

Пирамида v0.096 — по снимку ромба кнопок: «пусть паузу с ×N тоже вокруг себя собирает; и второй вариант — всё в ряд или в два, как на телефоне». Двойной щелчок по ✥ теперь ходит по кругу: ромб → один ряд над скоростью → два ряда зигзагом (как на телефоне) → снова ромб. В ромбе ⏸ и ×N тоже собираются вокруг ручки, слева снизу. На узком экране один ряд не влезает и пропускается.

Пирамида v0.095 — «ещё две ромбо-кнопки + − масштаб». Рядом с кнопками видов — ромбы + и −: приближают и отдаляют пирамиду; в ряду над скоростью они стоят по бокам от ⌖ (вид как был), в ромбе — по углам справа. Их, как и остальные, можно утащить куда угодно.

Пирамида v0.094 — «пауза возможна при записи?» → «отдельная кнопка паузы рядом с ⏺ — да». Пока идёт видеозапись, слева от ⏺ появляется ромб ⏸: щелчок — запись на паузе (и картинка, и звук), на кнопке ▶, ⏺ перестаёт мигать; ещё щелчок — запись продолжается в тот же файл, без дыры. Время записи паузу не считает. Остановил запись — кнопка паузы исчезает.

Пирамида v0.093 — по снимку кнопок, собранных ромбом вокруг ✥: «из такого положения пусть следующий двойной щелчок в ряд ставит их». Двойной щелчок по ручке ✥ теперь переключает: из ромба — в ряд над шкалой скорости, из ряда (или если кнопки растасканы) — обратно ромбом вокруг ручки, там, где она стоит.

Пирамида v0.092 — «дзен — по колёсику мыши; видеозапись со звуком — ещё кнопку». Щелчок колёсиком мыши по пирамиде включает и выключает дзен (если колёсиком тянуть — как раньше, сдвигается вид). Наверху справа, рядом с 📷, — ромб ⏺: видеозапись пирамиды со звуком. Звука у самой пирамиды нет, поэтому Chrome спросит, что показать, — выбери вкладку или весь экран и отметь «звук»: запишется то, что играет на компьютере. Отказался — запишется без звука. Пока идёт запись, ⏺ горит и мигает; второй щелчок или клавиша R — стоп, и файл сохраняется.

Пирамида v0.091 — по снимку кнопок, выстроенных в ряд над шкалой скорости: «по умолчанию и при двойном щелчке на ✥ — всё так собирает и кладёт вниз, сверху скоростей». Теперь при первом заходе и по двойному щелчку на ручку ✥ все ромбы-кнопки — ⊤ ◁ ⌖ ⏸ ×N ◇ ⊥ ⬙ ✥ ◢ — выстраиваются одним рядом над ползунками скорости, по середине экрана (на телефоне — зигзагом, чтобы влезли). Когда вращение выключено, ряд уезжает вниз вместе с ползунками, ⏸ остаётся у края.

Пирамида v0.090 — по снимку с телефона: «на мобильном это меню — под ползунки скорости и за низ экрана». Панель теперь никогда не заходит на полосу скорости и не уходит за низ экрана: её нижний край всегда над кнопками ⏸ ×N и ползунками (а когда вращение выключено — над низом экрана); если всё не помещается, панель листается внутри.

Пирамида v0.089 — по снимку ручки ✥: «эта пусть собирает всё вокруг себя, магнитит по горизонтали, вертикали и рёбрам». Вокруг ручки теперь невидимая сетка ромбов: соседние места ребром к ребру, в ряд по горизонтали и столбиком по вертикали. Тащимая кнопка прилипает к этой сетке в первую очередь. Щелчок по ручке собирает все растащенные кнопки обратно вокруг неё — в ближайшие свободные места сетки. А кнопки, которые стоят в сетке, ездят вместе с ручкой, когда тащишь весь ромб.

Пирамида v0.088 — «магнитить кнопки по горизонту и по рёбрам». Когда тащишь ромб-кнопку рядом с другим ромбом, она прилипает — ребром к его ребру или остриём к острию в ряд; а если просто ведёшь где-то на той же высоте, что соседняя кнопка, — выравнивается с ней по горизонтали.

Пирамида v0.087 — «не дать перетащить кнопки на кнопки и на ползунки». Пока тащишь кнопку, над другой кнопкой, над панелью или над ползунками скорости она бледнеет; отпустишь там — она сама встанет в последнее свободное место, где была по пути, или вернётся туда, откуда её взяли. Ромбы при этом могут стоять вплотную друг к другу.

Пирамида v0.086 — «кнопки тоже вниз — они фиксированы, это я на время перетаскивал». Кнопки, которые утащены к полосе скорости, теперь уезжают вниз вместе с ней, когда вращение выключено, и возвращаются, когда включено; ⟳ съезжает только до нижнего края экрана, чтобы её было чем включить вращение снова.

Пирамида v0.085 — по снимкам кнопок, растащенных над шкалой скорости: «и когда включено вращение — ещё и эти; скрыть и сдвинуть ползунки, если выключено вращение». Теперь ползунки скорости видны, только пока пирамида крутится. Нажмёшь ⏸ — полоса скорости плавно уезжает вниз за край экрана, ×N прячется, а кнопка ⟳ остаётся у нижнего края, чтобы включить вращение снова; включишь — полоса возвращается.

Пирамида v0.084 — по снимку ромба видов: «сделай те (⏸ и ×N) размером с эти, и дай растащить каждую по отдельности по полю». Кнопки вращения и множителя стали размером с ромбики видов. И теперь любую из этих кнопок — виды, ⌖, ⏸, ×N — можно утащить куда угодно на экране: ведёшь — тащится, просто щёлкнешь — нажимается, как раньше. Места запоминаются; двойной щелчок по ручке ✥ в центре ромба видов возвращает все кнопки на свои места.

Пирамида v0.083 — по снимку ромба ⏸: «сверху от скорости, посередине, и ×N с ним». Кнопка вращения и множитель ×N теперь парой ромбов над полосой скорости, по её середине; ползунки скорости снова во всю ширину полосы.

Пирамида v0.082 — по снимкам строки счёта и кнопок «▲◆ укладка | ⧫ бипирамиды»: «это показывать при наведении, сбоку». Строки со счётом частей под ползунками скорости больше нет. Наведёшь мышь на кнопки режима — справа от панели появится счёт: сколько тетраэдров вверх, октаэдров, тетраэдров вниз (или бипирамид), по слоям.

Пирамида v0.081 — по снимку полосы скорости: «ромб-кнопку вращения сюда перемести, и множитель справа / слева». Кнопка вращения ⟳ / ⏸ и множитель ×N переехали из ромба видов в полосу скорости: вращение — большим ромбом слева от ползунков, множитель — таким же ромбом справа. Они по-прежнему мигают, пока пирамида крутится.

Пирамида v0.080 — по снимку ромба-точки поверх деления «48»: «у прозрачных отметок приоритет в нажатии». Щелчок по ромбу-точке на нижнем ползунке теперь сразу ставит ровно её скорость — ромб ловит нажатие раньше ползунка и делений. Только когда бегунок уже стоит на ромбе, ромб уходит под него, чтобы бегунок можно было утащить.

Пирамида v0.079 — по снимку строки кнопок стробоскопа: «эти покажи ромбами с обводкой, без фона, прямо на втором ползунке скорости, только стоячие». Точки, где пирамида стоит или стоит её рисунок из нескольких положений, теперь — пустые ромбы с цветной обводкой прямо на нижнем ползунке скорости, каждый на своём месте; строки кнопок больше нет. Подведёшь бегунок к ромбу — он прилипает ровно в точку, и ромб загорается ярче.

Пирамида v0.078 — по снимку крайнего деления с дорожкой: «и дальше цветом этим же, как у бегунка». Контур длинного ромба-дорожки у ползунков скорости теперь того же цвета, что бегунок и обводка крайних делений, — сплошной цветной контур от края до края.

Пирамида v0.077 — по снимку крайнего деления: «обводка слева нормально, а справа — по треугольнику, правее». Цветная обводка крайних делений теперь идёт по всему их контуру: с внешней стороны — по рёбрам ромба размером с бегунок, с внутренней — по рёбрам треугольника, до его острия.

Пирамида v0.076 — «ось вращения — дальнюю от меня половину затемнить немного, после центра». Половина оси за центром пирамиды, уходящая от зрителя, теперь бледнее — сразу видно, какой конец оси ближе. Если смотреть строго сбоку, обе половины одинаковые.

Пирамида v0.075 — по снимку «¼ ×¼»: «бегунок везде на первый план; убрать надо было только левую половину». Понял неверно в прошлый раз — исправил: у крайних делений скорости вернулся плоский тёмный ромб, но только его внутренняя половина (наружная, торчащая за шкалу, убрана), а в середине — ромб размером с бегунок одной цветной обводкой. И бегунок теперь всегда впереди: когда он подходит к крайнему делению, деление уходит под него и щелчки достаются бегунку.

Пирамида v0.074 — по снимку крайнего деления ¼: «левую чёрную часть удали, а ромб обесцветь, но обводку сделай ему». У крайних делений скорости больше нет широкого тёмного ромба вокруг — остался только ромб размером с бегунок: тёмный внутри, с цветной обводкой, число в нём — светлое.

Пирамида v0.073 — по снимку строки «◐ цвет»: «на этой же строке — показать / скрыть ось вращения, кнопка в форме (())». Рядом с «◐ цвет» — кнопка «↕ ось»: шестигранник с двойными остриями внутри, как «(( ))». Включишь — через центр пирамиды проходит штриховая ось, вокруг которой она крутится; при виде сверху или снизу ось смотрит прямо на тебя и видна точкой.

Пирамида v0.072 — по снимку залитого ромба ¼: «крайние обесцветь, внутри них — ромб размером с бегунок, слева / справа». Крайние деления скорости снова тёмные, как остальные, а внутри каждого, посередине, — цветной ромб размером с бегунок, с числом на нём (у самого острия такой ромб не помещается — плоский ромб деления его обрезал бы). Нажимать на них — как раньше: шаг, удержание — повтор.

Пирамида v0.071 — по снимку кнопки ⟳: «значок паузы, когда крутится». Пока пирамида крутится, на кнопке вращения — ⏸ (нажмёшь — встанет), а когда стоит — ⟳ (нажмёшь — закрутится).

Пирамида v0.070 — по снимку бегунков «4», «0», «∞»: «убери жирность с чисел». Числа на бегунках панели и на крайних ромбах скорости теперь обычные, не жирные.

Пирамида v0.069 — по снимку стрелки у шкалы скорости: «у скоростей убери стрелки, а крайние ромбы закрась». Треугольных стрелок у ползунков скорости больше нет, ползунки стали шире. Крайние ромбы-деления — ¼ и 1024 на верхнем, концы промежутка на нижнем — залиты цветом ползунка и работают как стрелки: щелчок — шаг (вверху — к соседней метке, внизу — чуть-чуть), удержание — повтор.

Пирамида v0.068 — по снимку бегунка «Среза» с надписью «все»: «не „все“, а знак бесконечности». Когда показаны все слои, на бегунке и в подсказке теперь ∞.

Пирамида v0.067 — по снимку таблички «Раздвинуть 79»: «подсказку без рамки». Подсказка справа от панели теперь просто текст — без рамки и подложки (с лёгкой тёмной тенью, чтобы читалась поверх пирамиды).

Пирамида v0.066 — «числа на бегунках должны нормально читаться на фоне бегунка, и побольше». Ромбы-бегунки у ползунков панели стали шире, число на них — крупнее и жирнее. Цвет числа теперь не обратный, а чёрный или белый — смотря что лучше видно на цвете ползунка: обратный цвет у средних тонов почти сливался с ромбом.

Пирамида v0.065 — «числа — на бегунке, антицветом, фон их — за бегунком». В ползунках панели число теперь стоит прямо на ромбе-бегунке, по его середине, и едет вместе с ним; фоном ему служит сам ромб, а цвет числа — обратный цвету ползунка (на жёлтом — тёмно-синий и т. п.).

Пирамида v0.064 — «числа оставь». В ползунках панели у бегунка снова видно число; убрано только название — оно появляется в табличке справа при наведении и перетаскивании.

Пирамида v0.063 — «убери текст из ползунков; справа от них показывай его при наведении и перетаскивании бегунка». В ползунках панели («Слоёв», «Раздвинуть», «Срез») подписи больше нет — дорожка чистая. Название и число появляются в табличке справа от панели, напротив своего ползунка, пока над ним мышь или пока тянешь бегунок и жмёшь края; число в табличке меняется на ходу. Если панель стоит у правого края экрана, табличка появляется слева от неё.

Пирамида v0.062 — «по высоте пусть для мыши площадь больше будет по краям для стрелок». Щелчок у края теперь ловится во всю высоту строки ползунка, а не только по цветному треугольнику: треугольник лишь показывает, где край.

Пирамида v0.061 — «когда она узкая — увеличь длину до 2 раз, чтобы больше захвата было для стрелок». Цветной край дорожки, где щелчок работает как стрелка, теперь сам вытягивается: когда бегунок уходит к другому краю и ребро ромба становится пологим, край удлиняется — до двух раз, — и по нему легче попасть. Бегунок при этом не перекрывается: край длинный, только когда бегунок далеко.

Пирамида v0.060 — по снимку с закрашенными концами дорожки: «края внутри фоном залей, ограничь ромбами — там, где нажимать как стрелки». Концы ромба-дорожки, где щелчок работает как стрелка, теперь залиты цветом ползунка — ровно по рёбрам ромба, поэтому заливка меняет форму вместе с бегунком и видно, куда нажимать.

Пирамида v0.059 — по снимку цветных стрелок у ползунков панели: «теперь эти стрелки можно убрать и расширить ползунок, но клик по краям должен работать как по стрелкам». Стрелок больше не видно, а ромб-дорожка растянулся на их место, до самых краёв. Щелчок у левого или правого края — шаг на одно деление, удержание — повтор, как раньше стрелкой.

Пирамида v0.058 — по снимку ползунков панели: «пока только тут: эти серые ромбы зависят от бегунка — рёбра меняют длину, вершины привязаны к бегунку и к вершинам стрелок». У «Слоёв», «Раздвинуть» и «Среза» дорожка теперь не ровный ромб: боковые вершины стоят у стрелок, а верхняя и нижняя — над и под бегунком и едут вместе с ним, так что рёбра то удлиняются, то укорачиваются. Шкалы скорости пока не трогал.

Пирамида v0.057 — «можно ли открывать новое окно» (по значку хаба). На телефоне долгое нажатие на значок хаба снова открывает меню браузера с «Открыть в новой вкладке» — для всей остальной страницы это меню выключено, чтобы не мешало. Обычное нажатие по-прежнему переходит в хаб в этой же вкладке; на компьютере новая вкладка — колесом мыши или Ctrl+щелчком.

Пирамида v0.056 — по второму рисунку поверх ползунков: ромб дорожки стал во всю высоту ползунка, его острия доходят до стрелок, а контур — светлый и толще, как на рисунке.

Пирамида v0.055 — по рисунку поверх ползунка «Слоёв»: «вместо горизонтальной линии в бегунках — такое, фоном». Дорожка каждого ползунка теперь не полоска, а длинный плоский ромб во всю ширину — острия у стрелок, серый контур, тёмная середина; бегунок, числа и подписи ездят поверх него.

Пирамида v0.054 — по снимку «×1», наполовину спрятанного под ромбом скорости: «текст бегунка — на передний план». Цветные значения у бегунков скорости теперь поверх ромба и чуть дальше от него; подписи у ползунков панели («Слоёв», «Раздвинуть»…) остаются за бегунком, как просил раньше.

Пирамида v0.053 — по снимку ромба видов: «кнопки тоже в цвет». Ромбики видов, ручка в центре и отдельные ◎ 📷 ✥ теперь обведены цветом — радугой по порядку или выбранным цветом, приглушённо; при наведении и у включённого вращения — ярко.

Пирамида v0.052 — по снимку «Раздвинуть 26»: «текст назад, за бегунок». Подпись у бегунка теперь лежит под ромбом, а не поверх него — ромб всегда виден целиком.

Пирамида v0.051 — по снимку заголовка: «прыгает размер при открытии меню». Свёрнутая панель раньше сжималась до ширины заголовка и меняла поля, а стрелка меняла размер — поэтому при раскрытии всё прыгало. Теперь заголовок одинаковый в обоих видах: ширина и поля те же, стрелка только поворачивается на месте.

Пирамида v0.050 — по снимку стрелки «свернуть»: «другой треугольник того же ромба». Стрелка теперь — нижняя половина того же ромба, что у бегунков ползунков: уже и острее прежнего плоского треугольника.

Пирамида v0.049 — по снимку панели: «ползунки — цвет тоже менять». Ромбы-бегунки, стрелки по бокам, подписи у бегунков и горящие метки шкал теперь красятся так же, как кнопки: с радугой — каждый ползунок своим цветом нот, без радуги — все в выбранный цвет.

Пирамида v0.048 — по снимку маленькой ▾ в заголовке: «стрелку вниз — из ромбов, размер». Кнопка «свернуть» стала крупным треугольником — половинкой ромба, как стрелки у ползунков: остриём вниз, а у свёрнутой панели — вправо.

Пирамида v0.047 — «углы 60°». Ромбы делений на шкалах скорости собраны теперь из двух равносторонних треугольников: острые углы 60° смотрят влево и вправо вдоль линии, тупые 120° — вверх и вниз. Все деления одного размера, число — посередине.

Пирамида v0.046 — по снимку деления «2» на шкале скорости: «засечки тоже ромбами — их рёбрами, только серыми, тёмно». Каждое деление теперь — контур ромба тёмно-серыми рёбрами, высотой с бегунок, число — внутри ромба. Чёрточек над и под числом больше нет.

Пирамида v0.045 — по снимку карточек меню: «углы обводки меню — ромбами». У обеих карточек панели углы теперь не скруглены, а срезаны под 45°, как грань ромба, — в одном стиле с кнопками.

Пирамида v0.044 — по снимку кнопок панели: «цвет кнопок — в цвет выбранный или радугой». Обводка горящих кнопок теперь идёт за «◐ цвет»: пока радуга включена — каждая кнопка своим цветом нот, по порядку, как слои пирамиды; выключил радугу — все кнопки, заголовок и стрелки ползунков в тот цвет, что выбран в квадратике.

Пирамида v0.043 — по снимку ручки ⋮⋮ в центре ромба видов: «значок как у курсора в момент перетаскивания». Вместо точек там теперь четыре стрелки крестом — тот же знак, что у курсора, когда тащишь, — сразу понятно, что за него ромб и переставляется.

Пирамида v0.042 — по снимку «◐ цвет» с квадратиком цвета рядом: «объедини одной обводкой ромбоидной». Кнопка «◐ цвет» и квадратик выбора цвета теперь одна фигура: общий шестигранник с одной обводкой, квадратик — внутри, справа от надписи. Когда радуга включена, квадратика нет и это обычная кнопка.

Пирамида v0.041 — по снимку стрелок ▶: «все стрелки сделай, как у ромбов, углом». Стрелки у всех ползунков теперь — половинка ромба: остриё под прямым углом, как углы ромбиков видов и кнопок ◎ 📷 ✥, а не прежний острый клин.

Пирамида v0.040 — по снимку ромба видов: «в пустое место перемести вращение и сбоку от него также ромбом ×2; поменяй местами то, что в центре, с кнопкой перемещения всего меню». ⟳ вращение встало в пустой ромбик ромба видов, ×N — ромбиком рядом с ним, в нижнем левом углу. Ручка ⋮⋮ (перетащить всё) теперь в центре ромба, а ⌖ — на её прежнем месте. Наверху посередине кнопок больше нет; ⟳ и ×N мигают прямо в ромбе, пока пирамида крутится.

Пирамида v0.039 — по снимку «10 ×10,000»: «так бегунок не схватить; число с засечкой — под ползунком всегда; и ползунки увеличь на 50 %». Числа шкалы закрывали ромб-бегунок, и его было не ухватить. Теперь слои идут так: линия, поверх неё числа с засечками, а поверх всего — бегунок; щелчок по числу проходит в ползунок и ставит его в это место. И все ползунки — скорости и в панели — стали в полтора раза крупнее: линия, ромб, стрелки, числа.

Пирамида v0.038 — по снимку «✕ как было»: «отменить (пошагово) и как было». Рядом с «как было» — «↶ отменить»: каждый щелчок возвращает на один шаг назад — убирает последнее отражение, разворачивает переворот, возвращает перетащенную часть, а после «как было» — возвращает всё, что было до него. На компьютере то же делает Ctrl+Z. Помнится до 200 шагов; когда отменять нечего, кнопка бледная.

Пирамида v0.037 — по снимку ромба видов: «повысь размер ромбов до больших». Ромбики видов стали крупнее (46 px вместо 34) и значки в них тоже; весь ромб теперь 144 px, панель на компьютере опущена под него.

Пирамида v0.036 — по снимку шкал скорости: «нет, я о том, что перед линией — числа и засечки, и числа на линии, а не ниже». Числа делений теперь стоят прямо на линии ползунка, поверх неё — линия под числом прерывается, а короткие засечки торчат над и под числом. Под линиями больше нет отдельной строки чисел, и полоса скорости стала ниже.

Пирамида v0.035 — по снимку «⟳ вращение ×2»: «убери прямоугольную рамку». Вокруг кнопок вращения наверху больше нет прямоугольной подложки — висят одни шестигранники.

Пирамида v0.034 — по снимку счёта частей: «это в одну строку под скоростями; деления скоростей покажи прямо на линии ползунка». Счёт (▲ … по слоям … · ◆ … · ▼ …) ушёл из панели в полосу скорости — одной строкой под обоими ползунками; не влезает — обрезается многоточием. Засечки делений скорости теперь пересекают саму линию ползунка, числа — под ней.

Пирамида v0.033 — по снимку группы «отражать, двигать, перевернуть, как было»: «отдели пустотой от меню — как бы два меню друг под другом, но примагничены всегда». Теперь это две отдельные карточки: сверху основное меню, под ним, через небольшой промежуток, карточка действий со щелчком. Тащатся они всегда вместе, за заголовок, и сворачиваются вместе.

Пирамида v0.032 — по снимку кнопки «⧫ бипирамиды»: «здесь две кнопки, одна какая-то включена». Верхняя строка панели теперь выбор из двух: «▲◆ укладка» (тетраэдры и октаэдры, слои 1, 3, 6…) и «⧫ бипирамиды» (ярусы 1, 2, 3…); горит та, что показана сейчас.

Пирамида v0.031 — по снимку «Слоёв 64»: «32 максимум в ползунке, но стрелкой можно довести до 64». Ползунок слоёв теперь идёт от 1 до 32 — на нём проще попасть в нужное число, а стрелка ▸ ведёт дальше, до 64. После 32 бегунок стоит у края, а подпись показывает настоящее число слоёв.

Пирамида v0.030 — по снимку кнопок «⟳ вращение ×178»: «посередине наверху и мигать, когда движение». Вращение и скорость ×N ушли из панели наверх, на середину экрана, и пока пирамида крутится, они мигают — сразу видно, идёт движение или стоит.

Пирамида v0.029 — по снимку кнопки «⧫ бипирамиды»: «на самый верх меню, под заголовком». Переключатель режима теперь первой строкой панели, сразу под «ПИРАМИДА», над ползунками: он меняет всю фигуру, ему место в начале.

Пирамида v0.028 — по снимку кнопок ⟲ ✥ ⇅ ✕: «объедини в группу». Отражать, двигать, перевернуть и «как было» теперь одна группа в общей рамке — всё, что меняет саму пирамиду, в одном месте.

Пирамида v0.027 — по снимку кнопки «📷 снимок»: «к режиму дзен слева, и дзен в ромбо-вид кнопку». Снимок ушёл из панели в правый верхний угол, рядом с ◎ дзен, слева от него. ◎, 📷 и ✥ (сдвиг вида справа посередине) стали ромбами, как кнопки видов. В дзене 📷 остаётся бледным, как ◎, — можно снять кадр, не выходя.

Пирамида v0.026 — по снимку полоски видов: «в ромб по вершинам и сторонам и помести слева вверху». Кнопки видов собраны в ромб из ромбиков: по вершинам — сверху (вверху), ребро (справа), снизу (внизу), сбоку (слева); по сторонам — 3D, грань и ручка ⋮⋮ для перетаскивания; в центре — ⌖ (приближение как было). Ромбики сходятся сторонами вплотную. Ромб стоит в левом верхнем углу, панель на компьютере опущена под него. Следом — «пусть над ползунками появляется, чтобы не дёргались»: кнопки стробоскопа теперь висят над полосой скорости, а не под ней, и ползунки больше не прыгают, когда кнопки появляются или исчезают.

Пирамида v0.025 — по снимку кнопок «◌1571 0,50 …» на медленном участке: «при таких скоростях эффекта нет? зачем они? пусть появляются, только когда что-то есть». Да, там эффекта нет: 1571 положение за круг глаз видит как обычное вращение. Теперь кнопки стробоскопа появляются, только если положений не больше 12 — это примерно от ×32 и выше (у бипирамид — от ×64). На медленных участках строка кнопок исчезает совсем.

Пирамида v0.024 — по снимку кнопок ⟲ отражать / ✥ двигать / ⇅ перевернуть: «нужно отключать всё, чтобы ничего не менять». Повторный щелчок по горящей кнопке режима теперь её гасит. Когда не горит ни одна, щелчки по пирамиде ничего не достраивают, не двигают и не переворачивают — мышь и пальцы только крутят вид, грань под курсором не обводится. Выбор (и «ничего») запоминается.

Пирамида v0.023 — «у бегунков скорости — значения покажи на комп-версии». На компьютере рядом с каждым ромбом скорости теперь едет его значение: у верхнего — ×N (зелёным), у нижнего — точное, до сотых (голубым). На телефоне подписи спрятаны, чтобы не теснить полосу.

Пирамида v0.022 — по снимку полосы скорости во весь экран: «на компе не на всю ширину, а посередине, на 2/3 ширины браузера примерно». На компьютере полоса скорости теперь занимает две трети ширины окна и стоит по центру; на телефоне — как была, во всю ширину.

Пирамида v0.021 — «(верх(окта)низ) — так выровняй края ромбами». Запись скобками, как в Zazerkalius: средняя кнопка — шестигранник с остриями на обе стороны, кнопки слева от неё смотрят остриём влево, справа — вправо, и все сцеплены вплотную. Так у каждой строки оба края — острия наружу, ровно и симметрично. Правило одно на все строки панели, стробоскоп и полоску видов; если строка переносится, каждая её часть выравнивается сама. Следом — «ползунки как у скоростей, числа слева-справа от бегунков и название там же»: у «Слоёв», «Раздвинуть» и «Среза» теперь ромб-бегунок и треугольные стрелки по бокам, а название с числом едут прямо рядом с бегунком — справа от него, у правого края — слева. Отдельных строк-подписей над ползунками больше нет, панель стала ниже.

Пирамида v0.020 — по снимку панели: «сделай перемещаемой, кнопки в стандарте ромбов, как последние правки в Zazerkalius — в стиле, не обязательно точно» и «виды — отдельно кнопки». Панель теперь тащится за заголовок и помнит место; двойной щелчок по заголовку возвращает её на место. Кнопки стали шестигранниками с остриями, как у конуса Zazerkalius: первая в ряду — остриём, следующие — выемкой, и входят друг в друга; нажатая обведена зелёным. Виды (сверху, снизу, сбоку, ребро, грань, 3D) и ⌖ ушли из панели в отдельную полоску вверху посередине — она тоже перетаскивается за ⋮⋮ и помнит место.

Пирамида v0.019 — «на других скоростях тоже надо — пусть при перемещении ползунков для каждого участка найдёт». Кнопки стробоскопа теперь считаются под тот участок, который показывает нижний ползунок: двинул верхний — участок сменился, и под ним свои точки. Ищутся скорости, где поворот за кадр — простая доля трети оборота: целая — пирамида стоит (■), половина — двоится (✶), треть — три положения (△), дальше ◌q — q положений по кругу. Самая простая точка участка идёт с ⟲ и ⟳ по бокам — чуть медленнее и чуть быстрее, чтобы видеть, как вращение меняет сторону; следом ещё до трёх. На медленных участках доли мелкие (сотни положений) — там глаз видит обычное вращение, но точки всё равно показаны.

Пирамида v0.018 — «сделай бегунки ромбами и стрелки из треугольников равнобедренных». Бегунки ползунков скорости теперь ромбы (верхний зелёный, нижний голубой), метки встали точно под их середину. Стрелки ◂ ▸ по бокам — равнобедренные треугольники цвета своего ползунка, при нажатии становятся ярче.

Пирамида v0.017 — вопрос «как скоростями поймать момент, когда кажется, что крутится в одну сторону, а потом в другую; есть ли частота стояния» и следом «просто кнопки такие под ползунками, сразу показать». Пирамида поворачивается шагом за кадр (0,004 × скорость), а совпадает сама с собой через треть оборота — поэтому при ×523,6 каждый кадр она встаёт ровно туда же и кажется неподвижной. Под ползунками теперь строка кнопок: ■ 523,6 — стоит; ⟲ 523,1 — медленно назад; ⟳ 524,1 — медленно вперёд; ✶ 261,8 — двоится (две картинки чередуются); △ 174,5 — три положения по кругу. В режиме бипирамид набор свой, от ×785,4 (пол-оборота). Шаг привязан к кадру, поэтому стояние точное на любом мониторе.

Пирамида v0.016 — «в режиме без радуги нужен выбор цвета». Когда ◐ цвет выключен, рядом с кнопкой появляется квадратик цвета: щелчок — и выбираешь любой. В него красятся и грани, и рёбра; прежде без радуги всё было одним светлым. Выбор запоминается.

Пирамида v0.015 — «кнопка дзен — отдельно от всех, вверху справа; и кнопку справа посередине по вертикали — нажал и повёл, двигает всё». ◎ дзен переехал из панели в правый верхний угол и стоит сам по себе; в дзене он остаётся бледным, и нажатие на него выводит обратно (долгое нажатие и Esc тоже работают). У правого края посередине высоты — ✥: нажми и веди, и сдвигается весь вид, как правой кнопкой мыши. В дзене ✥ спрятан.

Пирамида v0.014 — «у ползунков скоростей с боков стрелки». По краям обоих ползунков скорости — ◂ и ▸. Верхние переводят на соседнюю метку (вдвое медленнее или быстрее), нижние двигают на сотую часть промежутка между метками. Если держать стрелку, шаги повторяются.

Пирамида v0.013 — «ещё режим би-три-рамиды — в каждом ярусе плюс одна». Кнопка ⧫ переключает пирамиду на ярусы треугольных бипирамид — два правильных тетраэдра основанием к основанию, остриё вверх и остриё вниз. Сверху одна, под ней две, под ними три — и так до 64 ярусов, цвет по ярусу. Сбоку это стопка ромбов 1, 2, 3…: соседи в ярусе касаются уголками треугольника-зеркала, ярус с ярусом — тоже в одной точке, не пересекаясь. Целыми гранями одинаковые бипирамиды друг к другу не встают (об этом было ещё в v0.001), поэтому касание здесь — точками. Раздвинуть, срез, грани/рёбра/цвет, виды, отражать, двигать и переворачивать — всё работает и тут; сдвинутая бипирамида защёлкивается в узел ярусов. При переключении режима достроенное убирается.

Пирамида v0.012 — «убери выделения текста; под ползунком скорости ещё один — от и до между текущими метками скорости». Текст на странице больше не выделяется — ни мышью, ни долгим нажатием на телефоне (оно теперь только выводит из дзен). Под полосой скорости — второй, голубой ползунок: он идёт ровно, без степеней, от метки слева от текущей скорости до метки справа (скорость ×3 — от 2 до 4, ×700 — от 512 до 1024), с метками на концах и четвертях. Пока его тянешь, промежуток не прыгает; меняется он, когда двигаешь верхний ползунок, жмёшь ×N или метку сверху.

Пирамида v0.011 — «кнопка дзен и выход по долгому нажатию; картинку — так, как видно на скорости; ×1024; ползунок на всю ширину экрана, плавный, но с метками». ◎ дзен прячет панель и полосу скорости, остаётся одна пирамида; выход — долгое нажатие на ней (0,6 с, не двигая) или Esc. Скорость теперь — полоса внизу во всю ширину: ползунок плавный, но идёт по степеням двойки, поэтому метки ¼ ½ 1 2 4 … 1024 стоят на равных расстояниях; у меток он чуть прилипает, а щелчок по метке сразу ставит её скорость. Кнопка ×N удваивает до ×1024. Снимок 📷 на вращении складывает 8 последних кадров в один — на большой скорости глаз видит не один кадр, а их наложение, и картинка выходит такой, как видно на экране; без вращения — один кадр, как раньше.

Пирамида v0.010 — «двойной клик — пауза / старт вращения». Двойной щелчок (или двойное касание на телефоне) где угодно на холсте включает и выключает вращение. Чтобы он не путался с одиночным, отражение и переворот по щелчку срабатывают теперь с задержкой 300 мс — если второго щелчка не было. А в режиме ✥ часть снимается с пирамиды только когда её потащили, а не от простого нажатия: иначе двойной щелчок оставлял бы на месте «сдвинутую» часть.

Пирамида v0.009 — «смена вида пусть не останавливает вращение». Кнопки видов (⊤ ⊥ ◁ ◇ ◢ ⬙) больше не выключают ⟳: пирамида плавно встаёт в вид и крутится дальше вокруг вертикали с тем же наклоном; сверху и снизу — вращается на месте.

Пирамида v0.008 — «×512». Кнопка скорости удваивает теперь до ×512 (было до ×32), после ×512 — снова ×¼.

Пирамида v0.007 — «номер версии не видно после заголовка». Номер стоял в правом нижнем углу экрана, а на телефоне с v0.004 был спрятан вовсе. Теперь он в заголовке панели, сразу после «ПИРАМИДА», мелко и серым — виден везде, и в свёрнутой панели тоже.

Пирамида v0.006 — «кнопку скорости — умножает на 2 каждый раз». Рядом с ⟳ — кнопка ×N: каждый щелчок вдвое ускоряет вращение (×1, ×2, ×4 … ×32), после ×32 скорость возвращается к ×¼, чтобы можно было и замедлить. Если вращение было выключено, щелчок по ×N его включает.

Пирамида v0.005 — «а если до 64 слоёв? и возможность отключать цвет, чисто рёбрами, и несколько видов сверху, сбоку, и ещё кнопки». В 64 слоях 45 760 тетраэдров вверх, 43 680 октаэдров и 41 664 тетраэдра вниз — около 700 тысяч граней; прежний холст 2D сортировал каждую грань в каждом кадре и на таком числе встал бы. Поэтому рисует теперь WebGL2: каждая часть — запись в текстуре данных (сдвиг, матрица, цвет), видеокарта собирает её из заготовки. Прозрачность держится тем же «художником», только по частям: части сортируются от дальних к ближним (поразрядно, быстро), внутри части сначала дальние грани, потом ближние. Новые кнопки: ▣ грани, ╱ рёбра, ◐ цвет (выключишь грани и цвет — останутся чистые светлые рёбра); «Срез» — показать один слой; виды ⊤ сверху, ⊥ снизу, ◁ сбоку, ◇ на ребро, ◢ прямо на грань, ⬙ 3D (поворот плавный, вращение останавливается); 📷 — снимок PNG; у ползунков стрелки ◂ ▸. Отражать, двигать и переворачивать можно по-прежнему, на любом числе слоёв.

Пирамида v0.004 — «на мобильном поправь меню, на пол-экрана, всё перекрывает, минимализируй». На узком экране панель была во всю ширину внизу, со словами на кнопках и ползунками друг под другом — закрывала половину пирамиды. Теперь там кнопки только значками (▲ ◆ ▼ ⟳ ⟲ ✥ ⇅ ⌖ ✕; что делает — во всплывающей подсказке), оба ползунка в одну строку, счёт мелким шрифтом, номер версии в углу спрятан. И у заголовка — ▾: сворачивает панель до одной строки «ПИРАМИДА ▸». На телефоне она с самого начала свёрнута, на компьютере открыта; выбор запоминается.

Пирамида v0.003 — «а также переворачивать ромбы и перемещать». Режим щелчка теперь выбирается: «⟲ отражать» (как было), «✥ двигать» — хватаешь любую часть и тащишь в плоскости экрана, отпустил — она защёлкивается: первая вершина встаёт в ближайший узел решётки, где стоят все вершины укладки, поэтому часть снова может сесть грань к грани; «⇅ перевернуть» — щелчок переворачивает часть вверх ногами (поворот на 180° вокруг горизонтали): тетраэдр остриём вверх становится остриём вниз, ровно как в провалах укладки, а октаэдр совпадает сам с собой. Двигать и переворачивать можно и части самой пирамиды — тронутая становится своей копией. «✕ как было» возвращает всё.

Пирамида v0.001 → v0.002 — по снимку пирамиды — «сделай приближение, масштабирование и достройку отражения от любой грани по клику». Колесо мыши или два пальца — ближе и дальше, к точке под курсором; правая кнопка, Shift или два пальца — сдвиг вида. Щелчок по любой грани достраивает зеркальную копию этой части через эту грань: она садится по ту сторону вплотную, грань к грани. По достроенным частям тоже можно щёлкать, и фигура растёт куда угодно; если такая часть на этом месте уже стоит, второй раз она не ставится. Грань под курсором обведена белым. «⌖ вид» — приближение как было, «✕ отражения» — убрать достроенное.

Просмотр GIF v0.001 (новая страница prosmotr/Zerkalius-prosmotr.html) и хаб v0.071 — «нужен GIF-просмотрщик нормальный, чтобы покадрово, через кадр 2, 4, и разные участки выбирать, склеивать». Открыть один или несколько GIF (кнопкой или бросив на страницу) — слева список; листать ◀ ▶ (← →, Shift — по одному кадру), шаг — каждый кадр, через 2, 4, 8, 16, играть ▶ с любой задержкой, назад ⇆, по кругу 🔁, масштаб «вписать» / ×1 … ×8, 🖼 кадр в PNG. «[ с» и «по ]» отмечают участок, «➕ В склейку» кладёт его с выбранным шагом (обратный участок — задом наперёд); справа — склейка: участки из разных GIF, ↑ ↓ ✕, «▶ Смотреть склейку» — в том же просмотре, «💾 Скачать GIF» — одним файлом (кадры разного размера — по центру на чёрном, общая палитра до 256 цветов). Разбор и сборка GIF — свои, без библиотек (LZW, палитры, прозрачность, способы смены кадра, чересстрочность; сборка — тот же LZW, что в Code). Кнопка — в хабе в «Знаке и записях», за Битмультфильмами; _js/hub-link.js знает новую папку prosmotr.

Code 35.105 — «надо прям на холсте выбрать ромб — и скачать все проходы по этому столбу этих ромбов». В ◇ разделе, под 🎞 Ромбами в кино — 🎯 Выбрать ромб: следующий щелчок по холсту переводится в строку и столбец текста по раскладке последнего кадра, находится ромб сетки (шаг — «Шаг» сетки, «авто» — 32), в котором точка, и весь его столбец — ромбы с той же вершиной по столбцу через S строк, касаются вершинами — обводится голубым; в строке состояния — строка, столбец, сдвиг от оси и сколько ромбов в столбе. 🎞 Столб ромбов — все проходы — GIF: волна гонится на копии текста, кадр — проход (шаг — как у 🎞 GIF), в кадре все ромбы столба друг под другом, до повтора текста (не больше 1024 кадров) — на цикле 512 это весь цикл. Под радаром и 3D-вращением выбор не работает; смена шага сетки снимает выбор.

Code 35.104 и Битмультфильмы v0.010 — цикл нашёлся («ура, цикл найден — как теперь всё записать»: 512 строк, период 512, повтор после 129-го прохода), и пользователь прислал два файла: «💾 Данные» (Zerkalius_Data.txt, 512 строк) и «📤 Сцены в файл». Проверено вне страницы (numpy, тот же XOR волны — проход = накопленный XOR строк сверху вниз): текст из «Данных» возвращается к себе ровно через 512 проходов. А в файле сцен — «Мой шедевр» другого размера: 256 строк, цикл 256 после 129-го (проход 17742). Нашлась дыра: файл «💾 Данные» Code обратно не читал — брошенный на холст, он грузился как текст со скобками и кавычками. Теперь processTextData узнаёт этот формат (JSON-массив строк с полем text) и ставит строки как были, строка в строку, с пустыми. Оба файла положены в Битмультфильмы, в «Иероглифы Аниматрицы», ссылками для скачивания.

Code 35.103 — по снимку ◇ сетки на большом треугольнике — «надо ромб 128 добавить, не хватает 64», и следом по снимку столба ромбов на оси — «как вот эти ромбы собрать по очерёдности». В «Шаг» ромбической сетки добавлены 128, 256 и 512 (было 8 … 64); «авто — по проходу» тоже рисует 512 (свой оранжевый); остальное, что берёт шаг (🔤 буквы, 🎞 ромбы в кино, ▶ ромбы-кадры), читает его числом. В 🎞 Ромбах в кино — «ромбы по оси — сверху вниз»: GIF только из ромбов, чья вершина стоит на оси симметрии (строки 0, S, 2S …), по очереди от вершины вниз по столбу, над кадром «ромб по оси i/n · строка r».

Code 35.102 — «надо кадры и в гиф-анимацию», следом «столб надо по горизонтали порубить: берём кадр прогона, режем горизонтально на сколько-то частей, нумеруем, воспроизводим, потом следующий кадр» (про столб по оси, где «целая история» и пингвин). В Аниматрице, над ⧖ Зеркалом — ширина столба (±8 … ±64 столбцов от оси), на сколько частей резать (целиком, 2 … 32) и две кнопки: 🎞 Столб по частям в GIF — части кадра по очереди, 1 (сверху, у вершины) … K, потом следующий кадр, над частью «проход · часть i/K», 0,25 с на часть; ▦ Лист частей — PNG, строка — кадр прохода, в ней пронумерованные части слева направо. Ось — середина первой строки, волна гонится на копии текста тем же правилом, что в 🎞 GIF (холст и счёт не трогаются), следующий кадр — через столько проходов, сколько выбрано у 🎞 GIF, до повтора текста (GIF — не больше 1024 частей всего, лист — не выше ~9000 px). Биты — как на холсте: ◆ ромбы и ◆ вплотную рисуются ромбами (на «все-таки ромбы рулят!»), иначе квадратами; с битами-фигурами без «Фигура 0 / 1» — «1» белым, «0» чёрным на тёмно-сером.

Битмультфильмы v0.009 — «охренеть, тут целая история по вертикальному столбу идёт — пингвин появился»: в «Иероглифах Аниматрицы» — карточка «Столб: пингвин» (stolb-pingvin.png), столб по оси крупно. Столб стоит на оси симметрии кадра, поэтому узор в нём всегда зеркальный — отсюда фигуры и лица.

Битмультфильмы v0.008 — следом пользователь прислал весь кадр (проход 406, кадр GIF): в «Иероглифах Аниматрицы» первой карточкой — «Весь кадр — проход 406» (ieroglify-kadr-406.webp): знаки идут столбиком по оси симметрии через равные промежутки, по бокам — такие же, мельче.

Битмультфильмы v0.007 — «закинь это в битмультфильмы». Пользователь крутил Аниматрицу (Формы: Правило 90, сид 1, 512 строк; ⧖ Зеркало «низ → вверх»; около 406 проходов, повтора нет; биты — ◆ ромбами вплотную) и увидел узоры, похожие на китайские знаки; спросил, есть ли такие. Есть: ряд, две черты и крест — 交 jiāo «пересекаться, обмениваться» (по сути XOR), 父 fù, два креста — 爻 yáo, черта гексаграмм И-цзин; две половины с точками — 兆 zhào, трещины на гадательной кости, «знамение», и рядом 非 «не» и 北 — зеркально. Новый раздел «Иероглифы Аниматрицы» между «Зеркалом» и «Другими треугольниками»: оба снимка (ieroglif-jiao.png, ieroglif-zhao.png, лежат в rezultaty/) с подписями и тем, как узор получить.

Code 35.101 — «перенеси вниз в центр и дай возможность перетаскивать», «не показывает цикл», «а это что за китайские иероглифы в Аниматрице?». Циферблат стоит внизу по центру холста, над строками уведомлений; тянется мышью (место — доли ширины и высоты холста, запоминается, при смене размера окна не уезжает), двойной щелчок — на место; щелчок по нему не ставит паузу. Цикл: на снимке — «пройдено 406 · повтора пока нет» после ⧖ Зеркала: текст стал другим и за 406 проходов не повторился, а длину цикла заранее не узнать — только когда повтор случится; до того циферблат показывает номер прохода и длинную стрелку, подпись теперь «повтора нет», как в строке внизу. «Иероглифы» — не знаки: в тексте только 0, 1 и пробелы; это мелкие куски битовой картинки (ромбы по 8 строк) после XOR-зеркала — узор похож на письмена.

Code 35.100 — «можно прямо на холсте окружность со стрелкой и числом кадра из цикла?». В Аниматрице — галка ⏲ Циферблат цикла на холсте: в правом верхнем углу холста (под увеличением 1·2·4) — окружность с делениями и двумя стрелками («можно две стрелки») — как часы. Кадр — проход волны. Когда повтор найден (🔁 период P), в середине — номер кадра в цикле и «/ P», делений — P (до 128, больше — 12), короткая жёлтая стрелка — (кадр + доля строк, пройденных волной) / P оборота, длинная — оборот за проход, по строкам волны. Пока повтора нет — номер прохода и «цикл ?», видна только длинная. SVG поверх холста, щелчки проходят сквозь; в дзене не показывается, как и увеличение. Номер после 35.99 — 35.100 (у Code номер с сотыми, счёт не обрывается на 99).

Пирамида v0.001 (новая страница oktaedr/Zerkalius-piramida.html) и хаб v0.070 — вопрос «а можно ли вообще расположить единичные [тела] гранями друг к другу так: 1, 2, 3» → «верх, под ней 3, под ней ещё больше, и т. д.», после показа — «в черновики». Одними бипирамидами нельзя: боковые грани у них наклонные, цепочка грань к грани закручивается спиралью, а вокруг ребра пять тетраэдров оставляют щель около 7,4°. Без щелей это делают тетраэдры вместе с октаэдрами: большой тетраэдр режется на тетраэдры остриём вверх — по слоям 1, 3, 6, 10…, — октаэдры между слоями и тетраэдры остриём вниз в провалах, и каждая грань прилегает к грани соседа целиком. На странице пирамиду можно крутить, выбрать число слоёв (1–7), раздвинуть части и спрятать любой вид; тетраэдры вверх раскрашены по слоям цветами нот. Кнопка «Пирамида» — последней в «Черновиках». (Сделано в облачной сессии параллельно с Code 35.8x–35.99 и Zazerkalius v0.40x–v0.440; при слиянии хаб поднят до v0.070.)

Code 35.99 — по снимку экрана (два треугольника сверху, треугольник под стыком) и нумерованной треугольной сетке — «сделай, чтобы можно было вручную и авто двигать вот такое по рёбрам: берём 1 и 3 — зеркало по нижнему ребру и вниз, а 23 как бы ставим на ребро — горизонт 2 выше — и так же вниз зеркало»; на вопрос, как понимать шаг, — «надо разные, все варианты». Под ⧖ Зеркалом — ⟱ Перекат по рёбрам, три варианта: «все вниз» — каждая полоса высотой в треугольник переворачивается через нижнее ребро на полосу ниже, по кругу текста (при высоте ½: 1 и 3 ложатся перевёрнутыми на 22 и 24, а 23, уйдя вниз по кругу, встаёт на место 2 — ровно «на ребро горизонта 2»); «все вниз, XOR» — то же, но отражение ложится на старое по правилу волны; «1, 3, 23 → 22, 24, 2» — только три куска, прочее не трогается. Высота треугольника — ½, ¼, ⅛, 1/16 всех строк. ▶ — шаг вручную, «авто» — шаг каждые 0,15 … 2,5 с (память браузера пишется, когда авто выключили), ↶ — текст, каким он был до первого шага. Геометрия — как у ◇ сетки: вершина — середина первой строки, край — столбец на строку. Меняет сам текст, счёт циклов Аниматрицы начинается заново.

Code 35.98 — по снимку битов ромбами — «как тут у ромбов убрать вообще под 0 отступы?». Ромб ◆ вписан в клетку (ширина символа × межстрочный шаг), и с соседом по диагонали — а в треугольнике Аниматрицы биты стоят именно так, через пробел со сдвигом на полсимвола — сходится только углом: между ромбами щель. В «Биты» добавлено ◆ ромбами вплотную: полудиагонали во всю клетку, ромб вдвое больше — соседи по диагонали сходятся гранью к грани, отступов нет (под радаром — так же, вдвое больше). Соседи в одной строке при этом наезжают друг на друга; прежние ◆ остались как были.

Code 35.97 — «нет, дело не в масштабе, убери всё это новое с масштабом». ⧉ Слои масштаба (35.89, след — 35.96) сняты целиком: группы в 🧬 Слоях больше нет, отрисовка слоями и её память — тоже (ключи zcode_scalelayers_v1 / v2 в браузере просто не читаются). Прочее остаётся: 🔍 Авто-масштаб с ⌖, ⧉ ступени и «100 % =» в плеере, 1·2·4 в углу, щелчок по холсту — пауза масштаба. Прежние версии со слоями — в архиве, 35.89–35.96.

Code 35.96 — по снимку ⧉ Слоёв масштаба — «тут не надо больше 100 %, но надо кадры так, чтобы каждое наложение появлялось тогда, когда настоящий масштаб ушёл». Слои масштаба стали следом: ступени — доли «Масштаба», не больше 100 % (100, 50, 25, 12,5, 6,25, 3,1 — галками, какие оставлять); пока идёт авто-масштаб (или ⧉ ◀ ▶ в плеере), в момент, когда масштаб уходит со ступени, её кадр снимается — отдельной отрисовкой ровно на её масштабе, от вершины, если ⌖, — и остаётся слоем поверх живого кадра; вернулся масштаб на ступень — её слой убирается; прыжок через ступени (новый круг) — след стирается, так же при смене «Масштаба», направления и размера холста. Смешение и 🎨 — как были. Прежний вариант 35.89 (÷4 … ×8 от текущего, все слои живьём каждый кадр) снят. Лишняя отрисовка — одна, в момент ухода со ступени, а не на каждый кадр. Тем же заходом — «щелчок по экрану — остановка, пауза масштаба»: при включённом 🔍 Авто-масштабе щелчок по холсту ставит на паузу и пускает сам масштаб (⏸ / ⏵), плеер при этом идёт; без авто-масштаба щелчок, как прежде, — плеер.

Code 35.95 — по снимку плеера — «включение автомасштаба сюда надо». Кнопка-включатель там была, но одним значком 🔍 — не читалась: теперь подписана «🔍 Авто» (зелёная обводка — включён). Под ней новая строка — всё включение авто-масштаба в плеере: направление (↗ ↔ ↘ ⧉ ∞), ⌖ зум от вершины и 1·2·4 увеличение в углу. Это двойники тех, что в «Виде»: меняются вместе, настройки те же.

Code 35.94 — по двум снимкам: «число крутится тут — это настройка, надо отдельно показать крутящееся» (поле «Сдвиг Слоя 2») и «когда до 100 %, то надо следующий шаг по кругу — смотря как в настройке какое движение: туда-сюда, цикл» (⧉ в плеере). Поле сдвига теперь — только настройка: что вписали, то и стоит (и запоминается); нынешний сдвиг, который меняется на ходу, — рядом подписью «сейчас N». ⧉ ▶ — следующая ступень по направлению из 🔍: «↗ по кругу увеличивать», Квадра, ∞ — вверх, за 100 % снова самая мелкая; «↘ по кругу уменьшать» — вниз, за самой мелкой — 100 %; «↔ туда-сюда» — у края разворот, и дальше в обратную сторону. ◀ — шаг назад по тому же правилу.

Code 35.93 — по снимку Dual Core — «тут наложение слоёв — как задать число строк». Никак: Слой 2 только уезжал на «множитель» строк за каждый шаг плеера, и сколько строк между слоями, нигде не было видно. Теперь под множителем — поле «Сдвиг Слоя 2, строк»: вписали число — Слой 2 встаёт ровно на столько строк от Слоя 1 (от замороженной строки, если ⚓, иначе от текущей), отрицательное — в другую сторону; пока плеер идёт, поле показывает нынешний сдвиг (по кругу текста, от −n/2 до n/2).

Code 35.92 — «пусть где-нибудь в углу, если включена галка такая, показывает текущее увеличение только так: 1, 2, 4, 8» и следом «в дзен-режиме не надо». У 🔍 Авто-масштаба (справа от ⌖) — галка 1·2·4: в правом верхнем углу холста (панель справа — в левом) крупно стоит текущее увеличение — 1 у самой мелкой ступени, дальше 2, 4, 8 …, самое большое — у «Масштаба» (100 %); между ступенями — ближайшая. В дзене не показывается. Галка запоминается.

Code 35.91 — по снимку списка направлений — «так же во всех — максимальный это тот, что вручную стоит; было бы неплохо ещё прямо в плеере ползунок масштаба крутить — максимум задавать». Потолок — ручной «Масштаб» — во всех направлениях был уже с 35.90. Теперь в ▶ Плеере под строкой ⧉ — строка «100% =» с самим ползунком «Масштаб» (двойник того, что в «Виде», ходят вместе; колесо над холстом их тоже двигает) и его числом. Где он стоит — это 100 %. Сдвинули его на паузе — ⧉ остаётся на своей ступени: была 50 % — будет 50 % нового; на ходу авто-масштаб сразу берёт новые пределы.

Code 35.90 — «доходит до 64 и топчется там», потом «я ставлю ползунок на какой-то размер — это 100 %, от него надо считать; про пиксели я не знаю вообще ничего». Масштаб авто-зума и ⧉ теперь считается от ползунка «Масштаб»: где он стоит — это 100 %, ступени вниз вдвое — 50 %, 25 %, 12,5 %, 6,25 %, 3,125 % … (самая мелкая — не мельче одного пикселя). ⧉ в плеере ходит по этим ступеням, число справа — только в процентах; Квадра — по ним же рывками, ↗ ↔ ↘ — от самой мелкой до 100 %, ∞ — от 50 % до 100 %. Подпись «Масштаба» больше не бегает вместе с авто-зумом — там стоит сам ползунок; ⧉ Слои масштаба внизу тоже пишут проценты. Промежуточный вариант того же захода — потолок 4096 px — пользователь отверг («ЗАЧЕМ?»): «Масштаб» и есть потолок.

Code 35.89 — по снимку раздела 🧬 Слои — «нужно наложение масштабов как слои». В 🧬 Слоях под Dual Core — ⧉ Слои масштаба: тот же кадр рисуется сразу на нескольких масштабах — ÷4, ÷2, ×1, ×2, ×4, ×8 от текущего (ползунок «Масштаб», авто-масштаб или ⧉ в плеере; по умолчанию ÷2, ×1, ×2), все от вершины — первая строка с «1» в центре экрана, — и слои складываются: мелкий снизу, крупный сверху. Смешение: «свет» (screen) — слои светятся вместе, «XOR» (difference) — где слои совпали, гаснет, «поверх» — крупный сверху на 50 %. 🎨 — каждый слой умножается на цвет своей кнопки (голубой ÷4, зелёный ÷2, белый ×1, жёлтый ×2, красный ×4, лиловый ×8), чёрное остаётся чёрным. Внизу — масштабы слоёв числом. Вместе с авто-масштабом слои плывут все разом — ромбы разных размеров видны одновременно. Каждый слой — отдельная отрисовка кадра; сдвиг холста и авто-масштаб после кадра — как были.

Code 35.88 — «нужен ползунок, чтобы при стрелке увеличил ×2, потом ещё ×2, и числом, и назад и вперёд — кнопки как в плеере, расположить так же в плеере». В ▶ Плеере под строкой 🔍 — строка ⧉: ◀ — масштаб ÷2, ▶ — ×2 (кнопки того же вида, что шаги плеера), между ними ползунок ступеней 1, 2, 4, 8, 16, 32, 64 px, справа — число. Ступень ставится через авто-масштаб: он включается и встаёт на паузу, поэтому работает ⌖ — зум от вершины, а ползунок «Масштаб» не трогается. ⏵ — масштаб пойдёт дальше от этого кегля, не прыгая (фаза подстраивается под кегль; у ∞ круг начнётся с него). Пока авто-масштаб идёт сам, ползунок и число показывают его ступень. У ползунка нет своих ◂ ▸ — стрелки здесь ◀ ▶.

Code 35.87 — по снимку строки с двумя ползунками (1 и 189) — «че это за числа??? сделай от мини до максимума просто всегда». Ползунков «от» / «до» больше нет: авто-масштаб всегда ходит по всему диапазону ползунка «Масштаб», 1 … 100 px. ⧉ Квадра — 1, 2, 4 … 64 px и снова 1. ∞ — от текущего «Масштаба» до двух таких (от 1 px круг ∞ был бы 1 → 2 px, смотреть нечего); колесо мыши на ходу меняет, откуда он идёт. Старые «от» / «до» из памяти браузера не читаются.

Code 35.86 — по двум снимкам с ◇ сеткой — «Квадра-масштаб сделаем: у нас минимальный ромб 8, потом 16 — так же пусть и масштаб рывками увеличивается». В 🔍 Авто-масштабе направление ⧉ Квадра — рывками ×2: кегль не плывёт, а встаёт ступенями — «от», 2·«от», 4·«от» … пока не больше «до» (ступеней не меньше двух), с последней — снова «от». Ползунок скорости здесь — секунд на ступень. Ромб 8 после рывка встаёт размером прежнего 16, 16 — прежнего 32. Зум идёт от вершины (⌖), без ⌖ — в центр экрана, как у ∞; ⏸ останавливает на ступени.

Code 35.85 — по снимку строки 🔍 Авто-масштаба — «тут бы скролы, два в одну строку». Пределы «от» и «до» теперь не поля с цифрами, а два ползунка в одну строку под галкой (1–200 px), число — справа от каждого; масштаб подхватывает их на ходу. В первой строке остались 🔍, ⏸ и ⌖.

Code 35.84 — «так это не бесконечность: увеличивается до макс, потом снова в 1 — это не то», «там уже есть нарезка на ромбы разного размера», «как этот масштаб на паузу поставить — дай кнопку». Почему скачок был виден: в 35.81 круг ∞ брался по «до / от» — при «от» 1 это ×32 и больше; и даже при ×2 кадр Аниматрицы повторяет себя лишь примерно, а символы на круге вдвое мельчают. Теперь ∞ — всегда ×2 (от «от» до двух «от», «до» не участвует), и шов закрыт наплывом: во второй половине круга поверх кадра проявляется тот же вид на кегле, с которого начнётся следующий круг, к концу круга виден только он — круг замыкается кадр в кадр. Так же — у «↗ / ↘ по кругу» (наплыв на «от» / «до»); «туда-сюда» шва не имеет. С ◇ ромбической сеткой это и есть бесконечная нарезка: крупные ромбы растут, из них проступают вдвое мельче. Наплыв — два кадра на экранный кадр только во второй половине круга. ⏸ пауза масштаба — в плеере рядом с 🔍 и в «Виде» рядом с «до»: кегль стоит, плеер и Аниматрица идут дальше, ⏵ — масштаб снова пошёл; включение и выключение 🔍 паузу снимают.

Code 35.83 — по снимку окна ▶ Плеер — «сюда надо вынести кнопку и ползунок автозума». Под скоростью плеера — строка 🔍 Авто-масштаба: кнопка 🔍 (включить / выключить; пока идёт — зелёная обводка) и ползунок его скорости с подписью в секундах. Это двойники кнопки и ползунка из «Вида»: ходят вместе с ними, настройки те же. Пределы «от» / «до», направление и ⌖ остались в «Виде» — в плеер вынесено только то, что трогают на ходу.

Code 35.82 — «масштаб смотреть должен точку-центр — это 1 строка и в ней всегда 1, и зум от неё делать при любом повороте». В 🔍 Авто-масштабе галка ⌖ (справа от «до», включена): вершина текста — первый непробельный символ первой строки, та самая одна «1» — стоит в центре экрана, и масштаб идёт от неё. «При любом повороте»: пока ⌖ стоит, барабан строк при Play картину не сдвигает (первая строка держится посередине, строки не скользят), под радаром вершина — на первом, внутреннем кольце, и сдвиг берёт её угол с учётом 3D-вращения — радар крутится вокруг неё. Сдвиг считается каждый кадр по той же раскладке, что рисует текст (по центру / влево / вправо). Сняли ⌖ или выключили авто-масштаб — кадр пересчитывается ещё раз на кегле ползунка, барабан ставится туда же, где его держал ⌖, и картина не прыгает. На снимках 35.81 центр — как раз вершина: над ней по кругу видны последние строки текста (два треугольника), под ней — сам треугольник от первой строки.

Code 35.81 — по трём снимкам одного и того же треугольника на разном масштабе — «а что если увеличивать масштаб и аниматрицу», «постоянно увеличивать весь цикл». В 🔍 Авто-масштабе новое направление — ∞ бесконечно увеличивать. Прежнее «↗ по кругу» шло от «от» до «до» (8 → 40, в 5 раз) и прыжком назад — прыжок виден. Здесь за круг масштаб растёт ровно в степень двойки (×2, или ×4, ×8 — ближайшая к «до / от»), а треугольник Серпинского, как и кадры Аниматрицы, при ×2 повторяет сам себя — возврат к «от» глазу не заметен, и масштаб растёт весь цикл не останавливаясь. Увеличение идёт в центр экрана, а не в середину текста: сдвиг холста растёт вместе с кеглем, на круге падает вместе с ним, и точка под центром стоит на месте. Поэтому нужную точку — вершину или стык трёх треугольников, как на снимках, — достаточно перетащить в центр. Включение и выключение не сдвигают картину. Остальные направления не менялись.

Code 35.80 — «вместо 1 и 0 белые и чёрные квадраты… и ромбы» и «скорость масштаба увеличь». В «Виде» — Биты: цифрами / ■ квадратами / ◆ ромбами: «1» рисуется белой клеткой, «0» — чёрной (с галкой «Фигура 0 / 1» в «Цвете» — её цветами); квадрат занимает всю клетку — ширину символа × межстрочный шаг, с запасом в полпикселя, чтобы между клетками не было щелей; ромб вписан в клетку вершинами в середины её сторон. Под радаром — квадрат или ромб повёрнут вдоль кольца, как был повёрнут символ. Остальные символы остаются буквами; яркость Δ и «Скрыть статику» работают как прежде. Чёрный «0» на чёрном фоне холста не виден — для него «Фон холста» в «Цвете». Окно ▶ Ромбы-кадры при битах фигурами тоже рисует «0» чёрным и «1» белым. Авто-масштаб: ползунок стал скоростью (вправо — быстрее) и идёт по степени от 60 до 0,05 с на путь «от → до» — до 35.80 самое быстрое было 0,5 с; подпись по-прежнему в секундах. Настройки авто-масштаба записаны под новым ключом — прежние секунды иначе прочлись бы как деления скорости.

Code 35.79 — «туда-сюда менять масштаб при аниматрице и просто при статике: задаю пределы масштаба, направление — по кругу увеличивать, туда-сюда, по кругу уменьшать… и скорость». В «Виде» под «Масштабом» — 🔍 Авто-масштаб: «от» и «до» в px, направление (↗ по кругу увеличивать — дошёл до «до» и прыжком к «от»; ↔ туда-сюда — разворот на краях; ↘ по кругу уменьшать) и ползунок скорости — секунд на путь от «от» до «до». Прежнее 🫁 Дыхание (в «Движении») этого не давало: у него ни пределов, ни направления, и оно живёт только при идущем плеере. Кегль идёт по степени (px = от · (до/от)^t), а не ровным шагом: на мелком масштабе 1 px — это уже скачок в разы, на крупном — незаметно, по степени движение выглядит ровным. Кегль дробный и живёт только в отрисовке — ползунок «Масштаб» не трогается, выключили — вернулся его масштаб; включение стартует с текущего масштаба, если он внутри пределов, без скачка. На стоящем холсте у авто-масштаба свой таймер кадров; при идущем плеере рисует плеер — кадр на каждый экранный кадр, как у Дыхания. Настройки и галка переживают F5 (своя запись в памяти браузера, отдельно от снимка сессии и ★-сцен).

Code 35.78 — «Исследование», раздел 5 (проход 155 с красными линиями через 32 строки): «Ромбы-„кадры“ — как их построчно прогнать на разной скорости, надо прямо в Code». До этого ромбы сетки можно было только скачать GIF-ом (🎞 Ромбы в кино, 📦 Все ромбы цикла) — вживую их не было видно. В «Виде» под 📦 — кнопка ▶ Ромбы-кадры вживую — по рядам: окно поверх холста (тянется за шапку). «По рядам»: строка окна — ряд ромбов сетки, тот самый ряд между красными линиями (ряд e — e + 1 ромб, на сцене «1» при шаге 32 это 1, 2 … 6 — всего 21); каждый ряд листает свои ромбы слева направо по кругу, со своей скоростью. Скорости: «одна» — все ×1; «круг вместе» — ряд с меньшим числом ромбов медленнее, все ряды замыкают круг разом; «ниже медленнее» ×(e + 1) и «ниже быстрее». Сверх этого щелчок по ряду — вдвое медленнее, правый щелчок — вдвое быстрее (от ×1/16 до ×16), ⟲ — всё с начала и ×1. «Подряд» — один ромб, все ромбы кадра ряд за рядом, как GIF «ромбы кадра подряд», но вживую. Мс на кадр — ползунком (20…2000). Ромбы режутся из текста на каждом кадре окна тем же способом, что у ◇ сетки (вершина — середина первой строки, шаг сетки, «авто» — 32), поэтому при идущей Аниматрице они меняются вместе с волной; текст, холст и счёт Аниматрицы окно не трогает. Как понят «построчно на разной скорости» — ряды ромбов, каждый со своей скоростью; если имелось другое (например, сами строки текста), — переделать.

Гранидус v0.068 и Zazerkalius v0.439 — по снимкам окна «◆ Гранидус»: голубая черта слева вверху, раздел «Вид», ушедший за правый край, и полоса «⇄ строки → грани | ↗» — «и это тоже ненужная полоса». В окне Zazerkalius у Гранидуса больше нет боковых панелей: v0.067 снял только магнит, а сами панели остались, и голубая черта была левой из них. Теперь все разделы плавающие: те, что лежали в панелях (по умолчанию или в старой раскладке), встают столбиками — левой панели от левого края, правой от правого, не влезает по высоте — следующий столбик; через мгновение столбики выравниваются ещё раз по окончательной высоте. Плавающий раздел целиком в окне по ширине — за правый край не уходит, и при сужении окна тоже. Узкого режима (листа снизу, ⚙) в окне Zazerkalius нет — окно почти всегда уже 720 px; стили узкого режима отнесены только к отдельной странице (:where(html:not(.zzemb)) — сила правил та же). В Zazerkalius кнопки «⇄ строки → грани» и «↗» переехали в шапку окна «◆ Гранидус», перед ⛶; полосы под шапкой нет — место Гранидусу. Проверено в безголовом Chrome с чистой памятью: панели пусты, шесть разделов плавают в окне 700 px, ошибок нет.

Гранидус v0.067 — по снимку окна «◆ Гранидус» в Zazerkalius — «тут окна закрепляются ещё и справа, слева — два поля есть невидимых, убери их». В окне Zazerkalius (?zz) у краёв больше нет полос магнита, которые забирали отпущенный раздел в левую или правую панель: раздел остаётся плавающим там, где его отпустили, и прилипает только к соседним разделам и краям окна. Отдельная страница Гранидуса — как была.

Zazerkalius v0.438 — по снимку развёртки Зеркалидуса с Серпинским — «добавь свою развёртку: из имеющихся создаёт копию, потом при клике по треугольнику просто копирует его по всем трём граням — зеркалит; если по грани ткнуть — по этой грани зеркалит». В «✦ Развёртке» — кнопка + своя: копия выбранного варианта (обычного или своего) становится своей развёрткой — миниатюрой в пунктирной рамке после шести обычных. На ней щелчок по треугольнику кладёт его зеркала через все три ребра (туда, где пусто), щелчок у ребра — зеркало только через это ребро, правый щелчок — убирает треугольник. Зеркало через основание меняет род грани — верхняя (голубая, биты как есть) ↔ нижняя (золотая, биты инвертированы), как U0 ↔ D0 через экватор; через боковое ребро род тот же, как U0 ↔ U1. Биты строк ложатся зеркально — узор (Серпинский и любой другой) отражается. Правый щелчок по миниатюре своей — удалить её. Осей и креста центра у своей нет; развёртка сама вписывается в окно.

Zazerkalius v0.437 — «△ Сетка»: «дать выбирать цвет обводки каждой группе, и внутри неё сетку или нет, и сетку вне групп», «ставить буквы-символы на группы», «сделай сетку сразу на всё окно», «и масштаб до реального менять», «ставить светящиеся точки в узлы — с диаметром задаваемым», «рисовать чисто обводкой разного цвета». Сетка теперь на всё окно: рядов и треугольников в ряду — сколько влезает (поля «ряды / в ряду» и ручка снизу сняты — рядов больше, если окно выше); 🔍 масштаб — от настоящего размера (1:1, два ряда = кнопка 24 px) до крупного. Группа — касающиеся треугольники одного цвета; ☝ (или Alt + щелчок) выбирает её, и появляется строка «группа»: своя обводка, ▦ внутри — сетка между её треугольниками, символ посередине (буква, знак), ↺ — снять своё. Настройки лежат на самих треугольниках и едут в сцены. ▦ вне групп — бледная сетка пустых треугольников (выключить — пусто). ✦ — светящаяся точка в узел (вершину) сетки, диаметр ⌀; ╱ — линия по рёбрам сетки, щелчком и протяжкой, толщина ═; цвет у обоих — из палитры, пока инструмент горит; тот же цвет ещё раз или правый щелчок — убрать. Размеры точек и линий — в пикселях настоящего размера. Живой вид показывает только занятую часть сетки — с группами, символами, линиями и точками. «⧉ в буфер» пишет и группы со своими настройками, точки (линия:узел) и линии (узел–узел).

Zazerkalius v0.436 — «обводка и фон — в построении, а не только в результате, и там удалять линии обводки; обводка по группам — сразу все касающиеся одного цвета треугольники обводит только граничной рамкой». Фон и обводка «△ Сетки» (строка над сеткой) теперь общие для сетки построения и живого вида. В сетке закрашенные треугольники — без своих линий, обводка по режиму: ▵ каждый — все рёбра (и пунктир средней черты); ⬡ по группам — только граница каждой группы касающихся треугольников одного цвета, линией потолще; без обводки — ни одной линии. Пустые треугольники остаются бледной сеткой — видно, куда щёлкать.

Zazerkalius v0.435 — по снимку низа «△ Сетки» — «тянуть за границу вниз-вверх — ± число строк». Под последним рядом — полоса-ручка (две черты); над ней курсор ↕, и её можно тянуть: рядов становится столько, сколько целых рядов до мыши (1–12). Закраска ушедших рядов не стирается — вернёшь ряды, вернётся и она.

Zazerkalius v0.434 — «надо только реальный размер показать, также менять фон, и обводку — цвет и, возможно, отключать её», «также границы по группам цветов». Живой вид «△ Сетки» — только в настоящем размере (×2 убран). Над ним: фон и обводка — поля цвета; кнопка режима обводки по кругу: ▵ каждый треугольник → ⬡ по группам (только рёбра, за которыми другой цвет или пусто, — контур каждой группы одного цвета) → без обводки; ↺ — фон и обводку как были (по теме). Обводка рисуется поверх заливки.

Zazerkalius v0.433 — по снимку «△ Сетки» со сценой 2 — «можно сразу вживую смотреть, как будет выглядеть?». Под сеткой — живой вид: та же сетка кнопками, в настоящем размере (два ряда — 24 px, как у кнопок групп) и вдвое крупнее, на фоне панели групп. Пустые треугольники — фон, закрашенные — цветом кнопки: серый — светлая кнопка, золотой — горящая, красный — как стрелка-стоп, остальные — их цвет, приглушённый так же; внутри — бледная сетка, как в кнопках. Меняется сразу, пока красишь, и при открытии сцены.

Zazerkalius v0.432 — «сделай окно с этими треугольниками, чтобы можно было там сделать сцены: выделяю цветом какие-то, сохраняю сцену 1, потом 2…» (после разговора, что значит «))» в ряду «Звука»). Новое окно △ Сетка (кнопкой в шапке, за Развёрткой): ряды равносторонних треугольников, как в кнопках — ряд в полвысоты кнопки, два ряда — кнопка, их средняя черта пунктиром; по умолчанию 2 ряда по 25. Цвет — из восьми (серый, золотой, красный, голубой, розовый, зелёный, сиреневый, белый) и ластик ⌫; щелчок красит, тот же цвет ещё раз или правый щелчок — стирает, протяжкой — много разом. Номера треугольников (№) — по рядам с 1. «+ сцена» — сохранить новой (1, 2, …), «💾 в N» — перезаписать выбранную, щелчок по номеру — открыть, правый — удалить. «⧉ в буфер» — все сцены текстом: по цветам номера треугольников — чтобы вставить в сообщение и показать, как должно быть. Сцены хранятся с остальными настройками страницы.

Zazerkalius v0.431 — «последняя нажатая кнопка двойная — цвет забирает». Стрелка направления — это и есть последняя нажатая стрелка — снова двойная «))» (как в v0.429) и горит; во время игры она с ❙ в ◆ одного цвета и мигает. Нажатая красная (стоп во время игры) тоже становится последней нажатой: звук встаёт, направление переходит на неё — она двойная и горит, следующий ⏵ играет в её сторону.

Zazerkalius v0.430 — «начало: тишина, стрелка вправо горит одна, в середине значок плей (ноту убери); нажать плей — стрелка и плей объединятся цветом и станут !) — вертикальная палка и стрелка, типа пауза со стрелкой; нажать на них — пауза» и «при плее другая стрелка становится красной — это стоп». Ряд «Звука» теперь: стоп — горит одна стрелка направления (одинарная, двойная «))» из v0.429 снята), в ◆ — ⏵, щелчок по ◆ — играть сразу, с того же места, в сторону горящей стрелки; стрелки на стопе — шаг. Играет — в ◆ вертикальная черта ❙, ◆ и стрелка направления одного цвета и мигают вместе («!)» — пауза со стрелкой); щелчок по любой из них — пауза; другая стрелка — красная, щелчок — стоп (место то же). Пауза — ⏸, горит; стрелка — играть в её сторону, ◆ — стоп. Значок ◆ на стопе — ⏵, а не ▶: по ▶ код узнаёт кнопку-стрелку и сделал бы ◆ стрелкой.

Zazerkalius v0.429 — «стрелку, что нажата последней, дополни — будет две стрелки „))“, и обе мигают фоном», «убери пробел между левой стрелкой — вплотную её к стопу». Широкая стрелка направления (5t) теперь читается как две стрелки по 4 треугольника: вторая остриём в выемке первой, по стыку — черта цветом панели; пока звук играет, мигают обе (черта остаётся поверх мигания). Пробел между ◀ и ◆: соседняя кнопка заходит в выемку правилом «кнопка сцепки + кнопка сцепки», а между ◀ и ◆ в разметке стоит спрятанная ♫ — правило не срабатывало, ◆ стояла на глубину острия правее. Теперь «каждая следующая кнопка сцепки» — спрятанные не мешают. Заодно правило пользователя: всё по горизонтали — только из сетки треугольников (шаг t = s / 2 ≈ 6,93 px), никаких других размеров и отступов; на остальные группы — после его «да».

Zazerkalius v0.428 — «(стрелка) не мигает». Мигание делалось анимацией цвета фона, а у стрелки направления фон задан правилом «включённая — золотая» с !important — такое правило сильнее анимации, и она не была видна (у ◆ прежде так же). Теперь мигает отдельный золотой слой поверх фона (под значком и сеткой, по форме кнопки) — с фоном не спорит.

Zazerkalius v0.427 — «стрелка мигать должна фоном». Пока звук играет, фоном мигает стрелка текущего направления (◀ или ▶); ◆ не мигает — горит (играет или пауза) и показывает состояние значком.

Zazerkalius v0.426 — «(!Стоп) — стрелка 4 треугольника, ромб 2 и снова стрелка 4, итого 10». Кнопка ◆ Стоп — не ромб из двух треугольников (v0.425 так понял «!»), а из десяти, k = 3, как на рисунке «()()()»: «(» — острие-стрелка из четырёх, «!» — ромб из двух посередине, «)» — стрелка из четырёх (≈ 41,6 px). Значок в ней снова обычного размера.

Zazerkalius v0.425 — «( ( (!Стоп) ) )» (скобка — стрелка, «!» — ромб из двух треугольников, пробел отделяет кнопки), «стоп — выполняет стоп и паузу; при стопе стрелки — шаг, при паузе — плей; пауза — нажать — стоп, ничего не меняется; плей не нужен», «стоп смещается в сторону другой стрелки, а текущая нажатая стрелка расширяется», «как запустить из стопа — поставить паузу». Ряд «Звука» — ◀ ◆ ▶: кнопка ♫ убрана; ◆ — ромб из двух треугольников, показывает состояние (■ стоп, ⏸ пауза — горит, ♫ играет — мигает). ◆: играет → пауза, пауза → стоп (место то же), стоп → пауза. Стрелки: стоп — шаг в свою сторону (стоп остаётся), пауза — играть в свою сторону, играет — играть в свою сторону. Стрелка текущего направления шире (≈ 35 px вместо 21), ◆ от этого сдвигается к другой.

Zazerkalius v0.424 — «границы не делай, фоном подсветку меняй». У кнопок сцепки («Звук») больше нет ни контура, ни скосов — только заливка (через одну темнее и светлее) и сетка треугольников. Состояние — заливкой: наведение — сиреневая, включённая — золотая, пока звук играет — заливка мигает (вместо мигающей рамки).

Zazerkalius v0.423 — по рисунку «(стоп) = ()()(), 10 треугольников» — «тут правильно, а на странице». Внутри кнопок сцепки теперь видны сами треугольники, как на рисунке: тонкая сетка — средняя черта и косые под ±60° через каждую вершину на средней черте, от острия или выемки кнопки. Рисуется картинкой SVG пятым слоем фона, рамка кнопки её обрезает; ставит joinTag при каждой раскладке. И «на странице длинная какая-то СТОП»: ■ получала ширину обычной кнопки (99 px) и выходила ≈ 97 px — теперь длина задана прямо, data-k="3": ()()(), 10 треугольников, ≈ 41,6 px, как на рисунке. Сетка в стрелках строилась до того, как стрелка получала свою ширину, и выходила сжатой — исправлено. И «звук — уменьши длину, оставь там только символ, без текста»: на кнопке только ♫ / ⏸ / ⏯ (слова — в подсказке), длина data-k="2" — ≈ 34,6 px.

Zazerkalius v0.422 — «(стоп) — из скольких собран так: ()()()?» (ответ: не из целых — ≈ 3,5 треугольника по ряду; «()()()» — длина k = 3) → «2 — подгони все под целые треугольники». Кнопки сцепки теперь длиной в целое число треугольников: в глубинах острия — чётное у кнопок с концами одного рода (остриё–остриё: k треугольников по ряду, 4k − 2 всего), нечётное у кнопок «остриё–выемка», как стрелка; берётся ближайшее к прежней ширине. «Звук»: ■ — ()()(), k = 3, 10 треугольников (≈ 41,6 px), «звук» — ≈ 104 px, стрелки — по 4.

Zazerkalius v0.421 — по снимку ряда «Звука» — «без пробелов соедини, различи фоном». Кнопки сцепки встают остриём ровно в выемку (прежде оставался волосок в 2 px — он и читался пробелом), а различаются фоном: через одну светлее. Выключенная кнопка в сцепке (■, пока звук не идёт) больше не полупрозрачная — на её месте была как будто дыра; теперь бледная только надпись.

Zazerkalius v0.420 — «( — это 4 треугольника, не удлинённая, по минимальной длине». Стрелки в сцепке (◀ и ▶ «Звука») — шеврон ровно из четырёх треугольников минимальной длины: ширина — три глубины острия (≈ 20,8 px при высоте 24), а не всё место полкнопки. Остриё и выемка — прежние, соседние кнопки встают к ним вплотную.

Zazerkalius v0.419 — «)( )звук((Стоп)) — вот так буду обозначать», «((звук((Стоп)) — да». Сцепка: кнопки ряда стоят вплотную, остриё одной входит в выемку соседней (между ними волосок). Запись краёв — скобками, по знаку на край слева направо: «(» — край острием влево (у левой кнопки на нём выемка, у правой — остриё), «)» — острием вправо. Остриё 120°, глубина — как у кнопок из треугольников. Первая — строка «Звука»: ◀ звук ■ ▶ = «((())» — стрелка ◀ с выемкой, в неё входит «звук», в его выемку — ■ Стоп, остриё Стопа — в выемку ▶. Стрелки в сцепке без знака. Другие ряды — так же, одной записью у блока (data-ends).

Zazerkalius v0.418 — по снимку «◀ ⏯ дальше ■ ▶» — «устрани пробелы, соедини… стоп, сделай: добавь слева два треугольника». Горизонтальные стрелки — шеврон уже из шести треугольников: два добавлены со стороны выемки (у ▶ — слева, у ◀ — справа), стрелка длиннее (≈ 35 px вместо 21) и ближе к соседней кнопке. ▲ ▼ — по-прежнему из четырёх: шесть по высоте кнопки не влезают.

Zazerkalius v0.417 — по снимку шеврона со знаком ▶ внутри — «теперь значки им не нужны». У кнопок-стрелок (шевронов из четырёх треугольников) знак стрелки больше не виден: форма и есть стрелка. Сам символ в кнопке остался (прозрачным) — по нему кнопка узнаётся как стрелка нужной стороны.

Zazerkalius v0.416 — по снимку развёртки Зеркалидуса — «попробуем кнопки собирать из таких: вот стрелки, одна стрелка из 4 треугольников, края кнопок такие же», «скосы под 120, остриё тупое, 120», «цельные треугольники». Кнопки групп — из целых равносторонних треугольников: высота кнопки — два ряда по полвысоты, сторона ≈ 13,9 px при 24. Кнопка — полоса треугольников с остриём 120° на концах (все углы 120°), длина — сколько целых треугольников влезает в её ширину, по центру (у «одной» в 99 px — 7 треугольников по средней черте). Стрелка ◀ ▶ ▲ ▼ — шеврон ровно из четырёх треугольников, как на развёртке: остриё 120° в сторону стрелки, с другой стороны выемка, по центру своего места. Размеры считает rhombTag для каждой кнопки. Прежде (v0.401–v0.404) — острия 90° и четверти креста.

Zazerkalius v0.415 — по снимку «◯ Конус» — «за заголовком текст какой-то, подвинь его вправо». Строка 3D-вида конуса («поворот · наклон · высота») рисовалась в левом углу холста — под заголовком окна. Теперь она начинается сразу за заголовком; на странице одного конуса (без шапки окна) — у края, как было.

Zazerkalius v0.414 — по снимку «⏺» в шапке — «видео, дубль вверху — удалить». Общая кнопка записи с выбором окна (v0.268: поле строк, конус, вид, пирамида) из шапки убрана (скрыта); у конуса запись — своими кнопками, как была. Код записи остался — запись поля строк, вида и пирамиды вернётся вместе с кнопкой, если понадобится.

Zazerkalius v0.413 — по снимку страницы «◯ Конус» (?solo=cone) — «у конуса убери вверху отдельное какое-то поле». Полосы кнопок со своей чертой снизу больше нет: холст конуса — на всю страницу от самого верха, группы кнопок лежат поверх него, как в окне конуса на общей странице. Пустые места между группами мышь пропускают к конусу — крутить можно и там.

Zazerkalius v0.412 — по снимку «⇆ поле справа» — «строки — слева». Кнопка говорит о строках и о том, куда их переставит щелчок: пока строки справа — «⇆ строки слева», пока слева — «⇆ строки справа». Горит, как прежде, пока строки справа.

Zazerkalius v0.411 — по снимку «✎ Правка» — «убери». Кнопки режима правки панелей в шапке больше нет (скрыта). Сам режим в коде остался: свои названия и места кнопок, сделанные в нём раньше, держатся; вернуть кнопку — снять одно правило CSS.

Гранидус v0.066 — по снимку «⌖ Вид сверху» — «это лишняя». Кнопки больше нет: она ставила не вид сверху, а наискосок (поворот 0,6, наклон −0,42), а настоящий вид сверху — картинка «сверху» в розе видов. Из методички строка убрана.

Гранидус v0.065 — «подсветку граней — откл (вкл)». В «Картине» — кнопка ▰ Подсветка граней (по умолчанию вкл, помнится): полупрозрачная заливка граней цветом верха и низа (в раскраске «каждая своим» — цветом грани) и внутреннего основания. Выключишь — грани прозрачные, тело — одни рёбра и биты.

Гранидус v0.064 — по снимку светящейся головки ноты на нуле — «пусть на нулях не светится, а бледным будет». Головка ноты (бит, который сейчас читает нота) на 1 горит, как прежде, со свечением; на 0 — бледная (около четверти яркости), без свечения: на нуле нота молчит, и головка теперь это и показывает.

Zazerkalius v0.410 — по снимкам «✦ развёртка» и шапки с «◆ Гранидус», «◯ Конус» — «сюда». Окно развёртки теперь закреплённой кнопкой в шапке, сразу за Гранидусом (у кого Гранидуса в шапке нет — в конце); добавляется один раз, открепишь правым щелчком — само не вернётся. Кнопка «✦ развёртка» в окне Гранидуса убрана. Кнопки окон в шапке теперь достают окно и из списка окон слева (при «⇆ поле справа»), прежде свёрнутое туда окно они не показывали.

Гранидус v0.063 — по снимкам «Вида» и «Цветов» — «это в Картину всё», «туда же». В раздел 🎲 Картина переехали: 01 Биты, ⠿ Точки, □ △ ▷ Клетки, ◇ Рёбра, △ Скрытые рёбра, ползунки «Размер цифр» и «Свечение бит» и всё из «Цветов» (схема 🎨 и цвета 0 и 1). Раздела «Цвета» больше нет. В «Виде» остались стороны света, оси, «⌖ Вид сверху», виды картинками, «◭ Грань» и счёт совпадений; вращение — своим разделом (v0.060).

Гранидус v0.062 — по снимку пунктирного прямоугольника в окне — «эти поля убери». Это пустая боковая панель: она проступала пунктиром всё время перетаскивания раздела, а если мышь отпустили за рамкой (в Зазеркалиусе), Гранидус конца перетаскивания не узнавал, и поле так и висело. Теперь пустая панель появляется только когда магнит указывает на неё (светится), а перетаскивание кончается само, если кнопка мыши уже отпущена, ушли из окна или окно потеряло фокус.

Zazerkalius v0.409 — «клик вне поля окна — скролл листает окна». Колесо над окном, в котором ещё не щёлкнули, больше не масштабирует его холст, а листает стол с окнами; щёлкнул внутри окна — окно активно, колесо в нём как прежде (масштаб конуса, пирамиды, вида). Щелчок вне окон — активного нет, колесо снова листает. Окно Гранидуса — чужая страница в рамке и колесо забирает само, поэтому пока оно не активно, поверх рамки прозрачная крышка: колесо над ней листает стол, первый щелчок её снимает. На странице одного окна (?solo=cone) и в фоне Хаба — как было. Ctrl + колесо не перехватывается.

Гранидус v0.061 — по снимку режима точек (биты — квадратные клетки) — «из треугольников тоже — 2 версии, гориз и верт основания». В «Виде» рядом с «⠿ Точки» — кнопка формы клетки по кругу: □ квадрат (как было), △ треугольник с горизонтальным основанием, остриём к вершине грани, ▷ — с вертикальным основанием, остриём вдоль ряда. Треугольник вписан в прежнюю клетку, поэтому центры бит, наведение и закрепления те же; у нижних граней форма зеркальная сама (грань отсчитывается от своей вершины). Выбор формы включает и режим точек, помнится.

Гранидус v0.060 — по снимку «⟳ Вращение» со скоростью — «отдельное». Вращение и ползунок скорости вынесены из «Вида» в свой раздел ⟳ Вращение (своя вкладка, в окне Зазеркалиуса — ромб ⟳, рамка золотая, как у «Кручения» конуса). Раздел встаёт в левую панель над «Видом»; раскладка у кого сохранена — новый раздел ложится в свою панель, остальные — где были.

Zazerkalius v0.408 — «и развёртку Зеркалидуса». В окне «✦ Развёртка» — кнопки △ Зеркалидус (по умолчанию) и ◇ Октаэдр. Зеркалидус — треугольная пирамида и её зеркало, 6 граней: U0–U2 сверху, D0–D2 снизу. Свои шесть вариантов: А — веер из трёх верхних вокруг T (ровно полкруга), Б — вокруг вершины экватора, В — ромб верх + низ (линия зеркала), Г — ромб из двух верхних, Д — большой треугольник из четырёх граней и две сбоку, Е — лента из шести. Строки поля — так же гранью от вершины, низ инвертирован. Оси считаются по телу: ось — пара вершин с серединой в центре; у Зеркалидуса она одна, Верх–Низ (углы экватора все соседние), вершины без оси — серые точки. Налезаний нет ни в одном варианте (проверено).

Гранидус v0.059 — по снимку «Цвета» над «Нотами» — «верхнюю, если тянуть, — не размагничивай», и по снимку «Вида» с полосами прокрутки — «скролл». Склейка: плавающие разделы, прилипшие снизу к тому, кого тянут (верх ровно на его низу, хоть частью по ширине), и прилипшие уже к ним — цепочкой, едут вместе с ним; тянешь нижний — отрывается, как прежде. Едущие следом магнит не притягивают к самим себе. Прокрутка: сетки видов (роза, грани, ×N) ужимаются по ширине раздела — прежде столбец не бывал уже картинки, и сетка выпирала вбок; у плавающих разделов, как у панелей, полосы прокрутки нет (колесо листает).

Гранидус v0.058 — «также подсчёт всех вершин, граней — какие совпали при виде на меня», «и с осями». Под видами в «Виде» — строка для нынешнего вида, обновляется на ходу, пока тело крутится: вершины всего → различимо; рёбра всего → различимых прямых («торцом» — видны точкой); грани всего → различимо (легла одна на другую — одна; «ребром» — видны линией); оси (с внутренними диагоналями) — сколько торцом и сколько легло на ребро. Считается по линии взгляда, без перспективы, с допуском 0,012 радиуса тела. Пример: Зеркалидус сверху — вершины 5→4, рёбра 9→6, грани 6→3, ось торцом. И по снимку «Картины» — «нижний скролл»: ряд оснований ▽1 … ⬡6 с кнопками Зазеркалиуса был шире раздела и давал полосу прокрутки внизу — кнопки ряда в окне компактнее и делят ширину поровну, а горизонтальной прокрутки у разделов и панелей больше нет.

Гранидус v0.057 — по снимку Зеркалидуса, где рёбра почти легли друг на друга, — «вот такие виды, где по максимуму возможного ребро на ребро». Под видами на грань — картинки «×N»: виды, где рёбер совпадает больше всего. Считаются для нынешнего тела: кандидаты взгляда — вдоль каждой пары вершин (сливаются в точку) и вдоль пересечений плоскостей, в которых лежат пары рёбер (такая плоскость видна прямой, её рёбра ложатся на одну линию); счёт — сколько рёбер легло на уже занятую прямую плюс сколько видно торцом. Показываются лучшие (до восьми; если лучших меньше четырёх — и следующий уровень), из пары противоположных — вид сверху. Щелчок — плавно в вид, как остальные. При смене основания набор пересчитывается.

Гранидус v0.056 — по снимку правой панели со «Связями» и «Видом» и полосой прокрутки — «скролл убери; если примагничивание делает высоту больше, чем окно влезает, — не магнитить». У панелей разделов больше нет полосы прокрутки (колесо листает, если окно потом сузили). Магнит, прежде чем прилепить раздел к панели, проверяет высоту: не влезет панель вместе с ним в окно — панель не подсвечивается и раздел остаётся плавающим на холсте. Раздел, уже стоящий в этой панели (переставляют), — как прежде.

Гранидус v0.055 — «клик по полю — остановка вращения, и старт так же, но без перемещения — только если клик». Щелчок по холсту мимо битов, не сдвигая мышь (до 4 px), — вращение стоп, ещё такой же щелчок — пуск (как «⟳ Вращение» и пробел; кнопка горит вместе). Потянул — это поворот тела, вращение не переключается. Щелчок по биту — как прежде: закрепить; Shift — править бит, Alt — выбрать грань. Работает и пальцем (касание без сдвига).

Гранидус v0.054 (прежде «Октаэдр»), Zazerkalius v0.407, Хаб v0.069, Треугольник v0.037 — «названия пока оставим как-нибудь, замени на общее название, и развёртку не найду». Общее имя тел — Гранидус (грань + «-дус», «дуо» — с зеркальной половиной): окно в Зазеркалиусе «◆ Гранидус», заголовок страницы и надпись в полосе вкладок, методичка, кнопка Хаба, кнопка «◆ Гранидус» в Треугольнике. Тела в названии основания — N-гранидус: Одногранидус (ромб), Двугранидус (крест), Зеркалидус (3, знак), Четырёхгранидус (октаэдр), Пятигранидус, Шестигранидус. Файл и адрес страницы — прежние (oktaedr/Zerkalius-oktaedr.html), чтобы не ломать ссылки. Развёртку не находили — новое окно встало в самый низ стола; в окне Гранидуса кнопка ✦ развёртка: разворачивает окно (и из списка окон слева), поднимает, прокручивает к нему и мигает рамкой.

Zazerkalius v0.406 — «и в развёртке оси покажи» (вслед за «✛ Оси» Октаэдра v0.053). В окне «✦ Развёртка» — кнопка ✛ оси (по умолчанию вкл). У октаэдра две грани с общим ребром всегда складываются в ромб, а его дальние углы — противоположные вершины, концы оси. Поэтому через каждую склейку развёртки проведён штрих между ними цветом оси: Верх–Низ — светлая, E0–E2 — розовая, E1–E3 — зелёная; сами вершины на развёртке — точки цвета своей оси (одна вершина тела лежит на развёртке в нескольких местах, так видно, где концы одной оси). Только на крупной картинке.

Октаэдр v0.053 — «сделай оси видными во всех фигурах, и те, что не оси, но от вершины к вершине не по ребру, а внутри идут». Кнопка ✛ Оси в «Виде» (по умолчанию вкл, помнится). Берутся все пары вершин тела, которые не ребро. Середина в центре — ось, штрихом цветом экватора: Верх–Низ у всех тел, у чётного основания ещё и диаметры экватора (у октаэдра три оси, у шестигранной бипирамиды четыре). Остальные — внутренние диагонали, точками цветом закрепления: у пятигранной — пять диагоналей пятиугольника, у шестигранной — шесть коротких. У треугольной бипирамиды (Зеркалидус) пар «не ребро» одна — сама ось Верх–Низ. Линии рисуются поверх тела полупрозрачно: они внутри, а грани стеклянные.

Знак Zerkalius, Октаэдр v0.052 и общий _js/hub-link.js — разговор об именах тел (Пи-рамидус, Гранидус: «-дус» — «дуо», с зеркальной половиной; утверждены Двугранидус и Четырёхгранидус) и «Зеркалидус — это Три, переделай знак». Знак — не квадратная пирамида и её зеркало (октаэдр), а треугольная (Трёхгранидус): так же, как пирамида Паскаля в Зазеркалиусе — тетраэдр, каждая грань которого треугольник Паскаля. Переделаны: большой логотип oktaedr/zerkalius-logo.svg и зелёный (экватор — три вершины, передняя к нам; спереди четыре грани с битами, нижние — те же строки инвертированные; невидимо одно заднее ребро экватора; строки бит — вдоль переднего ребра), значок вкладки zerkalius-mark.svg (пояс — излом «V» к нам вместо перекладины) и крутящийся значок «в Хаб» на всех страницах (треугольная бипирамида вместо октаэдра). В Октаэдре основание по умолчанию — 3 (у кого сохранено своё — остаётся). Имена страниц и окон пока прежние — думаем.

Октаэдр v0.051 — «сделай кнопку: выделяю грань — первое нажатие на неё — вид, она ближе, второе — она дальше, за другими гранями от меня». В «Виде» — ◭ Грань. Выбрать грань: нажать кнопку и щёлкнуть грань на теле (или Alt + щелчок по грани в любой момент; берётся ближайшая к глазу под курсором) — она обведена светящейся рамкой цвета закрепления, у отвёрнутой — пунктир. Потом каждое нажатие по кругу: 1-е — взгляд вдоль её наружной нормали, прямо на неё, она ближе всех; 2-е — вдоль обратной, она дальше всех, за другими гранями. Плавно, крен снимается, вращение стоп. На кнопке — имя грани (у октаэдра по сторонам света: ЮВ▲, СЗ▼…) и что сделает следующее нажатие; правый щелчок — выбрать другую. Грань помнится по месту (slot, верх / низ) и переживает смену основания, если такая грань у нового тела есть.

Октаэдр v0.050 — «когда Ю посередине, В — верх — тоже все». У камеры появился крен — поворот картинки вокруг взгляда (после поворота и наклона); им наверх встаёт любая вершина. По бокам от «снизу» в розе видов — ↶ ↷: кувырок на 90° против и по часовой, к ровным четвертям, плавно. Роза (вид с С, Ю, …) выбирает, какая сторона к нам, кувырок — какая вершина наверху: так получаются все положения, например Ю посередине и В наверху. Вид из розы и «⌖» крен снимают. Мышь с креном ведёт себя как без него — сдвиг пересчитывается в повёрнутую картинку (Shift — только поворот вокруг оси тела). Вращение по-прежнему вокруг оси Верх–Низ: с креном она на экране наклонена. Крен запоминается вместе с поворотом и наклоном. И «три ребра к нам» (по снимку вида с ребра): под розой — восемь видов прямо на грань, сеткой 4 × 2 по сторонам света — слева верхние ▲СЗ ▲СВ / ▲ЮЗ ▲ЮВ, справа нижние ▼. Три ребра грани к нам, контур тела — шестиугольник; у октаэдра это направление грани (ЮВ и т.д.) с подъёмом atan(1/√2) ≈ 35,3° вверх или вниз.

Октаэдр v0.049 — по снимкам видов с подписями сторон света, лёгшими друг на друга («Ю» на «З», «С» на «В»), — «ещё эти ЮЗВ и ЮсВ, ну и далее ВЮС…». Виды стали розой ветров: картинки 3 × 3, как на компасе — СЗ С СВ / З сверху В / ЮЗ Ю ЮВ, и «снизу» под ней. «Ю» — зритель на юге, юг к нам. Стороны — те же, что буквы на теле (+X — В, +Z — Ю). У октаэдра вершины экватора стоят ровно на С, В, Ю, З: с них взгляд — на вершину (боковые буквы по краям, передняя и задняя — в середине друг на друге), с СВ, ЮВ, ЮЗ, СЗ — на ребро (переднее ребро на заднем, как в v0.048; прежние «спереди, сзади, слева, справа» — это ЮВ, СЗ, СВ, ЮЗ). Сверху — север наверху, восток справа, как на карте; снизу — та же карта, отражённая. Щелчок — как прежде: плавно в вид, вращение стоп.

Октаэдр v0.048 — «с зажатым Shift — кручение по горизонтали только», «у вида справа, слева, спереди и сзади — там бы поправить, чтобы рёбра друг на друга, к нам». Shift + тянуть — только поворот вокруг оси, наклон стоит (Shift + щелчок без сдвига, как и прежде, — правка бита). Заодно после вида ровно сверху или снизу (90°) тело больше не прыгает на 83° при первом движении мышью: предел наклона — не меньше нынешнего. Виды сбоку (v0.047 смотрели прямо на вершину экватора, совпадали только средние рёбра) теперь смотрят в середину ребра экватора: у октаэдра каждое переднее ребро ложится ровно на заднее. Поворот считается от основания (yaw = π / NB − π / 2), сверху и снизу — тем же поворотом, чтобы переднее ребро и там было внизу; картинки видов — так же.

Октаэдр v0.047 — «и октаэдр — все виды разложи так же» (как развёртку — малыми картинками), «и кнопки вида в октаэдр — сверху, снизу…». В группе «Вид» под «⌖ Вид сверху» — шесть картинок-кнопок: сверху, снизу, спереди, сзади, слева, справа. На каждой — тело с этой стороны: рёбра верха цветом верха, низа — цветом низа, экватор ярче; дальние — пунктиром и тусклее. Щелчок — тело плавно (≈ 0,35 с, кратчайшим поворотом) встаёт так, а вращение останавливается, чтобы вид держался. Сверху — вершина T смотрит на зрителя, снизу — B. Картинки перерисовываются при смене основания и цветов. Работает и в окне Зазеркалиуса, и на своей странице; в методичке — строка «Виды».

Zazerkalius v0.405 — «развёртку покажи малыми картинками все сразу, и при выборе одной из них — крупно, выпадающий список не нужен». В окне «✦ Развёртка» вместо списка — шесть маленьких развёрток рядом (А–Е, из тех же строк поля); щелчок по любой — она крупно на холсте, выбранная — в золотой рамке, имя варианта — в подсказке. У маленьких нет подписей, крест мельче, а биты рисуются, только пока клетка не мельче 1,2 px (иначе грани просто залиты своим цветом). Маленькие перерисовываются, только когда поменялись строки, цвета или размер.

Zazerkalius v0.404 — «треугольники кладём на горизонт: Л — вверх и У — вниз, но не Й, то есть Х в общем случае» (буквы — картинки: Л — треугольник остриём вверх, У — вниз, Й — прямоугольные треугольники v0.403, их отменили, Х — квадрат, разрезанный крестом на четыре треугольника с общей вершиной в центре). Горизонт — средняя черта кнопки, одна у всех; на ней же острия ромбов. Стрелки — четверти Х: у всех остриё в центре, на горизонте. ▲ — нижняя четверть (основание внизу, остриё вверх до горизонта), ▼ — верхняя (основание вверху, остриё вниз до горизонта), ◀ ▶ — боковые (остриё на горизонте, основание — дальний край). ▲▼ рядом складываются в ⧗, ◀▶ — в ⋈. Значок в ▲ ▼ — мельче (9 px), у основания.

Zazerkalius v0.403 — «треугольники — стоят все, но горизонт один! у всех, так теперь». Кнопки ◀ ▶ (v0.402 — треугольники на боку, остриём в середину высоты) стали прямоугольными треугольниками, стоящими основанием на той же нижней черте, что и ▲: остриё — в сторону стрелки вдоль черты, прямой угол — с другой стороны, высота — та же полоса в 24 px. ▲ ▼ — как были. Рамка: основание и катет — своя рамка кнопки, гипотенуза — диагональ фоном.

Zazerkalius v0.402 — «надо с размерами определиться: треугольник — это стрелки, 4 штуки, квадрат — это 1 размер», «размер 1, 2, 4, 8, 16 — это сколько помещается целых ромбов», размер в пикселях — как предложено: ромб 24 × 24, размеры 24 / 48 / 96 / 192 / 384. Единица кнопки групп --bu — 80 → 99 px: так прежние размеры встают на ромбы сами — полкнопки 48 (2 ромба), одна 99 (4), двойная 201 (8), четверная 405 (16), а две полкнопки по-прежнему равны одной и столбцы ровные. Ромбом (вытянутым, с равнобедренными остриями, v0.401) теперь кнопки групп всех размеров, не только «1». Кнопка, на которой одна стрелка ◀ ▶ ▲ ▼ (◄ ►), — треугольник остриём в сторону стрелки: основание — рамка кнопки, скосы — диагонали, цвет как у рамки (наведение сиреневое, включённая золотая). Стрелки у ползунков — как были. Группы стали шире примерно на четверть — перемещённые группы стоят на своих местах, но могут лечь теснее.

Zazerkalius v0.401 — «все кнопки теперь ромбами» (выбрано: все кнопки Зазеркалиуса), «равнобедр», «пока те, что 1 размера». Кнопки групп шириной в одну единицу (--bu, 80 px) — вытянутым ромбом: верх и низ ровные, на концах — равнобедренные треугольники с вершиной посередине высоты (глубина 12 px, у кнопки в 24 px — прямой угол). Чистый ромб под надпись вышел бы вдвое шире и выше — «равнобедр» понят как острия-треугольники; кнопка, у которой ширина не больше высоты, от этого и есть ромб. Нажимается только ромб. Рамка скосов — четыре диагонали фоном, её цвет как у рамки: обычная, наведение сиреневое, включённая золотая. Какие кнопки «1 размера» — решает вычисленная ширина (класс .rh1, rhombTag при каждой раскладке групп), поэтому и спрятанные до поры кнопки ромбом встают сразу. Полкнопки-значки и кнопки в 2 и больше — пока прежние.

Zazerkalius v0.400 и Октаэдр v0.046 — по снимку разделов «Связи» и «Реверс» в окне Октаэдра, прилипших к правой панели, — «такое же примагничивание надо, и похоже, меню кнопки тоже надо ромбами делать» (выбрано: магнит — группам конуса, окнам Зазеркалиуса и группам Октаэдра; ромбами — вкладки Октаэдра). Магнит. Общий приём: край ближе 10 px к краю цели встаёт на него (по горизонтали и вертикали отдельно), а цель — то, к чему прилипли, — светится бирюзой. Группы конуса прилипали и раньше (v0.366), но молча; теперь светится соседняя группа, окно конуса или поле строк, а левая панель ловит группу уже в 40 px правее своего края и светится вся. Окна Зазеркалиуса прилипают к краям других окон, стола и поля строк; место при отпускании — с учётом магнита. Поле строк, куда окно встаёт под строки, тоже светится. В Октаэдре полоса магнита панелей — не шире 22 % окна (в узком окне Зазеркалиуса 240 px с двух сторон съедали почти всю ширину), панель под курсором светится, а плавающий раздел прилипает к соседним разделам, панелям и краям окна. Ромбы. В окне Зазеркалиуса вкладки Октаэдра — ромбы зигзагом ребро к ребру, как ноты в Хабе: каждый следующий заходит на полромба и чередуется вверх-вниз на полвысоты. В ромбе — значок, имя — в подсказке; открытая вкладка золотая, наведение — сиреневое. Своя страница Октаэдра — с прежней полосой вкладок.

Zazerkalius v0.399 и Октаэдр v0.045 — по снимку окна «◆ Октаэдр» — «приведи группы кнопок и кнопки в стандарты кнопок Зазеркалиуса». В окне (Октаэдр с ?zz) кнопки теперь как в Zazerkalius: фон панели, скругление 4, системный шрифт 13 px, наведение — сиреневая рамка, включённая — золотая рамка и надпись; полоса вкладок — в тех же цветах, выбранная вкладка золотая. Разделы стали группами, как в конусе: рамка и фон своего цвета, заголовок прописными своим цветом (Картина — зелёная, Вид — голубая, Цвета — розовая, Ноты — сиреневая, Реверс — оранжевая, Связи — красная). Надпись «zerkalius · октаэдр», версия и подсказка внизу в окне не показываются: имя — в шапке окна, а текстовых подсказок на страницах не делаем. Отдельная страница Октаэдра — как была. Галки «строки → грани» и «подписи» (окно «✦ Развёртка») стали кнопками-переключателями ⇄ строки → грани и 🏷 подписи, как переключатели конуса: горит — включено.

Zazerkalius v0.398 — «разложи октаэдр на плоскость, дай черновую картинку, разные варианты центровки вершин и рёбер» (черновик — шесть развёрток картинкой) → «развёртку добавь в Зазеркалье». Новое окно ✦ Развёртка: 8 граней октаэдра на плоскости, как в окне «◆ Октаэдр» (T — верх, B — низ, E0…E3 — экватор). Строка k поля — ряд k грани от её вершины; голубые верхние грани U0–U3, золотые нижние D0–D3 — с инвертированными битами, а зеркальность выходит сама: нижняя грань ложится отражением верхней через ребро экватора. Шесть вариантов, что в центре (красный ✚): А — вершина T (веер из четырёх верхних), Б — вершина экватора, В — ребро экватора (ромб верх + низ — сама линия зеркала), Г — боковое ребро (ромб из двух верхних), Д — два больших треугольника по 4 грани (Серпинский вдвое больше), Е — лента из 8 граней зигзагом. Развёртка строится деревом склеек: каждая следующая грань — отражение соседней через общее ребро; налезаний нет ни в одном варианте (проверено в черновике). Галка «подписи» — имена граней и вершин.

Zazerkalius v0.397 — по снимку сплющенного списка «Окна» в левой панели (при «⇆ поле справа») — «вниз клади окна за экран и покажи стрелками светящимися, что там что-то есть». Кнопки окон держат свою высоту (прежде сжимались до налезания друг на друга: список был ограничен 45 % панели, а кнопки в нём могли сжиматься). Теперь список занимает всё место панели до низа, лишние кнопки уходят за нижний край. Пока ниже или выше что-то есть, у края светится бирюзовая ▼ или ▲; щелчок по ней листает, колесо — как обычно. Полосы прокрутки у списка нет — её место заняли стрелки.

Zazerkalius v0.396 и Октаэдр v0.044 — по снимку «⌖ Вид сверху» Октаэдра — «весь Октаэдр в Зазеркалье, как одно из окон, наравне с Конусом». В Зазеркалиусе новое окно ◆ Октаэдр: в нём страница Октаэдра целиком, со всеми вкладками, вращением, видом, цветами, нотами и реверсом. Грузится, когда окно впервые открыто. Строки поля ложатся гранью: строка k — ряд k от вершины (k бит; короче — добивается нулями, длиннее — лишнее не влезает; начальный столбик 1, 11, 101, … ложится ровно), рядов — сколько строк, все грани одинаковые, низ — как всегда, отражённый и инвертированный. Меняешь строки — меняется октаэдр; галка «строки → грани» это отключает. У окна своя память (Октаэдр с адресом ?zz пишет ключи с «-zz»), поэтому отдельную страницу Октаэдра оно не трогает; значка «в Хаб» внутри окна нет. ↗ в окне открывает Октаэдр отдельной вкладкой. Сделано рамкой (iframe), а не переносом кода: Октаэдр — 2 тыс. строк со своей раскладкой вкладок, и так он остаётся одним и тем же на своей странице и в окне.

Октаэдр v0.043 — «каждую грань в свой цвет — 7-я внутренняя, варианты раскраски такую надо», «и ноты», «туда внедрить звук». Новый раздел «🎵 Ноты». Кнопка «🎨 Грани» переключает раскраску по кругу: половинами (как было) → каждая грань своим цветом нот радугой (верхние по кругу, потом нижние; внутреннее основание рисуется полупрозрачным следующим цветом — у треугольной бипирамиды 3 + 3 + 1 = 7, как нот, и основание — Си) → парами (верх и его зеркало снизу одним цветом). Цвет берут и заливка, и цифры грани. Кнопки До…Си — звук: нота читает биты своей грани ряд за рядом от вершины (1 — звучит, 0 — пауза, высота по трём битам), звучит от своей ноты, и включённые вместе дают созвучие. Ноте без своей грани достаётся экватор. Звучащий бит горит на теле цветом ноты. Темп — ползунком. Описано и в методичке страницы.

Хаб v0.068 — «из хаба убери смену языков, пока оставь только рус буквы». Все подписи хаба теперь русские и больше не переключаются. Русские и в самой разметке, чтобы до запуска скрипта не мелькал английский. Сбойные полосы остались, только без смены языка.

Хаб v0.067 — «а если треугольники для левого расположить катетами вдоль вертикали левой…», по показу — «поменять местами», и дальше: «кнопки прямо вниз, большие группы разделить и запустить нажатием — отправить в бесконечность». Телефон лёжа: треугольники из ромбов лежат на боку, вершина у своего края экрана, основание к нотам (ромбы повёрнуты вместе с ними, крупнее прежних — почти во всю высоту). На телефоне меню ниже первого экрана — одним столбцом, «Черновики» разбиты по пять с просветом. Нажатая кнопка меню теперь вспыхивает и улетает вдаль, к середине экрана, сжимаясь в точку, и страница открывается, когда она долетела. С Ctrl, Shift или средней кнопкой мыши — как обычно, без полёта. Вернулись назад — кнопки на местах. Попутно: сбойные полосы смены языка резали тёмную середину ромба ноты, и он на миг серел полосами — теперь середина всегда ромб.

Хаб v0.066 — по снимку телефона лёжа — «тот треугольник — левый и правый». Лёжа у краёв теперь два таких же треугольника, как стоя: равносторонние, из ромбов ребро к ребру, прижаты к левому и правому краю. Прямоугольный треугольник из ромбов ребро к ребру не сложить: строки перекашиваются, и рисунок Серпинского ломается.

Хаб v0.065 — «треугольник должен быть выполнен из бит-ромбов, а не квадратов». Каждый бит треугольника Серпинского на телефоне теперь ромб. Стоя ромбы с углами 60° и 120° ложатся ребро к ребру: ряд наполовину заходит в предыдущий, как ноты в стрелке, и треугольник выходит равносторонним. Лёжа строки не сдвигаются (треугольники прямоугольные), поэтому ромб стоит в своей клетке и касается соседей вершинами. Единицы — крупные ромбы, нули — маленькие бледные, звучащие горят цветом своей ноты.

Хаб v0.064 — по снимку «Черновиков» у Kubits — «сюда прошлую версию Хаба, где крутящийся есть, с нотами». Последней кнопкой в «🔬 Черновиках» — «Хаб с конусом» (Zerkalius-hub-konus.html): замороженная копия хаба v0.058, последней, где конус-фон виден, а семь нот стоят в ряд. Взята из git как есть. Не правится и не версионируется — это снимок, живой хаб по-прежнему index.html.

Zazerkalius v0.395 — «теперь треугольники гипотенузой к центру, сначала покажи». Показаны два снимка фона (как было и как станет), ответ «да». Пирамиды Серпинского по бокам конуса теперь прижаты строками к внешнему краю: вертикальный катет снаружи, гипотенуза смотрит на конус.

Хаб v0.063 — «ноты обрамить каждую ромбом, чтобы в общем получилась [стрелка]» и про телефон: «все кнопки в столбик по 1 или по 2 и вниз, чтобы их не видно было, внизу стрелки двигаются вниз, мигают; на экране по центру ноты и Серпинский, когда один — по центру; телефон по горизонту — кнопки тоже внизу за экраном, два Серпинских прижаты к своим сторонам». Каждая нота теперь в ромбе. Ромбы в ряду касаются вершинами, ряд заходит в ряд на половину ромба, так что наконечник стрелки складывается из ромбов ребро к ребру, а Си — древко. Нажимается сам ромб, углы соседних не мешают. Выключенный ромб серый, включённый горит цветом своей ноты. На телефоне первый экран — треугольник Серпинского и ноты. Стоя — один треугольник по центру (строки по середине, равнобедренный), лёжа — два прямоугольных у своих краёв, гипотенузой к нотам. Звучащие биты на нём горят цветами своих нот (головки берутся из фона). Кнопки меню ниже, за краем экрана, в столбик по 1–2, а внизу первого экрана бегут вниз и мигают стрелки ⌄⌄ (нажатие — к меню). Видео хаба на телефоне теперь снимает весь первый экран: треугольник, ромбы и ноты. На компьютере хаб прежний, только ноты в ромбах.

Хаб v0.062 — по снимку «D» — «D = Ре?». Да: по-английски ноты называют буквами (C — до, D — ре, … B — си; счёт исторически шёл от ля, потому она A). Буквы путали, и по слову «да» ноты по-английски теперь пишутся слогами латиницей: Do Re Mi Fa Sol La Si.

Хаб v0.061 и Zazerkalius v0.394 — «на хаб надо видеозапись». Страницу хаба браузер снять не даёт: кнопки — не холст. Поэтому кадр рисуется заново на своём холсте, формата устройства, как у конуса: телефон — 1080×1920, компьютер — 1920×1080. В кадре стрелка нот: на тех же местах, того же цвета, так же мигают и светятся, как на экране. Под ней конус, если он виден. Звук нот идёт в файл прямо из фона, без захвата экрана и без вопросов браузера (для этого фон отдаёт свою дорожку — zzSndStream). Кнопка ⏺ — в правом верхнем углу, работает и при запертом меню; пока идёт запись, она красная и мигает. Файл Zerkalius-hub-….mp4 (или .webm, если браузер не пишет mp4). Кнопок меню в кадре нет. Попутно: в хабе не было строки meta viewport, и телефон рисовал его страницей шириной 980 px, уменьшенной целиком. Ноты выходили мелкими, а правила для узкого экрана не срабатывали. Строка добавлена. И ещё: скачивание готового файла идёт щелчком по невидимой ссылке, а его перехватывал «замок» меню (пока не горели все семь нот), так что файл не сохранялся. Теперь замок реагирует только на настоящие щелчки.

Хаб v0.060 — «1-2-3-1 — такой треугольник-стрелка». Ноты перестроены в стрелку вверх: ряды 1, 2, 3 — наконечник (До; Ре, Ми; Фа, Соль, Ля), каждая нота стоит над щелью между двумя нижними, и снизу древко — Си, под Соль. Прежний треугольник 1 + 2 + 4 (v0.059) снят.

Хаб v0.059 — по снимку треугольника бит — «расположи ноты стрелкой вверх; при смене англ/рус все должны стоять на местах; крутящийся конус пока отключи». Семь нот встали треугольником 1 + 2 + 4: До сверху, под ней Ре и Ми, внизу Фа, Соль, Ля, Си. Это то же дерево, что у длительностей в словаре: каждая нота второго ряда стоит ровно над серединой своей пары в третьем. У каждой ноты теперь постоянная ширина, поэтому смена языка (Соль ↔ G) ничего не сдвигает. Конус-фон спрятан, но работает: звук нот играет в нём же.

Хаб v0.058 — «адаптировать к телефону нажатие кнопок нот». Касание ноты срабатывает сразу: браузер больше не ждёт, не будет ли двойного касания. Нет синей вспышки, и подсветка наведения не «залипает» на пальце: она теперь только там, где есть мышь. Место под палец не меньше 44 px, долгое нажатие не вызывает меню и выделение текста, на узком экране ноты мельче, чтобы стояли в одну строку.

Zazerkalius v0.393 — «запись видео нужна в формат мобильника или компа — по определению». Раньше ролик был размером холста конуса, то есть какой угодно, как окно. Теперь кадр стандартный по устройству: телефон — вертикальный 1080×1920, компьютер — горизонтальный 1920×1080. Из холста берётся область этого формата вокруг середины, по короткой стороне холста, поэтому конус её и заполняет; чего в холсте нет — закрашено фоном страницы. Так пишут все три записи конуса: ⏺ и mp4, ↻1 оборот и 🎞 покадровая. Рамка ▣ показывает эту область и формат (🖥 или 📱). Проверено в браузере облачной сессии: как компьютер — файл 1920×1080, как телефон (Pixel 7) — 1080×1920.

Хаб v0.057 — по снимку «До Ре Ми Фа Соль Ля Си» — «также на англ». Ноты стали такой же строкой, как кнопки меню: язык меняется вместе со сбоем, по-английски — буквами C D E F G A B (так ноты называют в английском: До — C, Ре — D, … Си — B). Подсказки при наведении остались русскими.

Хаб v0.056 и Zazerkalius v0.392 — «если нажать вне кнопок — пауза, и центр перестаёт крутиться», «после паузы — с того же момента», «нужна и пауза при клике на странице, и плей, а сброс как-то иначе». Щелчок по пустому месту хаба (не по нотам и кнопкам) — пауза: звук встаёт на месте, конус перестаёт крутиться, ноты горят, но не мигают. Ещё щелчок — дальше с того же шага, с теми же нотами, конус крутится дальше. Включил ноту на паузе — она добавляется, и всё идёт дальше. Сброс — правым щелчком по пустому месту: все семь нот, звук с начала, конус с начального положения. Самый первый щелчок, как прежде, включает До и Ре.

Хаб v0.055 — «кнопки хаба не делать активными, пока все ноты не включить (в первый раз)». Меню притушено и не нажимается, пока хоть раз не загорятся все семь нот сразу. Первый щелчок по странице, как прежде, включает До и Ре. Щелчок по притушенной кнопке меню никуда не ведёт, а серые, ещё не включённые ноты вспыхивают своими цветами: подсказка без текста. Загорелись все семь — меню оживает, и браузер это запоминает (ключ zerk_hub_all7). Дальше хаб открывается сразу живым, ноты можно гасить. Отметка новая, вместо прежней «музыка хоть раз звучала», чтобы через это прошли все, в том числе те, кто уже слушал. Если фон за 3 с ни разу не ответил (звука нет), меню отпирается, чтобы не остаться запертым навсегда.

Zazerkalius v0.391 — «кнопку записи звука». В группе «Звук» появилась ⏺ в полкнопки. Она пишет в файл то, что играет «♫ звук», только звук, без видео: .webm (opus), а где браузер webm не пишет — .m4a. Звук молчал — при старте записи он включается сам. Ещё щелчок по ⏹ — стоп, и файл Zerkalius-zvuk-….webm уходит в «Загрузки». Пока идёт запись, кнопка мигает красным, время — в подсказке. Дорожка та же, что уходит в видео, поэтому в файле ровно то, что слышно, без задержки колонок.

Zazerkalius v0.390 — по снимку «Своя | 1 ■ | 0 ■ | а ■» — «объедини в размер 4». «Своя» и три выбора цвета (единицы, нули, акцент) теперь один блок ровно в две кнопки (размер 4 по шкале пользователя, прежде вместе выходило три). Выбор цвета — квадратик 22 px, цифра стоит в его углу, «Своя» занимает остальное место. Блок переносится между группами целиком, как «🎯 до строки | 10».

Хаб v0.054 и Zazerkalius v0.389 — «добавь ещё нот (До Ре Ми Фа Соль Ля Си), серыми, не включёнными, при включении они также цветные» и «разве не 7 всего нот в музыке?». Значков-нот в хабе теперь семь, по названиям нот. До — бывший ♫ (строки подряд), Ре — бывший ♪ (столбцы сверху вниз, бас). Новые: Ми — строки задом наперёд (с конца поля, справа налево), Фа — столбцы снизу вверх, Соль — диагональ ↘, Ля — диагональ ↙, Си — случайный бит. Чтобы названия что-то значили, у каждой головки своя тоника: её мелодия сдвинута так, что звучит от своей ноты. Несколько включённых звучат созвучием. Выключенная нота серая, включённая горит своим цветом радуги (До красная … Си фиолетовая), и этим же цветом подсвечен её бит на конусе и в пирамидах. Первый щелчок по странице по-прежнему включает До и Ре, остальные ждут своего щелчка. Радуга и сдвиг тоники — только в фоне хаба, в самом Zazerkalius «стр+стл» звучит и светится как раньше (бирюза и золото). Проверено в браузере облачной сессии: каждая нота включается и выключается отдельно, головки совпадают с горящими нотами.

Zazerkalius v0.388 — по снимку подсветки бита — «как будто бы сдвиг есть звука с картинкой». Подсветка звучащего бита ставилась сразу, а звук доходит до колонок позже, на задержку вывода звуковой карты. На Windows это десятки миллисекунд, в Bluetooth-наушниках 0,2–0,3 с, то есть больше шага при 6 битах в секунду. Браузер эту задержку знает (baseLatency + outputLatency), и теперь подсветка в строках и на конусе ставится с той же задержкой, вместе со звуком. Сколько вышло, страница один раз пишет в консоль. Во время записи видео задержки нет: в ролик звук пишется до колонок. Попутно найдена ошибка с v0.374: else ветки «стоп» стоял внутри комментария, поэтому ■ и выключение обеих нот в хабе звук не останавливали. Исправлено.

Хаб v0.053 — по снимку номера версии — «наверх». Номер версии снова вверху по центру. Вниз его унесли в v0.045, потому что вверху встал ♫, а с v0.051 ноты стоят под надписью Zerkalius, и верх освободился.

Хаб v0.052 — на вопрос «притушенное меню — только в первый раз?» ответ «да, если в кеше нет ничего, то так». Как только фон ответил, что звук пошёл, в памяти браузера (localStorage, ключ zerk_hub_snd) ставится отметка. С ней хаб дальше открывается сразу светлым и щелчков не перехватывает, музыка тогда — по нотам ♫ ♪. Без отметки (новый посетитель, другой браузер, очищенная память) — притушенный режим v0.051. Если память недоступна (закрытый режим), хаб ведёт себя как у нового посетителя.

Хаб v0.051 — «пусть все кнопки меню будут затемнены, пока не включится музыка, и любой щелчок по странице включает все ноты, если ни одна не включена»; «значки нот пониже и побольше». Браузер не даёт звуку начаться без щелчка, а первый щелчок в хабе обычно по кнопке, и человек сразу уходил, так музыки и не услышав. Поэтому меню теперь притушено, пока звук не пошёл. Первый щелчок где угодно, даже по кнопке меню, никуда не ведёт, а включает обе головки (♫ и ♪). Меню светлеет, когда фон ответил «звучит», или через 1,5 с, если фон молчит, иначе меню могло бы остаться запертым. Фон ещё не догрузился — хаб повторяет просьбу раз в полсекунды. Щелчок по самой ноте включает только её головку. Ноты стали 40 px и стоят под надписью Zerkalius.

Хаб v0.050 и Zazerkalius v0.387 — вопрос «можно ли включать музыку при старте у новых» и ответ на «нет» — «2 и более значков, каждый отдельно вкл/выкл». Сам звук при старте браузеры не дают, пока посетитель ничего не нажал. Вместо одного ♫ в хабе теперь два значка, по одному на головку звука фона: ♫ — строки подряд (горит бирюзой), ♪ — столбцы сверху вниз, бас (горит золотом). Каждый включает и выключает свою головку; выключены обе — звук встаёт. Фон понимает новое сообщение { zerkSndHead: "r" | "c", on } и отвечает, какие головки звучат. Прежнее { zerkSnd } тоже работает и включает обе сразу.

Хаб v0.049 — «перемести Черновики вниз, но не ниже номера версии». Панель «🔬 Черновики» теперь последняя, под «◇ Знаком и записями». Номер версии прибит к низу экрана (10 px от края), поэтому снизу у хаба оставлен запас не меньше 44 px, а не просто 6% высоты. Иначе на низком окне нижняя панель заезжала бы на номер.

Zazerkalius v0.386 — по снимку подсказки границы поля строк — «при перетаскивании влево также сначала покажи границу, куда упадёт». Причина: граница поля — невидимая полоса в 10 px, а видимая черта — у её края. Если вести мышь от черты наружу (у поля справа это влево), указатель с первого же движения уходил с полосы, движения ей больше не приходили, и протяжка не начиналась: ни черты-прицела, ни новой ширины. Внутрь всё работало, поэтому и казалось, что черта есть только в одну сторону. Теперь полоса держит мышь с момента нажатия, и черта идёт за ней в обе стороны. Ошибку воспроизвёл и проверил сам, в браузере облачной сессии: все четыре случая (поле слева или справа, тянуть влево или вправо).

Zazerkalius v0.385 — по снимку «Всё | Каждое | Встреч Стр | Встреч Бит» — «кнопки размером 1» и про кнопки, сделанные раньше «в 2 кнопки», — «да, те тоже». Шкала пользователя: размер N — это N полкнопок. Поэтому режимы кручения стали по полкнопки, подпись у каждого теперь мелко, в две строки («Встреч / Стр»). «Размер 2» из просьб v0.356–v0.364 означал одну обычную кнопку, а сделано было в две. Теперь «⏸ на проходе», «↻ по часовой», «🎨 разные» и пары «🎯 до строки | 10», «↻ | 45°» стоят ровно в одну кнопку, а длинные подписи не обрезаются, а переносятся на вторую строку мельче. Сделано в облачной сессии, в ветке claude/….

Zazerkalius v0.384 — по снимкам «Настраиваемая | 1 0 а», «▶» и «Янтарь» — «Настраиваемая — Своя, размер 3; 1 размер — это вот такие (▶), 2 — это (Янтарь)». Гамма «Настраиваемая» переименована в «Своя» и стоит в полторы кнопки, то есть размер 3 по шкале пользователя. Вместе с тремя выборами цвета 1 / 0 / а по полкнопки блок занимает ровно три обычные кнопки. Шкала размеров пользователя: 1 — полкнопки (как ▶), 2 — обычная кнопка (как «Янтарь»), 3 — полторы, 4 — две.

Хаб v0.048 — по снимку «Triangle / Зазеркалиус» — «в одну строку». Две главные кнопки хаба стоят рядом, в одну строку; на узком экране переносятся одна под другую.

Zazerkalius v0.383 и Хаб v0.047 — «а что если добавить головку, идущую по столбцам» → «да» (и в Зазеркалиусе, и в фоне хаба, скорость одна). Новый режим звука стр+стл — две головки разом, на одном счёте шагов. Строчная читает строки подряд слева направо, как «подряд», подсвечена бирюзой; «⁑ авто» относится к ней. Столбцовая идёт по столбцам: столбец сверху вниз (только строки, где он есть), потом следующий; она подсвечена золотом и звучит октавой ниже, как бас. В треугольнике Серпинского первый столбец — сплошные единицы, дальше столбцы всё реже, с дырами Серпинского, поэтому бас редеет к краю. Головки видны в строках поля (золото — отдельной подсветкой), на конусе (2D — обводка, 3D — точка) и в обеих пирамидах фона хаба. «♫» в хабе теперь включает звук фона именно в этом режиме.

Zazerkalius v0.382 — по снимку колонки замков у номеров строк — «покажи другими значками, просто полоской, все невыкрученные» и «поменяй значок над номерами — он похож на кручение». Замки колец у строк и общий замок над ними — теперь не 🔒 / 🔓, а полоска: заперто (кольцо крутится только на вид, строка не сдвигается) — сплошная серая, открыто (крутит саму строку) — пустая золотая. Щелчки прежние. Кнопка «Начальные строки» над номерами — теперь ⇤ вместо ↺: ↺ путалась с ⟲ кручения рядом.

Хаб v0.046 — по снимку «♫ Звук ■» — «оставь только символ музыки, без рамки». Кнопка звука фона теперь просто ♫ вверху по центру, без рамки и фона. Пока звук идёт, значок бирюзовый и мигает свечением. Что делает кнопка, сказано во всплывающей подсказке.

Хаб v0.045 — по снимку номера версии — «это вниз». Номер версии хаба перенесён вниз, по центру у нижнего края экрана. Вверху по центру теперь только ♫ Звук.

Хаб v0.044 — «кнопку ♫ Звук — наверх посередине и мигающей, когда звук идёт». Кнопка звука фона переехала из правого нижнего угла вверх, на середину. Пока звук идёт, её бирюзовая рамка мигает, как у кнопок авто-хода в Zazerkalius.

Zazerkalius v0.381 и Хаб v0.043 — «добавить кнопку в Хаб: Звук», «обои доработать всё как есть, но добавить по горизонту зеркального конуса две пирамиды Серпинского высотой до вершины конуса, справа и слева, чтобы соприкасались почти катетами» (выбрано: прямоугольные, катетом к конусу), «звук пустить по обеим пирамидам сразу и показать биты-головки в обоях». В живом фоне хаба по бокам зеркального конуса стоят два треугольника Серпинского из тех же строк (Паскаль mod 2). Вершина — на высоте вершины конуса, основание — на горизонте (плоскость зеркала). Вертикальный катет почти касается самого широкого места конуса, гипотенуза смотрит наружу, левый треугольник зеркальный. Единицы — цветом единиц, нули — бледно. В хабе, в правом нижнем углу, появилась кнопка ♫ Звук. Она запускает звук фона: строки звучат подряд, звучащие биты (головки) подсвечиваются бирюзой сразу в обеих пирамидах и на конусе. Ещё щелчок выключает звук; пока звучит, кнопка горит. Фону дано разрешение на звук (allow="autoplay"), иначе браузер его не пускает. На страницах самого Zazerkalius и в карточках пресетов ничего не меняется.

Zazerkalius v0.380 — по снимкам двух головок рядом (1000000001 под 11111111) — «почему так?» Причина: «⁑ авто» берёт шаблоном строку под строкой из одних 1, здесь это сама читаемая строка; единицы на 0 и 9 в строке из 10 бит — по кругу соседние. Выбрано: круг оставить и «строки, где все 1-цы, пропускать, кроме той, где длина 1». В режимах, где звучат несколько строк (разом, подряд, по 2, столбцы), строки из одних единиц длиннее одного бита теперь не звучат — их пропускают; верхняя «1» звучит как прежде. В режиме «строка» звучит та, что выбрана, — без изменений.

Zazerkalius v0.379 — «текст поправь»: сообщение при нажатии «◉ показать» теперь говорит на языке кнопки — «◉ Показать — вкл: звучащие биты (головки) подсвечены в строках и на конусе» или «◉ Показать — выкл» (прежде — «◉ Головки видны / не показываются»).

Zazerkalius v0.378 — по снимку «Звука» — «обнови подсказки» и по снимку «◉ головки» — «Показать». Подсказки «Звука» переписаны под то, что в нём сейчас. У группы перечислено, что где. У ◀ ▶ сказано, что они задают направление (горит) и шагают. У «♫ звук» — цепочка «пауза → дальше», у ■ — «стоп и в начало». У ♩ и 🔊 указаны единицы. Кнопка «◉ головки» теперь называется «◉ показать»: что именно она показывает, объясняет подсказка.

Zazerkalius v0.377 — по снимку «■» — «стоп тоже мигать при плее, цвет обводки такой же, толщина», «стоп — это в начало». Пока звук играет, кнопка ■ мигает вместе с кнопкой звука, той же золотой рамкой той же толщины. На паузе и в остановке она не мигает. Что делает ■, не менялось: останавливает звук совсем, и следующий пуск идёт с первого бита. Теперь это сказано и в подсказке («Стоп и в начало»).

Zazerkalius v0.376 — по снимку «Звука» — «кнопку показать головки на битах строк и в конусе». «◉ бит» стала «◉ головки»: звучащие биты (головки чтения, при «⁑ авто» их несколько) видны и в строках поля, как было, и на конусе. В 2D сектор бита обведён бирюзовым, в 3D на бите бирюзовая точка. По умолчанию включено; выключишь — головок не видно ни там, ни там. Остановил звук — отметки пропадают.

Zazerkalius v0.375 — «Вид — кнопка показ / скрыть (по умолчанию „показать“) дуги битов». В «Виде» появилась кнопка ◠ дуги, по умолчанию включена. Выключишь — дуги битов на конусе не рисуются: ни в 2D, ни в 3D, ни у зеркала. Остаются границы между битами, контуры колец, лучи и лазер. Выбор помнится.

Zazerkalius v0.374 — по снимку «◀ ⏯ дальше ■ ▶» — «по умолчанию выделить стрелку, и запоминать последнюю выделенную — при плее задаёт направление». У звука теперь есть направление: горит ▶ (по умолчанию) или ◀, последняя нажатая помнится. Пока звук идёт, стрелка меняет направление, и звук играет дальше в ту сторону, не останавливаясь. Когда не звучит — стрелка, как прежде, делает один шаг (звук на паузе) и заодно задаёт направление. Пуск в обратную сторону начинается с последнего шага.

Zazerkalius v0.373 — по снимку группы «Лазер» в 3D — «в 3D лазер: все кнопки пока что неактивные нужно». В 3D лазер не рисуется и не считается, поэтому все кнопки, поля и списки группы «Лазер» в 3D теперь неактивны: бледные и не нажимаются, а подсказка группы объясняет почему. Двигать группу можно. При выходе из 3D (🧊) всё возвращается как было; то, что было неактивно само по себе (например, «щели»), таким и остаётся.

Zazerkalius v0.372 — по снимку «✳ все» — «проверь — работает для зеркала?». Не работало: лучи к центру (✳ выдел. / ✳ все) рисовались только у верхнего конуса, у отражённых вниз колец (⧗ зеркало) их не было. Теперь лучи есть и у отражённых колец, на их высоте, от центров бит к оси. При «⧗ выдел.» — только у тех колец, что отражены; при «✳ выдел.» — только у колец в фокусе, и сверху, и в зеркале.

Zazerkalius v0.371 — по снимку «■ звук | ⏯ дальше» — «пауза и звук — 1 размер, и рядом 0,5 — стоп; когда не включён, стоп неактивен». Звук и пауза — теперь одна кнопка в 1 ширину: «♫ звук» (пуск) → «⏸ пауза» (пока звучит) → «⏯ дальше» (на паузе). Рядом — ■ в полкнопки: стоп совсем, следующий пуск — с начала. Пока звук не идёт и не на паузе, ■ неактивна (бледная). Блок — ◀ [звук / пауза] [■] ▶.

Zazerkalius v0.370 — по снимку группы «Гамма» — «кнопки со своими цветами; Исходная — это Настраиваемая, к ней выбор цветов 0 и 1 и ещё что там». Кнопки гамм теперь окрашены своими цветами: надпись — цветом единиц, фон — с оттенком нулей, рамка — цветом акцента; выбранная обведена своим акцентом (цвета — для нынешней темы). «Исходная» стала «Настраиваемая». Рядом с ней три выбора цвета: 1 (единицы), 0 (нули) и а (акцент: рамки, подписи, выделение). Тянешь в выборе цвета — строки, конус и окна перекрашиваются сразу. Свои цвета помнятся у каждой темы отдельно (Z.palCust); пока не заданы — цвета страницы, как было у «Исходной». Правый щелчок по «Настраиваемой» возвращает цвета страницы.

Zazerkalius v0.369 — по снимку «🎨 Контраст» — «Гамма» (было предложено «Палитра», решили оставить «Гамма»). На кнопке в шапке теперь всегда «🎨 Гамма», а не имя выбранной гаммы. Какая выбрана, видно в группе «Гамма» (горит) и во всплывающей подсказке кнопки.

Zazerkalius v0.368 — по снимку «■ звук» — «раздели на 2 по 1 размера, паузу сюда». Блок звука теперь ◀ [♫ звук] [⏸ пауза] ▶: звук и пауза — две кнопки по 1 ширине, стрелки шага — по краям в полкнопки. Пауза переехала из отдельной кнопки внутрь блока и подписана: «⏸ пауза», на паузе — «⏯ дальше». Между группами блок переносится целиком.

Zazerkalius v0.367 — по снимку «🎨 Роза» — «группа кнопок: сразу все показать в ней, а сюда кнопку вызова этой группы, если группа закрыта». Появилась группа Гамма: все семь гамм кнопками (Исходная, Янтарь, Океан, Лес, Роза, Огонь, Контраст), выбранная горит. Группа ведёт себя как остальные: переносится, сворачивается, встаёт на левую панель или поле строк. У неё в заголовке есть ✕ — закрыть совсем. «🎨 …» в шапке стала кнопкой вызова этой группы. Если группа закрыта, свёрнута или её не видно, щелчок открывает её и мигает рамкой; если окно конуса закрыто, группа встаёт на левую панель. Если открыта — щелчок закрывает. Пока группа открыта, кнопка горит. Правый щелчок — следующая гамма, как раньше.

Zazerkalius v0.366 — по снимку группы «Кольца», ушедшей под поле строк, — «группы не скрывать теперь, а примагничивать к границам, всем, по всему периметру». Вынесенная на холст группа теперь всегда целиком внутри окна конуса; прежнее «уезжает вправо под поле строк, виден один заголовок» (v0.215) снято. Пока группу тащишь, она притягивается магнитом, если подвести её край ближе 10 px к краю окна конуса, краю поля строк или краю любой другой группы. Работают все четыре стороны, вплотную или вровень, по горизонтали и вертикали отдельно.

Zazerkalius v0.365 — снова по снимку режимов кручения — «размер 1 каждая». Кнопки «Всё / Каждое / Встреч Стр / Встреч Бит» и так были по ширине в кнопку, но стояли слитной полоской, без зазоров, и выпадали из сетки остальных. Теперь это отдельные кнопки в 1 ширину, с обычным зазором и скруглением, ровно в сетку со всеми.

Zazerkalius v0.364 — по снимку списка «🎨 разные» (тембр звука) — «размер 2». Список тембров в «Звуке» теперь ровно в 2 кнопки, где бы ни стоял.

Zazerkalius v0.363 — по снимку «🧱 Бит 7» — «не снимает выделение, заморозку». Разморозка срабатывала, только если выделение лежало целиком внутри замороженного: захватил лишний бит — кнопка замораживала ещё. Теперь, если выделение задевает замороженные биты, выделенное размораживается. Без выделения горящая кнопка размораживает все, как и правый щелчок. Заморозить, как прежде: выделить незамороженные биты и нажать.

Zazerkalius v0.362 — по снимку группы «Кручение» — «подсказки обнови». Всплывающие подсказки в «Кручении» переписаны под то, что есть сейчас. У группы перечислено, что в ней, а «всё на места» указана там, где она стоит на самом деле: зелёная ⟲ над столбиком кручений у поля строк и на пульте. У «весь:» появилась своя подсказка. У ползунка скорости — единицы по режимам (Всё и Встреч Стр — °/с, Каждое и Встреч Бит — бит/с). У шагов ◀ ▶| — нынешние названия режимов вместо прежних «по биту / навстречу», у ↻ / ↺ — что идёт в эту сторону, а что в обратную. Подсказка ⟲ на пульте тоже указывает на новое место.

Zazerkalius v0.361 — по снимку «достроить: 🔺 Серп 90 · ⤒ из-под черты», горящих обе, — «„Заменить“ удали, слово „достроить“ убери, жёлтая обводка — либо-либо». Кнопки «Заменить» и подписи «достроить:» больше нет. Строки, что лежали под чертой, при достройке теперь не стираются, а сдвигаются вниз, ниже новых; стереть их — 🗑. Жёлтым горит что-то одно. «⤒ Из-под черты» горит, когда она включена и под чертой есть строки: черта вниз сперва вернёт их. Иначе горит способ достройки (🔺 Серп 90 / 30 / маска). Выбор способа выключает «из-под черты». И по снимку «↻ по часовой» — «размер 2»: эта кнопка теперь ровно в 2 кнопки.

Zazerkalius v0.360 — по снимкам «🎯 до строки | 10» и «↻ | 45°» — «ширина 2 им», «также» — и по снимку режимов кручения — «каждое 1 ширины». Пары «🎯 до строки + номер» и «↻ + шаг лазера» — каждая один блок ровно в 2 кнопки: номер строки и ↻ по полкнопки, кнопка и список занимают остальное. Между группами такая пара переносится целиком. Режимы кручения «Всё / Каждое / Встреч Стр / Встреч Бит» — каждый ровно в 1 кнопку, слитной полоской, как были.

Zazerkalius v0.359 — по снимкам «✳ все» (лучи) и «⧗ зерк.» — «у зеркала тоже надо». Зеркало вниз (октаэдр) в «Виде» теперь списком, как лучи: ⧗ нет / ⧗ выдел. / ⧗ все. «Выдел.» отражает вниз только кольца выделенных строк (нет выделения — текущей), «все» — все кольца, как было. Кнопка ⧗ над пультом по-прежнему включает и выключает зеркало, список за ней следит. Выбор помнится, ⭐ умолчание и «⟲ всё на места» его возвращают.

Zazerkalius v0.358 — по снимку «проход 0 · волна 0/63» — «перемести прямо в поле строк, где первая строка, прижми вправо, биты на передний план и удали дубль». Счёт Аниматрицы теперь один: в самом поле строк, у правого края, на уровне первой строки. Он лежит позади строк, биты рисуются поверх него, и мышь сквозь него проходит. Обе прежние копии убраны: в группе «Аниматрица» и в полосе над полем (v0.350).

Zazerkalius v0.357 — по снимку «▮ Столб | от −8» — «убери „от“, расположи 2 окна: слева 8, справа 0 — так по 2 столба можно задать». Рядом со «▮ Столб» теперь два поля по полкнопки, без подписи: левое — на сколько бит левее вершины, правое — на сколько правее. 0 значит, что с этой стороны столба нет; по умолчанию слева 8, справа 0 (как прежнее −8). Можно поставить два столба сразу: оба замораживаются при построении по правилу (заготовки, ▦ 256, достройка) и оба подсвечены в строках голубым. Прежний один сдвиг переходит сам: минус — в левое поле, плюс — в правое. Столба ровно по центру теперь нет: 0 значит «нет».

Zazerkalius v0.356 — по снимкам «⏸ на проходе» и списка «45°» — «размеры 2». Кнопка «⏸ на проходе» и список шага лазера (45° / 1/T / 1/(1+…+T)) теперь ровно в 2 кнопки, где бы ни стояли: на полосе, над холстом или на левой панели.

Zazerkalius v0.355 — по снимку окошка «↧ до 64» — «после применения показать следующую цифру». Пока окошко открыто, после ✓ или Enter в нём уже стоит следующая степень двойки в ту же сторону, куда тянули черту: вниз 64 → 128 → 256… (до предела 1024), вверх 64 → 32 → 16… Ещё один Enter шагает дальше, своё число набирается поверх выделенного.

Zazerkalius v0.354 — «прокрутка на группе кнопок — в Конусе например — так же, как на поле конуса, а не скролл панелей надо». Колесо над группой кнопок конуса (на полосе или поверх холста) теперь делает то же, что над самим холстом, — масштаб конуса вокруг курсора; стол с окнами больше не едет. Над группой, поставленной на поле строк, колесо листает строки. Как было осталось: группы на левой панели листают панель, число или список в фокусе меняют своё значение, Ctrl + колесо — масштаб страницы.

Zazerkalius v0.353 — «их (▮ стенку и 🧱 стенку) в одну группу „Заморозка“, поместить её в Аниматрицу, назвать: Столб, Бит; показать в строках подсветом; Вид — кнопка, по умолчанию вкл, — видимость замороженных». В конце «Аниматрицы» теперь блок ❄ Заморозка: ▮ Столб с полем «от −8» (прежняя ▮ стенка, v0.241; из панели достройки она ушла, но на достройку действует по-прежнему), 🧱 Бит (прежняя 🧱 стенка, v0.347) и 👁 вид. Замороженное видно в строках: столб — голубым (клетка «середина строки + сдвиг» в каждой строке), биты — кирпичным. «👁 вид» (по умолчанию вкл) включает и выключает только подсветку, заморозка действует в любом случае. В сообщениях тоже «столб» и «заморожено» вместо «стенки».

Zazerkalius v0.352 — по снимку окна «📝 Текст конуса и лог лазера», обрезанного справа, — «тут всё нераскрыто по ползункам, надо как-то, чтоб видно было». Свободное окно могло уехать за правый край экрана, и с ним пропадали кнопки 📌 ▾ ✕ и конец строк. Теперь оно всегда целиком на экране, и приколотое тоже не шире экрана. Полосы прокрутки в окне стали заметными (были тонкие и тёмные на тёмном): текст, вылет, прогноз и лог листаются вбок и вниз, и видно, что там есть ещё.

Zazerkalius v0.351 — по снимку «▶ волна» — «мигать кнопкой, например рамкой, когда вкл; также все кнопки, которые двигают что-либо авто». Пока что-то идёт само, у кнопки мигает золотая рамка. Так ведут себя ▶ волна Аниматрицы, ▶ крутить конуса (и её копия в пульте), ♫ звук (на паузе не мигает), ▶ расти и ⟳ крутить у пирамиды. Остановил — рамка обычная.

Zazerkalius v0.350 — по снимку «проход 0 · волна 0/55» — «покажи вверху поля строк справа». Счёт Аниматрицы (проход, волна, цикл) теперь виден и в полосе над полем строк, у её правого края, в рамке. Если полоса длиннее поля и прокручивается, счёт остаётся у края.

Zazerkalius v0.349 — по снимку полосы «📝 Текст конуса и лог лазера» поверх холста — «сделай как было: отдельная вкладка, но она привязана к Конусу ниже, либо отдельным окном в любое место, чтоб двигать». Окно текста снова своё, не внутри конуса: холст конуса занимает всё окно. У окна два положения. 📌 Приколото (по умолчанию): стоит вплотную под окном конуса, той же ширины, и ходит за ним, когда конус тащат, растягивают или прокручивают стол; высота меняется за нижний край. Если потянуть за заголовок, окно открепляется и едет за мышью: это свободное окно в любом месте, размер меняется за угол. 📌 снова прикалывает его под конус. ▾ или двойной щелчок по заголовку сворачивает окно до заголовка, ✕ убирает (вернуть — «📝 Текст» в шапке). Место, размер и положение помнятся (Z.ctw). Конус свёрнут или спрятан — приколотое окно тоже не видно.

Zazerkalius v0.348 — «наборы кнопок, кроме тех, что только для конуса (кручение, кольца), — если переместить целиком на поле строк, то дать туда попасть, если частью — то так же, как сейчас». Группу, отпущенную целиком над полем строк, теперь там и оставляют: она встаёт поверх поля и ездит вместе с ним, когда меняется ширина поля, панели или окна. Пока её тащат целиком над полем, поле обведено рамкой. Отпущенная частью ведёт себя как прежде: висит над холстом, прижатая к окну конуса. Назад — вытащить с поля или правый щелчок по заголовку (на полосу). «Кольца» и «Кручение» на поле не встают. Если поле спрятано, включён дзен или открыта страница одного конуса, группа стоит на полосе конуса, а место на поле помнится (Z.cgrpFld). Группа остаётся частью окна конуса: закроешь окно — пропадёт и она.

Zazerkalius v0.347 — по снимку выделенных бит — «выделенные биты кнопку Стенка помечает и морозит». В «Аниматрице» появилась кнопка 🧱 стенка. Выделяешь биты мышью в строках, жмёшь — они подсвечиваются кирпичным фоном и замораживаются: волна их не переписывает, они держат своё значение, а соседние биты считаются от них как обычно. Если выделить биты, которые уже в стенке, они снимаются; правый щелчок снимает всю стенку. На кнопке — сколько бит заморожено. Стенка хранится по строкам и отрезкам бит (Z.walls), помнится и едет в «💾 Всё». Прежняя «▮ стенка» (столбец от вершины для заготовок и достройки) осталась как была.

Zazerkalius v0.346 — три просьбы по снимкам. «0·1 — Баланс, назови»: кнопка у номеров строк теперь называется Баланс. «В три значка»: списки выравнивания «◫ по центру / ◧ влево / ◨ вправо» (поле строк, ▽ Спуск, ⊿ Сложить) заменены тремя кнопками-значками ◫ ◧ ◨. Кнопки стоят слитной полоской, горит выбранная, названия видны в подсказке. Сам список остался спрятанным: память, события и выставление из кода работают как прежде.

Zazerkalius v0.345 — по снимку «♫ звук» — «пауза и шаг вперёд-назад, стрелки справа-слева». В «Звуке» теперь блок ◀ ♫ звук ▶ и кнопка ⏸. ⏸ останавливает звук, но место и подсветка бита остаются; ⏯ продолжает с того же места. ◀ ▶ проигрывают один шаг назад или вперёд и ставят звук на паузу. Шаг считается по режиму: бит текущей строки, бит звучащих выделенных, бит в чтении подряд или по 2 (с переходом на соседнюю строку) или столбец поля. «■ звук» останавливает совсем, и следующий старт идёт с начала.

Zazerkalius v0.344 — по снимку списка «📋 заготовка…» во всю ширину — «размер 2, внутри сократи „Правило“ — слишком часто слово». В списке теперь R90, R18, R150 — XOR трёх… вместо «Правило 90…»; короче стали и длинные названия: «🔺 Паскаль mod 2» (+1 бит — в подсказке), «R60 — Паскаль ←», «R102 — Паскаль →», «Дракон (сгибы)», «Счёт 1, 10, 11…». Список встаёт в 2 кнопки; что такое R, объясняет подсказка.

Zazerkalius v0.343 — по снимку ползунков «♩» и «🔊» без чисел — «всем ползункам численное значение». У кого своего числа не было (♩ темп звука, 🔊 громкость — в процентах, ↕ и ▬ у конуса, «этаж» пирамиды), оно теперь стоит внутри ползунка, по середине дорожки, как у остальных (v0.333). Число следит и за мышью, и за значением, выставленным из кода: при загрузке, сбросе или пресете оно не отстаёт.

Zazerkalius v0.342 — «ползункам также как и кнопкам фон, рамку, размер стандарт». Ползунок в группе (значок, стрелки ◂ ▸, число внутри) теперь в рамке и на фоне, как кнопка, высотой в кнопку, при наведении рамка подсвечивается. Ползунок скорости кручения между ◀ ▶ тоже: он шириной в 2 кнопки, и весь блок ◀ ползунок ▶ занимает 3 кнопки.

Zazerkalius v0.341 — по снимку списка «Звука» — «сократи, чтобы в размер 1 уместились». Режимы звука теперь строка · разом · подряд · по 2 · столбцы (были «выделенные разом», «по очереди», «по 2 строки» — из-за них список вставал в 2 кнопки). Полные названия — во всплывающей подсказке у списка и у каждого пункта; что делают режимы, не менялось.

Zazerkalius v0.340 — по снимку «🔴 неподв. ⇄» в «Виде» — «раздели на 2 кнопки, вкл либо либо». Была одна кнопка по кругу: выкл → 🔴 неподвижные при развороте ⇄ → 🟢 при реверс-инверсии ⇄🔁 → выкл, — и чтобы попасть в нужный режим, жали по два-три раза. Теперь две кнопки рядом: 🔴 неп. ⇄ и 🟢 неп. ⇄🔁. Включишь одну — другая гаснет; щелчок по горящей — выключить; могут не гореть обе. Что показывают, не менялось — и в строках, и числами у номеров.

Zazerkalius v0.339 — по снимку «Вида» («🔴 неподв. ⇄» обрезана с обеих сторон) — «не совсем расположил» — и по снимку «проход 0 · волна 0/63» — «также размер кнопок, и поле текста выдели фоном или рамкой, выровняй по центру». Кнопки, кнопки-галки и списки, которым мало одной ширины, теперь встают в 2 кнопки (или в 4), а не обрезаются — по тому же правилу «только 1, 2, 4» (v0.335); пересчёт — когда меняется подпись, сворачивается или переставляется группа. Счёт Аниматрицы — полем высотой в кнопку, с фоном и рамкой, текст по центру, ширина — в 2 или 4 кнопки. Ширины теперь меряются разом для всех элементов (прежде — по одному, и при ▶ волне это была перекладка страницы на каждый элемент каждый кадр).

Zazerkalius v0.338 — к окошку «↧ до [N]» (v0.324): «число строк — прямо во время протяжки», «и вверх, и при применении строки надо удерживать на месте это окно, чтобы ещё раз нажать можно». Пока тянешь черту (вверх или вниз), у курсора живая метка «N стр.» — сколько строк сейчас над чертой. Окошко появляется и после протяжки вверх; там по умолчанию ближайшая степень двойки снизу (дотянул до 11 — 8), вниз — сверху (до 11 — 16). Enter или ✓ перестраивают поле, а окошко остаётся открытым на том же месте, с новым числом строк, выделенным — можно сразу набрать другое и применить ещё раз. Закрывают ✕, Esc или щелчок мимо. Каждое применение — своя точка ↩.

Zazerkalius v0.337 — по снимку «⁑ 2 бита» — «измени кнопку: пусть определяет количество бит и расстояние по строке, следующей после строки, где все 1-цы, и автоматом переключает при плее». Кнопка теперь ⁑ авто: над читаемой строкой (или она сама) ищется ближайшая строка из одних 1, и следующая за ней строка — шаблон: сколько в ней единиц, столько бит звучит разом (до 8), а где они стоят — на таком расстоянии впереди читаемого бита, по кругу строки. У треугольника Серпинского под 1111 лежит 10001 — два бита через 4; под 11111111 — 100000001 — два через 8. Считается на каждом шаге звука: читаешь дальше вниз («по очереди», «строка» со сменой текущей, Аниматрица меняет строки) — прошёл новую строку из 1, шаблон меняется сам. Что звучит сейчас, пишется на кнопке: «⁑ 2×8» — два бита через 8, «⁑ 3: 0,2,6» — если шаг неровный; звук стоит — «⁑ авто». Строки из одних 1 выше нет, и в «столбцах» — как прежде, два бита через ↔.

Zazerkalius v0.336 — по снимку свёрнутой полосы «📝 Текст конуса и лог лазера» — «прозрачный заголовок, когда свёрнуто». Скрытая (▾) полоса текста больше не тёмная плашка: без фона, рамки и тени, лежит прямо поверх холста, а холст конуса идёт до самого низа окна. Подпись и кнопки ▴ ✕ читаются по тени; двойной щелчок по подписи или ▴ — развернуть, как прежде. Развёрнутая полоса — как была.

Zazerkalius v0.335 — на «заголовок группы — не уже стандартной кнопки» — «стандарт ширины кнопки — ширины только 1, 2, 4». Всё в группах, что стояло своей шириной, теперь шириной ровно в 1, 2 или 4 кнопки (с зазорами 3 px между ними: 80, 163, 329 px) — наименьшую, в которую влезает: подпись группы (АНИМАТРИЦА — в 2), «весь:», «по биту:», полоса режимов кручения, «🎯 до строки» с полем, голые поля, счёт Аниматрицы «проход · волна · цикл». Ширина пересчитывается, когда меняется текст (счёт Аниматрицы растёт — встанет в 4, не дёргаясь на каждой цифре). Кнопки, списки и поля с подписью внутри — уже в 1 (v0.317), ползунки и блоки «◀ [ ] ▶» — в 2 (v0.320). Кнопки-значки (◀ ▶ ⏮ …) — по-прежнему в полкнопки, две — как одна.

Zazerkalius v0.334 — по снимку «АНИМАТРИЦА 🧘» — «заголовок группы — как кнопка размерами, не давать размера больше, если пустые области появляются». Подпись группы теперь размером с кнопку: высотой 24 px, не уже стандартной кнопки, сверху слева — вровень с первым рядом кнопок (прежде тянулась во всю высоту группы); у свёрнутой до заголовка группы — как была. Уголок размера (v0.315, v0.332) больше не даёт пустых мест: высота группы — всегда ровно по кнопкам, а ширина прижимается к правому краю самого длинного ряда, так что тянуть уголок — это выбирать, по сколько кнопок в ряд: от самой широкой кнопки до всех в одну строку.

Zazerkalius v0.333 — по снимку «◂──●──▸ 30°/с» у скорости кручения — «все ползунки — текст в ползунок». В v0.322 число клалось на дорожку только у ползунков, стоящих прямо в группе; у кручения метка лежит глубже — число осталось справа. Теперь по-другому: число любого ползунка страницы (скорость кручения, ⚡ волна, щель лазера, «этажей» пирамиды — у кого оно есть) переезжает внутрь обёртки самого ползунка и лежит ровно по середине дорожки, между стрелками ◂ ▸ — независимо от того, где ползунок стоит и есть ли у него значок слева. Мышь проходит сквозь число.

Zazerkalius v0.332 — по снимку группы «Вид», сжатой уголком до одной подписи (кнопки спрятались), — «кнопки, если не помещаются в группе, — не давать размера». Уголок (v0.315) больше не сжимает группу меньше, чем нужно кнопкам: ширина — не меньше самой широкой кнопки или ползунка, высота — не меньше, чем занимают все кнопки при этой ширине (уже — выше, шире — ниже). Уже сжатые группы при загрузке показываются в нужный рост; сохранённое значение при этом не трогается, а запоминается то, что видно, — когда уголок тянули и отпустили. Больше, чем нужно, — можно, как прежде.

Zazerkalius v0.331 — «в группу Аниматрица — кнопку: возврат всех битов на какие были». Кнопка ⤺ возврат (перед ⏮): поле снова такое, каким было до первой волны — проход 0, — сколько бы проходов ни прошло, одним щелчком; счёт проходов и цикла — с нуля. ⏮ возвращает только на проход назад, и его история ограничена по памяти, а исходные биты возврат держит всегда. «До волны» — это после последней правки строк не волной (руками, шаблоном, заготовкой, ↩): после такой правки волна начинает заново, и возврат ведёт уже к ней. Сам возврат — точка ↩.

Zazerkalius v0.330 — «проверь все подсказки у всех кнопок». Прочитаны все 247 подсказок страницы и сверены с тем, что кнопки делают сейчас. Исправлены устаревшие: 🗑 под чертой (обещала удаление щелчком по битам — снято в v0.325); край левой панели (двойной щелчок — ширина по умолчанию, сама она с v0.255 не расширяется); «↺ Начало» — в «Шаблонах», не в «Построении» (v0.305), и ⭐ называла её прежним именем «↺ Начальные»; список оси кольца — пункты с v0.320 «⇄ строки», «★ лучшая», «✋ вручную», «◐ 180°», подсказка ссылалась на старые названия; режимы кручения — без номера версии в тексте; ▶ крутить — направление с v0.136 задаёт кнопка ↻ / ↺, а не «минус», и про правый щелчок (всё кручение на места) не было ни слова; ⌖◁ ⌖▷ — вместо путаной смеси «(v0.139: …)» и прежнего поведения «в щель кольца 2» — как они работают сейчас: крутят строку 1, пока вырез не встанет на неподвижный лазер, открыт — закрывают; счёт Аниматрицы — что такое проход, волна и цикл; ✕ у полосы текста — «убрать полосу», окна больше нет. Остальные подсказки верны.

Zazerkalius v0.329 — по снимку «проход 0 · волна 0/47» — «проход — это же цикл? как точнее объясни и поправь, если». Нет, не одно и то же. Волна — номер строки, до которой дошла перезапись в этом проходе (из N − 1: строка 1 не переписывается, она источник). Проход — волна прошла от верха до низа один раз. Цикл — через сколько проходов картина всего поля повторилась (сравнение по отпечатку после каждого прохода); он может быть и 1 проход, и тысячи, а может не найтись долго. Путаница была в самой странице: галка «⟳ циклами» и «цикл/с» у ползунка на деле гнали и считали проходы (название пришло из Треугольника). Теперь — «⟳ проходами» и «прох/с». А найденный цикл в строке счёта пишется полнее: «цикл 12 прох. (с 3-го)» — повтор длиной 12 проходов, начался с прохода 3.

Zazerkalius v0.328 — по снимку полей «[256 стр.] [сид 1]» — «выровняй по середине». Число или строка в поле с подписью внутри (v0.327) — по середине поля, между подписями, а не прижаты к левому краю; по высоте — тоже посередине.

Zazerkalius v0.327 — по снимку «[256] стр. · сид [1]» в «Аниматрице» — «текст убрать в поля». У полей ввода в группах конуса подпись теперь внутри самого поля, мелко и приглушённо: что стояло перед полем — слева в нём (сид, от, ↔ у «⁑ 2 бита», ⌖× у лучей лазера), что после — справа (стр., ° у угла лазера); число или строка отступают под подпись. Мышь проходит сквозь подпись — щёлкаешь в поле, как прежде. Поля — шириной в кнопку, как остальное (v0.317). Стрелок-вертушек у числовых полей больше нет — они наезжали на подпись справа; колесо над полем в фокусе и клавиши ↑ ↓ меняют число, как и раньше.

Zazerkalius v0.326 — по снимку окна «📝 Текст конуса и лог лазера» — «в низ конуса на всю длину, и с возможностью скрытия». С v0.158 оно плавало поверх всей страницы; теперь пристёгнуто к низу окна конуса полосой во всю его ширину, и холст конуса кончается над ней — ничего не закрывает. Высота — тянуть заголовок полосы вверх / вниз (помнится). Скрыть — ▾ в заголовке или двойной щелчок по нему: остаётся одна тонкая полоса-заголовок, ▴ (или снова двойной щелчок) — вернуть. «📝 Текст» в шапке и ✕ — убрать полосу совсем, как прежде. Свёрнуто окно конуса или дзен — полосы нет; на странице одного конуса (?solo=cone) она так же внизу.

Zazerkalius v0.325 — по снимку строк под чертой — «наведение на бит под чертой — убери удаление по клику». С v0.244 наведение на строку за чертой красило её и все строки до черты красным, а щелчок удалял их насовсем. И подсветка, и удаление щелчком сняты: строки под чертой просто лежат, их удаляет только 🗑 в углу поля (и «Заменить» при достройке).

Zazerkalius v0.324 — по снимку черты под двумя строками — «когда вниз тянуть — пусть появляется окошко, по умолчанию до следующего 2, 4, 8, 16… ближайшего, и можно руками набрать номер строки». Протянул черту вниз и отпустил — прямо под ней окошко ↧ до [N] ✓ ✕. N — ближайшая степень двойки не меньше того, до куда дотянул: две строки, чуть потянул до третьей — 4; до девятой — 16 (до 1024 — предел достройки). Число выделено — можно сразу набрать своё. Enter или ✓ — поле достраивается до строки N тем же способом, что и протяжкой (Серп 90 / 30 / маска, сперва — строки из-под черты, если «⤒ из-под черты» включено); меньше, чем есть, — лишние уходят за черту. Esc, ✕ или щелчок мимо — остаётся как дотянул. Протяжка и окошко — каждая своя точка ↩. Вверх черту тянут как прежде, без окошка.

Zazerkalius v0.323 — «колёсико в левой панели — скролл всех окон». Своей прокрутки у левой панели нет (кроме режима значков), и колесо над ней ничего не делало. Теперь колесо над левой панелью прокручивает стол со всеми окнами, как если бы крутили над самим столом; Shift + колесо — стол вбок. Если под мышью то, что прокручивается само и ещё может, — группы кнопок на панели, список шаблонов, панель в режиме значков, — крутится оно, как прежде; поле ввода в фокусе — тоже своё. Ctrl + колесо — масштаб страницы, не трогается.

Zazerkalius v0.322 — по снимку «⚡ ◂──●──▸ 32 стр/с» в «Аниматрице» — «тут число может прям в ползунок закинуть?». Число у ползунков, где оно есть (⚡ скорость волны, скорость кручения, щель лазера), теперь лежит поверх самой дорожки, по её середине — мелко, с тенью цвета фона, чтобы читалось и на дорожке, и на бегунке; мышь проходит сквозь него, ползунок тянется как прежде. Места справа под число больше не нужно — такие ползунки тоже длиной в две кнопки, как остальные (с v0.320 были в три).

Zazerkalius v0.321 — по снимку круглого значка ⌂ в левом нижнем углу — «это наверх, перед заголовком». Значок «в Хаб» (общий модуль hub-link.js, на всех страницах — в левом нижнем углу поверх всего) на этой странице переставлен в шапку, перед «Zazerkalius»: поменьше (26 px), в ряд с кнопками шапки, холст конуса больше не перекрывает. Клавиша H ведёт в Хаб, как прежде. В дзене шапки нет — и значка тоже. Сам модуль не тронут, другие страницы — как были.

Zazerkalius v0.320 — три просьбы по снимкам. «◀ ось: вручную ▶» — «не отделяй их при перестановках, это одно; уменьши длину, и значки первыми, потом текст сокращ.»: стрелки со своей подписью или списком — один блок: ◁ ↻ бит ▷ и ◀ [ось] ▶. Блок не рвётся при переносе строк группы и перетаскивается (в другую группу, окно, шапку) целиком — за любую его кнопку; прежние перестановки этих кнопок теперь двигают весь блок. Длина блока — две кнопки: стрелки в полкнопки, посередине подпись или список шириной в кнопку. Пункты списка — значком и коротко: ⊘ без оси, ★ лучшая, ⇄ строки, ✋ вручную, ◐ 180° (полное название — в подсказке пункта). И «ползунки и значки их — в длину кнопки»: ползунок со значком теперь длиной ровно в две кнопки (с числом справа — ⚡ волна, скорость кручения, щель — в три) и стоит в ряду с кнопками по той же сетке; не влез в строку — переносится и встаёт от того же края. Значок (↕ ▬ ♩ 🔊 …) — в столбце одной ширины, дорожка забирает остальное. Правило v0.316 «ползунки подряд — каждый своей строкой» снято: теперь они встают по два в ряд, если помещаются.

Zazerkalius v0.319 — по снимку группы «Кольца» — «стрелки — между ними текст и поле». Было: «по биту: ◁ ▷» и «[ось: вручную ◀ ▶] ◀ ▶» (список к тому же обрезан стандартной шириной v0.317). Стало: ◁ по биту ▷ и ◀ [ось] ▶ — стрелки по краям, между ними подпись или список. Список оси — по своей подписи (до 170 px), не обрезан; в пункте «ось: вручную» лишние ◀ ▶ сняты — стрелки теперь вокруг списка. Кнопки и их действия не менялись.

Zazerkalius v0.318 — две просьбы подряд. «Звук: кнопку режим 2 бита — чтобы сразу с 2 битов шёл звук, и задать как-то расстояние»: в «Звуке» кнопка ⁑ 2 бита и рядом число ↔ (по умолчанию 4). Включена — в каждой звучащей строке читают две «головки»: та, что была, и вторая на ↔ бит впереди неё, по кругу строки (строка — кольцо конуса, конец переходит в начало); звучат оба бита разом, двумя голосами, громкость делится. Работает во всех режимах: строка, выделенные разом, по очереди, по 2 строки; в «столбцах» — два столбца разом (↔ столбцов между ними), строка, у которой 1 в обоих, звучит один раз. ◉ бит подсвечивает в поле обе головки. Выключена — поле ↔ тусклое, звук — как прежде. И «в Вид — кнопку: подсветить 1 бит каждой строки»: галка-кнопка ① 1-й бит — первый бит каждой строки (самый левый в поле) обведён золотом на своём кольце, видно, откуда строка начинается и куда повёрнута; в 3D — золотая черта по биту. У строк из 1–2 бит в «многоугольниках» (точка и Г) обводки нет.

Zazerkalius v0.317 — по снимку группы «Звук» на левой панели (каждая кнопка и список — своей строкой, все разной длины) — «всем кнопкам и спискам — стандарт длины кнопок, если в строку более чем 1 помещается, то туда». У кнопок, кнопок-галок и списков во всех группах конуса теперь одна ширина — 80 px (переменная --bu), кнопка-значок, где не больше двух знаков (◀ ▶| ↻ ⏮ 01), — в полширины, так что две такие занимают место одной обычной. Сколько влезает в строку группы, столько и встаёт, и столбцы получаются ровными. Кто значок, считается по подписи и пересчитывается, когда она меняется (▶ / ⏸, «◉ только значки»). Длинная подпись обрезается по краю — целиком она в подсказке у кнопки. Ползунки (строкой, v0.316), подписи вроде «весь:» и числовые поля — своей ширины, как были.

Zazerkalius v0.316 — «ползунки, если не в строке, то все друг под другом, и выровняй». Ползунки, что стоят в группе подряд (↕ высота и ▬ толщина в «Виде», ♩ темп и 🔊 громкость в «Звуке»), теперь каждый своей строкой во всю ширину группы, один под другим, а значок слева — в столбце одной ширины: дорожки начинаются ровно от одного края (прежде 🔊, шире ♩, сдвигал свой ползунок вправо). Одиночный ползунок среди кнопок — скорость кручения, щель лазера, ⚡ скорость волны — остался в ряду с ними. Только CSS, на полосе конуса и на левой панели одинаково.

Zazerkalius v0.315 — по снимку группы «Звук» — «дай возможность уголком менять вручную размер» и следом «и перетаскивание за любую пустую область». В правом нижнем углу каждой группы кнопок конуса (на полосе, поверх холста и на левой панели) — маленький уголок в две косые черты цвета группы: тянешь его — меняются ширина и высота группы, кнопки переносятся по новой ширине (ограничение 430 px у блока кнопок для такой группы снято). Размер помнится (Z.cgrpSize, едет в пресет вместе с местами групп), двойной щелчок по уголку — прежний, сам по содержимому. Свёрнутая до заголовка группа уголка не показывает и размер на это время не держит. Тащить группу теперь можно не только за подпись, а за любое место без кнопок, полей и списков — промежутки между кнопками, подписи вроде «весь:», поля вокруг; курсор там — «переместить». Двойной щелчок по пустому месту по-прежнему сворачивает группу, правый щелчок по подписи — обратно на полосу.

Zazerkalius v0.314 — по снимку пульта у холста конуса в плоском виде (🧊 3D, ⧗ зерк., ↺, ⠿, ▶ крутить, ↻) — «тут сразу покажи все кнопки, но приглушёнными, которые не активны». С v0.285 в плоском виде кнопки 3D (⟲ ▲ ⟳ − ⌂ + ▼) пропадали совсем, и пульт сжимался; теперь он всегда полный, той же формы и в той же бирюзовой рамке, что в 3D, а кнопки 3D в плоском виде тусклые и не жмутся (щелчок по ним ничего не делает и пульт не тащит). Включил 🧊 3D — те же кнопки становятся яркими, на своих местах. ↺ всё на места, ▶ крутить и ↻ работают в обоих видах, как прежде.

Zazerkalius v0.313 — по снимку полосы конуса — «группы кнопок сделай разными цветами, сделай все ползунки стандартного размера раза в 2 длиннее». Группы: у каждой свой цвет — полупрозрачный фон, рамка и подпись, как у «Кручения» с v0.153 (оно так и осталось золотым): «Вид» — голубой, «Кольца» — зелёный, «Аниматрица» — оранжевый, «Звук» — фиолетовый, «Лазер» — розово-красный. Цвет — классом у самой группы, поэтому едет с ней и на левую панель, и когда её тащат; там фон непрозрачный, как был. «Дзен» — служебная, пунктирная, без цвета. Ползунки: короткими их делала не страница, а стрелки ◂ ▸ общего модуля slider-arrows.js — обёртка брала прежнюю ширину ползунка (60…90 px), и стрелки съедали из неё свои 32 px, дорожке оставалось 30…60. Теперь у всех ползунков страницы одна длина — 140 px вместе со стрелками, дорожка около 108 px (вдвое длиннее прежней средней). Модуль не тронут — правило только на этой странице.

Zazerkalius v0.312 — по снимку левой панели со свёрнутыми группами — «поправь, когда сворачивается, чтобы кнопка обратно развернуть не заезжала вверх». Кнопка ◂ (свернуть панель в значки) стоит в правом верхнем углу панели поверх первого заголовка «💾 Страница целиком» — с v0.310, когда у заголовков появилась стрелка ▾ / ▸ справа, эта стрелка у первой группы оказалась прямо под ◂, и свёрнутую группу было не видно, как развернуть (и сам заголовок обрезался: «Страница целико»). Теперь первый заголовок кончается левее кнопки: справа у него отступ под ◂, длинная подпись переносится на вторую строку, стрелка ▸ видна рядом с кнопкой. В столбике значков заголовков нет — там ничего не менялось.

Zazerkalius v0.311 — «двойной клик по полю строк не убирает выделение — даже вне бит, должен убрать все». В v0.292 двойной щелчок по любому месту строки (и по пустому рядом с битами — строка тянется во всю ширину поля) выделял её, поэтому выделение не снималось. Теперь двойной щелчок выделяет строку только по её номеру; по битам, по пустому месту в строке и мимо строк — снимает все выделения (строки, подсветку текущей, текст, ось). Одиночный щелчок по битам выделяет строку, как и прежде.

Zazerkalius v0.310 — по снимку левой панели — «скрывай вкладки при нажатии заголовка». Щелчок по заголовку группы левой панели («💾 Страница целиком», «Шаблоны», «Построения», «△ Треугольник из строки», «✂ Нарезать треугольник», «Заготовки») сворачивает её, ещё щелчок — разворачивает; справа у заголовка ▾ / ▸. Какие группы свёрнуты, страница помнит. «◯ Группы конуса» и «Окна» (их показывает сама страница) не сворачиваются. В панели значками (◂) видно всё, как прежде.

Zazerkalius v0.309 — «поле Конус — одиночный клик без перемещения — снять выделение». Щелчок по холсту конуса без сдвига (без Ctrl и Shift) — как Esc: выделенные кольца (строки) сняты, подсветки текущего нет; и в плоском виде, и в 🧊 3D. Прежде (v0.248) такой щелчок по кольцу делал его строку текущей, а нажатие по холсту зажигало подсветку текущего (v0.107) — это снято. Остальное как было: Ctrl + щелчок по кольцу — выделить / снять кольцо, Shift + щелчок — сменить бит, тянуть — сдвиг вида (в 3D — вращение), Ctrl + тянуть кольцо — крутить его, щелчок по ячейке строки для заполнения — 0 ↔ 1, двойной щелчок — кручение / пауза.

Zazerkalius v0.308 — по снимку группы «Построения» — «отсюда удали дубли». Сняты две кнопки, которые повторяли «Заготовки» (v0.307 — рядом в левой панели): «● Зерно» (вставить «1» под текущей — ровно заготовка «● 1») и «🎲 Случ.» (случайная строка). Чтобы не потерять «той же длины», заготовка «🎲 Случ. 16» стала «🎲 Случ.»: случайная строка длиной как текущая, нет строк — 16 бит. Остальные кнопки «Построений» на странице больше нигде не повторяются.

Zazerkalius v0.307 — по снимку панели под чертой — «отсюда убери то, что не относится к построению от линии». Под чертой остались только «достроить:» (🔺 Серп 90, 30, маска, ▮ стенка) и «под чертой:» (Заменить, ⤒ из-под черты). Остальное не удалено, а переехало в левую панель, под «△ Треугольник из строки»: группа «✂ Нарезать треугольник» (✂, фигура, высота, порядок, без пустых) и группа «Заготовки» — встроенные шаблоны (● 1, 🔺 Серп. ×16, Туэ–Морс, 0…15, палиндромы, 0101…, сбой, случайная), по два в ряд, как было до v0.225. Работают как прежде.

Zazerkalius v0.306 — по снимку кнопки «✕ Удалить» — «удали её». Кнопка «✕ Удалить» (удалить текущую строку) снята из «Построений». Строки по-прежнему удаляются клавишей Del — выделенные или текущая; ↩ вернёт.

Zazerkalius v0.305 — по снимку кнопки «↺ Начало» — «также» (к Шаблону, как «🧹 Очист.» в v0.304). «↺ Начало» (столбик — снова начальные строки) переехала из «Построений» в группу «Шаблоны», после «🧹 Очист.». Работает как прежде.

Zazerkalius v0.304 — по снимку кнопки «🧹 Очист.» — «это к Шаблону». «🧹 Очист.» (очистить весь столбик) переехала из группы «Построения» в группу «Шаблоны» левой панели, после «+ новый». Работает как прежде.

Zazerkalius v0.303 — по снимку шапки окна «◯ Конус» — «сюда кнопку для открытия в …/Zerkalius-zazerkalius.html?solo=cone». В шапке окна конуса появилась ↗: открывает конус отдельно (эта же страница с ?solo=cone — одно окно конуса и поле строк, своя память) в новой вкладке. Адрес строится от нынешнего, поэтому кнопка работает и на localhost, и на сайте. В самом отдельном конусе ↗ нет.

Zazerkalius v0.302 — просьба пользователя, пересланная из другой сессии: «переименовать „💾 Всё“ и „📂 Всё“ и отделить их группу от „Шаблонов“». Кнопки называются «💾 В файл» и «📂 Из файла» (что делают — прежнее: вся страница в файл .json и обратно). Группа «💾 Сохранение» разделена на две: вверху «💾 Страница целиком» — «💾 В файл», «📂 Из файла», «⭐ Умолчание»; под ней «Шаблоны» — «💾 Сохр», «+ новый» и свои шаблоны. Подсказки и сообщения говорят новыми названиями.

Zazerkalius v0.301 — по снимку своего шаблона с 💾 ⚑ ✕ — «убери + Столбик под чертой, поставь к шаблонам + новый; выделенный шаблон — текущий, жёлтым, флажок тогда не нужен», и выбор «💾 Сохр — в текущий». Текущий шаблон горит жёлтым: с ним сравниваются строки (номера изменённых — золотом), и в него пишет «💾 Сохр». Щелчок по своему шаблону загружает его в поле и делает текущим (Shift — вставить под текущей строкой, текущим не делает). «+ новый» (рядом с шаблонами, в группе «Сохранение») — новый шаблон из всех бит, сразу текущий. «💾 Сохр»: есть текущий — перезаписывает его (правый щелчок — вернуть прежние биты, ещё раз — снова записанные), нет — сохраняет новый. Сняты: ⚑ и 💾 у каждого шаблона, «+ Столбик» под чертой.

Zazerkalius v0.300 — «строки не надо сохранять», «я о том, что шаблоны — только все строки, а не по одной». Кнопка «+ Строка» под чертой снята: свои шаблоны сохраняются только целым столбиком («💾 Сохр» в группе «Сохранение» или «+ Столбик»). 💾 у шаблона-эталона тоже всегда записывает весь столбик. Уже сохранённые шаблоны-строки не тронуты — работают как прежде, удалить — ✕.

Zazerkalius v0.299 — «да» на «правый щелчок по 💾 — вернуть прежнюю версию» (к v0.298). 💾 у шаблона-эталона теперь помнит, какими были биты шаблона до записи. Правый щелчок по 💾 возвращает прежние биты (и прежнее имя), а записанные уходят в запас; ещё правый щелчок — снова записанные. Запас один — последняя запись; он хранится вместе с шаблоном и едет в «💾 Всё».

Zazerkalius v0.298 — «у текущего шаблона — кнопку, которая изменённые биты сохранит, то есть изменит сам шаблон». У шаблона-эталона (тот, у которого горит ⚑, — с ним сравниваются строки, номера изменённых золотом) появилась 💾: записывает в сам шаблон нынешние биты — столбик получает весь столбик рабочего поля, шаблон-строка — текущую строку. После этого золотые номера гаснут: поле и шаблон снова совпадают. Имя, которое дала страница («Столбик · 27 стр.»), подстраивается под новый размер; своё имя не трогается. Прежние биты шаблона не сохраняются — об этом говорит подсказка кнопки.

Zazerkalius v0.297 — по снимку «💾 Сохр» и своего шаблона в шапке — «убери их в левую, в самый верх, сделай там группу, и туда все кнопки сохранения настроек и пресетов». В левой панели первой стоит новая группа «💾 Сохранение»: «💾 Сохр» (биты поля — своим шаблоном), «⭐ Умолчание», «💾 Всё» и «📂 Всё» (файл .json со всем), под ними — свои шаблоны во всю ширину (⚑, ✕, двойной щелчок — переименовать). Из шапки все они ушли. Работают как прежде; в панели значками — столбиком, без ⚑ и ✕.

Zazerkalius v0.296 — по снимку своего шаблона «Столбик · 27 стр.» (с ⚑ и ✕) под чертой — «это на верхнее меню, и кнопку Сохр (биты)». Свои шаблоны переехали в шапку, сразу за закреплёнными кнопками; перед ними — «💾 Сохр»: сохраняет все биты рабочего поля (весь столбик) своим шаблоном — как «+ Столбик», и новый шаблон становится эталоном ⚑. Щелчки те же: по шаблону — заменить столбик (строку — текущую строку), Shift — вставить под текущей, двойной — переименовать, ⚑ — эталон, ✕ — удалить. Под чертой остались встроенные шаблоны и «+ Строка / + Столбик».

Zazerkalius v0.295 — по снимку сообщения «Тянешь черту вниз — строки достраиваются от верхней: Серп 90…», висящего после нажатия, — «убирай уведомления, которые после нажатия, — при любом следующем клике». Любой щелчок где угодно на странице сперва гасит висящее уведомление (и подсказку); если сам этот щелчок что-то сообщает — его сообщение встаёт следом. Без щелчков уведомление гаснет само, как раньше.

Zazerkalius v0.294 — по снимку всплывшей у мыши подсказки шаблона — «все подсказки показывай в области уведомлений». Подсказки браузера больше не всплывают у мыши: наводишь на кнопку, галку, поле или номер строки — через четверть секунды её текст появляется внизу, там же, где уведомления, и держится, пока мышь над элементом. Ушла мышь — подсказка гаснет; нажал — её сменяет сообщение самой кнопки. Работает для всех подсказок страницы, в том числе у кнопок, которые появляются позже (шаблоны, закреплённые, копии). Сами тексты подсказок не менялись.

Zazerkalius v0.293 — по снимку уведомления внизу экрана, лёгшего на 🗑, — «убери влево значок и уведомление на всякий убери за значки, если накладываются». 🗑 переехал в ЛЕВЫЙ нижний угол видимой части поля строк (выше полосы прокрутки). И он теперь поверх уведомлений: кнопка лежит прямо на странице (position:fixed, выше уведомления), а не внутри поля — изнутри поля её над уведомлением не поднять. Место считается по полю на экране при каждой отрисовке и смене размеров; в дзене и фоне 🗑 нет.

Zazerkalius v0.292 — «2 щелчка по строке — выделение, а по битам одинарный, как сейчас» (уточнение к v0.291). Двойной щелчок по строке рабочего поля — по номеру, по битам или по пустому месту в строке — выделяет эту строку; одиночный щелчок по битам выделяет, как и прежде. Снимает все выделения теперь только двойной щелчок мимо строк — по пустому месту поля или по строкам под чертой. Заголовки полей, ручки осей и строка для заполнения двойной щелчок не трогает.

Zazerkalius v0.291 — «двойной клик по полю строк — должен убирать все выделения». Двойной щелчок в любом месте поля строк снимает всё сразу: выделенные строки, подсветку текущей строки (как Esc), выделенный текст и выделение оси. Раньше (v0.266) он только убирал слово, которое сам выделял на битах. Исключения: двойной щелчок по черте по-прежнему возвращает все строки, а в панели под чертой (кнопки, поля, шаблоны — там свой двойной щелчок, переименование) поле его не перехватывает.

Zazerkalius v0.290 — по снимку поля (🗑 в конце панели под чертой, ниже — строки) — «вот тут в нижний угол всегда». 🗑 вынесен из панели под чертой и стоит поверх поля строк, в правом нижнем углу его видимой части — левее и выше полос прокрутки. Строки прокручиваются, а 🗑 остаётся в углу; при коротком поле — тоже в углу, а не сразу под строками. Место пересчитывается при каждой отрисовке и при смене размеров поля. Когда под чертой пусто, 🗑 бледная и не нажимается, как прежде.

Zazerkalius v0.289 — «значок удалить побольше и прижми вниз вправо» (про 🗑 под чертой). 🗑 крупнее (18 px) и стоит последним в панели под чертой — в правом нижнем углу, после шаблонов. Что делает — как прежде: стирает все строки под чертой, горит, только когда там что-то есть.

Zazerkalius v0.288 — «убери выделение, когда нет внизу ничего» и «да» на разделение кнопок под чертой на группы. «Заменить» и «⤒ из-под черты» касаются только строк, что уже лежат под чертой: когда там пусто, обе ничего не делают, и теперь их подсветка не горит (как и 🗑, погашенная с v0.245). Выбор при этом сохраняется — как только под чертой появятся строки, подсветка вернётся; щелчок по кнопке при пустоте так и говорит. Группы: у трёх кнопок «Заменить · ⤒ из-под черты · 🗑» своя подпись «под чертой:», как у «достроить:» и «нарезать:», и перед каждой подписью, кроме первой, — отступ.

Zazerkalius v0.287 — по снимку кнопки «🗑 под чертой» — «текст — удалить». На кнопке остался один значок 🗑; что она делает — во всплывающей подсказке, как и было.

Zazerkalius v0.286 — по снимку кнопок под чертой, где «Заменить» и «⤒ из-под черты» горят вместе, — «они вместе не могут быть включены, нелогично». Так и есть: при «из-под черты» тянешь черту вниз — сперва возвращаются строки, что под ней, и к достройке под чертой пусто, заменять нечего; а по умолчанию были включены обе. Теперь одна или другая: включил «Заменить» — «из-под черты» гаснет, и наоборот. Сохранённое не переписывается: при включённом «из-под черты» «Заменить» просто показана выключенной — так она и работала.

Zazerkalius v0.285 — по снимку пульта в плоском виде (🧊 3D / ⧗ зерк., под ними пустота, ↺, ⠿, ▶ крутить / ↻) — «ужми пульт в плоском виде». Кнопки 3D в плоском виде были невидимы, но держали место (visibility:hidden) — два пустых ряда. Теперь они убраны совсем: пульт — ряд «↺ … ⠿» и ряд «▶ крутить / ↻», над ним «🧊 3D / ⧗ зерк.». В 3D — как был.

Zazerkalius v0.284 — «и обычную запись mp4 тоже сделай покадровой — такую возможность». Обычная ⏺ / mp4 пишет то, что делаешь руками, — это реальное время, её оставили. Рядом новая 🎞 — покадровая запись КРУЧЕНИЯ: шаг кручения вынесен из кадра анимации в autoStep(dt) (режимы, лазер, краска, ✺, остановки на проходе — всё то же), и 🎞 зовёт его ровно на 1/fps секунды на кадр, рисует и отдаёт кадр кодировщику (общий с ↻1: WebCodecs H.264 + mp4-muxer). В ролике время ровное, как бы ни тормозил браузер: на экране конус тогда идёт медленнее, в файле — ровно. В файл идут кадры, только пока крутится: ▶ стоп или кручение встало само — запись ждёт, ▶ — дальше в тот же файл. Ручки крутить можно. На кнопке — длина ролика. 30/60 к/с — правым щелчком (общий с ↻1). Без звука.

Zazerkalius v0.283 — «запись конуса для обоев можно как-то независимо сделать, чтоб не тормозил, даже если в браузере тормозит». ↻1 (один оборот для Lively) писал экран в реальном времени (MediaRecorder): кадр считался дольше 1/30 с — в ролике рывок. Теперь ↻1 пишет покадрово: для кадра k фаза кручения ровно s0 + P·k/N, кадр рисуется и уходит в кодировщик H.264 самого браузера (WebCodecs) с меткой времени k/fps; mp4 собирает библиотека mp4-muxer 5.2.2 (jsdelivr, грузится при первой записи). Сколько бы ни считался кадр — в ролике всё ровно, медленный компьютер просто дольше пишет; на кнопке — проценты, в подсказке — сколько осталось. N кадров — ровно один период, ролик замыкается без скачка. 60 кадров/с, правый щелчок по ↻1 — 30/60. Размер — холст конуса (▣ показывает кадр), стороны округляются до чётных. Без звука. Вкладку можно свернуть — не встанет. Нет WebCodecs, интернета или кодировщик не берёт размер — прежняя запись в реальном времени. ⏺ и mp4 (обычная запись) — как были.

Zazerkalius v0.282 — «галки тоже сделай переименовываемыми». В ✎ Правке щелчок по галке (по флажку или её подписи) не переключает её, а открывает тот же редактор: своё название, «◉ значок» (👁 выдел. → 👁), «↺ как было»; «вся панель» теперь берёт и галки. Помнится по флажку (Z.btnLab, ключ — его имя); подпись рисуется после флажка поверх исходного текста. Копии галок на холсте и в «Дзене» — со своим названием. Списки и ползунки по-прежнему только переставляются.

Zazerkalius v0.281 — четыре просьбы подряд. (1) По снимку «Кручения»: «дай возможность включать режим редактирования панелей — там переставлять кнопки и давать им названия или оставлять только значки». В шапке — ✎ Правка (выход — ещё раз или Esc). В режиме кнопки панелей не жмутся: щелчок открывает редактор — своё название, «◉ значок» (только значок), «↺ как было», и то же для всей панели. Текст кнопки код меняет по-прежнему (▶ крутить → ⏸ стоп) — подпись рисуется поверх, значок берётся живой; своё название без значка получает значок кнопки впереди. Хранится Z.btnLab, пишется только по действию. (2) «Сделай, чтобы кнопки можно было перемещать по любым группам-панелям»: перетаскивание (было — только между группами конуса, v0.258) теперь идёт в любую панель — группы конуса и левой панели, полосы кнопок всех окон, шапку; место — Z.btnMove. Попутно: перенос в конец своей же группы раньше забывался после перезагрузки — теперь помнится (сравнение с исходным соседом справа). (3) «В режиме настройки нужна группа Дзен — туда кнопки копируются, а не перемещаются»: группа Дзен у конуса — видна в Правке и в дзене; брошенная в неё кнопка — копия, жмёт оригинал и горит, как он; внутри копии переставляются, вытащил наружу или правый щелчок в Правке — убрана (Z.zenBtns). (4) «Нужна кнопка запрета выделения колец в конусе — она где-то есть?» — не было; теперь галка 🚫 выбор рядом с «👁 выдел.»: щелчок по кольцу не делает его текущим, Ctrl + щелчок не выделяет, наведение не обводит; сдвиг вида, Shift + щелчок (бит) и Ctrl + тянуть — как были.

Zazerkalius v0.280 — «проверь перетягивание границы — как будто всё осталось, что-то тормоза». Замер на 66 строках (6000 элементов на странице): нажал и повёл — 59 мс, отпустил — 240 мс. Две причины. (1) Курсор ↔ на время протяжки ставился правилом body.wdrag *, а cursor и user-select наследуются: смена класса у body перестилизовала ВСЕ элементы — по 55–70 мс и на нажатии, и на отпускании. Теперь курсор даёт прозрачная накладка поверх страницы (#wShield), у body.wdrag своих свойств нет. (2) Подгонка шага строк (rowsFit) считала ширину поля частью ключа и после каждой протяжки заново раскладывала поле 4–5 раз (0,13 с), хотя строки не переносятся и их высота от ширины не зависит. Ширину из ключа убрали. Стало: начало — 5 мс, отпускание — ~90 мс (это уже сама перекладка поля под новую ширину). То же касается границы панели (#paneEdge).

Zazerkalius v0.279 — по снимкам списка «Всё / Каждое / Встреч Стр / Встреч Бит» и пульта 3D: «это вынеси в кнопки, кнопку Крутить копируй в квадрат этот кнопок … вместе с направлением». Режим кручения в «Кручении» — четыре кнопки слитной полоской, выбранная горит золотом (список остался скрытым: на его значении держатся 🎯, пресеты и «💾 Всё»). В пульте на холсте конуса — нижняя строка: ▶ крутить (⏸ стоп, правый щелчок — всё кручение на места) и ↻ / ↺ направление; жмут те же кнопки «Кручения» и горят вместе с ними. Строка видна и в плоском виде, где от пульта остаётся только зелёная ↺.

Zazerkalius v0.278 — по снимку строки под полем «66 стр. · 2211 бит · текущая 32 … · H 0.99 · ⇄ 56%»: «эту надпись убери здесь и помести её в подсказку для номеров». Под последней строкой сведений больше нет — место не занимают. Наведёшь на номер строки — во всплывающей подсказке сначала своё (строка N, изменена ли), а вторым абзацем те же сведения поля целиком: число строк и бит, текущая, за границей, метрики H и ⇄. Берутся свежими на каждое наведение.

Zazerkalius v0.277 — по снимку столбика номеров с замками и счётчиками (н·м, 0·1): «выделять тут только за номера — всю строку». Протяжка с номера через несколько строк выделяет их целиком, подряд (с Ctrl — к прежним), как протяжка по битам (v0.254); щелчок по номеру — как был (Ctrl — добавить, Shift — диапазон). Счётчики рядом с номером строку больше не выбирают — щелчок по ним ничего не делает, курсор над ними обычный; замок и ↻ — как были. Ширину поля номера больше не тянут (v0.274) — жест освободился.

Zazerkalius v0.276 — по снимку списка «1 поле … 4 поля»: «здесь + создать (поле), и показывать только, если создано 1, 2, 3 поля». В списке теперь только поля, что есть (1 … сколько сейчас), и «+ создать поле», пока их меньше 4. Создать — ещё одно поле, и оно сразу рабочее; если в этом месте лежали строки поля, скрытого раньше выбором меньшего числа, — оно возвращается с ними (строки не стираются, как и прежде), об этом говорит сообщение. Выбор меньшего числа — как был: лишние поля прячутся, не стираясь; удалить поле — ✕ в его заголовке.

Zazerkalius v0.275 — «граница всё равно — не всегда цепляется». Поверх неё ничего не лежало (проверено по всей высоте в обоих положениях поля), но хват был 6 px и невидим: чуть промахнулся внутрь поля — начинался сдвиг поля (v0.264), наружу — стол. Теперь хват 10 px, у края поля — тонкая линия, куда целиться; строки отступают от хвата на его ширину (при поле справа — слева), полоса кнопок над полем — поверх хвата, чтобы её крайние кнопки («по центру») не перекрывались.

Zazerkalius v0.274 — «перетаскивание за номера убери — там сейчас есть граница». Ширину поля строк с v0.218 тянули и за столбик номеров (граница-разделитель тогда была снята), с v0.224 — ещё и за невидимую полосу у края поля. Теперь — только за границу поля; номера снова только выбирают строку (курсор — рука, столбик при наведении больше не подсвечивается). Сброс ширины по умолчанию (двойной щелчок) переехал с номера на саму границу.

Zazerkalius v0.273 — по снимку пульта 3D: «по ширине этого квадрата их расположи сверху». «🧊 3D» и «⧗ зеркало» над пультом (v0.270) торчали влево шире него; теперь стоят ровно по его ширине, пополам (по 48 px), шрифт мельче, «зеркало» — «⧗ зерк.» (полное имя — в подсказке).

Zazerkalius v0.272 — «скролл и граница — друг на друге, посмотри где». Нашлись два места. (1) При «⇆ поле справа» полоса прокрутки стола, перенесённая в v0.270 к его левому краю, легла на хват ширины левой панели (он заходит в стол на 3 px) и закрывала его — теперь полоса правее хвата. (2) При поле слева хват ширины поля (6 px у правого края поля) лежал прямо на полосе прокрутки поля строк — тянули одно, попадали в другое; теперь поле строк отступает от края на ширину хвата, полоса прокрутки — левее него, рядом.

Zazerkalius v0.271 — «тормоза от этой границы остались — там что-то глючит, граница отдельно от курсора тянется иногда». Две причины. (1) Залипание: протяжку ширины за номер строк слушало только само поле; нажал на номер, повёл вниз (не вбок — это ещё не протяжка ширины) и отпустил вне поля — «отпущено» до поля не доходило, слушатели оставались, и следующее движение мыши над полем тянуло границу уже без нажатой кнопки. Теперь «отпущено» ловится на всём окне (и потеря фокуса окна тоже), а движение без нажатой кнопки сразу заканчивает протяжку — так у ширины поля, у ширины левой панели и у черты строк. (2) Тормоза: в v0.269 поле перекладывалось вживую, пока кадр не окажется дольше 0,1 с, — на среднем поле это рывки по 50–100 мс. Теперь при протяжке ширины поля и левой панели поле не перекладывается совсем: за мышью идёт тонкая черта ровно там, где встанет граница, ширина — один раз, когда отпустили.

Zazerkalius v0.270 — три просьбы. (1) «Можно ли конвертировать в обои то, что сделано в полях, в движении?» → из трёх предложенных «сначала запись ровно одного оборота, потом остальные два» (режим обоев для поля строк и пакет для Lively — впереди). ↻1 в полосе записи конуса: запись сама ведёт кручение от места, где конус стоит, до того же места и останавливается — по часам, а не по кадрам, последний кадр за миг до начала, поэтому ролик в Lively крутится по кругу без скачка. Цикл: «всё целиком» и «навстречу по строкам» — 360°, «по биту» — НОК длин строк в битах (если он огромный или оборот дольше 30 мин — сказать и не писать). Скорость и направление — с «▶ крутить»; лазер на время записи выключается (он меняет рисунок, цикл бы не замкнулся); файл mp4, где браузер умеет. (2) По снимку полосы прокрутки вплотную к номерам строк — «этот скролл перемести влево конуса»: при «⇆ поле справа» это прокрутка стола с окнами (она у его правого края — у поля). Теперь своя тонкая полоса у левого края стола, родная спрятана; колесо, перетаскивание бегунка и щелчок по полосе работают. Не rtl: окна на столе стоят от левого края, при rtl вылезшие вправо стали бы недостижимы. То же — у левой панели, когда она прокручивается. (3) По снимку пульта 3D с кнопкой «🧊 3D» над ним — «сюда выбор 3D поставь примерно так» и «⧗ зеркало — туда же»: над пультом у холста конуса — «🧊 3D» и «⧗ зеркало», те же галки, что в «Виде» (включённая — золотая), видны и в плоском виде.

Zazerkalius v0.269 — по снимку поля, сжатого до номеров: «зависание при перетаскивании за границу — курсор уже отпустил, а она сама двигается и всё тормозит». Это была граница ширины поля (тянут за номера или за край поля), а не черта строк. Замер на 180 строках: каждый шаг ширины — 1–2 с: вся раскладка и отрисовка поля (цифры переносятся по-новому), подгонка шага строк (0,2 с — ширина входит в её ключ), кнопки над столбиками; кадры шли медленнее мыши, и граница догоняла её уже после отпускания. Теперь ширина ставится не чаще кадра (последнее место мыши), подгонка шага и кнопки — один раз, когда отпустили; а если кадр всё равно дольше 0,1 с — поле больше не перекладывается, граница идёт за мышью тонкой чертой, и ширина встаёт, когда отпустили. Отпустили кнопку, а браузер не прислал «отпущено» — это видно по следующему движению, и протяжка заканчивается (так же и у черты строк).

Zazerkalius v0.268 — «а если одну кнопку на всё — и потом выбор окна кликом: либо строки, либо конус, и потом 3D». ⏺ ушла из полосы поля строк в шапку (перед 📝 Текст) и стала общей: нажал — окна под мышью обводятся золотым, щелчок по окну — пишется оно, Esc или щелчок мимо — отмена; пока выбираешь, щелчок по окну ничего в нём не делает (конус не крутится, строки не выделяются). На выбор: поле строк, ◯ конус (и в 3D — тот же холст), 🧊 вид, ▲ пирамида. Холсты пишутся напрямую (captureStream) — без вопроса браузера и без кнопок поверх холста; поле строк — как в v0.267, вкладкой с обрезкой по полю. Файл — Zerkalius-stroki / konus / vid / piramida-дата.mp4; звук «♫ Звук», ⏸ пауза, красная рамка у записываемого окна — общие. ⏺ и mp4 на холсте конуса остались как были (с ▣ кадром и в дзене).

Zazerkalius v0.267 — «как записывать видео в области строк?» → «1» (из двух предложенных: запись вкладки с обрезкой или перерисовка строк на свой холст). Поле строк — не холст, у него нет captureStream, поэтому ⏺ конуса его не пишет. Новая ⏺ в полосе поля строк (рядом с 📂 💾): браузер пишет саму вкладку (getDisplayMedia с preferCurrentTab — спрашивает «Поделиться этой вкладкой?»), а кадр обрезается по полю строк (CropTarget / cropTo, Chrome и Edge). Выбран этот путь, потому что в файл идёт ровно то, что на экране — подсветка, звучащий бит, черта, прокрутка, выделение, — и ничего не надо перерисовывать. Цена — вопрос браузера при каждом старте. Звук — дорожка «♫ Звук», как у конуса; формат — mp4, если браузер умеет, иначе webm. Пока идёт запись — поле обведено красным пунктиром снаружи (в файл не идёт), ⏸ — пауза (рамка жёлтая), «Остановить показ» в браузере — тоже стоп и сохранить. Выбрали не эту вкладку — запись не начинается. Что поверх поля (всплывающие сообщения) — в кадр попадает. Заодно подсказка у бит — «щелчок по биту — выделить» (v0.266).

Zazerkalius v0.266 — «выделение сделай по 1 клику, но только по битам, вне бит — перетаскивание поля». Одиночный щелчок по самому биту (цифре) снова выделяет строку: ещё раз по ней же — снять, Ctrl — добавить / убрать, Shift — диапазон от прежней. Двойной щелчок строку больше не выбирает (он бы тут же снял выделение первого щелчка). Мимо бит щелчок ничего не выбирает, а протяжка двигает поле (v0.264). Протяжка по цифрам — как была: в одной строке выделяет символы (тогда строка не выбирается), через несколько строк — строки подряд; щелчок в конце такой протяжки выделение не сбивает. Править строку на месте — F2 / Enter.

Zazerkalius v0.265 — «зависание у границы перетаскивания строк поля». Замер на 400 строках: каждый шаг черты (строка за черту или из-под неё) шёл 1,1–1,25 с. Причины: (1) подгонка шага строк считала каждое новое число строк новым размером поля и заново раскладывала поле 4–5 раз (0,6 с); (2) расстановка ↺ 🔒 ⟲ над столбиками и сам замер размеров поля — ещё по полной раскладке. Теперь, пока черту тянут, шаг строк прежний и кнопки над столбиками не двигаются — и то и другое делается один раз, когда черту отпустили; вне протяжки подгонка тоже не раскладывает поле, если строк стало больше, а шаг и так самый тесный (0,7). Итог на тех же 400 строках: шаг черты — около 0,4 с (было 1,1–1,25). Остаток — одна раскладка всего поля; быстрее — только если рисовать одни видимые строки.

Zazerkalius v0.264 — «сделай перемещение вне клика бит в поле строк, а не выделение, оно — только на битах» и «но подсветка всей строки». Протяжка по полю строк мимо самих бит (цифр) — по пустому месту слева и справа от треугольника, под строками — теперь двигает поле, как рукой (прокрутка вбок и вверх-вниз), и выделения символов не начинает; курсор там — ладонь. Протяжка по цифрам — как в v0.254: в одной строке — символы, через несколько строк — строки целиком. Подсветка всей строки при наведении и выделении — как была. Номера, замки, черта, кнопки под чертой, строка для заполнения — как были; сдвинул поле — щелчок не срабатывает (строку под чертой случайно не сотрёт).

Zazerkalius v0.263 — «а теперь, когда скролл двинул нижний, выделение само пришло в 17 строку». Полоса прокрутки — часть поля строк, и нажатие на неё (как и на пустое место поля, строки под чертой, кнопки под чертой) снова зажигало подсветку текущей строки. Теперь её зажигает только нажатие на номер строки (и стрелки ↑ ↓ с клавиатуры, как было); замок и ↻ — нет (v0.261).

Zazerkalius v0.262 — «после перезагрузки — выделенная строка почему-то, хотя я снял выделение». Снятая подсветка текущей строки (двойной щелчок по выделенной, Esc) жила только до перезагрузки: страница её не помнила и при старте снова зажигала текущую. Теперь помнит (Z.noCur): сняла — после перезагрузки так и снято; выбрал строку — после перезагрузки она выбрана. Проверено перезагрузкой.

Zazerkalius v0.261 — баг: «нажимаю на 6 замок, а выделяется строка 21». Замок сам строку не выбирал, но любое нажатие в поле строк снова зажигало подсветку текущей строки (снятую раньше), а текущей была 21-я — остальные гасли, и казалось, что замок выделил её. Теперь нажатие на замок 🔒 / 🔓 и на ↻ подсветку текущей не трогает. Проверено: 25 строк, текущая 21, подсветка снята — щелчок по замку 6: кольцо 6 заперто, подсветка так и снята, ничего не выделено.

Zazerkalius v0.260 — «Звук: кнопки, ползунки — стрелки всем ползункам всегда, и покажи, какой бит сейчас играется в строках (кнопку, по умолчанию вкл)». (1) Подключён общий модуль сайта _js/slider-arrows.js: у каждого ползунка страницы — ◂ ▸ (щелчок — шаг, держишь — повтор), и у тех, что появятся позже. (2) В группе «Звук» — ◉ бит (по умолчанию вкл): пока звучит, в строках поля подсвечен бирюзовым бит, на котором сейчас каждая звучащая строка (строка — её бит, выделенные разом — у каждой свой, по очереди / по 2 — у звучащей строки, столбцы — у строк с 1 в этом столбце). Подсветка — Highlight API, строки не перерисовываются; звук остановлен — подсветка снята.

Zazerkalius v0.259 — по снимку столбика замков (у строк 75 и 80 — в золотой рамке): «непонятно, какие там варианты, зачем выделяется рамкой?» — рамка значила «свой замок кольца, общий его не слушает» → «не должно быть разницы, по какому — общий сразу все открывает и снимает, стирая различие». Теперь общий замок над столбиком запирает или отпирает все кольца разом, а свои замки колец стираются; рамки больше нет. Щелчок по замку строки по-прежнему запирает / отпирает одно это кольцо — до следующего щелчка по общему.

Zazerkalius v0.258 — по снимку «⧗ зеркало»: «не переносится на холст — надо у всех вкладок, чтобы могли, и между вкладками». (1) Галки (метки с флажком) не тянулись на холст с первого раза: у метки браузер решает, тащить ли, раньше, чем доходит нажатие, а разрешение ставилось в миг нажатия (со второго раза выходило). Теперь оно ставится уже при наведении мыши — проверено настоящей мышью, что причина в этом. (2) Между группами: кнопку или галку любой группы конуса (и на полосе, и на левой панели) можно перетащить в другую группу — переезжает она сама, не копия, перед той кнопкой, над которой отпустил (над правой половиной — после неё); группа под ней подсвечена. Место помнится (Z.cgrpMove — раскладка, в ⭐ умолчание не идёт); вернуть — перетащить обратно в свою группу, запомненное тогда забывается. Кнопки не из групп конуса (левая панель, под чертой) так не переезжают — только на холст, как прежде.

Zazerkalius v0.257 — «Звук — добавь, чтобы несколько строк выделенных — как-то разными звуками на строку, и режим чтения строк, и по 2 строки, и разные варианты с музыкой; если её вкл — то также на видео». В группе «Звук»: режимы — строка (как было), выделенные разом (все выделенные строки, до 8, звучат одновременно, каждая своим голосом и в своём такте; нет выделения — текущая), по очереди (чтение: строки одна за другой, как текст — выделенные, нет выделения — всё поле; какая звучит — сообщением), по 2 строки (пары строк разом, потом следующая пара), столбцы (как было). Новый выбор тембра: «🎨 разные» — у каждой строки свой (треугольник, квадрат, пила, синус, дальше — октавой выше и ниже), или один на всех — треугольник, синус, квадрат, пила, 🔔 колокол (синус с негармоническим обертоном и долгим затуханием). Видео: дорожка «♫ Звук» теперь идёт в запись ⏺ / mp4 всегда (когда не пишется звук ПК) — включил музыку посреди записи, она тоже в файле; молчит — в файле тишина.

Zazerkalius v0.256 — «видео — когда запись, на паузу можно?» → «да; и ещё в режиме дзен показывать все кнопки и группы вкладок, которые отмечу (надо у них кнопку сделать), а кнопки записи видео — всегда; и кнопку рядом с видео — ставит расположение, как будет на видео». (1) Кнопки записи — одной полосой в левом нижнем углу холста: ⏺ (webm), mp4, ⏸, ▣ (прежде mp4 стояла в ряду справа от холста и отнимала у него место). (2) ⏸ пауза — видна, пока идёт запись: запись встаёт, конус можно крутить и настраивать — в файл не идёт; ▶ — дальше в тот же файл; рамка кадра на паузе жёлтая, время в подсказке ⏹ — без пауз, длительность webm — тоже. (3) ▣ кадр — конус в середину кадра (как при старте записи) и рамка кадра на холсте, пока не нажмёшь ещё раз; рамка следит за размером холста (и в дзене). (4) Дзен: кнопки записи теперь видны (прежде прятались); у каждой группы конуса в заголовке — 🧘: отмеченные группы видны и в дзене, поверх конуса, где стоят (с левой панели — на время дзена у верхнего края, после — обратно на панель). Кнопки, перенесённые на холст (v0.203 / v0.249), в дзене видны и так.

Zazerkalius v0.255 — по снимку группы «Звук» на левой панели: «когда группы в левом меню — заголовки вверх, и проверь, чтобы все легли; ширину самого поля не менять, левого». На левой панели у группы заголовок теперь сверху, кнопки под ним во всю ширину панели (ползунки чуть короче, списки не шире панели). Панель сама больше не расширяется (в v0.252 она раздвигалась под две группы) — остаётся 250, как была; тянуть её край рукой по-прежнему можно, двойной щелчок по краю — снова 250. Проверено: все шесть групп на панели — ни одна кнопка не вылезает за край; не влезли по высоте — список групп прокручивается сам.

Zazerkalius v0.254 — «выделение в поле строк — по двойному щелчку или протяжкой» → «протяжкой по битам» и «вместо одного щелчка выделения — двойной нужен». По битам строк: одиночный щелчок больше ничего не выбирает и подсветку не трогает; двойной щелчок — выделить строку (по уже выделенной — снять, с Ctrl — добавить / убрать); протяжка по битам через несколько строк — выделить их подряд (с Ctrl — к прежним), остальные строки гаснут, как при выделении по номерам. Протяжка внутри одной строки по-прежнему выделяет символы (Del, Ctrl+C). Править строку на месте, что раньше было на двойном щелчке, — теперь F2 или Enter (текущая строка; не срабатывает, когда фокус в поле ввода или на кнопке). Номера строк — как были: щелчок выделяет, Ctrl / Shift — добавить / диапазон, двойной — ширина поля по умолчанию.

Zazerkalius v0.253 — «когда под линией у строк есть биты — надо кнопку, чтобы их включать, когда вниз тянуть; она по умолчанию». Под чертой — ⤒ из-под черты (по умолчанию вкл): тянешь черту вниз — сперва возвращаются строки, что лежат под чертой, по порядку, и только когда они кончились — достраиваются новые (Серп 90 / 30 / маска, от последней вернувшейся). Выкл — как в v0.225: черта вниз сразу достраивает новые от нижней строки над чертой, а что было под чертой — удаляется или сдвигается вниз по «Заменить». Проверено: над чертой 1…1111, под ней 00000 и 000000, черта на 7 — вкл: вернулись обе, седьмая достроена от них; выкл: 10001, 110011, 1010101, под чертой пусто.

Zazerkalius v0.252 — «а сами панели вкладок — переносить на левую панель, чтоб там по 2–3 в ряду вставали» (уточнено: группы конуса). Группу конуса (Вид, Кольца, Кручение, Аниматрица, Звук, Лазер) тянут за заголовок: пока тащат, она висит над всей страницей; отпустил над левой панелью — встаёт внизу панели, в разделе «◯ Группы конуса», в ряд с другими, перед той, над которой отпустил; иначе — висит поверх холста, как прежде. В панели группы узкие (кнопки переносятся), а панель сама расширяется под две в ряд (одна — под одну); край панели тянется мышью (тогда ширина твоя), двойной щелчок по краю — снова сама. Назад: вытащить за заголовок на холст или правый щелчок по заголовку — на полосу конуса. Панель пуста — ширина прежняя, 250. Порядок групп — Z.cgrpDock, ширина — Z.paneW; это раскладка, в ⭐ умолчание и в пресет конуса она не идёт. Свёрнутая до значков панель группы прячет.

Zazerkalius v0.251 — «биты в видах сверху, сбоку в 3D — сделай кнопку вкл / выкл, по умолчанию выкл». Цифры бит в 3D (v0.243) теперь по галке 01 рядом с «⧗ зеркало»; по умолчанию она снята — ровно сбоку и сверху конус рисуется без цифр, как до v0.243. Галка запоминается и едет в ⭐ умолчание конуса вместе с прочими настройками 3D.

Zazerkalius v0.250 — «что с кнопкой видео? mp4 пишет?» (нет: ⏺ конуса писал только .webm) → «добавь кнопку туда рядом с имеющейся». Рядом с ⏺ — mp4: та же запись холста конуса, но в файл .mp4 (H.264, со звуком — AAC), его без перекодировки открывают телефон, Телеграм, YouTube, любой плеер. Всё остальное общее с ⏺ (одна функция на обе кнопки, подсказка второй сессии): рамка кадра, конус в середину кадра, звук ПК правым щелчком (по любой из двух), дорожка «♫ Звук» копией. Длительность в заголовок у mp4 не дописывается — она там и так есть. Идёт запись любой из двух — щелчок по любой её останавливает. Браузер без mp4 — сообщение, запись не начинается.

Zazerkalius v0.249 — по снимку «одинак.» и «3D»: «любые кнопки сделай переносимыми на поле, а не только те, что сейчас». На холст конуса (v0.203) тянулись только кнопки с именем (id). Теперь тянутся ещё: галки — метки с флажком («🧊 3D», «одинак.», «свет»…): копия щёлкает флажок и горит, пока он стоит; и кнопки без имени, но с меткой data-… в окне с именем — шаблоны под чертой, ⟲ ▲ ⌂ − + у 3D, виды «сверху / спереди…», ①②③: такая запоминается селектором ({ sel } в Z.coneBtns). Кнопки, что действуют на нажатие (⟲ ▲ у 3D — держишь, повторяется), получают с копии и нажатие; взяли его — щелчок второй раз не передаётся. Не тянутся только кнопки заголовков окон (?, ⛶, ⧉, –) — у них нет ни имени, ни метки.

Zazerkalius v0.248 — «в конусах курсором двигать круги — только через Ctrl», «в поле конуса». На холсте плоского конуса кольцо крутится (а с ним и строка в поле), только если тянуть его с Ctrl. Без Ctrl тянешь по кольцу — сдвигается весь вид, как мимо колец; щелчок — выбрать строку. Ctrl + щелчок без движения — выделить / снять кольцо, как в v0.231; Shift + щелчок — сменить бит, как было. Кольцо строки 1 при луч-часах (с вырезом) — тоже только с Ctrl. Причина: кольца сдвигались от случайного движения мыши, когда хотелось подвинуть вид или просто выбрать строку. В 3D всё по-прежнему: тянешь — поворот, с Ctrl — сдвиг.

Zazerkalius v0.247 — по снимку заголовка «поле 1 · 250 стр.»: «надо кнопку удалить поле». В заголовке каждого поля (они видны, когда полей больше одного) — ✕: поле уходит со всеми строками и строками за чертой, поля правее сдвигаются на его место, ↩ вернёт. Последнее поле не удаляется. Раньше удалить поле можно было только через Del по выделенной оси в наложении.

Zazerkalius v0.246 — «почему всё тормозит?». Замер на 160 строках + 100 под чертой: перерисовка поля строк шла 0,7 с, общая перерисовка — 1,8 с, а поле перерисовывается почти на любое действие (и на каждом кадре Аниматрицы). Причины и что сделано: (1) подгонка шага строк под высоту поля каждый раз сбрасывала шаг и заново раскладывала всё поле 4–5 раз (по 0,1 с) — теперь, если строк, шрифта и размеров поля столько же и всё помещается (или ужато до предела), шаг прежний и раскладка одна; класс ужатости не сбрасывается при перерисовке; (2) ширина сведений и кнопок под чертой и сдвиг ↺ 🔒 ⟲ над столбиками писались заново, даже когда не менялись, — каждая запись давала ещё одну раскладку поля; теперь пишется только новое значение, а сдвиг считается от нынешнего без сброса в 0; (3) шрифт и кегль (--ff, --fs) ставились на всю страницу на каждой перерисовке — пересчёт стилей 12 тыс. элементов; теперь только при смене; (4) подсветка столбика номеров при наведении была на CSS :has(:hover) — пересчитывала стили всего поля на каждое движение мыши по строкам; теперь — класс, который ставится только при входе и выходе. Итог на том же замере: перерисовка поля ~0,2 с, общая — ~0,3 с. Остаётся: смена текущей строки при всех 21 открытых окнах — ~0,8 с (каждое окно считает свою картину по строке 260 бит); поле строк без «виртуальной» прокрутки дешевле 0,2 с на 260 строках не станет.

Zazerkalius v0.245 — «и кнопку — стереть всё под линией». Под чертой, рядом с «Заменить», — 🗑 под чертой: все строки за чертой стираются насовсем, во всех полях; ↩ вернёт. Когда под чертой пусто, кнопка неактивна. Одну строку и всё над ней до черты по-прежнему стирает щелчок по её битам (v0.244).

Zazerkalius v0.244 — по снимку строк за чертой: «чтобы можно было кликнуть на нижние биты и удалить всё сразу до линии». Щелчок по строке за чертой (по битам, не по номеру) — она и все строки между ней и чертой удаляются насовсем, во всех полях; строки ниже неё поднимаются к черте. Пока ведёшь мышью, то, что уйдёт, подсвечено красным. ↩ вернёт. Щелчок по самой нижней — под чертой пусто. Замок строк это не держит — как и перенос черты: строки над чертой не меняются.

Zazerkalius v0.243 — «3D-режим: пусть при виде сбоку и сверху, когда ровно, показывает биты». В 3D конуса при наклоне ровно 0° (сбоку) или 90° (сверху) на каждом бите пишется его цифра, 0 или 1. Сбоку подписана только ближняя половина кольца (дальняя за ней), и кольца складываются в треугольник строк, как в поле; сверху зеркало под основанием не подписывается — оно лежит ровно под верхним. Размер цифры — по ширине и толщине бита на экране: у краёв сбоку, где биты сжаты, и при тонких кольцах мелкие цифры не пишутся. Под любым другим наклоном — как было.

Zazerkalius v0.242 — «черту тяну вниз — прыгает всё вверх, если ниже экрана». Причина: при каждом шаге черты поле строк перерисовывалось и прокручивалось обратно к текущей строке (обычно 1-й), поэтому дотянуть черту за нижний край было нельзя. Теперь, пока черту тащат (и при итоговой перерисовке после отпускания), к текущей строке поле не прокручивается; у края поля или окна прокрутка идёт сама, пока курсор там, даже если мышь стоит, — строки достраиваются дальше вниз.

Zazerkalius v0.241 — по статье «When Information Hits a Wall: Barriers in Cellular Automata» (dev.to) — «да» на стенку в правилах. Под чертой — ▮ стенка и поле «столбец от вершины» (0 — по центру, минус — влево, плюс — вправо; по умолчанию −8). Нажата — одна клетка поля заморожена: не обновляется и держит своё начальное значение, сигнал на ней отражается или гаснет. Действует на достройку под чертой (Серп 90 / 30), заготовки Аниматрицы и карту ▦ 256 (там и картинки правил — со стенкой). Стенка на затравке «1» — вечный источник единиц. Проверено: правило 90, стенка на −4 — первые 4 строки как обычно, с 5-й левая ветка гаснет о стенку, левее неё пусто, справа узор отражается; стенка 0 на «1» — центр всегда 1; без стенки строки совпадают с обычными один в один.

Zazerkalius v0.240 — «3» (третья идея Cellcosmos — звук из бит): группа конуса Звук. ♫ — пуск / стоп. Режим «строка» — текущая строка тактом слева направо: 1 — нота, 0 — пауза, высота — число из трёх бит с этого места (0…7) как ступень лада, поэтому одинаковые рисунки звучат одинаково. «Столбцы» — шаг — столбец поля: звучат строки с 1 в нём (не больше 8 разом, первые сверху), высота — по номеру строки, сверху выше, через три октавы по кругу. Лад (пентатоника, минор, мажор, хроматика), темп 1…30 шагов в секунду, громкость — помнятся. Строки меняются на ходу (волна, правка) — звучит уже новое. Звук идёт в запись ⏺ конуса напрямую, без захвата экрана; со «звуком ПК» — из захвата (он и так слышит всё, иначе звучало бы дважды). Осталось: какой бит сейчас звучит, на поле и конусе не подсвечивается.

Zazerkalius v0.239 — по странице Cellcosmos (лаборатория элементарных автоматов) — «делай 1 и 2»: (1) ▦ 256 рядом со списком заготовок Аниматрицы — карта всех 256 правил сеткой 16×16, миниатюры по 32 строки из нынешнего сида, номер в углу; наведение — правило и его средние энтропия, зеркальность и доля единиц; щелчок — правило строками в поле, как заготовка (↩ вернёт); карта остаётся открытой, выбранное обведено золотым — можно перебирать подряд; закрыть — ▦, Esc или щелчок мимо. (2) Метрики строки: в сведениях поля у текущей строки — H (энтропия по тройкам соседних бит, 0 — один рисунок повторяется, 1 — шум) и ⇄ (зеркальность: доля бит, совпавших с отражением с другого конца; 100% — палиндром, 0% — антипалиндром). Зеркальность выбрана вместо общей «симметрии» Cellcosmos нарочно: у Зеркалиуса главное — ⇄ и инверсия, и 0% здесь не «нет симметрии», а другая, зеркально-инверсная. Счёт — в ядре (zzRowEntropy, zzRowMirror, zzRowsStats). Осталось: третий пункт оттуда — звук из бит (строка как такт) — не делался.

Zazerkalius v0.238 — по снимку групп «Аниматрица», «Лазер», «Кручение» — «все кнопки разъехались — компактными, и размер стандартизируй». Группа конуса — подпись слева (хват во всю высоту, как было) и блок кнопок рядом, который переносится компактно; сетка «два ряда ровными столбцами» (v0.183) растягивала кнопки до ширины самого широкого в столбце — её больше нет. У всех кнопок, галок, списков и полей одна высота (24 px), кегль 12 и отступы; ползунки — 84 px, списки — не шире 130 px. Проверено: во всех пяти группах высота элементов одна — 24 px; свёрнутая группа — одна подпись.

Zazerkalius v0.237 — ответы на незакрытое и по снимку сведений поля — «эту надпись вниз, под последнюю строку». (1) Сведения поля («12 стр. · 102 бит · текущая…») — строкой под последней строкой, над чертой, слева. (2) «Черту выше строки 1 не надо; пусть при построении учитывает: если стоит Серпинский — строит не с 1, а с 11»: 🔺 Серп 90 достраивает по треугольнику — строки растут на 1 бит или над чертой одна строка — Паскаль (1 → 11 → 101…), растут на 2 — правило 90. (3) Нарезка — «нужны ▼, и вообще все вариации настроек — по размерам, по порядку»: фигуры ▲, ▼ (как есть), ▼ перевёрнутые, ▲▼, ◇ ромбы (▲ и ▼ под ним), ⧗ часы (▼ над ▲); порядок — по рядам, вдоль левой, вдоль правой, каждый в обе стороны (кнопки-переключатели: щелчок дальше, правый назад), высота — числом. (4) Сброс ширины поля — «по номерам»: двойной щелчок по номеру строки. Проверено: Серп 90 от «1» — 1, 11, 101, 1111, 10001, от 1, 111 — 11011; 64 строки Серпинского, h = 16: ▲ 10, ▼ 6, ▲▼ 16, ◇ 6, ⧗ 3; все 6 порядков; сведения — под строкой 4, над чертой; двойной щелчок по номеру — ширина по умолчанию.

Zazerkalius v0.236 — «надо рамкой показать размер видео при записи конуса и расположить изначально его посередине»: пока идёт запись ⏺ (и пока мышь над ⏺ — чтобы видеть кадр заранее) холст конуса обведён красным пунктиром, вверху — размер кадра в пикселях (размер холста: окно × масштаб экрана). Рамка — отдельный слой поверх холста, в файл не попадает. Со стартом записи сдвиг конуса сбрасывается — он встаёт в середину кадра; масштаб остаётся, какой был.

Zazerkalius v0.235 — «подключать надо настройку — звук с компа» (к записи ⏺ конуса): правый щелчок по ⏺ — звук ПК вкл/выкл (помнится, на кнопке значок ♪). Со звуком при старте браузер спрашивает, что захватить: системный звук Windows отдаёт только с «Весь экран» и галкой «Поделиться системным звуком», вкладка — со «звуком вкладки». Из захвата в файл идёт только звук, картинка — по-прежнему холст конуса; webm со звуком (opus). Звук не выбран или окно закрыли — запись не начинается, а не пишется молча без звука. Захват закрыли кнопкой браузера посреди записи — запись останавливается и сохраняется. Так же звук ПК берёт Lively (lively/_js/zvuk.js).

Треугольник v0.036 и Code 35.77 — «в треугольник и ещё где, посмотри, где webm-запись, — тоже добавь»: у обеих своя запись ⏺ (копия прежнего общего кода) — пишет mp4, а где браузер не умеет, webm; webm теперь сохраняется с длительностью тем же доводчиком recorder.js (длина меряется до сборки файла — длинная запись собирается не мгновенно). В Треугольнике ещё «🗻 видео цикла» — всегда webm — тоже с длительностью. Остальные страницы с ⏺ (Кубиты, Genezis, GPU, Grid, Октаэдр, Lively) пишут через сам recorder.js — им правка пришла вместе с ним.

Zazerkalius v0.235 и общий _js/recorder.js — по снимку плейлиста PotPlayer — «нет эскизов в плейлисте»: у роликов Zerkalius-konus-….webm длина 0. MediaRecorder пишет webm потоком и длительности в заголовок не кладёт — в начале записи она ещё неизвестна; без неё плеер не строит эскиз и плохо мотает. В recorder.js — доводчик: после остановки в блок Info заголовка дописывается элемент Duration, остальной файл байт в байт тот же (сегмент «неизвестного размера», адресов внутри нет — сдвиг хвоста ничего не ломает); не разобрал заголовок — файл уходит как был. Работает для записей ⏺ на всех страницах с модулем (когда браузер пишет webm, а не mp4) и для восстановленных — там длина по времени последнего куска. Кнопка ⏺ конуса в Zazerkalius пишет своим кодом — она зовёт тот же доводчик; модуль подключён к странице с data-bez-knopki: без плавающей ⏺ и клавиши R, только функции. Осталось: таблицы перемотки (Cues) в файле по-прежнему нет — мотает плеер перебором; уже записанные ролики лечатся ffmpeg -i старый.webm -c copy новый.webm.

Zazerkalius v0.234 — по снимку столбика из треугольников по 16 строк — «объединить с тем html, где нарезка треугольника на мелкие и строится анимация: взять их и расположить друг под другом в Зазеркалиусе». Под чертой — нарезать: ✂ ▲ [16] · по рядам → · без пустых. Как в Треугольнике: треугольник строк режется без остатка на полосы высотой h, в полосе n — n + 1 треугольников ▲; их строки встают друг под другом (↩ вернёт). Строки могут расти на 1 бит (Паскаль) или на 2 (правила 90, 30… — заготовки Аниматрицы); порядок — по рядам, вдоль левой стороны или вдоль правой (одна кнопка, щелчок меняет); «без пустых» — без ▲ из одних нулей. Проверено: 64 строки Серпинского, h = 16 — 10 ▲, непустых 9 (3²), каждый — верхний треугольник; правило 90 (+2) — то же; ↩ вернул 64 строки.

Zazerkalius v0.233 — по снимку выбранной строки 10 — «номера тоже затемнять при выделении». Номер, замок и кручение невыделенных строк затемняются вместе с их битами (brightness 0.5). Проверено: выбрана строка 3 — её номер яркий, у остальных затемнены.

Zazerkalius v0.232 — по снимку поля строк, упёршегося в самую узкую ширину, — «после максимального уменьшения поле должно уезжать вправо и оставлять только немного — размер кнопок». Самое узкое поле теперь — колонка номеров с кнопками ↺ 🔒 ⟲ над ней (около 100 px), а не 220 px: тянешь дальше — остальное уходит за край. Проверено: поле 97 px, кнопки и номера видны, остальное за краем.

Zazerkalius v0.231 — «выделение нескольких — через Ctrl, а не Shift». В конусе, как и в поле строк: Ctrl + щелчок по кольцу — выделить / снять (можно набирать несколько), Shift + щелчок по сектору — сменить бит (в v0.173 было наоборот). Подсказка над битом — по-новому. Проверено: Ctrl — выделены кольца 4 и 5; Shift по кольцу 6 — 110011 → 010011.

Zazerkalius v0.230 — по снимку растянутых во всю ширину шаблонов под чертой — «тут жесть какая-то! без фона надо, и это не поле, а кнопки под чертой, не растягивать». Под чертой — компактные кнопки своей ширины, без фона, в ряд с переносом: достройка, «+ Строка», «+ Столбик», встроенные и свои шаблоны; ширина полосы — по видимому полю, она прижата к левому краю и не уезжает вбок с широкими строками. Проверено: кнопки 27…88 px, полоса 439 px в поле 451 px, два ряда.

Zazerkalius v0.229 — по снимку кнопки «🗑 удалить» под чертой — «эту также: надпись только «Заменить» — вкл / выкл». Кнопка под чертой — «Заменить» с одной надписью: включена (горит, по умолчанию) — строки, что были под чертой, заменяются новыми при достройке; выключена — сдвигаются вниз и остаются под чертой, ниже новых. Проверено: вкл → выкл → вкл.

Zazerkalius v0.228 — по снимку списка «щели / Без щелей» — «это одна кнопка, как и все». Пропуск солнца — теперь одна кнопка-переключатель: щелчок — «щели» ↔ «Без щелей»; «Без щелей» горит; без солнца кнопка неактивна. Проверено: Без щелей → щели → Без щелей.

Zazerkalius v0.227 — по снимку «всё пропало» (биты уехали вправо за край, строки под чертой сдвинулись). Ошибка v0.225: ячейка, куда под чертой ставится полоса достройки и шаблоны, занимала первую колонку сетки строк — колонка номеров растягивалась на ширину этой полосы. Теперь ячейка идёт во всю ширину поля и на ширину колонок не влияет. Проверено: колонка номеров 88 px, биты сразу за ней, строки под чертой на своих местах, полоса — во всю ширину.

Zazerkalius v0.226 — по снимку шапки страницы конуса «◯ Конус v0.225» — «тут название — после Zazerkalius, а не вместо». На странице одного окна (?solo=cone) в шапке — «Zazerkalius ◯ Конус», во вкладке — «Zazerkalius ◯ Конус — v0.226».

Zazerkalius v0.225 — «под линией расположи кнопки Серп 90, 30, маска (умолч. 01 и поле для неё); когда тянуть за линию вниз — строки достраиваются от верхней», «если под полосой есть другие — их удалить» → «кнопку: удалить или сдвинуть вниз», «туда же свои сохранённые пресеты» и по снимку шаблона «Столбик · 87 стр.» — «перемести». Под чертой поля (под строкой для заполнения) — полоса достроить: 🔺 Серп 90 · 30 · маска [01] · 🗑 удалить / ⤓ сдвинуть, под ней — свои шаблоны (+ Строка, + Столбик и список; из левой панели они ушли). Тянешь черту вниз — каждая новая строка достраивается от строки над ней: Серп 90 — правило 90, 30 — правило 30 (строка на 2 бита длиннее, как заготовки Аниматрицы), маска — маска подряд на бит длиннее; сколько строк — столько, сколько их помещается от черты до курсора. Строки, что были под чертой: удаляются или остаются под ней, ниже новых. Замок строк ⛔ достраивать не даёт — черта тогда, как прежде, возвращает строки из-под себя. ↩ отменяет. Черту выше строки 1 не поднимаю: без единой строки над чертой рушатся окна и конус. Проверено: от «1» Серп 90 — 1, 101, 10001, 1010101, 100000001; маска 01 — 1, 01, 010, 0101; «сдвинуть» — новая 11001 (правило 30), 11011 и 1000001 остались под чертой; «удалить» — новая 1111101, под чертой пусто; с замком — черта вернула строку.

Zazerkalius v0.224 — три правки поля строк. (1) По снимку строки для заполнения «45 + ✕» — «вынеси влево управляющие крестик и иконку, не перекрывай номер» (выбрано: под номером, мелко): + и ✕ теперь мелко под номером, в колонке номеров; строка для заполнения чуть выше остальных. (2) «За саму границу тоже надо перетаскивать»: у края поля со стороны стола — невидимая полоса-хват 6 px (подсвечивается при наведении), тянет ширину поля так же, как номера. (3) По снимку столбика номеров — «убери линии и лишний отступ от битов»: черт между колонками номеров, замков и кручений нет, биты — в 2 px от них (было 8). Проверено: строка для заполнения — «17», под ней + ✕, + добавил строку; граница — 451 → 421 px.

Zazerkalius v0.223 — по снимку выбранной строки 110011 на лиловой подложке — «фон при выделении не добавлять, а гасить невыделенное; не делать фон совсем чёрным — чтобы можно было затемнять». Фон поля строк светлее (между цветом панели и линий), у выбранной строки (и выделенных) подложки больше нет — остальные строки затемнены целиком, фон вместе с битами (brightness 0.5; прежде биты были прозрачнее). Проверено: поле ≈ #1b2130, выбранная строка 6 — без подложки, остальные — затемнены.

Zazerkalius v0.222 — «сделай кнопку — чистые кольца, без границ». В «Виде» — галка ◯ чистые: у колец нет контура (голубой внутри, оранжевый снаружи), нет прорезей между битами (у колец, краски, строки для заполнения), нет зазора между кольцами — кольца сомкнуты; текущее кольцо — без обводки (видно по яркости, остальные гаснут). Проверено в дзене на 16 строках Паскаля: одни биты, сплошными кольцами.

Zazerkalius v0.221 — «выделение строки — это когда все остальные тушатся светом». Теперь гасит остальные не только выделение (Shift, Ctrl, номер), но и просто выбранная строка: выбрал — остальные строки в поле на 45% и кольца на конусе под вуалью; щелчок по ней ещё раз (v0.220) или Esc — всё яркое. После загрузки текущая строка — выбранная. Проверено: при загрузке строка 2 — 1, остальные 0,45; щелчок по строке 3 — она 1, остальные 0,45; ещё щелчок — все 1.

Zazerkalius v0.220 — по снимку выделенной строки 110011 — «клик по выделенной строке — снять выделение». Щелчок по текущей (или единственной выделенной) строке — по битам или по номеру — теперь как Esc: выделение снято, текущей строки нет (и на конусе); ещё щелчок — снова выбрана. Щелчок по другой строке, Ctrl и Shift — как прежде. Проверено: строка 4 — выбрана → снята → выбрана; номер 6 — выделен → снят; щелчок по строке 2 — выбрана она.

Zazerkalius v0.219 — по снимку поля строк без разделителя — «потерялась граница» → «сделай фоном другим — без линии» и «хват только у номеров, не дальше». У поля строк теперь свой фон — чуть светлее стола (к цвету панели), без черты; внутри поля «фон» — он же, так что подложки бит, столбик номеров и подсветки строк сходятся с ним сами (в тёмной и светлой теме). Ширину поля тянут только за сами номера строк: замок, кручение и остальное в той колонке — как прежде, курсор ↔ и подсветка — только у номеров. Проверено: за замок — 451 → 451, за номер — 451 → 411; поле, номера и подложки бит одного цвета, стол темнее.

Zazerkalius v0.218 — по снимку подсказки разделителя «Потяни — шире или уже…» — «границу для перетаскивания убери, функцию будет выполнять столбик номеров, подсвечивать немного при наведении». Разделителя (полоски 6 px между полем строк и столом) больше нет. Ширину поля строк меняет столбик номеров: тянешь его по горизонтали (дальше 6 px и больше вбок, чем вверх-вниз) — поле шире или уже; короткий щелчок по номеру, замку, кручению — как был. Наведён — весь столбик чуть светлее, курсор ↔. Проверено: протащил номер на 60 px — поле 451 → 504 px (упор по ширине окна), щелчка по номеру после этого не было; простой щелчок по номеру выделил строку.

Zazerkalius v0.217 — по снимку блока «Шрифт» в левой панели — «перемести над строки; вместо ползунка две стрелки и число между; не удлинять — окно шрифтов ещё короче» и по снимку полосы над строками в две строки — «здесь не делай 2 строки — одна, остальное уезжает вправо за край». Шрифт переехал в полосу над строками, сразу за ↺ 🔒 ⟲: список шрифтов узкий (74 px), размер — ◀ число ▶ (11…40) вместо ползунка; в левой панели блока «Шрифт» больше нет. Полоса над строками — всегда одна строка: что не влезло, уходит вправо за край (без полосы прокрутки). Проверено: полоса 37 px в высоту, ◀ ▶ — 18 → 19 → 18, кнопки ↺ 🔒 ⟲ по-прежнему над своими колонками.

Zazerkalius v0.216 — по снимку солнца с краской в чёрных прорезях — «щелей не должно быть, назови «Без щелей»». Пропуск солнца «0 — проход, 1 — стена» теперь зовётся «Без щелей», и прорезей в нём нет нигде: ни у колец строк, ни у закрашенных светом ячеек (краска идёт сплошной дугой), ни у строки для заполнения. Пустые кольца до 256 в этом режиме не рисуются и не считаются — свет всё равно ловит строка для заполнения, а с ними строки сжимались в точку. Проверено в дзене на 8 строках: кольца и краска сплошные, строки во весь холст.

Zazerkalius v0.215 — по снимку свёрнутой группы «Лазер» у края окна конуса — «пусть вкладки уезжают за поле строк, но не заголовком». Вынесенную группу теперь можно задвинуть вправо за край окна конуса (под поле строк): край держит только её заголовок — он всегда виден, за него вытаскивают обратно (правый щелчок — на полосу). Влево заголовок уходил бы первым — там по-прежнему упор в край. Окно конуса обрезает задвинутую группу без горизонтальной полосы прокрутки. Проверено: «Лазер», утащенный на 3000 px вправо, встал заголовком у края (998 при крае окна 1002), полосы прокрутки нет.

Zazerkalius v0.214 — по снимку группы «Кручение» — «всё на места — эту кнопку перемести также над столбиком кручений». Кнопка «⟲ всё на места» переехала из группы «Кручение» в полосу ввода и стоит узкой зелёной «⟲» ровно над столбиком кручений строк (как ↺ над номерами и общий замок над замками); делает то же, что прежде. Проверено: середины совпали с колонками (265/265, 292/292, 321/321), ⟲ сбросил кручение.

Zazerkalius v0.213 — «выделять кольцо или строку — синхронно, и остальные при этом гаснут немного». Выделение и так общее у колец и строк (Shift + щелчок по кольцу, Ctrl + щелчок или щелчок по номеру строки); теперь, пока оно есть, невыделенные гаснут: на конусе — под полупрозрачной вуалью цвета холста, в поле строк — биты невыделенных строк на 45%. Сняли выделение — всё снова яркое. Одна лишь текущая строка (без выделения) ничего не гасит. Проверено: выделена строка 4 — остальные 0,45, она 1; снято — всё 1.

Zazerkalius v0.212 — по снимку галки «запрет сдвига строк» — «это не дубль замка?» (да, та же Z.coneLock, что общий замок) → «да, но общий замок всегда над столбиком должен стоять», и «а над номерами — сброс строк, кнопку на начальные». Галки в «Кольцах» не видно (осталась скрытой — на ней держится общий замок). В полосе ввода — две узкие кнопки: ↺ (то же, что «↺ Начало» в «Построении») — ровно над колонкой номеров, общий замок — ровно над столбиком замков; место пересчитывается при перерисовке строк, когда поле шире/уже и когда догрузился шрифт. Проверено: середины кнопок совпали с серединами колонок (265/265, 292/292), ↺ вернул столбик 1, 11, 101…

Zazerkalius v0.211 — по снимку свёрнутой группы «Кручение» — «поправь хват по всей длине и высоте заголовка». Заголовок группы (за него группу тянут, по нему двойным щелчком сворачивают) теперь во всю высоту группы и до её рамки слева, а у свёрнутой группы хват — вся группа. Проверено: «Кручение» 619×61 — хват 57×59; свёрнутая 74×61 — хват 72×59 (по пикселю — рамка).

Zazerkalius v0.210 — по снимку кнопки «🔒 кольца» в группе «Кольца» — «эту кнопку удали, замки есть у каждой строки». Кнопки замка выделенных колец больше нет: свой замок — у каждой строки в столбике замков (правый щелчок по замку кольца в списке колец снимает его, как прежде).

Zazerkalius v0.209 — по снимку «i3 стр. · 934 бит · текущая 8…» (начало сведений ушло под колонку номеров и замков) — «подвинь надпись». Сведения поля больше не заходят под левую колонку: ширина надписи считается от правого края колонки номеров (и заново, когда поле становится шире или уже), не влезла — многоточие в конце, целиком — в подсказке.

Zazerkalius v0.208 — по снимку «☀ солнце · 1 — вырез» — «в этом режиме у битов не должно быть щелей; щель тут — 0, вся его длина, а 1 — это стена», «сделай неактивными те кнопки, которые не влияют» и по снимку горящих вместе «⌖ луч-часы» и «☀ солнце» — «это либо-либо, и выделение так же». Второй пропуск солнца теперь «0 — проход, 1 — стена»: щелей между битами нет, «0» пропускает свет во всю ширину своей ячейки, «1» — стена, строка для заполнения — сплошная; на рисунке у колец нет прорезей между битами. Окно «360° / число единиц» (v0.206) убрано. При ☀ неактивны лазерные кнопки (довод строки 1, ⏸ на проходе, 🔮, 🎯 с номером, число лазеров и «от …°», ⌖→ след., 📌 лазер, ↻ с шагом), при «0 — проход» ещё «щель» и «пустые до 256»; копии на холсте гаснут вместе с ними; список пропуска неактивен без солнца. Лазер и солнце — либо-либо: при солнце луч-часы не горят, щелчок по ним возвращает лазер. Попутно: касание границы ячейки больше не красит соседнюю. Проверено на 1, 10, 101, 1001, 10001, 110011: после «10» свет 180–360°, после «101» — 180–240°, дальше сквозь нули до строки для заполнения (ячейки 4 и 5).

Zazerkalius v0.207 — к сворачиванию группы двойным щелчком (v0.204) — «высота остаётся как была — нужно». Свёрнутая группа теперь сужается до заголовка, а высоту держит прежнюю (запоминается в Z.cgrpMin в пикселях), заголовок — посередине: соседние группы и полоса не прыгают. Проверено: «Аниматрица» 758×94 → 99×94 → снова 758×94.

Zazerkalius v0.206 — «первая строка — один бит, круг — это солнце, оно всегда светит; дальше если 11, то там две щели, размер щелей — ширина луча; из 11 всегда два луча», «ещё настройку, где 1 — не часть круга как бит, а вырез, из которого идёт луч его ширины» (выбрано: ширина выреза — 360° / число единиц строки) и «между битами тут щелей нет, работает без щелей». В «Лазере» — ☀ солнце и список пропуска. Строка 1 — солнце в центре: светит всегда и во все стороны, выреза-затвора нет. Свет идёт наружу кольцо за кольцом освещёнными секторами: щели — кольцо пропускает свет только в щелях между битами (ширина — ползунок «щель»), у «11» — два луча; 1 — вырез — щелей нет, каждая «1» — окно шириной 360° / число единиц строки по центру своей ячейки, «0» — стена, строка для заполнения — сплошная стена. Ячейка под освещённым сектором красится (при каждом новом освещении — единица в счёт), её видно на конусе и в «✎ в поле 2». Кольца от солнца не встают, лучи не гаснут; ✺ и ☀ — что-то одно; 🔮 и 🎯 для солнца не нужны. Проверено на 1, 11, 101, 1111, 10001, 110011: «щели» — два луча на 0° и 180°; «1 — вырез» — после «101» свет 0–150° и 210–360° («0» в середине ловит), после «10001» — 0–126° и 234–360°, дальше весь дошедший свет ловит строка для заполнения.

Zazerkalius v0.205 — по снимку сведений поля («43 стр. · 934 бит · текущая…» поверх строк 1–2) — «пусть надпись скрывается за битами». Сведения теперь лежат под полем строк (своя изоляция у #field, сведения — z-index −1), а у самих бит — подложка цвета поля в том же состоянии строки (наведена, текущая, выделена, поле в наложении): сведения видны только в пустоте и прячутся за битами, подсветка строк не изменилась. Попутно исправлена ошибка v0.202: в поле «от …°» комментарий попал в середину строки и глотал её хвост — угол первого лазера из поля не менялся; теперь меняется.

Zazerkalius v0.204 — по снимку группы «Аниматрица» — «двойной клик по группе сворачивает её до заголовка». Двойной щелчок по заголовку группы или её пустому месту (не по кнопке, полю, списку) — группа сворачивается до заголовка (с «▸»), ещё раз — разворачивается; запоминается (Z.cgrpMin). Возврат вынесенной группы на полосу, что был на двойном щелчке по заголовку (v0.177), — теперь правый щелчок по заголовку. Проверено: «Аниматрица» 772×94 → 99×21 → снова 772×94; двойной щелчок по её кнопке группу не сворачивает.

Zazerkalius v0.203 — «сделай как в Zerkalius-layers.html, чтобы кнопки можно было на холст в любое место». Как «кнопки на поле цепочек» в Layers (v1.594): любую кнопку с именем тянешь мышью на холст конуса — там, куда бросил, встаёт её копия с той же подписью, оригинал остаётся на месте; та же кнопка уже на холсте — не удваивается, а переезжает. Копия жмёт оригинал (и в вынесенном окне) и горит, как он; подпись меняется вместе с ним (▶ крутить → ⏸ стоп). Копию тянешь по холсту — переезжает; вытащил за холст, правый щелчок или Delete — убрана. Места — Z.coneBtns, в долях ширины и высоты холста: растянул окно — кнопки остаются на своих местах холста. Это раскладка — в ⭐ умолчание не входит; фон хаба и показ пресета кнопок не рисуют. Проверено: «⌖→ след.» брошена на холст (30% ширины, 40% высоты), щелчок по копии переключает оригинал, копия горит вместе с ним, правый щелчок — убрана.

Zazerkalius v0.202 — «почему лазер крутится? надо кнопку фикс лазера и стрелку крутить на заданное частей круга, по умолчанию 45», «и ещё на число самой длинной, когда все, а все — это 1+2+3+…+T» и «убери то, что по умолчанию лазер, когда уходит, — до 8 лазеров, потом следующие; это надо вкл/выкл». Лазер крутился потому, что был частью картинки конуса: в «Всё» и от ⟲ ⟳ поворачивается весь конус (Z.coneSpin), и лазер с ним. Теперь 📌 лазер (по умолчанию включено): лазер стоит на экране, конус едет под ним; в «Всё» попадания между кадрами считаются мелкими шагами, как при кручении колец. ↻ — повернуть лазер (и все лучи ✺) на шаг по часовой, правый щелчок — против; шаг в списке рядом: 45° (по умолчанию), 1/T круга (T — бит в самой длинной строке) или 1/(1+2+…+T) круга — для ✺, где лучи и так стоят через 1/T. Угол первого лазера теперь хранится с долями градуса. ⌖→ след. — переход к следующему лазеру после вылета (как было с v0.191), по умолчанию выключен: луч вышел за край — пауза. Проверено: ↻ 0° → 45°, шаг 1/(1+…+160) — +0,028°; при повороте конуса на 90° закреплённый лазер в системе конуса на −90° от прежнего.

Zazerkalius v0.201 — «сделай, чтобы в лазере лучей было сколько бит в строках — до 256, по кругу из центра; когда лазер вылетает, его больше нет в круге, и так гонять до последнего» (выбрано: все сразу, кольца общие). В «Лазере» кнопка ✺ все лучи: лучей столько, сколько бит в самой длинной строке конуса (не больше 256), шаг — 360° / число, первый — на угле «от …°». Светят все сразу, каждый считается как прежний лазер: вырез строки 1, щели, стены, краска, лог (в записи — номер луча ✺N), вылет из строк, ✎ в поле 2. Кольца общие: встаёт кольцо, из которого вышел любой луч; луч, ушедший за край, гаснет насовсем и отпускает кольца. Если все живые лучи упёрлись в стоящие кольца (затор), кольца отпускаются и полбита не встают. Погасли все — пауза. Шаг всех лучей дорогой (~1,4 мс на 160 лучей), поэтому кадр считает лучи не дольше ~12 мс, и кольца доворачиваются только до просчитанного места: крутится плавно, щели не проскакивают, но с сотней лучей — медленнее ползунка, по мере вылета — быстрее. Проверено прогоном: 160 строк (1, 11, 111, дальше нули), «Встреч Бит» — первый луч погас на 44-м бите поворота, лучи гаснут по одному, затора не было, кадр ~17 мс.

Zazerkalius v0.200 — «туда ещё заготовки-пресеты, по умолчанию 256 строк: все серпинские правила и какие-нибудь последовательности». В группе «Аниматрица» — список «📋 заготовка…», число строк (по умолчанию 256) и сид. Выбор заменяет поле строк целиком (↩ вернёт), счёт волны — заново. Серпинский: Паскаль mod 2 (+1 бит за строку) и элементарные правила 90, 18, 26, 82, 146, 154, 210, 218 — перебором всех 256 правил из одной «1» проверено, что именно они дают ровно треугольник правила 90; из одной точки они совпадают, различаются с сида, где единицы стоят рядом (11, 1101…). Строка правила — световой конус, на 2 бита длиннее предыдущей. Родственные: 22, 126, 150, 60, 102, 182, 195, 30, 110. Последовательности (строка i — первые i + 1 членов): Туэ — Морс, слово Фибоначчи, Рудин — Шапиро, складывание бумаги, удвоение периода, Баум — Свит, Колакоски, простые, квадраты, двоичный счёт, случайные. Конус теперь рисует до 256 колец (CONE_MAX было 160).

Zazerkalius v0.199 — «по циклу аниматрицы»: галка ⟳ циклами в группе «Аниматрица» — ▶ волна идёт целыми циклами, за шаг плеера весь проход волны от верха до низа, как «Плеер — целыми циклами» в Треугольнике. Конус и поле показывают только картины на границе циклов; начат посреди прохода — сперва доходит до его конца. Скорость тогда — циклов в секунду (0,5…5000).

Zazerkalius v0.198 — «аниматрицу надо ещё сюда» и «скорость — больше возможностей». В окне «◯ Конус» новая группа «Аниматрица»: волна из Треугольника идёт сверху вниз, строка r+1 переписывается операцией (XOR, XNOR, NAND, NOR, AND, OR) с уже переписанной строкой r; дошла до низа — проход. Строки здесь разной длины, и складывать их решили ПО УГЛУ на конусе (выбор пользователя из трёх: по углу, как в поле, слева по номеру): бит j нижнего кольца берёт бит верхнего, лежащий на луче через середину бита j, с учётом поворота колец. Кнопки: ▶ волна, ▷| шаг (одна строка), ⏭ весь проход, ⏮ к началу прохода или на проход назад; счёт проходов и длина цикла, когда картина повторилась (по отпечатку всех строк). Скорость волны — 0,5…5000 строк в секунду по логарифму. Строки правили не волной — счёт заново; ↩ вернёт. Ползунок скорости кручения — тоже по логарифму: 1…3600°/с (было 5…120 ровным шагом), рядом число: °/с или бит/с в режимах «по биту».

Zazerkalius v0.197 — по снимку 3D-конуса сбоку: «тут можно регулировать высоту 3D битов?» Нельзя было: ↕ разносит только кольца, а толщина дуги бита считалась сама (0,6 шага радиуса, не толще 26 px). Рядом с ↕ — ползунок ▬, множитель толщины ×0,2…×4 (сбоку это и есть высота бит), двойной щелчок — ×1. Помнится в Z.cone3Bw, входит в ⭐ своё умолчание и в пресеты.

Zazerkalius v0.196, скрипт пресетов v0.002 — по снимку конуса с окном «Текст конуса и лог лазера» — «как вообще сохранять так, чтобы потом по ссылке открывали прямо там» и «да» на то, чтобы открывалась вся страница, а не только конус. Ссылка Zerkalius-zazerkalius.html?preset=<имя> (без solo=cone) теперь открывает весь Zazerkalius в состоянии пресета: окна на своих местах, конус, лазер, все поля строк. Память браузера при этом не читается и не пишется: гость крутит и гоняет лазер, а его собственные строки и раскладка остаются нетронутыми, и по ссылке пресет всегда открывается тем же. «↺ Начальные» и «⟲ всё на места» возвращают к пресету. «📂 Всё», открытое прямо на пресете, ложится в свою память и уводит на адрес без ?preset. Чтобы окна приехали, dobavit.py больше не выкидывает раскладку (кроме копии умолчания); режим «только конус» выкидывает её сам при загрузке. Старый пресет «Октаэдр · 70 строк» без раскладки открывается с окнами по умолчанию. Порядок: «💾 Всё» → python presety/dobavit.py файл.json имя "Название" → коммит и пуш → ссылка.

Zazerkalius v0.195 — «сразу надо в строки писать биты, заполнив сначала нулями строки соответствующей длины» (выбрано: в поле 2; «1» — туда, куда упал луч). В «Лазере» кнопка ✎ в поле 2: включена — во втором поле строк (если рабочее — второе, то в третьем) столько же строк из нулей той же длины, что строки конуса, плюс строка для заполнения; ячейка, в которую упал луч (стена в строке, поимка строкой для заполнения), становится «1» — от всех лазеров вместе, как краска на конусе. Конус и рабочее поле не меняются. Если полей меньше — показывает второе. Прежнее содержимое того поля при включении откладывается в запас, правый щелчок по ✎ возвращает его. Проверено: 1, 11, 101, 1111, 10001, «Встреч Стр», 12 шагов — поле 2: 0, 01, 110, 0110, 01010, 000010 — ровно ячейки краски; правым щелчком поле 2 вернулось байт в байт.

Zazerkalius v0.194 — «где задать количество и начальный угол?» (выбрано: просто угол от верха). В «Лазере» рядом с 🎯 — два поля: ⌖× — сколько лазеров (1…72, по умолчанию 8; шаг — 360° / число) и от …° — угол первого лазера, градусы по часовой от верха (по умолчанию 0). В статистике вылетов у каждого лазера — его настоящий угол. Проверено: 1, 11, 111, «Встреч Стр», 3 лазера от 30° — лазеры на 30°, 150°, 270°.

Zazerkalius v0.193 — снимок «всё съело»: «🚪 Вылет из строк» пуст, прогноз показывает «1 из 1» от прежнего набора, строка прогноза наехала на лог. Три причины: (1) вылеты жили вместе с краской и стирались любым сбросом — ⟲, ✕ у строки для заполнения, правым щелчком по ▶, сменой режима или строк; (2) прогноз не знал, что строки сменились; (3) блоки окна «Текст» сжимались до нуля, когда места мало. Теперь: вылеты каждого лазера по окончании переезжают в постоянную статистику (Z.coneExLog, последние 64 лазера) с номером прогона (от сброса до сброса), режимом и числом строк; стирает её только новая ✕ в самом блоке. Прогноз, сделанный для других строк или режима, не показывается. Блоки лазера не сжимаются, а прокручиваются вместе; лазеру — две трети окна, логу — не меньше трёх строк. Проверено: два лазера → сброс → ещё прогон → смена режима → смена строк — все записи на месте (прогоны 1, 1, 2), окно высотой 300 px — все блоки видны.

Zazerkalius v0.192 — по снимку «окно поправь» (в «🚪 Вылет из строк» был виден только ⌖2, первый лазер уезжал вверх) и «покажи номер, статистику: на каком угле начальное положение, из какой вылетел и т. д.». Теперь у каждого лазера заголовок — номер, угол лазера, с какой фазы начал, режим, сколько строк прошёл — и таблица: строка, биты от щели, щель вылета (ячейки слева|справа; у строки 1 — вырез), поворот кольца по часовой от начала, через сколько от включения лазера. Нынешний лазер — сверху, блок выше (до 55% окна). ⧉ копирует всё это таблицей через табуляцию — в Excel ложится по столбцам. Проверено на 1, 11, 111, «Встреч Стр», без «▦ до 256»: лазер 1 — строки вылетают на 179°, 179°, 239° (щели вырез, 1|2, 1|2), за край — на 269°; лазер 2 стартует с 269°, лазер 3 — с 494°, лазер 4 — с 719°.

Zazerkalius v0.191 — «после вылета — как начать ещё на том же рисунке бит» и «просто когда лазер вылетает, сделай 45°: следующий лазер становится активен, и т. д.». Лазеров восемь, через 45° по часовой, первый — вверх. Луч ушёл за край — при ▶ и при шагах ◀ ▶ включается следующий лазер, а кольца, которые встали, отпускаются там, где стоят: их фаза становится сдвигом (Z.voidHits.off), и дальше они крутятся с того же рисунка, ничего не прыгает. После восьмого — пауза. Прежние лазеры видны бледным пунктиром. «🚪 Вылет из строк» теперь по лазерам: ⌖1 · 0°, ⌖2 · 45°…; ⧉ копирует всех, лазеры — через пустую строку. 🎯, отпуская стоящие кольца, тоже больше не сдвигает их. Сброс лазеров — вместе с остановленными кольцами (⟲ всё на места, ✕ у строки для заполнения, правый щелчок по ▶, смена режима). Проверено: треугольник Паскаля, 10 строк, «Встреч Стр», шагами ▶ — лазер 1 даёт на 10-й строке 1110000001, лазер 2 — 1000000111, лазер 3 — 0000011110, лазер 4 — 0001111000.

Zazerkalius v0.190 — снимок и «что не так?»: режим «Всё», три строки, лог «1 закрыт». Во «Всё» конус крутится целиком, и вырез строки 1 относительно неподвижного лазера не сдвигается — луч не выйдет никогда, а 🎯 только отвечала «выбери другой режим». Теперь 🎯 во «Всё» сама переключает на «Встреч Стр» и крутит до нужной строки (говорит об этом). Проверено: 1, 11, 111 во «Всё», 🎯 до строки 3 — «Встреч Стр», 239°, строка 111, луч пойман строкой для заполнения.

Zazerkalius v0.189 — «и ничего не крутит» (снимок: Встреч Бит, одна строка, вырез строки 1 закрыт, 🎯 и ▶ стоят). Причина: остановленные лучом кольца (Z.voidHits.fz) хранят фазу в единицах своего режима — во «Встреч Стр» в градусах, в Каждое / Встреч Бит в битах. Кольца, вставшие во «Встреч Стр» на 179°, после переключения на «Встреч Бит» читались как 179 бит: вырез строки 1 застывал закрытым, а кольцо стояло — крутить было нечего. Повторено у себя ровно так. Теперь: смена режима отпускает остановленные кольца (краска и лог остаются); 🎯, не дойдя до строки из-за стоящих колец, отпускает их и пробует снова с того же места (и говорит, сколько отпустил); ▶, когда все кольца строк стоят, не запускается впустую, а говорит, как их отпустить.

Zazerkalius v0.188 — «а как сделать, чтобы луч дошёл до 10 строки» → «да» на кнопку 🎯 до строки N (в «Лазере», номер — в поле рядом). Крутит выбранным режимом и тем же мелким шагом, что ◀ ▶, до мига, когда луч проходит строку N (выходит из её кольца через щель), и встаёт там. По пути всё как при ▶: пройденные кольца встают, стены красятся, лог пишется, «🚪 Вылет из строк» заполняется. Строка уже пройдена — говорит об этом; за круг не дойти — возвращает всё как было. Во «Всё» не крутит. Проверено на треугольнике Паскаля, 12 строк, с нуля: «Встреч Стр» — строка 10 через 323° (строка от щели 1110000001, дальше луч упирается в строку 11), затем до 12-й — ещё 6°; «Каждое» — 10-я через 0,99 бита. Попутно: подпись ?v= у двух скриптов страницы застряла на 0152 (с v0.152 её не поднимали) — теперь 0188; без неё браузер мог отдавать старый zz-ui.js из кэша.

Zazerkalius v0.187 — «мы же можем заранее просчитать, что получится на 10 строке?» → «да». В «Лазере» кнопка 🔮 просчитать: прогон луча от нынешнего положения до конца — мгновенно, без анимации, тем же шагом, что ◀ ▶, и тем же счётом (остановка колец, вылет из строк, строка для заполнения). Конец — луч ушёл за край или прошёл целый круг. Прогон идёт на копии: фаза, краска, лог и остановленные кольца после него те же, что были. Итог — в «📝 Текст», блок 🔮 Прогноз: у каждой строки угол (во «Встреч Стр») или биты (в Каждое / Встреч Бит) до вылета и строка от щели вылета; внизу — через сколько луч уйдёт за край и что поймает строка для заполнения; ⧉ — строки столбиком. Во «Всё» не считает: кольца там друг относительно друга не двигаются. Проверено на треугольнике Паскаля, 12 строк, с нуля: «Встреч Стр» — строка 10 вылетает на 323° строкой 1110000001 (модель давала 323), строка k — на 360·(k−1)/k; Каждое — все строки на 1 бите, 10-я — 1110000001; Встреч Бит — 10-я 1000000111; счёт — десятки миллисекунд.

Zazerkalius v0.186 — по логу лазера (332 записи: внутренние кольца стоят коридором, меняется только нижняя строка) — «напиши биты на момент вылета из строки каждой» (выбрано: вся строка от щели). Под логом — 🚪 Вылет из строк: для каждой строки в тот миг, когда луч впервые из неё вылетел, — сама строка, прочитанная от щели вылета (с ячейки сразу за щелью, по часовой); строка 1 — от точки под лучом. Одна запись на строку, первая; стирается вместе с краской (✕ у строки для заполнения, «⟲ всё на места», правый щелчок по ▶, смена строк). ⧉ — копия столбиком, строка на строку: Ctrl+V в поле строк вставит его. Проверено на 1, 11, 101, 1111, 10001, 110011, 1010101 во «Встреч Бит»: записались все 7 — 1, 11, 110, 1111, 11000, 100111, 1101010 (каждая — поворот своей строки).

ОСТАЛОСЬ ПО ИССЛЕДОВАНИЮ

Почему нули не меняют период и при каких сидах они вымирают — закрыто (исследование v0.018: столбцы независимы, метка верхней клетки заливает столбец, дальше чистый XOR). Осталось: точная формула разгона — у Серпинского P/2 + 1, без обрезки P/2, у правила 150 5/8 P — это время, за которое метка доползает до низа столбца. Сделано: картинки на сайте (папка issledovanie\, страница «Исследование», кнопка в хабе), сетка «авто» и ось симметрии — в Code 35.56.

Хаб v0.017 — «какие-то тормоза при наведении на кнопку». У каждой кнопки хаба было своё размытие фона (backdrop-filter) поверх живых обоев, которые меняются каждый кадр, и браузер размывал этот фон заново постоянно. У кнопок лаборатории размытие ещё и сидело внутри размытой панели. Наведение добавляло увеличение и переход «всего подряд» (transition: all) на четверть секунды, включая широкое свечение, то есть самую дорогую перерисовку. Размытие у кнопок снято, фон под ними чуть плотнее. Плавно меняются только цвет, фон, рамка и сдвиг, свечение включается сразу. Заодно убран мёртвый pulse-glow: его и так перекрывал перелив цветов с v0.009. У панелей размытие осталось, оно одно и не вложенное.

Хаб v0.018 — «лаборатория — оставь надпись “Черновики”, сделай как в обоях сбойные полосы у кнопок». Панель подписана просто «🔬 Черновики». Кнопки получили сбои, как в обоях Lively: там полосы экрана без музыки «изредка сами» срываются вбок на три кадра. Здесь раз в 0,12 с с шансом 8% выбирается случайная кнопка (кроме той, что под мышью), и три кадра подряд у неё срываются в сторону две горизонтальные полосы: копия надписи на фоне кнопки, обрезанная по высоте (clip-path) и сдвинутая на 3–12 px. В среднем это сбой раз в полторы секунды где-нибудь на экране. Полосы — псевдоэлементы, они живут только на время сбоя и потому ничего не стоят в остальное время. Если в системе включено «меньше движения», сбоев нет.

Хаб v0.019 · обои v0.006 — «всё равно что-то тупит, скорость реакции на наведение». Настоящая причина не в кнопках. Обои лежат на том же сайте, что и хаб, и потому работают в одном с ним потоке браузера. Рисуя 60 кадров в секунду на весь экран, они съедали почти весь кадр, и события мыши хаба ждали своей очереди. Поэтому фоном хаба (внутри iframe) обои теперь рисуют не чаще 30 кадров в секунду. Открытые сами по себе, они рисуют на каждом кадре, как раньше. У панелей хаба снято размытие обоев под ними: оно тоже пересчитывалось на каждом кадре. Фон панелей плотнее (0.55 → 0.72). Наведение на кнопку стало мгновенным, без перехода в 0,15 с, который на глаз читался как вялая реакция.

Хаб v0.020 — «сбои не по одной кнопке, а построчно». Теперь как в обоях: полоса идёт через весь экран на своей высоте и срывает вбок кусок каждой кнопки, которую пересекает, все на один и тот же сдвиг. На каждом из трёх кадров сбоя три новые полосы высотой 3–14 px со своими сдвигами 6–20 px. У одной кнопки за кадр не больше двух полос: столько у неё псевдоэлементов. «И чаще»: шанс начать сбой каждые 0,12 с поднят с 8% до 30%, то есть в среднем сбой раз в 0,4 с вместо полутора секунд.

Хаб v0.021 — «названия на английском и на русском поочерёдно, в каждой кнопке своя фаза; меняются». У каждой кнопки два имени (data-en, data-ru): Code / Код, Genezis / Генезис, GPU Core + Synth / Ядро GPU + синт, Grid Module / Модуль сетки, WebGL Engine / Движок WebGL, Kubits / Кубиты, Fold Layers / Слои сгиба, ASCII Art / ASCII-арт, Octahedron / Октаэдр, Zazerkalius / Зазеркалиус, Lively Wallpaper / Обои Lively, Logbook / Борт-журнал, Wallpaper / Обои. Каждое держится 5 с, фаза у кнопки своя, случайная, так что меняются они вразнобой, а не хором. Сбойные полосы режут то имя, что сейчас на кнопке.

Хаб v0.022 — «нет, лучше построчно менять, одновременно со сбоями». Своя фаза у каждой кнопки (v0.021) снята. Теперь раз в 2–3 с выбирается случайная строка кнопок (флагман, два ряда Черновиков, ряд Знака) и получает сбой: полосы идут только в её высоте, а на втором кадре сбоя все её кнопки разом меняют язык, прямо сквозь полосы. Строки ищутся по верхнему краю кнопок заново на каждый сбой, так что раскладка может меняться с окном. Обычные случайные сбои по всему экрану остались (в среднем раз в 0,4 с), язык они не трогают. При «меньше движения» в системе нет ни сбоев, ни смены языка, и названия остаются английскими.

Хаб v0.023 — «названия групп кнопок также»: «🔬 Drafts / Черновики» и «◇ Sign & Records / Знак и записи» стали такими же строками. Они получают свой сбой и меняют язык сквозь него. Заодно при открытии все названия ставятся на английский. В разметке часть кнопок подписана по-русски, и раньше строка переключалась вперемешку. Теперь строка всегда целиком на одном языке.

Хаб v0.024 — в разметке все подписи английские. Раньше часть кнопок была подписана по-русски, и до запуска скрипта на долю секунды мелькала смесь языков.

Хаб v0.025 · обои v0.007 — «при старте должны быть оба языка». Строки кнопок сверху вниз получают язык поочерёдно (en, ru, en…), начало выбирается случайно. Так с первого кадра видны оба языка, но каждая строка по-прежнему целиком на одном. Надпись обоев тоже стала такой «строкой»: Zerkalius ⇄ Зеркалиус. Она стоит в этом чередовании выше всех кнопок и дальше участвует в общей очереди смены языка. Хаб меняет её через zerkSetTitle в обоях (сайт один, так что окно обоев доступно хабу). Обои сами пускают по надписи сбойные полосы. Чтобы это было возможно, надпись в обоях собирается отдельно от остальной раскладки (buildTitle): полная перестройка сбрасывала бы дождь. У main.js и nastroyka.js появилась подпись ?v=007, иначе браузер отдавал бы старые скрипты из кэша. Пока обои не загрузились, хаб ждёт: надпись ставится по событию загрузки, а для надёжности ещё и через 1,5 с.

Хаб v0.026 · обои v0.008 — «надпись обоев не переключается». Хаб звал функцию обоев напрямую, а с диска (file://) браузер считает хаб и обои разными сайтами и такой вызов запрещает. Ошибку глотал try, поэтому ничего не происходило и ничего не было видно. Теперь хаб шлёт надпись сообщением (postMessage): сообщения ходят и с диска, и на сайте. Обои, загрузившись целиком, сами шлют хабу «готово» (zerkReady), и тогда хаб ставит стартовую надпись. «Готово» уходит именно после полной загрузки: до неё nastroyka.js ещё не выставил свою надпись и перебил бы присланную. Вторая причина: надпись была одной «строкой» из семи-восьми, и её очередь приходила раз в ~20 с. Теперь на неё приходится четверть смен, то есть примерно раз в 10 с.

Октаэдр v0.019 — «в нём самом нет обратно в хаб». Подключён общий значок ⌂ (_js/hub-link.js) в левом нижнем углу, как на остальных страницах. Но клавиша H здесь давно открывает методичку, а модуль тоже вешает на H переход в хаб. Нажатие сделало бы оба дела сразу, а модуль, сидящий на document, срабатывал бы первым. Поэтому у модуля появилась оговорка window.zerkHubNoKey: страница ставит её перед подключением, и тогда в хаб ведёт только значок, а H остаётся методичке. На телефоне внизу лежит лист панели, и значок переезжает наверх, рядом с ⚙. В Дзене он, как и ⏺, не прячется, а приглушается, чтобы выйти можно было и оттуда. В методичке появилась строка про ⌂.

Октаэдр v0.020 — «нужна возможность свои биты вписывать». Рядом с 🎲 появилась кнопка ✎ Свои биты, она раскрывает поле. Поле свёрнуто по умолчанию, потому что панель и так длинная. Из поля берутся только 0 и 1, а пробелы и переносы стоят для глаза. Биты ложатся по порядку чтения: грань за гранью, в грани ряд за рядом от вершины, в ряду слева направо. Короткая строка идёт по кругу, поэтому даже «1011» даёт узор на всё тело. Лишнее не влезает, и под полем видно, сколько вписано и сколько мест. ⇩ Текущие выписывает картину с граней в поле, ряд на строку и грани через пустую строку. Отсюда и правило «считаются только 0 и 1»: такой текст, поправленный руками, ложится обратно ровно на свои места. ◇ Грани одинаково заставляет каждую грань начинать строку с начала. Вписанное сохраняется в памяти браузера, а при смене плотности ложится заново на новое число мест. Случайная картина пересобиралась бы, а свои биты вписывали руками, и терять их обидно. 🎲 снимает свои биты и возвращает случайные. Ctrl+Enter в поле вписывает, Esc выходит из поля, чтобы снова заработали клавиши прибора.

Октаэдр v0.021 — «возможность кидать текстовый файл прямо в поле». Файл принимает не только поле, а вся страница. Без перехвата браузер, получив файл мимо поля, открыл бы его вместо страницы, и прибор закрылся бы вместе с картиной. Пока файл несут над окном, поле само раскрывается и подсвечивается. Текст файла заменяет поле целиком и сразу ложится на грани, а под полем пишется имя файла. Подсветку гасит таймер, а не dragleave: тот сыплется на каждой границе элементов, Chrome часто не говорит, куда ушёл курсор, и поле мигало бы. Огромный файл в поле не кладётся целиком, потому что поле с мегабайтами текста тормозит на каждой букве: от него остаются одни 0 и 1, не больше 200 000. Столько же теперь помнит и память браузера, раньше помнилось 20 000. Файлы больше 20 МБ не берутся. Обычный текст, перетащенный мышью, поле принимает как всегда: перехват срабатывает только на файлы.

Октаэдр v0.022 — «можно ли плотность до 256?». До 256 в лоб нельзя. На грани было бы 32 896 бит, примерно 130 000 цифр за кадр, каждая со своим свечением, и страница встала бы. Шаг между битами вышел бы в 1–2 пикселя, а размер цифры от плотности не зависит, так что они слились бы в пятно. Для такой плотности нужен режим точек: грань рисуется картинкой, где бит — одна клеточка. Пользователь выбрал проще — поднять предел: плотность теперь до 64 рядов (2080 бит на грань). Прореживание нитей поднято с 12 до 32: при 64 рядах пар больше восьми тысяч.

ОСТАЛОСЬ

Режим точек для плотности выше ~40 рядов и до 256: грань — картинка «бит = клеточка», натянутая на треугольник, с попаданием клика в клеточку. Отложено, выбран простой подъём предела до 64.

Октаэдр v0.023 — три просьбы подряд. «Шрифт какой минимальный можно? Сделай минимум»: ползунок «Размер цифр» теперь от 2, а не от 7. Отрисовка молча пропускала всё мельче 5,5 px, теперь порог 1,5 px: мельче холст цифру не проявляет вовсе. На 2–4 px это уже не цифра, а светящаяся точка, и на большой плотности узор так читается лучше, чем каша из наползающих цифр. Выходит почти тот самый «режим точек», только даром. «Свечение по умолчанию отключи»: умолчание 7 → 0. У тех, кто уже открывал страницу, в памяти браузера лежала семёрка, и смена умолчания их не задела бы. Поэтому значение, сохранённое без новой метки glowV, один раз не берётся. Дальше ползунок запоминается как обычно. «Делай для теста 256»: плотность до 256 рядов, в методичке помечено «для пробы». Одно дешёвое ускорение под это: браузер разбирал строку шрифта на каждую цифру, потому что размер у каждой свой. Теперь размер округлён до 0,5 px, и шрифт ставится только при смене. На 256 рядах цифр за кадр больше ста тысяч, и это был главный тормоз.

Октаэдр v0.024 — «ползунок до 32, а после — только по стрелке до 256; нажать и удерживать — быстрое увеличение». На всей длине 4…256 грубой протяжкой было бы не попасть в обычные 10–20 рядов, ради которых ползунок и есть. Поэтому он теперь 4…32, а выше идёт только стрелка ►. Пока плотность выше 32, бегунок стоит у правого края: браузер сам обрезает значение по пределу. Надпись рядом показывает настоящее число. Стрелка плотности считает от самой плотности, а не от положения бегунка, иначе выше 32 она бы застряла. Удержание любой стрелки теперь разгоняется: первые полсекунды повтора по одному шагу, дальше по 2, по 4 и по 8. По одному от 32 до 256 пришлось бы ехать секунд пятнадцать.

Октаэдр v0.025 — «при вводе сразу бы вписывать, кнопку убрать». Кнопки «✎ Вписать» и Ctrl+Enter больше нет. Поле кладёт биты на грани на каждый ввод: набранная цифра сразу видна на теле. Пустое поле картину не трогает. Когда всё стирают, чтобы набрать заново, картина иначе прыгала бы на полпути в случайную и обратно. «⇩ Текущие» и «◇ Одинаково» встали в одну строку.

Октаэдр v0.026 — «всё меню распредели на группы кнопок, как в Layers и у остальных, чтобы можно передвигать» и «задать цвета для 0 и 1 отдельно». Панель разбита на пять разделов: 🎲 Картина, 👁 Вид, 🎨 Цвета, ⇄ Реверс и 🔗 Связи. «Такт цикла», который стоял после нитей, переехал к реверсу, где ему место. Механика взята из Zerkalius Code, а не из Layers: у Layers целая система доков с окном панелей, а в Code её компактный вариант на тех же правилах. У раздела есть шапка «✥ имя ✕». Если тащить за неё, над панелью раздел встаёт между другими там, где курсор. У правого края он ложится во вторую панель, которая пуста по умолчанию и во время перетаскивания проступает пунктиром. Мимо панелей раздел висит на холсте плавающим окном. ✕ прячет раздел. Полоса вкладок сверху по центру показывает и прячет разделы, ↺ в её конце возвращает раскладку по умолчанию, 📖 открывает методичку. Надпись «zerkalius» из-за полосы опущена с 18 до 46 px. Раскладка и спрятанные разделы помнятся в браузере отдельными записями, поэтому их можно сбросить, не трогая настроек прибора. На телефоне разделы всегда собраны в лист снизу, а таскать их нельзя: правой панели там нет, и возить окна пальцем по холсту незачем. Раскладка при этом не трогается, и на широком экране всё встаёт как было. Дзен прячет и полосу, и правую панель, и плавающие окна. Цвета 0 и 1: кнопка «01 Цвета 0 и 1» и два квадратика выбора цвета. Включена — биты красятся значением: все нули одним цветом, все единицы другим, на обеих половинах тела. Выключена — как было: верх голубой, низ жёлтый. Выбор цвета сам включает раскраску: раз цвет трогают, значит хотят его видеть. Память краснеет от этих же цветов.

Октаэдр v0.027 — «🎨 оставить как было, а при изменении цветов — это схема „Свои цвета“». Отдельной кнопки «01 Цвета 0 и 1» больше нет. Схем стало три, и кнопка 🎨 (клавиша T) ходит по кругу: палитра приложения → зелень → свои цвета → палитра приложения. На кнопке, как и раньше, написано, куда переключит следующий щелчок. Выбор цвета в квадратике 0 или 1 сразу включает «Свои цвета». Рамки и фон в этой схеме остаются от той палитры, из которой в неё пришли.

Октаэдр v0.028 — «перемести в полосу меню зеркалиус-октаэдр». Надпись больше не висит над телом, она стоит первой ячейкой полосы вкладок: «zerkalius · октаэдр», тем же тонким разреженным шрифтом, только мельче. Место над телом освободилось, и полоса больше не толкает надпись вниз. На телефоне полоса опущена ниже ⚙ и ⌂, чтобы не лечь на них.

Октаэдр v0.029 — «граням добавить север, восток, юг — на углах буквы». У четырёх углов экватора, в его плоскости и чуть снаружи тела, стоят буквы С В Ю З. Раскладка как на карте, если смотреть сверху: +X восток, +Z юг, −X запад, −Z север. Буквы крутятся вместе с телом, и по ним видно, какой стороной оно сейчас повёрнуто. Яркость зависит от глубины: ближний угол горит во всю силу, дальний на треть, между ними плавно, без скачка на повороте. Рисуются последними, поверх рёбер и цифр, иначе те их перечёркивали бы. Кнопка «🧭 Стороны света» в разделе 👁 Вид и клавиша C, включено по умолчанию, помнится в браузере.

Октаэдр v0.030 — «правая панель тоже должна магнитить панели; по умолчанию распредели и в правую». Раньше раздел попадал в панель, только если курсор был над её коробкой. Пустая правая панель была полоской высотой 120 px, и попасть в неё было почти нельзя. Теперь у каждого края экрана своя полоса магнита шириной 240 px. Курсор в ней, на любой высоте, — и раздел прилипает к панели этого края. Плавающим окном он становится только посередине экрана. Пустая панель во время перетаскивания проступает пунктиром на всю высоту, видно, куда прилипнет. Раскладка по умолчанию стала двухпанельной: слева Картина, Вид и Цвета, справа Реверс и Связи (у раздела есть атрибут data-dock). Запись раскладки в браузере сменила имя (v1 → v2): иначе старая, где всё слева, перекрыла бы новое умолчание. ↺ раскладывает так же, как при открытии: на телефоне всё в лист, на широком экране по панелям.

Октаэдр v0.031 — четыре просьбы подряд. «Режим точек до 256, отдельный режим»: кнопка «⠿ Точки» (клавиша P). Бит рисуется не цифрой, а клеткой, и вся грань — одной картинкой, натянутой на треугольник одним drawImage. Восемь картинок за кадр вместо ста с лишним тысяч цифр. Натянуть можно потому, что точка грани P = V0 + a·(V1−V0) + s·(V2−V1) аффинна по (a, s), где a — доля от вершины, s — доля вдоль ряда. Треугольник картинки «x ≤ y» ложится на грань одним преобразованием холста. Центры клеток совпадают с bitPoint, так что нити и закрепления попадают туда же, где стояли бы цифры. Картинка пересобирается только когда устарела: счётчик dotVer растёт на новой картине, шаге, «забыть», правке бита и закреплениях, а в подпись входят ещё и цвета. При вращении не пересобирается ничего. У клетки нет знака 0 или 1, различает только яркость: 1 горит цветом, 0 тёмный. В схеме «Свои цвета» берутся цвета 0 и 1. Пока клетка крупная, у неё зазор, и видно, что это точки; на 256 рядах клетки идут сплошь. Клик, Shift+клик и наведение в этом режиме переводят точку экрана обратно в (a, s) ближайшей грани (pickAt). «Автоматом заблокировать свечение при плотности больше 32»: выше 32 рядов тень не рисуется, ползунок и его стрелки заблокированы, в подписи стоит «выкл.». Значение не теряется: вернёшься к 32 и ниже, и свечение снова такое, как было. «И Верх, Низ»: у вершин пирамид подписи «Верх» и «Низ», словами, потому что буква «В» уже занята востоком. Прячутся той же кнопкой 🧭. «Кнопку скрытия рёбер»: «◇ Рёбра» (клавиша E) прячет все рёбра разом, экватор тоже, и остаются одни биты. Буквы и так прячет «🧭 Стороны света».

Октаэдр v0.032 — ползунок «Скорость вращения» стоит сразу под кнопкой «⟳ Вращение», а не в конце раздела: кнопка и её скорость теперь рядом.

Октаэдр v0.033 — «Дзен отдельной кнопкой в верхней полоске меню, слева от названия». «☯ Дзен» переехал из раздела 👁 Вид в полосу меню и стоит в ней первым, перед «zerkalius · октаэдр». В Дзене полоса прячется вместе со всем остальным, а выход прежний: Z, Escape или щелчок колесом.

Октаэдр v0.034 — «а что если такую же, но 3 грани основания?». Октаэдр — это две четырёхгранные пирамиды под общим квадратом; число граней основания стало настройкой: в «🎲 Картине» кнопки △ 3, ◇ 4, ⬠ 5, ⬡ 6. При 3 выходит треугольная бипирамида — шесть граней, три сверху и три снизу, общий треугольник — зеркало. Углы основания стоят по кругу радиуса 1, первый на +X, так что при 4 тело прежнее точка в точку. Всё, что было «на четыре», стало «на NB»: грани и их пары, рёбра, картины бит по слотам, шаги реверса и память, нити, счёт мест для своих бит. Смена основания собирает новую картину (слотов стало другое число) и снимает закрепления — они адресованы граням прежнего тела. Буквы С В Ю З теперь стоят по компасу, а не на углах основания: у 3, 5 и 6 граней углы на стороны света не попадают. Название в полосе меню меняется по телу («zerkalius · треугольная бипирамида»), выбор помнится после F5.

Октаэдр v0.035 — «тут возможность Серпинского». В «🎲 Картине» под «Новой картиной» — кнопка «△ Серпинский»: на каждой грани треугольник Паскаля по чётности, бит ряда r на месте k — C(r, k) mod 2, то есть 1, когда у k и r−k нет общих двоичных единиц (Лукас). Это тот же треугольник, что «Правило 90» из одной точки в Code; снизу он, как всегда, отражённый и инвертированный. Режим держится, как свои биты: при смене плотности треугольник строится заново на новое число рядов (чище всего на 16, 32, 64 — степенях двойки). Снимается «🎲 Новой картиной» или вписанными своими битами, помнится после F5. Узор сверен расчётом.

Октаэдр v0.036 — «Аниматрицу туда также». В «⇄ Реверсе» две новые операции шага: «▼↙ Аниматрица» и «▼↘» (клавиши 4 и 5). Правило то же, что в Code: проход от вершины вниз, ряд r+1 переписан по уже переписанному ряду r. На гранях бит только 0 или 1, поэтому 1 — символ, 0 — пусто, и правило Code становится XOR — ровно то, чем Аниматрица оказывается после разгона (исследование, раздел 9½). У бита на грани два соседа сверху; «столбец» волны — один из них: ↙ берёт правого, и волна бежит вдоль левой стороны, ↘ — левого, вдоль правой. Шаг — целый проход по всем граням, назад — обратный проход снизу вверх, точная отмена; «▶ Цикл» гонит подряд, память и «устояло» считаются как у реверса. Когда картина возвращается к исходной, в строке шага встаёт «цикл за N». Сверено в node: 13 рядов — цикл 16, 16 — 16, 32 — 32 (степень двойки не меньше числа рядов, в обе стороны), шаг назад отменяет шаг вперёд; Серпинский за проход съезжает на ряд вдоль стороны, C(r, k) → C(r+1, k+1).

Октаэдр v0.037 — «это прямо под верхней полосой меню писать» (скриншот строки «шаг 129 · устояло 60% · цикл за 32», где «32» перенеслось на новую строку). Строка шага ушла из раздела «⇄ Реверс» под полосу меню: по центру, в одну строку, на полупрозрачной подложке, мышь сквозь неё проходит. Полоса на узком экране переносится и меняет высоту, поэтому место под ней меряет скрипт (нижний край полосы + 4 px) и следит за ней. В Дзене строка прячется вместе с полосой.

Октаэдр v0.038 — «также надо 2 и 1 грань». Кнопки основания теперь ▽ 1, ◊ 2, △ 3, ◇ 4, ⬠ 5, ⬡ 6. При 1 и 2 тела уже нет: основание — отрезок из двух точек (±X), и выходит плоский ромб — верхний треугольник и его зеркало вниз, в плоскости Z = 0. У плоской грани центр лежит в её же плоскости, и прежнее правило «нормаль смотрит туда же, куда центр» стороны не определяет — сторону задали явно: слот 0 смотрит на +Z, слот 1 на −Z. 2 грани — двугранник: у ромба лицевая и оборотная сторона, на каждой своя картина, видна та, что к глазу. 1 грань — одна картина, видная с обеих сторон (с оборота — зеркально), как на стекле: для неё видимость берётся по модулю. У отрезка экваторное ребро одно, а не два. Сверено в node: нормали, число граней и рёбер для 1, 2, 3, 4; при 4 тело прежнее.

Хаб v0.028 — «не меняет язык заголовков, на этом компе, на другом норм, странная штука». Виновата не страница, а машина: это Windows Server, где визуальные эффекты выключены по умолчанию, и браузер отвечает prefers-reduced-motion: reduce (проверено в консоли; регистр Windows на этот вопрос отвечает невнятно, и доверять надо браузеру). Весь блок сбоев начинался выходом по этому условию, а вместе с полосами уходили смена языка по строкам и надпись обоев — подписи так и стояли английскими, как записаны в разметке (v0.024). Уважать «меньше движения» правильно, но гасить это должно движение, а не содержание: теперь условие не выходит из блока, а поднимает признак CALM. В тихом режиме случайных сбоев нет и полосы при смене языка не рисуются — язык встаёт сразу, — а перебор строк и очередь надписи обоев идут как прежде, раз в ~2,5 с.

Октаэдр v0.039 — «поправь 2 — это перпендикулярное двух треугольников». В v0.038 две грани дали двугранник: один плоский ромб, у которого лицевая и оборотная стороны несут разные картины. Имелось в виду другое — два ромба ПЕРПЕНДИКУЛЯРНО друг другу, крест: первый в плоскости Z = 0, второй в X = 0, общая у них только ось. Поэтому у основания теперь четыре точки (0°, 90°, 180°, 270°), а грань стоит не на стороне квадрата, а на диаметре: слот s берёт EQ[s] и EQ[s+2]. Экватор — те же два диаметра, по одному на ромб, а не обход квадрата по сторонам. Сторону плоскости по-прежнему задаём явно (центр плоской грани лежит в её же плоскости, и «наружу» по нему не определить): слот 0 смотрит на +Z, слот 1 на +X. Видны оба ромба с обеих сторон, как одиночный: толщины у листа нет, и прятать изнанку не от чего. Кнопка основания стала «✛ 2», подпись тела — «крест из двух ромбов».

Октаэдр v0.040 — «пересечения там — пунктирным ребром». Два ромба креста пересекаются по оси, но настоящего ребра там нет, и в общий список рёбер ось не положить: видимость ребра считается по грани, где лежат ОБА его конца, а вершина и её зеркало в одной грани не встречаются — ось ушла бы в пунктир скрытого контура и появлялась бы только с включёнными скрытыми рёбрами. Поэтому линия рисуется отдельно, поверх рёбер, и тоже штриховой: по чертёжному правилу штрих и значит «здесь одно уходит за другое». Заодно снимается неточность художника: грани сортируются по глубине целиком, поэтому у самой оси один ромб ложится поверх другого полностью, и без этой линии место пересечения не читалось.

Октаэдр v0.041 — «это как бы скрытое ребро» (со снимком галки «△ Скрытые рёбра»). В v0.040 ось пересечения рисовалась сама по себе и всегда, ярче дальнего контура. Но она и есть скрытое ребро — линия, по которой одно уходит за другое, — поэтому переехала в тот же проход, что и весь дальний контур: та же штриховка, та же приглушённость, та же галка. Причина, по которой ось не лежит в общем списке рёбер, прежняя: видимость ребра считается по грани, где лежат ОБА конца, а вершина и её зеркало в одной грани не встречаются.

Исследование v0.019 — из трёх вопросов списка «осталось» закрылись два, и не проверкой, а доказательством (раздел 9¾). Почему период не меняется от нулей. Метка столбца — символ его верхней непустой клетки — вечна: строку 0 волна не переписывает, а над пустой клеткой ничего не меняется. Выше верхней чужой клетки чужому символу взяться неоткуда: накопитель там бывает только пробелом или меткой, значит и пишет только их. А над чужой клеткой правило — чистый XOR, то есть умножение на 1/(1+z) над GF(2), и в нём каждая строка когда-нибудь непуста: будь строка r пуста на всех проходах, пустовала бы и строка r−h при h — половине её периода, и так вниз до строки 0, а она непуста всегда. Значит чужая клетка рано или поздно накрывается меткой («два разных → верхний»), чистая часть столбца растёт строго, и дальше период обязан быть P. Нелинейность волны живёт только в разгоне. Отсюда же третий вопрос: нули вымирают тогда и только тогда, когда в сиде нет нуля, — живут они ровно в столбцах с меткой «0». Разгон без обрезки выведен точно: верхняя чужая клетка столбца на отклонении d гибнет на проходе min{k ≥ 1 : k & (d−1) = 0} (теорема Куммера), максимум даёт d = P/2 — совпало для всех 676 столбцов на прогонах в 50, 64, 100 и 128 строк. Расчёт заодно повторил все прежние числа исследования и показал главное: начало цикла — это в точности тот проход, на котором гибнет последняя чужая метка. Осталась только точная формула разгона у Серпинского с обрезкой (P/2 + 1) и у правила 150 (5/8 P), но известно, где искать: последними держатся не самые глубокие клетки, а те, что на отклонении P/4 и P/8 от центра. Заодно выправлен номер версии в первой строке файла — он отставал на две (v0.016 при v0.018 в заголовке).

ПОЧЕМУ ТЕКСТ ПОМОЩИ ЖИВЁТ В САМОЙ СТРАНИЦЕ

Как методичка в Октаэдре: отдельный файл с описанием отстаёт от кода с первой же правки. Инструкция лежит в <template id="helpText"> рядом с разметкой панелей, и при правке кнопки её описание оказывается прямо перед глазами.

ПОЧЕМУ ПОСЛЕ СЦЕНЫ, А НЕ В САМОЙ СЦЕНЕ

Стартовая сцена «Код Матрицы» при выборе из списка включает неон и гасит радар, и так должно оставаться. Поэтому стартовый вид накладывается поверх сцены отдельным шагом и только при открытии. Если в памяти браузера лежит свой текст, загрузится он, но вид будет тот же.

Zerkalius Layers · Binary-Drum-Machine\fold-layers\ · шесть файлов

v1.513Полуоборот — прыжок сразу в зазеркалье

Кнопка ⟲½ Полуоборот в рамке Круга, отдельной строкой.

Откуда взялась: «◄/► Круг Инв» переворачивает бит, переходящий через шов строки. Значит за len нажатий каждый бит пересекает шов ровно один раз — возвращается на своё место, но перевёрнутым. То есть len тактов «Круга Инв» = инверсия строки без всякого поворота, а ещё len тактов возвращают её домой. Полный период — 2·len, ровно поэтому computeShiftTotalTurns удваивает итог у Inv-режимов. Кнопка делает этот прыжок одним действием и за O(len).

ПОЧЕМУ НЕ ЦИКЛ ИЗ len ВЫЗОВОВ

Во-первых, это квадрат по длине строки. Во-вторых, и это важнее, у ◄/►Круг есть надстройки, которые ищут ПОЛОЖЕНИЕ («⇔ Крайние 1», «🔗 Не рвать 1-группы»), а ⊙-выравнивания вообще двигают только картинку и самих бит не трогают. Такой цикл они бы перехватили. Полуоборот положения не ищет — и потому от выравнивания и от этих галок не зависит вовсе.

У строк РАЗНОЙ длины общего полуоборота нет: у каждой свой. Счётчик «Вар: N/M» двигается на наибольшую длину, а сообщение честно перечисляет длины. При одинаковых длинах всё точно.

Заодно: версия в файле разъехалась — <title> показывал v1.512, а шапка и подписи скриптов 1511. Свёл всё к 1513.

v1.514Карта осей — Манакер по строкам

Кнопка 🪞 Карта осей под «🎭 Маской». Ищет не заданный образец, а САМУ симметрию: все центры отражения в каждой строке за один линейный проход.

ТРИ РЕШЕНИЯ ВНУТРИ

Антипалиндромы считаются тем же Манакером. Подмена t[i] = s[i] XOR (i&1): у чётной оси сумма номеров пары нечётна, значит ровно один из двух бит перевёрнут, и «биты РАЗНЫЕ в s» превращается в «биты ОДИНАКОВЫЕ в t». Второй алгоритм не нужен.

Порог 6 бит (AXIS_MAP_MIN_LEN): осью длины 1 является каждый бит, а длины 2 — каждая пара «01»/«10». Без порога карта закрасила бы всё.

Точки рвут ось. Строка режется на куски из чистых «0»/«1»: сравнение «точка равна точке» породило бы симметрию на пустом месте.

Черта сделана box-shadow, а не border: рамка у inline-элемента добавила бы высоту и увела строки по вертикали, а тень места не занимает.

v1.515Оси сквозной — симметрия через границы строк

Кнопка 🪞 Оси сквозной ⟶. Собирает цепочку в одну ленту и оставляет только те оси, что пересекли границу строк — внутристрочные уже показывает построчная карта, и дублировать её значило бы утопить редкие сквозные оси в сотне обычных. Черта толще, подсказка говорит охват.

ЛЕНТА БЕРЁТСЯ ИЗ КАРТЫ ЯЧЕЕК, А НЕ ИЗ СКЛЕЙКИ

bgConcatCellMap() отдаёт «место в ленте → {строка, бит}», собранное тем же обходом, что и сама склейка. Строить ленту отдельно через concatRowsDownTo() нельзя: они уже расходятся — склейка выбрасывает точки через stripDots, а карта ячеек их оставляет. Поэтому лента собирается ИЗ САМОЙ КАРТЫ: сколько ячеек, столько бит.

Обход — обычная сквозная ⟶ сверху вниз по всей цепочке, а не текущий режим фон-поиска: тот меняется по ходу работы, и кнопка означала бы каждый раз разное. Остальные одиннадцать обходов (влево, змейки, Инв, Рев+Инв) подключаются одной строкой.

Охват оси считается за одно вычитание: заранее строится префикс «сколько раз сменилась строка к этому месту». Иначе длинная ось стоила бы прохода по себе, и всё снова стало бы квадратом — тем самым, от чего уходили Манакером.

v1.516Реверс: вторая половина строки

Кнопка «⇄🔎 Реверс» показывала только неподвижные биты — те, что стоят на палиндромных местах и разворота не заметят. Вторая половина строки никак не помечалась, и картинка отвечала лишь на половину вопроса.

Теперь кнопка делит строку надвое: неподвижные горят своим цветом, меняющиеся гаснут в фон. На виду остаётся скелет симметрии строки.

ПОЧЕМУ ВТОРАЯ ПОЛОВИНА ГАСНЕТ, А НЕ КРАСИТСЯ

Пользователь сказал «изменяющиеся чёрным». На тёмном полотне «чёрным» и значит «в фон»: дай мы им ещё один цвет, на экране стало бы вдвое пестрее, а разделить надо всего надвое. Тот же приём, что в памяти октаэдра, и там он себя оправдал.

Признак считается тем же сравнением, что и первая половина, только с обратным знаком, и по тому же набору строк: две половины обязаны делить строку ровно надвое, без щелей и нахлёста. Пустые места и точки прореживания не в счёт — у них нет значения, которое могло бы измениться.

Это первая половина пункта 1 из списка ниже. Вторая — память по циклу (сколько шагов подряд бит держится) — ещё не сделана: в Layers для неё нужен свой ход, потому что «реверс» здесь не одна кнопка, а семейство зеркал и Кругов.

v1.517–1.518Вертикальный ползунок в «Виде»

Общий модуль стрелок оборачивал каждый ползунок в строку «◂ трек ▸» и отдавал обёртке ширину ползунка — у вертикального это 16 px, трек сжимался в точку. Обёртку вертикального развернули в столбик, значок «↕» убрали (двойной клик «подогнать под экран» переехал на число), трек — во всю высоту рамки. Модуль не трогали: он общий для всех машин.

v1.519«🔁 Инв меняющихся»

Пара к «⇄🔎 Неподвижным» на одной строке: переворачивает ровно ту половину, которую подсветка гасит.

ПОЧЕМУ РЕЗУЛЬТАТ РАВЕН РАЗВОРОТУ

Меняющиеся биты ходят парами: №k и зеркальный к нему различаются, значит перевернуть оба — то же, что поменять местами. Неподвижные при развороте и так стоят на месте. Это не ошибка, а само определение «меняющихся». Разница с «⇄ Реверсом» — биты остаются на своих позициях, и позиционные пометки (инверсии, вставки) живут дальше.

v1.521–1.522«🔺+1» и «🔢+1»: следующая строка под выделенной

Серпинский: новый бит №j = бит №j−1 XOR бит №j над ним, за краями нули — из строки длины T выходит T+1. На треугольнике Паскаля это его следующая строка, но правило общее и работает от любой. Номера: строка читается как двоичное число, под ней встаёт на единицу больше (BigInt — строки длиннее 53 бит). Обе вставляют со сдвигом нижних строк и переносят выделение на новую — жать можно подряд.

v1.523–1.530Меню 2, горизонт, ось

Меню 2 получило постоянный размер (24 px, кнопка 28 px, значки 15 px) вместо привязки к кеглю. Стоит по середине нулевой строки, по полстроки выходит в −1 и 1; сверху под его половину резервируется место, иначе оно упиралось в меню 1 и съезжало на биты. Черта горизонта под меню вырезается clip-path — слоями не получилось, меню и черта живут в разных контекстах. Ось идёт до низа последней строки ПОД цифрами бит (поднят слоем сам span с битами, а не коробка — у коробки z-index перебит подложкой поля) и стоит по центру цифры без межсимвольного интервала.

СТОРОЖ НУЛЕВОЙ СТРОКИ (v1.529)

На скриншоте первая строка Серпинского стояла в нулевой. Нулевая обязана быть пустой, но проверялась только при загрузке. Теперь проверка на входе каждой отрисовки: нашлись биты — над ними вставляется пустая нулевая. Откуда биты туда попали — НЕ установлено, это лечение последствия; причину стоит поймать, если повторится.

v1.531Память по циклу — пункт 1 закрыт

Кнопка «🔥 Память по циклу»: бит разгорается, пока держит значение — ступени 1, 2–3, 4–7, 8+ шагов; сменился — гаснет до обычного.

ПОЧЕМУ ОБЩИЙ ПРОХОД, А НЕ У КАЖДОЙ КНОПКИ

«Реверс» в Layers — семейство: зеркала, Круг, Круг Инв, полуоборот, разворот, правка руками. Вешать счёт на каждую значило бы завести пять копий одного и того же. Поэтому шаг определён через результат, а не через кнопку: шаг — это любое изменение строки. Проход на входе render() сравнивает строку с её прошлым видом; перерисовка без изменений (наведение, прокрутка) шагом не считается. Сменилась длина — позиции больше не совпадают, счёт строки заново.

v1.532Детектор цикла в прогоне — пункт 2

▶ Авто в режимах шага, XOR выдел, Интерливинг и сквозных теперь замечает, что вернулся в уже бывшее состояние, останавливается и отчитывается парой: μ — длина входа, λ — длина петли. Петля в один шаг — неподвижная точка.

СОСТОЯНИЕ — НЕ ТОЛЬКО СТРОКИ; ДВА ЯРУСА

Шаг зависит ещё от указателей пары, направления, хвостового буфера, флагов «использована» и кухни Гориз.XOR — всё это в ключе. Счётчики (номер шага, находки) не в ключе: они растут всегда и цикл не дали бы найти. Лишнее поле грозит только пропуском цикла, недостающее — ложной тревогой, поэтому поля взяты с запасом.

Первые 20 000 состояний идут в таблицу отпечатков (64 бита) — первое повторение даёт μ и λ точно и в самый ранний момент. Дальше таблица не растёт, и работает Брент: одна запомненная «черепаха», переставляемая на степенях двойки. λ он даёт точно, μ — только границей сверху (для точного нужен повторный прогон с начала, а шаги с побочными эффектами переигрывать нельзя).

Круг и Спираль не тронуты: там период известен заранее (НОК длин, у Инв вдвое), прогон и так останавливается на полном цикле.

v1.533«⇅ Зеркало по горизонту» — пункт 3

Строка r встаёт на место 2h−1−r, где h — строка горизонта. Горизонт не поднят — отражается выделенный блок. Отражаются только пары, у которых есть обе строки; нулевая строка остаётся на месте (иначе сторож нулевой вставил бы новую и всё сдвинул). Построчные пометки едут со своими строками, паттерны не трогаются.

ПОЧЕМУ НЕ КОМПОЗИЦИЯ ПОВОРОТОВ

«Повернуть на 90°, развернуть, повернуть обратно» теряет форму на строках разной длины: поворот кладёт их на общую сетку и досыпает нули. Прямая перестановка строк точна. Разворот, инверсия и вертикальное зеркало — три коммутирующие инволюции, вместе группа из восьми элементов (Z₂³): зазеркалье стало двумерным.

v1.534«🧬 Ядро децимации» и оси сквозной по всем обходам — пункты 4 и 6

Ядро. Лента (выделенные строки или все, сквозная →) прореживается с шагом k = 2…8 по уровням kᵉ; каждое прореживание сводится к представителю своей четвёрки V₄ и считается. Отчёт — лесенка «сколько разных видов всего» на каждом уровне; перестала расти — ядро замкнулось.

ЧТО ЭТО ДОКАЗЫВАЕТ И ЧЕГО НЕТ

Теорема Кобэма–Эйленберга: ядро конечно ⟺ последовательность k-автоматная. На конечной ленте подпоследовательности сравниваются окном в 16 бит, уровней мало — «замкнулось» на сотне бит это повод присмотреться, а не теорема. Поэтому в отчёте вся лесенка чисел, а не одно слово.

Склейка по V₄ считает ОРБИТЫ, а не элементы — число выходит не больше настоящего, но признак «конечно / растёт» от неё не меняется.

Оси сквозной. Рядом с кнопкой — выбор обхода: → , ←, змейка ←, змейка →. Инв- и Рев+Инв-вариантов в списке нет намеренно: инверсия и разворот всей ленты осей не меняют, карта вышла бы та же. Порог ленты свой — max(6, ⌈2·log₂N⌉): в случайной ленте из N бит самый длинный палиндром растёт как 2·log₂N, и с прежним порогом 6 длинная лента тонула в случайных осях.

v1.535«🧮 GF(2)» — неподвижные точки алгеброй — пункт 5

Для выделенной строки и выбранной операции (Круг, Круг Инв, разворот, инв-разворот, «x ⊕ сосед», Правило 90) решает, какие строки её длины вернутся к себе ровно через t шагов. Шаг — аффинный F(x) = A·x ⊕ b, t шагов — Fᵗ, и вопрос сводится к уравнению (Aᵗ ⊕ E)·x = bₜ: Гаусс вместо перебора 2ⁿ. Ранг даёт ответ сразу: решений нет или ровно 2^(n−r). «⤓ Вписать» кладёт в строку ближайшее решение — свободные переменные взяты из её же бит.

ПОЧЕМУ В СПИСКЕ НЕТ AND

x·y не выражается XOR-ами — AND нелинеен, и алгебра на нём ломается. Там перебор остаётся честным способом; ровно там живёт непредсказуемость. Длина ограничена 512 битами: у плотных операций умножение матриц — n³/32, и на большом t их до шестидесяти.

v1.540«▽ Спуск» — треугольник XOR вниз и его край

Выросло из разговора про «суперархиватор»: нельзя ли любую строку свести правилом к одному биту, а потом из короткого зерна «выстрелить» обратно в любые данные. Кнопка рядом с «🔺+1» строит под строкой треугольник: под каждой парой соседей их XOR, n бит → n−1 → … → 1, — и показывает его в «🧾 Черновике шага», а левый край (первый бит каждого этажа) — отдельно, в «Итоге».

ПОЧЕМУ ЭТО НЕ АРХИВАТОР, А ДЕТЕКТОР ПОРЯДКА

Каждый этаж теряет бит (0110 и 1001 дают под собой одно и то же), поэтому по низу строку не восстановить. Хранит её левый край — ровно n бит, как и сама строка: спуск не сжимает, а перекладывает. Это биномиальное преобразование над GF(2), и оно само себе обратное — спуск от края даёт исходную строку (ещё одно зеркало рядом с тремя инволюциями).

«Выстрелить из зерна в любые данные» мешает счёт: зёрен из T бит всего 2^T, значит и результатов не больше 2^T, а строк длины N — 2^N. Из двух бит правилом «🔺+1» выходят только 4 строки из 8 возможных трёхбитных, и у всех чётное число единиц. Зато для данных, порождённых правилом, сжатие огромное: у Серпинского край — одна единица. Поэтому кнопка отвечает на вопрос «есть ли в строке порядок»: разреженный или повторяющийся край — есть, край-мусор той же длины — не видно.

v1.541«🧮 Лин. сложность» — кратчайшее линейное правило

Продолжение того же разговора: «если бы можно было быстро вычислить правило, которое непременно приводит к нужной строке, — это и был бы суперархиватор». Кнопка рядом с «🧮 GF(2)» берёт ленту (выделенные строки или вся цепочка) и находит самое короткое правило «следующий бит = XOR нескольких предыдущих», которое выдаёт её целиком. В черновике — правило, зерно из L первых бит и 64 следующих бита, вычисленных по этому правилу.

ПОЧЕМУ ТОЛЬКО ЛИНЕЙНЫЕ ПРАВИЛА

Кратчайшее правило среди ВСЕХ возможных (колмогоровская сложность) найти нельзя в принципе — это доказано, а не «трудно». Да и у большинства строк правила короче их самих нет: правил короче n бит меньше, чем строк длины n. Но внутри одного семейства поиск бывает точным и быстрым. Для линейного, над GF(2), это алгоритм Берлекэмпа — Мэсси: за n² шагов, с гарантией, что короче нет. Лента, порождённая таким правилом, хранится как 2·L бит вместо N; у случайной L держится около N/2 — это честный ответ «линейного правила нет», а не промах поиска.

Zazerkalius v0.034Одно упавшее окно больше не гасит остальные; ошибки — сообщением

Баг-репорт «сломалось», со снимком. «🧊 Вид» в режиме «все строки»: холст со стрелками на месте, а карточек нет. Проверено в браузере на тех же версиях: «все строки» работает и на столе, и под полем строк, и в отдельном окне. На пустых, однобитных, огромных строках и на строках вперемешку с пустыми ни одно окно не падает. Не повторилось, значит, дело в данных пользователя: у него страница открыта из файла, и память у неё своя. Картинка на снимке объясняется так. «Вид» перерисовывается последним в общей перерисовке. Если какое-то окно раньше него падало, до «Вида» дело не доходило, и холст со стрелками оставался, а карточки не появлялись.

Теперь каждое окно перерисовывается в своём try: упавшее не гасит остальные, а внизу появляется сообщение «⚠ Окно «…» не нарисовалось: … — пришли этот текст». Любая другая ошибка страницы тоже показывается сообщением, с файлом и строкой. Проверено нарочно сломанным окном: остальные, и «Вид» тоже, рисуются, сообщение на месте.

ПОПУТНАЯ ПОЛОМКА: HEREDOC СЪЕЛ \N

Первая сборка v0.034 не загружалась вовсе: `$ is not defined`, а в консоли — SyntaxError в zz-ui.js. Правка вставлялась через heredoc оболочки, и `split("\n")` превратился в `split("` с настоящим переводом строки. Нашлось сразу, потому что проверял сам. Правки со строками, где есть обратная косая черта, нужно вставлять только через файл-скрипт, не через heredoc.

Zazerkalius v0.037Номер изменённой строки — золотом, против сохранённого столбика ⚑

Снимок своего шаблона «Столбик · 70 стр.» и просьба: «крась номер строки, если там есть изменённые по сравнению с сохранённой версией биты, и снимай краску, если восстановилось». Сохранённая версия — свой шаблон-столбик, эталон. У своих шаблонов появился флажок ⚑: им выбирают эталон, а второй щелчок по нему выключает сравнение. По умолчанию эталон — последний сохранённый «+ Столбик»: при загрузке берётся последний свой столбик, а каждый новый «+ Столбик» становится эталоном сам. Номер строки, которая отличается от эталона, золотой. Сравнение идёт строка в строку по номеру, в рабочем поле. Строки, которых в эталоне нет, тоже подсвечиваются. Над полем написано, против какого шаблона сравнение, сколько строк изменено и сколько недостаёт.

КРАСКА СНИМАЕТСЯ САМА

Сравнение считается при каждой отрисовке поля, а не запоминается пометкой. Поэтому, как только строка снова равна эталону (исправил руками, ↩, вставил обратно), номер гаснет сам, и снимать ничего не нужно. При удалении шаблона номер эталона сдвигается, а если удалён сам эталон, сравнение выключается.

Zazerkalius v0.036У номеров — неподвижные·меняющиеся и 0·1; неподвижные биты красным прямо в строках

Запрос пользователя: «неподвижных бит 2, меняющихся 6 — рядом с номером строки, эти числа компактно; и кнопку, чтобы прямо в строках подсветила красным неменяющиеся; также число 0 и 1 у номеров — отдельной кнопкой показать». Над строками три переключателя. «⇄ н·м» — у номера строки мелко: неподвижных бит (красным) и меняющихся (серым), например 2·6. «0·1» — нулей и единиц, например 3:5. «🔴 неподв.» — неподвижные биты прямо в строках красным, во всех полях и в наложении. Числа у номеров считаются по рабочему полю, колонка номеров расширяется под них сама. Неподвижный бит — тот, что равен своему зеркальному (бит k и бит «длина−1−k»): разворот его не трогает.

Одновременно с этой правкой Zazerkalius правила другая сессия: панель значками, v0.035. Эта версия легла поверх неё, и её работа сохранена. Переводы строк в трёх файлах страницы приведены к LF, как у той сессии.

Zazerkalius v0.035Левая панель значками в один столбик; оси по биту и между битами различимы

Две просьбы по снимкам: «возможность скрывать в значки в один столбик» (левая панель: Построения, △ Треугольник, Шаблоны) и «различай оси на бите и междубитные» (🎯 Указатели симметрии: у «111» три скобки выглядели одинаково).

Zazerkalius v0.033🧊 Вид: закреплённая ось для стрелок; крест ✥ — двигать, как с Ctrl

Пользователь: «стрелки пусть крутят, как будто последняя выделенная ось закреплена, — или что-то в этом роде; и сделай кнопку-крест: при нажатии на неё и перемещении двигается, как с Ctrl, сама она стоит на месте».

Zazerkalius v0.032🧊 Вид: гизмо поворота — кольца-плоскости X, Y, Z, как в 3D-программах

Запрос пользователя: «надо и плоскости ещё добавить, и чтобы за них крутить, когда остальная ось на месте, как в 3D-программах». Вокруг сцены теперь три полупрозрачных кольца-плоскости через её центр: YZ (поворот вокруг X, красное), XZ (вокруг Y, зелёное), XY (вокруг Z, синее), и их пунктирные оси с подписями. Кольцо под мышью подсвечивается, курсор меняется. Если тянуть за кольцо, сцена крутится только вокруг его оси, а остальные оси остаются на месте. Если тянуть внутри колец, поворот свободный, как раньше. Плоскость текущей строки осталась. Галка называется «оси и плоскости».

КАК СЧИТАЕТСЯ УГОЛ

Поворот вокруг оси мира — это M' = M · R(ось). Угол берётся из того, как мышь обходит центр кольца на экране: если ось смотрит на зрителя, против часовой — плюс, если от зрителя — наоборот. Когда кольцо стоит ребром и обходить нечего, угол считается по движению мыши поперёк проекции оси. Кольцо схватывается, если мышь ближе 9 px к его линии.

Zazerkalius v0.031🧊 Вид: «крутить по отдельности» — галкой, «⟲ сброс строк»

Запрос пользователя: «сброс вида, если накрутил отдельные строки, и галку — по умолчанию выключена — что можно отдельные крутить». Схватить строку в «все вместе» теперь можно только с галкой «крутить по отдельности», а по умолчанию она выключена. Без неё щелчок по лесенке только выбирает строку (делает её текущей), перетаскивание крутит всю стопку, Ctrl двигает всю картинку. Кнопка «⟲ сброс строк» возвращает на место всё, что накручено по отдельности: повороты и сдвиги строк стопки, повороты и масштаб карточек «все строки», а заодно масштаб и сдвиг картинки. Направление взгляда кнопка не трогает, для него есть кнопки видов.

Zazerkalius v0.030⧉ — любое окно в отдельное окно браузера

Запрос пользователя: «возможность каждого окна — в отдельное». В шапке каждого окна появилась кнопка ⧉. Она выносит окно в отдельное окно браузера, например на второй монитор. Окно продолжает жить: пересчитывается, крутится, следит за строками. Если закрыть то окно или нажать ⧉ ещё раз, окно вернётся туда, где было: на стол или под поле строк.

КАК ПЕРЕЕЗЖАЕТ ОКНО — ТЕМ ЖЕ СПОСОБОМ, ЧТО ПАНЕЛИ LAYERS

В новое окно копируются все стили страницы, тема и шрифт цифр, а само окно переезжает туда целиком (adoptNode), вместе со своими обработчиками. Ловушка одна: код ищет элементы по id в своём документе, а вынесенные живут уже в чужом, и окно перестало бы обновляться. Поэтому поиск по id ($) теперь смотрит и во вынесенные окна, и три места, где элементы искались прямо в документе (указатели симметрии), переведены на тот же поиск. Холст в отдельном окне перерисовывается при смене размера того окна. При перезагрузке страницы вынесенные окна закрываются, а сами обратно не открываются: браузер не открывает окна без щелчка. Если браузер не дал открыть окно, нужно разрешить всплывающие окна для страницы.

Zazerkalius v0.029🧊 Вид: схватить строку в стопке, стрелки, поворот от текущего вида, Ctrl — сдвиг, ось и плоскость

Пять сообщений подряд: «возможность хватать за одну в общем виде — выделять, и управление стрелками на клавиатуре и кнопки вверх-вниз-вправо-влево на поле вверху справа»; «добавить полупрозрачные ось и плоскость»; «вся стопка» (про стрелки); «от текущего вида крутится в одной плоскости»; «перемещение с Ctrl — просто передвижение без кручения».

Zazerkalius v0.028🧊 Вид: масштаб колесом, сдвиг, сброс двойным щелчком

Снимок: режим «все вместе», 70 строк лесенкой — вся стопка умещалась в окно и выглядела точкой. Просьба: «масштаб менять колёсиком». Колесо мыши меняет масштаб большой картинки и приближает к точке под курсором, так что можно подъехать к нужной строке стопки. Shift + перетаскивание или правая кнопка сдвигают картинку. Двойной щелчок возвращает масштаб и место как было. На карточках режима «все строки» колесо увеличивает свою карточку. Масштаб и сдвиг запоминаются, текущий масштаб написан в подписи картинки.

Zazerkalius v0.027🧊 Вид: «лесенка / гребёнка» — штрихкод, и инверсия как поворот палочек

Пользователь: «это, конечно, тоже так, но ещё вариант — что в азбуке Морзе 1-чёрточка вертикальна: ! ! . !», затем «да» на предложенный переключатель. В окне 🧊 Вид появился выбор «лесенка / гребёнка», и он работает во всех трёх режимах: одна строка, все строки, все вместе. В гребёнке каждый бит стоит на своём месте в ряд: 1 — палочка вверх, 0 — палочка к зрителю. Подписи под картинкой для гребёнки свои: спереди штрихкод, сверху инверсия, сзади разворот, сбоку крестик.

В ЛЕСЕНКЕ ТОЧКИ СЛИВАЛИСЬ, В ГРЕБЁНКЕ — НЕТ

В лесенке отрезки идут друг за другом, и спереди точка-ноль сливается с концом соседней чёрточки: порядок пропадает. В гребёнке у каждого бита своё место, поэтому спереди виден штрихкод «| | · |» целиком. Повороты гребёнки дают крест зеркал чище, чем обход лесенки. Инверсия — поворот каждой палочки на 90° вокруг оси ряда (вид сверху): стоячие становятся точками, лежащие встают. Ещё 90° возвращают палочки на место, потому что у палочки нет верха и низа, — поэтому двойная инверсия даёт строку обратно. Разворот — полоборота вокруг вертикали. Сбоку, вдоль ряда, все палочки встают одна за другой, и остаётся крестик — единственный вид, который теряет всё. Рисование стало общим для обеих форм: отрезок — это { начало, конец, бит }; палочка, направленная на зрителя, рисуется точкой.

Zazerkalius v0.026Колонка строк прокручивается вниз; окна удлиняются; 🧊 «все вместе»

Снимок: «🧊 Вид», пристыкованный под строками. Просьбы: «пусть вниз прокручивается и удлинять можно все окна» и «и все вместе вид — одна под другой, и также крутить».

Zazerkalius v0.025Окна под полем строк; 🧊 Вид — все строки, каждая крутится отдельно

Снимок окна «🧊 Вид» и две просьбы: «возможность перетаскивать эти окна под поле строк» и «тут — показать сразу все строки в таком виде с возможностью кручения каждой по отдельности».

Zazerkalius v0.024«🧊 Вид» — строка как лесенка в пространстве

Из отвлечения пользователя: «что если 1 — это вид сбоку на линию, а 0 — вид на неё сверху: 0 — линия от экрана ко мне, 1 — линия лежит на экране», затем: «да» на предложенное окно. Каждый бит — отрезок: 1 — вправо по экрану, 0 — к зрителю. Текущая строка рисуется лесенкой на холсте, взгляд крутится мышью или кнопками «сверху / спереди / слева / сзади / справа / наискосок». Внизу — что видно с этой стороны: спереди и с боков — азбука Морзе и соответствующее зеркало, сверху — число лесенок в ту же точку. Зелёная точка — начало строки, золотая — конец, в углу — значок осей.

ОБХОД ЛЕСЕНКИ — ЭТО КРЕСТ ЗЕРКАЛ, А ВИД СВЕРХУ — ТРЕУГОЛЬНИК

Спереди единицы видны чёрточками, а нули точками, потому что эти отрезки смотрят на зрителя. Слева чёрточками видны нули, по порядку, то есть инверсия. Сзади видны единицы задом наперёд — разворот. Справа — инв-разворот. Четыре зеркала окна «🪞 Зеркало» — это четыре стороны обхода одной лесенки. Честная проекция при этом сливает точки с концами чёрточек, и с любой стороны видна только сплошная черта: порядок бит теряется. Весь путь виден только сверху (или наискосок). Сверху это путь по решётке из k шагов вправо и n−k к себе, и таких путей в ту же точку C(n, k) — треугольник Паскаля. Чётность этого числа — Серпинский: оно нечётно ровно тогда, когда k AND (n−k) = 0 (теорема Люка). Число считается точно через BigInt, длинное показывается порядком.

Zazerkalius v0.022–0.023Del удаляет выделенную ось; окна возвращают ширину, если справа свободно

v0.022. Снимок пользователя с ручкой оси 3 и слова «Del выделенной оси». Щелчок по ручке оси без перетаскивания выделяет её: ручка обводится красным, её поле становится рабочим. Del удаляет выделенную ось вместе с её полем. ↩ теперь помнит и число полей, и места осей, поэтому возвращает всё. Выделение оси снимают Esc, любой щелчок по полю и перетаскивание: так Del, нажатый ради строки, не сносит поле. Проверено в браузере настоящим щелчком: выделение, Del (было 3 поля, стало 2), ↩ (снова 3, данные на месте).

v0.023. Снимок: «🪞 Зеркало», ужатое в v0.017, так и осталось узким. Слова: «пусть восстанавливают ширину — если справа свободно». Ужатие окна стало временным. Окно помнит желаемую ширину: растянул за угол — это она, «📐 Разложить» ставит свою, а если ширина не задана, окно берёт столько, сколько свободно. Ещё окно помнит желаемое место — куда его поставили. Каждый раз окно берёт меньшее из двух: желаемую ширину или место до края стола либо до окна справа на той же высоте. Освободилось справа — ширина вернулась. Проверено: ужатое до 270 px окно вернулось к 768; на узком столе 260, на широком снова 780; ширина, заданная за угол (420), держится и возвращается.

Отдельной папки v022 в архиве нет: 0.022 и 0.023 сделаны подряд, до архивации, и в архиве лежит v023, в которой есть обе правки.

Zazerkalius v0.021Del не ест столбик вверх

Баг-репорт: «Del на строке не должен удалять вверх, не переключать выделение — только нижние». Проверено в браузере. Если ничего не выделено, Del удаляет текущую строку, и на её место встаёт нижняя, так что повторный Del идёт вниз. Но на последней строке текущей становилась строка выше, и следующий Del удалял уже её: столбик съедался вверх. Теперь Del, удалив последнюю строку, останавливается. Следующий Del подряд ничего не трогает и пишет «ниже строк больше нет». Стоп снимают щелчок по полю и стрелки ↑ ↓: после них Del снова удаляет текущую строку. Проверено тем же сценарием: середина — вниз, низ — стоп, после ↑ — удаляет.

Zazerkalius v0.020Ручки осей стоят над своими чертами

Пользователь прислал снимок v0.018 и сказал: «проверь сам», «когда что-то не так, если пишу». Проверено в браузере через локальный сервер: включение наложения, перетаскивание ручки мышью, XOR совпавших бит (два одинаковых треугольника на одной оси гасят друг друга целиком: 78 совпавших мест, ни одной единицы), «⤓ итог» в новое поле, консоль без ошибок. Найдена одна ошибка: ручки стояли примерно вдвое ближе к левому краю, чем их черты.

CH СЧИТАЕТСЯ ОТ ШРИФТА САМОГО ЭЛЕМЕНТА

Место ручки было задано в ch, как у бит и черт. Но ch в свойствах элемента берётся от его собственного шрифта, а у ручки шрифт мелкий (10 px, системный). Поэтому «7ch» у ручки было втрое короче «7ch» у цифр. Теперь ручка лежит внутри точки .axp, у которой шрифт цифр, и место отсчитывается от точки. Замер после правки: середины ручек и черты совпадают до пикселя.

Zazerkalius v0.019Выбор «колонками / наложением» виден всегда

Пользователь после v0.018: «где?». Выбор вида полей показывался только при двух полях и больше, а при «1 поле» его не было видно, и найти наложение было нельзя. Теперь выбор стоит на месте всегда, справа от числа полей. Если выбрать «наложением» при одном поле, полей сразу становится два.

Zazerkalius v0.018Поля наложением: у каждого своя ось, оси тащатся друг через друга

Пользователь уточнил v0.015: «это тоже, но я о том, что в каждом поле нужно до 4 осей для каждой строки». На вопрос, что такое ось, он выбрал вариант «4 черты — 4 треугольника» и добавил: «с возможностью перемещать друг через друга с наложением». У полей строк появился второй вид — «наложением» (первый — «колонками», как в v0.015). Все поля встают в одно пространство. У каждого своя ось, это вертикальная черта своего цвета с ручкой-номером над строками. Строки поля выравниваются по его оси: по центру, влево или вправо, тем же выбором выравнивания. Ручку тянут мышью, оси проходят друг через друга, и треугольники наезжают один на другой. Совпавшие биты сводятся (⊕ XOR, OR, AND или «рабочее поверх») и подсвечиваются, подсказка на бите говорит, из чего он сведён. «↔ оси» разводит поля рядом, «⤓ итог» кладёт наложение в свободное поле для дальнейшей работы (если свободного нет — в рабочее, ↩ вернёт). Щелчок по биту поля делает это поле рабочим.

ПОЧЕМУ МЕСТА — В ПОЛУКЛЕТКАХ

Строка длиной L по центру своей оси начинается на L/2 клетки левее. У нечётной длины это полклетки, поэтому все места считаются в полуклетках, а клетка — это ширина цифры шрифта (1ch). Так треугольник остаётся ровным, как при обычном выравнивании по центру. Биты сводятся, когда стоят ровно на одном месте. Сдвинутые на полклетки рисуются оба, внахлёст, а в «⤓ итоге» идут подряд. Пустые целые клетки между битами итог заполняет нулями. Показ одной строки ограничен 1024 битами, в итог идут все. Править строку на месте и выделять символы можно в виде «колонками».

Zazerkalius v0.017Окна держатся в пределах стола

Снимок пользователя без слов: свёрнутое окно «⇋ Поправка зеркала», у которого правый край с «?» и «–» срезан краем стола. Стол (правая колонка) сужается, когда тянут разделитель у поля строк или сужают окно браузера, а окна держали прежние места и ширину и уходили за край. Теперь окно шире стола ужимается до его ширины (но не уже 260 px), а окно, вылезающее за правый край, сдвигается влево. Это делается после любых перестановок окон, после разделителя, при смене размера окна браузера и один раз при загрузке, когда ширина стола уже известна.

Zazerkalius v0.016Двойной щелчок по шапке окна — свернуть / развернуть

Запрос пользователя: «двойной щелчок по заголовку». Двойной щелчок по шапке окна делает то же, что кнопка «–»: сворачивает окно или разворачивает обратно. Двойной щелчок по кнопкам в шапке («?» и «–») это не задевает. Вместе с «⤒ К верху» (v0.015) окна ниже сразу поднимаются на освободившееся место. Шапка при двойном щелчке больше не выделяется как текст.

Zazerkalius v0.015До 4 полей строк со своими осями; окна прижимаются к верху

Два запроса пользователя со снимками. Первый: «тут возможность до 4 полей одновременно, для каждой строки 4, то есть 4 оси треугольника для дальнейшего взаимодействия». Над строками появился выбор «1 поле … 4 поля». Поле строк делится на колонки, у каждой свои строки и своя ось: треугольник в каждой выравнивается по своему центру, номер строки общий. Рабочее поле одно, и с ним работают все окна, кнопки, шаблоны, ввод, выделение, Del и Ctrl+C/V. Сделать рабочим другое — щелчок по его ячейке, по его заголовку или ← / →. Если полей стало меньше, лишние не стираются: они вернутся, когда полей снова станет больше. ↩ помнит все поля сразу.

Второй запрос: «прижми поля автоматом к верху» (на снимке под свёрнутым «▽ Спуском» осталась пустота). Кнопка «⤒ К верху» в шапке, включена сразу. Свернул, растянул или перетащил окно — те, что ниже в той же полосе, поднимаются и занимают место.

КАК УСТРОЕНЫ ПОЛЯ

Всё поле строк — одна сетка: колонка номеров и 1…4 колонки полей. Сама строка сделана «без коробки» (display: contents), поэтому поля стоят ровными колонками, а выравнивание по центру каждое поле делает внутри своей колонки. Отсюда своя ось у каждого. Z.rows по-прежнему означает «строки»: это ссылка на рабочее поле. Поэтому ни одно окно переписывать не пришлось, а поля сводятся в Z.lanes при сохранении, отмене и отрисовке. Места выделенных символов считаются только в рабочем поле. Взаимодействие полей между собой (XOR поля с полем и так далее) — следующий шаг.

Прижим к верху: окна идут сверху вниз по своему y, и каждое поднимается до нижнего края тех, что стоят над ним и хоть немного перекрываются по ширине. Места по x не трогаются. Если выключить, окна стоят там, где их поставили.

Zazerkalius v0.014«🔍 Проверка треугольника» — найти и исправить испорченный бит

Из размышления пользователя: «как объединить биты правок так, чтобы одни и те же биты принадлежали двум разным строкам», и затем: «да, сделай Проверку треугольника». Новое окно. Треугольник берётся из выделенных строк (если ничего не выделено, то из всех) и узнаётся по длинам: строки короче на бит — ▽ спуск, длиннее на бит — 🔺 Паскаль. Вид можно задать и вручную. Каждая тройка «два бита сверху, один под ними» считается проверкой. Бит подсвечивается тем краснее, чем больше у него сломанных проверок, а найденный испорченный бит обводится. Щелчок по биту в окне переворачивает его в самой строке: так треугольник можно испортить и посмотреть, найдёт ли окно ошибку. «🩹 Исправить» переворачивает самый выгодный бит, пока выгода есть. Окно живое и следит за своими строками. Заодно раскраска 0/1 (нули приглушены) стала общей для всех окон, а не только для строк и креста.

ОДИН БИТ — В ТРЁХ ПРОВЕРКАХ

Внутренний бит треугольника входит в три тройки: снизу в одну и сверху в две. Это и есть «одни и те же биты принадлежат разным строкам»: у треугольника три направления, и каждый бит лежит на всех трёх. Испорченный бит ломает ровно свои проверки, и общий у сломанных — только он. Та же идея, что у сетки с чётностями по строкам и столбцам (RAID, QR-код). Лишние клетки треугольника, которые при сжатии мешали («клеток N²/2, свободы N»), здесь работают как проверки.

Исправление — переворот бит по выгоде: берётся бит, у которого сломанных проверок больше, чем целых. Так декодируют коды LDPC (Галлагер, 1962). Одну ошибку оно находит всегда: сверено на 600 случайных треугольниках, спусков и Паскалей. Несколько ошибок исправляет часто, но не всегда, и тогда окно так и пишет, сколько проверок осталось сломано.

Zazerkalius v0.013«📡 Сигнал по базе» — бит на строку, чтение сквозь шум

Из отвлечения пользователя: «сигнал: база 10101…, 11 — это первый бит = 1, так как вторая строка; второй бит — 111 на третьей строке = 1», и затем: «да, сделай Сигнал по базе». Новое окно. Каждый бит сообщения превращается в одну строку: 0 — строка базы (маска, повторённая на длину строки), 1 — отступ от базы, то есть её инверсия или сплошные единицы, как в вопросе. Строки идут треугольником (каждая на бит длиннее) или все одной длины. Можно добавить шум в процентах. «📡 В столбик» кладёт строки под текущей и выделяет их. «📡 Прочитать» читает выделенные строки: смотрит, к чему каждая ближе, к базе или к отступу, показывает расстояния и запас и сверяет результат с отправленным.

РАСШИРЕНИЕ СПЕКТРА И ПОЧЕМУ ИНВЕРСИЯ ЛУЧШЕ ЕДИНИЦ

Так работают GPS и CDMA: бит растягивают на k «чипов». Сведений в строке 1 бит, остальное — запас прочности. Между базой и отступом d несовпадающих бит, и строка переживает до ⌊(d−1)/2⌋ испорченных. У инверсии d — вся длина строки: строка из 8 бит выдерживает 3 порченых бита. У «сплошных единиц» при базе 10 не совпадают только нули базы, d = 4, и строка выдерживает всего 1. Поэтому настоящие системы шлют ±, базу и её инверсию. В треугольнике запас растёт от строки к строке: поздние биты сообщения защищены лучше ранних. Если строка стоит ровно посередине, бит не решается, и окно пишет «?».

Zazerkalius v0.012Выделение, Del, Ctrl+C/V; ввод строки над полем; треугольник от строки

Пользователь прислал снимок поля и перечислил, чего не хватает: «выделение, удаление по Del, выделение посимвольно без лишних пробелов в фоне выделения, Ctrl+V вставка, окно для вставки строки, из которой строится треугольник, не нашёл».

КАК ВЫДЕЛЕНИЕ БРАУЗЕРА ПРЕВРАЩАЕТСЯ В НОМЕРА БИТ

Биты каждой строки лежат в своём блоке, где нет ничего, кроме 0 и 1, а подпись «ещё N бит» у длинной строки стоит снаружи. Поэтому место выделенного символа — это просто число цифр от начала блока до края выделения. Если выделение уходит за конец показанной части длинной строки, оно тянется до её настоящего конца. Щелчок по битам при выделенных символах поле не перерисовывает: иначе выделение пропадало бы до Del или Ctrl+C.

Zazerkalius v0.011«△ Треугольник по маске» — любая маска, длина числом строк

Запрос пользователя: «Зазеркалиус: построить треугольник по маске 10 — любой маске, длина задаётся», и уточнение: «числом строк». Слева, над шаблонами: маска из 0 и 1, число строк и кнопка «△ Построить». Строка k длиной k заполняется маской. Режимов два. «Каждая с начала»: маска у каждой строки начинается заново, от 10 выходит 1, 10, 101, 1010… «Сплошной лентой»: маска идёт подряд через все строки, как лента, свёрнутая в ⊿. Если длина маски не делит длины строк, фаза сдвигается от строки к строке, и в треугольнике проступают косые полосы. Треугольник встаёт под текущей строкой, текущей становится его вершина, ↩ его убирает. Строк не больше 512.

Zazerkalius v0.010Строки — в центре, правка на месте, шаблоны

Слово пользователя: «неудобно работать в Зазеркалиусе, нужно, как в других: по центру строки, с которыми работаем, и шаблоны, которые можно по нажатию вставить; изменять строки прямо в поле строк». Каркас стал трёхколонным:

ПОЧЕМУ ОКНА РАЗЛОЖЕНЫ ЗАНОВО

Стол с окнами стал уже на ширину поля строк, и прежние места окон, рассчитанные на широкий стол, уходили бы за правый край. Поэтому при первом запуске v0.010 окна один раз раскладываются заново. Если стол уже 900 px, они идут одной колонкой по важности: зеркало, поправка, ⊿, спуск, сортировка сдвигов и дальше. Потом раскладку снова держит пользователь, а «📐 Разложить» её сбрасывает.

Выравнивание по центру держится и на длинных строках: у поля внутренний блок шириной в самую длинную строку, так что при прокрутке вбок треугольник не разваливается. Показ одной строки ограничен 4096 битами, дальше надпись «ещё N бит». Править на месте можно всю строку.

Zazerkalius v0.009«☀ Светлый» — светлый фон всей страницы

Запрос пользователя: «сделай кнопку светлого фона всего html Зазеркалиуса». Кнопка стоит в шапке, перед ↩. Светлая палитра на странице была и раньше, но включалась только системной темой. Теперь она заведена ещё и под data-theme="light", и кнопка переключает светлый и тёмный фон. Выбор запоминается. Пока ничего не выбрано, страница, как и раньше, идёт за системой. Надпись на кнопке показывает то, что включится по щелчку: «☀ Светлый» или «🌙 Тёмный». Тема ставится до первой отрисовки, поэтому при загрузке тёмный фон не мелькает.

Zazerkalius v0.008Живой ⊿ — треугольник строки перестраивается сам

Запрос пользователя: «ещё туда онлайн-создание треугольника из строки, которую другими инструментами, например этой кнопкой, меняем». Окно «⊿ Сложить в форму» больше не ждёт кнопки. Оно показывает треугольник текущей строки (или всех подряд) и перестраивает его после любой правки строк: кода ⇉, 🔺+1, поправки, ввода, отмены. Первую длину и шаг можно крутить стрелками поля, и картинка меняется сразу. Своё выравнивание: по центру, влево, вправо. «⊿ Сложить» по-прежнему кладёт куски в столбик, а его итог теперь пишется в сообщении, потому что окно тут же показывает новый столбик.

ТУСКЛОЕ — ВЫВЕДЕНО, ЯРКОЕ — НОВОЕ

Смысл окна — увидеть, сколько в строке новых сведений при данной форме. Поэтому строка, которая выводится из предыдущей (🔺+1 от неё или повтор), рисуется тускло: нового в ней ноль бит. У строки «предыдущая + бит» тусклое начало, новые биты — золотом. Яркие строки целиком — это то, что пришлось бы хранить. У Серпинского, склеенного подряд, ярким остаётся только первый бит. У кода ⇉ при ширине 2 видно, что вторая половина каждой пары предсказуема, хоть окно и не помечает её отдельно. Слева у строки номер и знак вида: 🔺, +, =.

Zazerkalius v0.007«⇉ Код 1→10, 0→01» — манчестерский код одной кнопкой

Вопрос пользователя: «что если 1 — это 10, а 0 — это 01 из исходной строки, по очерёдности слева», затем: «да, в одну по циклу». Кнопка стоит в столбике строк, под «🧹 Очистить». Левый щелчок выполняет режим, правый меняет его по кругу. ⇉ Код: каждый бит текущей строки становится парой, и вдвое более длинная строка встаёт под текущей. ⇇ Раскод: от каждой пары берётся первый бит. Если в строке есть пары 00 или 11 либо длина нечётная, раскод не делается, а кнопка показывает, на каких битах ошибка. После кода кнопка проверяет, не вышел ли Туэ–Морс.

НЕ СЖАТИЕ, А ИЗБЫТОЧНОСТЬ — И ТУЭ–МОРС

Это манчестерский код (старый Ethernet, RFID). Строка удваивается, а сведений столько же: второй бит пары — инверсия первого. Избыточность куплена ради надёжности: трёх одинаковых бит подряд не бывает (приёмник подстраивает часы по сменам), пары 00 и 11 запрещены (ошибка видна), единиц ровно половина. Правило, повторённое k раз от «0», даёт Туэ–Морса длины 2^k: 0 → 01 → 0110 → 01101001. Отсюда видно, почему Туэ–Морс складывается в ⇋ Поправке ⧉🔁 до самого низа: вторая половина каждого уровня — инверсия первой, то есть то же правило, прочитанное большими кусками. Правый щелчок взят по образцу ⏺ в Code, где он тоже меняет режим одной кнопки.

Zazerkalius v0.006Сжатие переехало в Зазеркалиус: ⇋ Поправка, △ от центра, ⊿ Формы, ⇅ Сортировка сдвигов

Слово пользователя: «Zerkalius-zazerkalius.html — всё такое сюда надо скопировать, а этот только сюда». «Всё такое» — кнопки разговора про «суперархиватор». ▽ Спуск и 🧮 Лин. сложность в Зазеркалиусе уже были. Добавлены три окна:

ПОЧЕМУ СОРТИРОВКА СДВИГОВ — ОТВЕТ НА «ПОРЯДОК СТРОК КОДИРУЕТ ПОРЯДОК В СТРОКЕ»

Порядок строк треугольника одинаков для всех строк, поэтому ничего не кодирует: это ключ, а не данные. Сортировка — другое дело. Она тоже бесплатна (отсортировать может любой), но результат у каждой строки свой, и по последнему столбцу и номеру строка восстанавливается целиком. Счёт честный: n бит плюс номер — чуть больше исходного. Выигрыш в том, что похожие биты сходятся в длинные серии: 011011011011010011 — 12 серий, после сортировки 111111001111100000 — 4. На этом построен bzip2.

Обратный ход проверяет себя. Не каждая пара «столбец + номер» бывает результатом сортировки: пар в n раз больше, чем строк. Если такой строки нет, кнопка так и говорит и ничего не вставляет. Сортировка — удвоением префиксов, у периодических строк совпавшие сдвиги упорядочены по номеру сдвига. Обратный ход сверен с прямым на двадцати тысячах строк, включая периодические.

v1.627«⊿ Сложить треугольником» — лента, разрезанная на строки 1, 2, 3…

Вопрос того же разговора: «а если сложить строку в несколько строк по определённому порядку, например треугольником, — появится бесплатная упорядоченность: 1, 2, 3, 4 бита на строку, +1 бит всегда». Кнопка стоит под «⇋ Поправками → слой». Выделенные строки склеиваются в ленту (если выделена одна, берётся она сама) и режутся на куски длиной «первая», первая+шаг, первая+2·шаг и так далее. При 1 и 1 получается треугольник, при шаге 0 — прямоугольник заданной ширины. Куски ложатся в новую цепочку, источник не трогается. В сообщении — сколько строк выводится из предыдущей: «+1 бит», «🔺+1», повтор, — и сколько бит в этой форме новых.

ФОРМА БЕСПЛАТНА, ПОРЯДОК — НЕТ

Форму знают обе стороны, хранить приходится только длину ленты. Но форма лишь раскладывает те же биты по другим местам: это линза, а не источник порядка. Строк, где каждая строка треугольника — предыдущая плюс 1 бит, из 10 бит всего 16 из 1024, а из 5050 бит — одна на 2⁴⁹⁵⁰. Зато если порядок в данных есть, правильная форма его вскрывает. Серпинский, выписанный подряд, в строке выглядит мусором, а в треугольнике каждая строка — «🔺+1» от предыдущей, и нового ноль бит. Так же картинка, вытянутая в строку, оживает в прямоугольнике своей ширины. Поэтому у кнопки есть первая длина и шаг: формы можно перебирать, а выбор формы стоит всего нескольких бит.

v1.626«⇋ Поправки → слой» — поправки всех строк одной цепочкой

Следующий вопрос того же разговора: «а что если поправку и, возможно, симметрию нескольких строк записать битами для всех них», и уточнение: «общими». Кнопка стоит под «⇋ Поправкой». Для выделенных строк (если ничего не выделено, то для всех) она заводит НОВУЮ цепочку, строка в строку: строка №N слоя — поправка D строки №N. Источник не трогается. Вид зеркала по умолчанию общий, один на всю пачку: кнопка берёт тот, у которого единиц во всех поправках вместе меньше всего. Второй вариант в списке — «у каждой свой»: тогда лучший вид выбирается для каждой строки, и его 2 бита (00 ⇄, 01 ⇄🔁, 10 ⧉, 11 ⧉🔁) пишутся в начало её строки слоя. Так вид симметрии тоже становится битами, столбиком слева. В сообщении — сколько несимметричных бит набралось и сколько среди поправок разных.

ЗАЧЕМ ОТДЕЛЬНЫЙ СЛОЙ

Поодиночке поправка строку не сжимает: половина плюс поправка — снова N. Но поправки разных строк бывают похожи: у всех один и тот же сбой в одном месте, повтор через строку, симметрия по вертикали. Пример из разговора: три строки по 8 бит со сбоем во втором бите у всех. Каждая по отдельности стоит своих 8 бит, а вместе — 12 бит половин, одна общая D на 4 бита, 2 бита вида и 1 бит «D у всех одна»: 19 вместо 24. Слой — обычная цепочка, поэтому к нему годятся все готовые кнопки: ⇋ Поправка, ▽ Спуск, 🧮 Лин. сложность. Если порядок есть в самих ошибках, он виден сразу, и можно идти на следующий этаж — поправки поправок. Если слой — шум, этажи на этом кончаются. Общий вид выбран по умолчанию, потому что он стоит 2 бита на всю пачку, а свой — 2 бита на каждую строку.

v1.625«⇋ Поправка» — строка как половина и поправка зеркала

Тот же разговор про «суперархиватор», следующий шаг: «а что если отзеркалить строку — половины данных достаточно», и сразу за ним: «но если мы половину обозначим на симметричные и несимметричные биты». Кнопка стоит рядом с «▽ Спуском». Строка делится на левую половину L и правую R (при нечётной длине средний бит отдельно). Для четырёх способов достроить R из L — зеркало ⇄, зеркало с инверсией ⇄🔁, повтор ⧉, повтор с инверсией ⧉🔁 — считается поправка D, по биту на каждый бит L: 1 там, где пара не сошлась. Несимметричные биты подсвечены золотом прямо на L — это и есть те самые пометки. Дальше кнопка складывает строку, пока находится зеркало без единой поправки, и пишет, сколько раз это вышло подряд. В конце — грубая цена строки «в мире зеркал».

ПОЧЕМУ ПОМЕТКИ НЕ СЖИМАЮТ САМИ ПО СЕБЕ

Пометка «симметричный / нет» — один бит на каждый бит половины, то есть ещё N/2 бит. Половина плюс пометки дают снова N: зеркало, как и спуск, ничего не выбрасывает, а раскладывает строку на «что похоже на отражение» и «где отличается». Зеркальных строк длины N всего 2^(N/2), при N = 20 — одна на тысячу. Выигрыш бывает, только когда пометок мало: тогда вместо всей D хранятся номера несимметричных битов. А если симметрична и сама половина, и её половина, строка складывается раз за разом до пары бит — так ведут себя Туэ–Морс и Серпинский. Цена считается честно: на каждом этаже 1 бит «сложено ли», 2 бита «каким зеркалом», средний бит и поправка. Ниже 4 бит складывать не пробуем: строку в 2–3 бита складывает любая пара ⇄ / ⇄🔁, это не находка. Случайная строка выходит в N+1 бит, то есть честное «короче нет».

v1.624«📐90°» — прямой угол треугольника с учётом выравнивания

Замер пользователя на v1.623 показал, что кнопка сделала ровно то, что обещала: ячейка квадратная, лесенка 45.06°, остаток 1.6px на 100 столбцов (раскладка браузера квантуется по 1/64px). А треугольник в «центр ½» всё равно был острым, около 53° у вершины. Дело в выравнивании. Строка длиннее предыдущей на g бит, и по центру каждый её край уходит на g/2 столбца за строку, а влево или вправо — на целых g. Прямой угол у треугольника — это 45° у каждого края, то есть сдвиг края за строку равен высоте строки. Поэтому по центру (центр, центр ½, обе оси) ширина столбца теперь 2·высота/g, влево и вправо — высота/g. g — самый частый прирост длины между соседними непустыми строками (у Серпинского и «Номеров» это 1). У лесенок строки сдвигаются своим шагом, для них осталась квадратная ячейка. В сообщении кнопка пишет, какую ячейку поставила и почему.

v1.623«📐90°» ставит точный интервал, замеренный по полю

«📐90° — нет угла 90». Две причины. Первая: межсимвольный интервал округлялся до шага ползунка, 0.5px, а ширина цифры дробная. Ошибка до 0.25px на столбец на сотне столбцов даёт десятки пикселей, и лесенка заметно уходит от 45°. Вторая: ширину цифры брали из canvas.measureText, который может разойтись с тем, как браузер на деле раскладывает строку.

Теперь ширина цифры замеряется по самому полю: настоящий шаг столбца (realColStepPx) минус текущий интервал, а высота строки — по расстоянию между соседними строками (если полотно отмасштабировано, оба замера меняются одинаково). Интервал ставится с точностью до сотых (lsExact), ползунок встаёт на ближайшее деление, число под ним показывает точное значение. Шаг самого ползунка не мельчили: по нему шагают стрелки ◂ ▸ из общего _js/slider-arrows.js (правка там задела бы все страницы) и протяжка с Shift. Любое движение ползунком возвращает обычные деления. Точное значение сохраняется в кэше.

v1.622«📐90°» и протяжки интервалов тоже перерисовывают поле

«Проверь» — про кнопку «📐90°». Она подбирает межсимвольный интервал под квадратную ячейку и меняла его так же, как ползунки до v1.620: только CSS, без render(). Сдвиги «½» оставались посчитанными под прежний интервал до первого щелчка. Та же дыра нашлась ещё в двух жестах: Shift+протяжка по полю (межсимвольный) и Ctrl+протяжка (межстрочный). Все три теперь зовут viewRenderSoon. Двойной клик по «↕» (интервал по экрану) перерисовывал и раньше.

v1.621«№» цепочки: третье положение — без номеров

«Номер цепочек третье положение — нет, когда номеров». В v1.417 кнопка «№» номеров строк стала переключать только 10 ⇄ 2, а прятать колонку оставили окну «ℹ Поле». Теперь положение «без номеров» вернулось, и кнопка снова ходит маятником, как было решено в v1.319: 10 → 01 → нет → 01 → 10. Кольцо по пути от «нет» к «01» проводило бы через «10» — лишний кадр с другой шириной колонки. Всё для скрытия колонки (класс hide-rownums, отступ поля) осталось с тех пор и работает как было. Двойной клик по самой колонке (v1.419) по-прежнему меняет только систему счисления: прятать колонку двойным щелчком по ней же незачем.

v1.620Смена кегля больше не ломает «центр ½» до первого щелчка

«При изменении размера шрифта, выравнивание центр ½ — потом при клике любом восстанавливается». Ползунки кегля, межстрочного и межсимвольного, как и выбор шрифта, меняли только CSS-переменные и не звали render(). А часть раскладки считается при отрисовке в пикселях, по текущему шагу столбца: сдвиг строк на полстолбца в «½», ширины полей, оси. Она оставалась посчитанной под прежний кегль, строки разъезжались лесенкой, и любой щелчок, перерисовав поле, всё возвращал. Теперь все четыре зовут перерисовку, одну на кадр (viewRenderSoon): при протяжке ползунок шлёт input на каждый шаг.

Попутно исправлена ошибка v1.617: крестик × зафиксированной группы был текстовым узлом внутри строки, а столбцы строки считаются по длине текста её узлов (realColStepPx и др.) — крестик сходил за лишний столбец. Теперь знак рисуется псевдоэлементом, текста у узла нет.

v1.619Изменённый бит — красный, даже если он «Новый»

«Изменённые потом зелёные перекрашивают почему-то — хотя они красные потом становятся и должны быть». В порядке подсветок «Нов» стоял выше «Изм»: бит, который и дописан операцией, и отличается от оригинала (так бывает у XOR спуска и «Строк → края»: они помечают новыми ровно поменянные биты), горел зелёным, пока пометка «Нов» не слетала. Теперь «Нов» уступает «Изм»: всё, что отличается от оригинала, красное сразу, а зелёным остаётся только то, чему в оригинале пары нет (новые строки, достроенные края).

v1.618Все «Новые» биты теряют цвет при смене выделения

«Новые после смены выделения должны терять цвет». В v1.600 так слетало только зелёное от XOR спуска, построений и «Строки → края»; пометки построений («🔺», «🔢») и зеркал держались, пока их не снимут кнопкой «✕». Теперь правило общее. render() держит снимок newBitsMap (newBitsSeen): появилась другая строка или другой массив флагов — значит, операция только что дописала биты, и при них запоминается текущее выделение строк. Операция могла сама его поменять, поэтому исходным считается выделение сразу после неё. Выделение строк сменили — зелёное снимается целиком. Выбор отдельных бит («▭ Выбор ячеек») выделением строк не считается и зелёное не трогает.

v1.617📍 Зафиксировать выделение; выбор — в Черновик по порядку нажатий

«Нужна кнопка зафиксировать выделение; все выделения писать в черновик — поочерёдно, по нажатию бит; зафиксированное не снимается Escape — только кнопкой „снять“, которая рисуется крестиком рядом с последним битом».

Фиксируются только биты цепочки: подсветку групп в колонках паттернов не рисуем. Группы, как и сам выбор, живут до перезагрузки страницы.

v1.616«▭ Выбор ячеек»: щелчки только добавляют, снимает всё Esc

«Если по одной щёлкать — не снимать выделение, выделение снимать только по Escape, сразу всех». Excel-уклад из v1.614 не прижился: биты собирают по одному, а каждый простой щелчок начинал выбор заново, и держать Ctrl на каждом бите неудобно. Теперь щелчок и протяжка только ДОБАВЛЯЮТ (щелчок по уже выбранному биту ничего не меняет), Ctrl+щелчок или Ctrl+протяжка с выбранного бита снимают, Shift+щелчок добавляет прямоугольник от последнего бита. Щелчок мимо битов больше не стирает набор (так было с v0.941, и собранное терялось от одного промаха). Снять всё разом — Escape: он и раньше чистил и биты строк, и биты паттернов (clearAllSelections). Остались от v1.614 Shift-диапазон и перерисовка протяжки только при переходе на другой бит.

v1.615«Изм» сравнивает с оригиналом, а не с последним шагом

«Это должна показывать изменения сравнивания только с оригинальной цепочкой; если цепочку сохранить — она становится оригинальной». Раньше красными были биты, перевёрнутые ПОСЛЕДНИМ шагом (по верхушке стека отката): следующий шаг стирал всё прежнее, и понять, что вообще поменялось с начала, было нельзя. Теперь красный бит значит «отличается от оригинала». Оригинал — та же база, что у синих номеров строк и у «↺ Сброса»: 💾-сохранёнка вкладки, а без неё шаблон. Красное копится от шага к шагу, гаснет на бите, который вернули как был, и снимается целиком по 💾: сохранённая цепочка становится новым оригиналом.

Красные пометки XOR спуска (v1.597) и Маски подчинены тому же правилу: бит красный, только если он отличается от оригинала. Сравнение идёт по месту бита в строке, поэтому строка, которая стала длиннее или короче оригинала (зеркала, достройки), не красится вовсе: её биты не с чем сопоставить.

v1.614«▭ Выбор ячеек» — как ячейки в Excel

«Надо выделять проще, как прям ячейки в экселе». Раньше каждый щелчок по биту был переключателем: набор только копился, и чтобы начать заново, приходилось жать «✕ Очистить биты» или щёлкать мимо. Так когда-то попросили, чтобы набор не терялся от случайного щелчка. Но собрать его «с нуля» было дольше всего остального. Теперь всё как в Excel:

В битах паттерна то же самое, только в пределах одного паттерна. Строку без Ctrl можно сменить сразу, прежнее сообщение «снимите выбор в другой строке» осталось только для Ctrl. Протяжка теперь перерисовывает поле только при переходе на другой бит, а не на каждое движение мыши.

v1.613Выделенный значок на поле убирается клавишей Delete

«Пусть выделенная кнопка (после перемещения, например), если нажать Delete, удалится». Выделенный значок — тот, что в фокусе: его ставит бросок или перенос (значок сам получает фокус), а также клик по нему. У выделенного значка видна белая рамка. Delete на нём убирает значок с поля. Клавиша гасится на слое значков (#fieldBtns): общие обработчики клавиш висят на document и получили бы её следом, а там Delete удаляет выделенные строки. Проверено настоящим нажатием: значок ушёл, строки и их выделение на месте.

v1.612Цвета цепочки — столбиком под «№» в меню 2, с фоном поля Ц

«Эти цвета также вниз под № и фон поля цепочек сюда». Так же, как у П1/П2 (v1.609/v1.610): коробка цветов цепочки (#axisColBox) вынута из ряда меню 2 и стоит под «№» цепочки, шириной с кнопку. В ней столбиком цвет 1, цвет 0 и фон поля Ц: новый двойник colFieldCAx панельного colFieldC, заведён в fieldColTwins. Стили заданы по id: у замка тот же класс .axis-col-box, и он остаётся в ряду. Место считает placeChainColBox. Первая версия ставила коробку на 289 px левее «№»: место считалось раньше, чем меню 2 разводится по полю и садится на ось. Теперь расстановка зовётся и в самом конце updateAxisSplitPosition. Проверено: коробка точно под «№», 36 px, фон синхронен с «Видом» в обе стороны.

v1.611Протяжка оси цепочки без тормозов

«Можно ли устранить тормоза при передвижении цепочек за ось?» Профиль на цепочке 300×300 показал, что render() вызывался на каждое событие мыши, даже без сдвига на столбец. Кадр стоил около 270 мс, события копились в очередь. Почти всё время уходило на принудительные пересчёты раскладки, а не на логику. Что сделано:

Замер того же жеста (60 движений, по два на кадр, 300×300): было 14 с (из них 12,4 с блокировали обработчики), стало 3,4 с, обработчики около 0. Ось встаёт туда же. Облегчённый кадр 123 мс против 273.

v1.610Под «№» — три цвета столбиком, шириной с кнопку, с фоном поля

«И цвет фона поля перенеси сюда же, три цвета друг под другом» и «шириною одинаковой с №». Блок под «№» (v1.609) теперь столбик: цвет 1, цвет 0 и фон поля, каждый шириной с «№» и высотой 14 px. У фона П1/П2 появился двойник (colFieldLAx/colFieldRAx, заводится в fieldColTwins). Оригинал остаётся в «Виде» (colFieldL/colFieldR): от него считает applyFieldColors, его пишет кэш. Правка двойника переписывает оригинал и красит поле. Правка в панели или загрузка из кэша обновляет двойника (syncColTwins теперь зовётся и из applyFieldColors). Проверено: обе стороны синхронны, блоки шириной 41 px, как «№».

v1.609Цвета паттернов — под «№»

«Перемести цвета поля паттернов под номера паттернов». С v1.567 пара цветов (1 и 0) стояла в блоке рядом с «№» вместе с кнопкой выравнивания. Теперь цвета вынесены в свой блок (#patColL/#patColR, вид планки) и стоят вплотную под своей «№». У П1 блок выровнен по левому краю кнопки, у П2 по правому, зеркально, как сами «№» (v1.443). Место ставит placeCol в updateSplitPositions, сразу после блоков у «№». У «№» осталась одна кнопка выравнивания. Пикеры переехали вместе с обработчиками, связь с панельными цветами (syncColTwins) цела. В «чисто биты» блоки прячутся, как и остальной ряд. Проверено снимком обеих сторон.

v1.608Левый край П2 ровный во всех строках

«Поправь левую границу П2 — она не доходит до конца, по цвету фона видно». У ячеек П2 overflow:visible, а с ним у флекс-элемента min-width:auto, то есть ширина содержимого. Ячейка с длинным паттерном раздувалась шире колонки (--pat-w2) и вылезала левее границы. Граница и заливка поля считаются по нулевой строке, а она пустая и узкая. Край П2 выходил рваным: в замере колонка была 40 px, а ячейки 40, 44, 55 и 67 px. До v1.605 это заслоняла ползущая ширина П2, пока та не перерастала паттерны. Теперь ширина П2 не меньше той, что нужна самому длинному паттерну (patW2Need, формула fitPatW2), а ячейке запрещено раздуваться (.ln .pat2{min-width:0}). Проверено: во всех строках П2 начинается на одном x и одной ширины, граница #vsplit4 и заливка стоят по нему. Выделение паттерна по-прежнему ничего не двигает.

v1.607За пустое поле едут все поля вместе с битами; значки поверх бит

«Пусть зацеп за пустое поле, где нет битов, двигает все поля влево-вправо вместе с битами». Протяжка по пустому полотну (v1.018) только прокручивала его. Когда всё помещается в окно, прокручивать некуда, и не двигалось ничего. Теперь это та же рука, что у ручки #vsplitL0: весь ряд П1, цепочка и П2 сдвигается сдвигом раскладки (chainShiftCols, margin-left у .chain) по целым столбцам. Положение ряда на экране — это «сдвиг минус прокрутка», и жест прибавляет к нему dx. Когда раскладка упёрлась в левый край, дальше идёт прокрутка, как раньше: длинные строки по-прежнему можно довести до экрана. Сдвиг сохраняется. Выделение строк и паттернов не трогается: над битами жест, как и был, принадлежит выделению. Проверено: протяжка вправо на 200 px дала сдвиг 17 столбцов, П1 и биты поехали вместе, протяжка влево на 400 px вернула сдвиг к нулю и дальше прокрутила полотно.

«Не убирает прозрачность при попадании на биты». Фон значка на битах был сплошной (v1.604), но биты рисуются на z-index 102 (#rows .ln .bits > span), а слой значков стоял на 97, и биты ложились поверх. Слой поднят до 110: выше бит и оси (101), ниже плавающих окон (120) и полосы меню (200). Проверено снимком: значок на битах закрывает их целиком.

v1.606Строку выделяет только клик по битам

«Пусть выделять строки можно только в том месте, где лежат биты; клик по строке там, где нет битов, ничего не делает». Раньше строку выделял клик в любом месте её коробки, включая пустоту поля и отступы выравнивания. Теперь и клик, и начало протяжки сверяются с настоящими прямоугольниками знаков строки (pointOnRowBits: непробельные куски текста в .bits > span). По вертикали годится вся высота строки. Мимо бит ничего не происходит: выделение не ставится и уже набранное не снимается. Это касается и клика над горизонтом, который с v1.213 снимал выделение. Ячейки паттернов и колонка номеров живут по-прежнему. Проверено настоящими кликами: бит строки выделяет её, пустота левее и правее бит ничего не меняет, протяжка по пустоте не выделяет, по битам выделяет диапазон.

v1.605Выделение и находка паттерна ничего не двигают

«Пусть когда паттерн выделяется и находится — не двигается ничего». Нашлось две причины. П2 ползла от прохода к проходу. Её ширина считается «до края окна от правого края бит» (v1.397). Но биты растягиваются на всё, что оставила П2, а строка кончается на несколько пикселей раньше края окна (6 px в замере). Каждый проход раскладки прибавлял П2 эти пиксели: выделение паттерна давало три прохода, П2 шла 134 → 140 → 146 px, биты и ось ехали. Снятие выделения (fitPatW2) сбрасывало всё обратно. Дальше конца строки П2 всё равно не заходит, поэтому кромка теперь берётся не дальше конца строки. Пока строка короче окна, расчёт отдаёт ту ширину, что уже стоит, и лишние проходы ничего не двигают. Если строка длиннее окна, П2, как раньше, сжимается до 40 px. Мерить от базовой ширины бит (--bits-w) пробовал: она сама зависит от полосы меню 2, а полоса от поля бит, и выходит новая петля. Клик по паттерну уводил полотно вбок. scrollToBit ставил найденное вхождение в середину экрана всегда, а теперь только если бита не видно, так же, как scrollToRow по вертикали. Проверено в браузере: снятие, выделение и смена паттерна, три перерисовки подряд: ни одна коробка и прокрутка не сдвинулись.

v1.604Значок на битах — непрозрачный, сдвига больше нет

«Нет, так не получится, пусть просто меняют фон на непрозрачный, чтобы на битах их видно было, если они на битах». Сдвиг на пустоту из v1.602 снят: значки стоят на экране, и прокрутка всё равно подводит под них строки. Теперь значок, который хоть краем лежит на битах или паттернах, получает класс .on-bits: фон сплошной, своего оттенка. На пустоте он прозрачный, как в v1.601. Проверка (fieldBtnsMarkOnBits) идёт после каждой отрисовки (через refreshFieldBtnIcons), при прокрутке полотна и смене размера окна, не чаще раза за кадр. Битами считаются только непробельные знаки: пустые строки добиты пробелами, и прямоугольник всего текста метил бы пустоту. Это нашлось проверкой. Правило броска курсором прямо на биты осталось из v1.594: новую кнопку туда не кладём, перенесённую убираем. Проверено: на пустоте фон прозрачный, после прокрутки биты под значком, и он сплошной.

v1.603Номера цепочки — на фоне самого поля Ц

«Цвет фона номеров цепочек — такой же, как у поля Ц». Колонка номеров с v1.328 лежит на заливке цепочки (#fieldBgC), но с v1.336 поверх неё шла своя подсветка --numcol-bg (белый 12%), и колонка читалась отдельной полосой. Подсветка погашена (--numcol-bg: transparent), под номерами теперь ровно --fld-c. Проверено по пикселям: у поля (18, 20, 26), под номером (17, 19, 25). Вернуть отличие — снова задать переменной полупрозрачный белый.

v1.602Кнопки на поле — только на пустоте, ни краем на битах

«Кнопки переносные не должны лежать на битах! Только на пустоте». Проверялась одна точка под курсором, и длинная подпись (v1.595) ложилась краем на биты. Теперь с битами (.ln .bits > span) и паттернами (.pat/.pat2) сверяется весь прямоугольник значка, по настоящим прямоугольникам текста (Range.getClientRects). Пустые отступы выравнивания битами не считаются. Если значок задевает биты, он встаёт на ближайшее пустое место: поиск идёт кольцами до 240 px внутри полотна (fieldFreeSpot). Пустого рядом нет — новая кнопка не кладётся, перенесённая остаётся где была. Курсор прямо на битах: как раньше, новую не кладём, перенесённую убираем. При загрузке значки, лёгшие на биты, тоже переезжают на пустоту. Проверено: значок на битах сдвинулся на 18 px на пустое место, поиск занял 11 мс. Прокрутка строк значки не двигает: они стоят на экране, и строки под них заезжать могут.

v1.601Кнопки на поле — в оттенке своей вкладки и прозрачные

«Кнопки, которые перетащил, пусть будут каждая своего оттенка из своей вкладки, разные цвета у каждой группы, и прозрачные». Группа — это вкладка, где живёт оригинал (.menu-panel). Вне вкладок группа — верхняя полоса меню или само поле. Оттенок у каждой группы свой, из таблицы FIELD_BTN_HUE. Сначала оттенки шли золотым углом, но на 16 групп он дал соседей в 20°: «Строки» и полоса меню вышли обе бирюзовыми. Поэтому таблица ручная, а частые вкладки получили самые далёкие цвета. Фон значка полупрозрачный в оттенке группы, под ним видны биты. Рамка и текст того же оттенка. У включённого оригинала фон плотнее и рамка ярче. Группа запоминается в значке (g), так что цвет остаётся, даже когда вкладку унесли в отдельное окно. В подсказке значка написано, из какой он вкладки.

v1.600Зелёное от XOR слетает при смене выделения

«Зелёный должен слетать при изменении вручную выделения». Зелёная пометка («Нов»), которую ставят XOR спуска, «⊕ класть XOR-ом» и «Строки → края», держалась до «✕», как у всех построений. Теперь операция запоминает свои массивы флагов из newBitsMap и выделение строк сразу после себя (xorNewArm). Как только выделение другое, эти пометки снимаются в ближайшей отрисовке. Зелёное других построений (🔺+1, зеркала и прочие) не трогается: снимаются только те самые массивы. Красное (v1.597) живёт по-прежнему до правки строк. Проверено в браузере: после XOR 12 красных и 9 зелёных. Перерисовка без смены выделения их не трогает, после смены выделения зелёное ушло, а красное и чужая зелёная пометка остались.

v1.599Антикеш скриптов поднят: v1.595–v1.598 не доходили до браузера

«Не красит красным, также все биты зелёным красит, красный должен перебивать зелёный». Код v1.597 был верный: красное стоит выше «Нов». Но номер антикеша у fold-*.js остался ?v=1594. Браузер перечитывал страницу с новым номером в заголовке, а скрипты брал старые из кеша, та самая ловушка v0.779. Поэтому и был виден зелёный треугольник v1.585 без красного. Номер поднят до ?v=1599 вместе с версией. Проверено нажатием «⊕ XOR-ом» через http: 12 красных (все поменявшиеся) и 9 зелёных (биты треугольника, которые не поменялись).

v1.598Короткие названия значков на поле: «↪ Повтор»

«Просто Повтор» вместо «↪ Повтор отменённого шага…». Голова подсказки (v1.596) бывает длинной и обрезается «…». Для таких кнопок короткое имя задано руками в FIELD_BTN_SHORT: «↪ Повтор», «🗗 Все вкладки в окне», «🗗 Лог находок в окне», «🗗 Маски в окне», «🧹 Очистить список масок», «🧾 Окно «Черновик»», «💾 Сохранить цепочку», «📌 Закрепить высоту», «№ Номера П1/П2», «🎨 Цвет Маски», «✓ Считать наложение». Остальные названия по-прежнему берутся из подсказки. После правки на поле не осталось ни одной подписи с «…».

v1.597XOR спуска и «Строки → края» красят красным поменявшиеся биты

«При XOR спуск вниз — пусть красным красит биты изменившиеся, то есть которые изменились от XOR», затем про «▽⇄ Строки → края»: «эти также». С v1.585 все биты, на которые лёг этаж, метились «Нов», и эта пометка стояла выше штатного красного «изменён последним шагом». Какие биты XOR действительно перевернул, видно не было. Теперь xorIntoRowAligned отдельно запоминает биты строки-цели, которые поменялись 0↔1 (xorChgMap), и они горят красным поверх «Нов». Остальная часть треугольника остаётся «Нов», хвост, которым строка выросла, тоже «Нов»: он новый, а не изменённый. То же у «⊕ класть XOR-ом» в построениях и у «Строки → края». Красное держится, пока не изменится любой бит любой строки (правило Маски), и гасится общим «🔴 Изм. биты». Проверено в браузере: 12 из 12 изменённых у спуска, 24 из 24 у краёв, после правки красное снимается.

v1.596Кнопки-значки на поле — с названием из подсказки

«Также без подписей», на снимке значок «△» без слов. У таких кнопок (△, ↩, 🗗, «+», «−», 📌…) слов на самой кнопке нет, они в подсказке, и v1.595 переносил на поле один знак. Теперь, если в подписи оригинала нет ни буквы, ни цифры, к знаку дописывается голова подсказки: до первого « — », «: », «. » или «; », без повтора знака в начале. Длинная голова обрезается по слову примерно до 32 знаков с «…», незакрытая скобка или «кавычка» уходит целиком: «↩ Отмена», «− Левая линия НАРУЖУ», «🔓 ЗАМОК ПОЛОТНА», «↪ Повтор отменённого шага…». Кнопки со словами показывают свою подпись, как в v1.595.

v1.595Кнопки на поле — с подписью

«Надо их также с текстом». На поле значок нёс только первый знак подписи (как ярлыки меню 2, pinSlotIcon). Теперь на нём вся подпись оригинала, знак и слова, и она обновляется вместе с оригиналом («🎭 По маске: нет маски»). Ширина значка по тексту, шрифт как у кнопок приложения. Новую кнопку при броске держим за левый край, где её знак, а не за середину длинной подписи. Брошенная или перенесённая, она целиком остаётся внутри полотна по своей настоящей ширине. Сохранённые раньше значки стояли через 32 px и с подписями налезли бы друг на друга. При загрузке налезающие разводятся вправо впритык (spreadFieldBtns), остальные стоят где стояли.

v1.594Кнопки — прямо на поле цепочек, полка-окно снята

«Лучше вместо этого сделай всё поле цепочек полем для этих кнопок, и где их кинуть — пусть там крепятся, и перетаскивать можно, а если вытащить за пределы поля или на биты — то убрать». Вкладка «🧰 Кнопки» (v1.592) снята. Над полотном лежит слой #fieldBtns, мышь он пропускает насквозь, ловят только значки. Любую кнопку бросаешь на полотно, и значок встаёт под курсор и стоит там на экране. Строки под ним прокручиваются, он нет. Значок перетаскивается по полю. Вытащенный за полотно или брошенный на биты цепочки или паттерна, он убирается. Новую кнопку на биты не кладём. Бросок файлов на полотно работает как раньше: файловый обработчик пропускает всё, что не файл. Что лежало на полке и в слотах меню 2, переезжает на поле рядком у левого верхнего угла. В «чисто биты» слоя нет.

v1.593Ряд управления уезжает со строками; в «чисто биты» его нет

«В режиме дзен это всё убрать, оставить только цепочки, и в обычном режиме эти меню 2 должны уезжать за верх экрана вместе с первой строкой». Черта горизонта в покое упиралась в низ меню 1 (v1.454), меню 2 висело на черте и имело два своих упора (стопка баров и низ меню 1). При прокрутке все три держали ряд под меню 1. Теперь упоры считаются для непрокрученного полотна: в покое всё стоит как стояло, а прокрутка уносит черту, меню 2, планки П1/П2 и счётчики лесенок вверх вместе со строками, под меню 1. Сама линия оси по-прежнему держится под меню 1. В «чисто биты» (меню 1 скрыто) весь ряд у нулевой строки прячется: меню 2, планки П1/П2, счётчики, черта горизонта. Прячется через visibility: по этим коробкам считается раскладка.

v1.592Вкладка «🧰 Кнопки» — полка со свободной раскладкой; закрепления в меню 2 больше нет

«Сделай отдельное окно-вкладку для переносимых кнопок, и чтобы там, куда закинуть в поле, там и оставалась, а не сама по порядку шла». Набор свой, поле прямоугольное и переносится, как любая вкладка. Дальше: «закрепление значков в меню 2 — это удали». Новая вкладка «🧰» — окно с полем. Любую кнопку приложения бросаешь в поле, и её значок встаёт ровно под курсор, со своими координатами, а не в очередь ячеек. Значок жмёт оригинал и показывает его состояние, как прежние ярлыки меню 2. По полю он переставляется, брошенный мимо убирается, высота поля тянется за угол. Всё хранится в настройках вида. Приёмники меню 2 отключены. То, что было закреплено там, при загрузке переезжает на полку рядком. Пустые контейнеры слотов оставлены: по ним меню 2 садит выравнивания на ось.

v1.591«🧩⬇ В цепочку» из кэша — с первой строки

«Вот тут неправильно делает». Кэш ложился в строки с самого верха: первая запись попадала в нулевую строку или в построения сверху, и счётчик построений сбрасывался. Нулевая строка оказывалась занятой, вставлялась новая пустая, и цепочка вместе с паттернами съезжала на строку вниз. Теперь запись №1 ложится в строку №1, туда же, откуда «кэш → паттерны» начинает колонку паттернов, так что строка и её паттерн стоят напротив. Нулевая строка и построения сверху не трогаются.

v1.590Паттерны не уезжают вверх при вставке над началом

«Паттерны всегда должны начинаться с 1 строки». Вставка строк на нулевую строку или выше («🔻−1», «△ Подъём», спуск «вверх») поднимает счётчик построений сверху, чтобы номера настоящих строк не съехали. Список паттернов при этом не трогался: паттерны стоят по индексам, и первый оказывался на построенной строке с минусовым номером. Теперь в список на том же месте вставляется столько же пустых ячеек, и паттерны едут вместе со строками. Выделение паттернов переносится так же.

v1.589Горизонт тянется только за саму черту

«Убери цепляние горизонта за первую строку, только за саму линию». Хват за нулевую строку (v1.441, с v1.580 ещё и в промежутках меню 2) снят: нажатие в строке снова только выделяет. Тянуть горизонт можно за черту и за её толстый отрезок в промежутке под осью (v1.581).

v1.588«△ Подъём до вершины» — все предки по Паскалю разом

«А подъём есть? Или только спуск?», затем «да» на предложение кнопки. Это «🔻−1 Строка выше», повторённая до упора. Над строкой встают все её предки, каждый на бит короче, вершина сверху. Подъём останавливается на строке в один бит или на первой строке без родителя: у неё последний бит не сходится, а так у половины всех строк. Вставка идёт со сдвигом и переносом привязок, как вставка спуска вверх. От 1010101 подъём даёт 1, 11, 101, 1111, 10001, 110011: это строки 0–5 Паскаля по модулю 2.

v1.587«▽⇄ Строки → края» — каждую строку в край её спуска

«У каждой строки есть край — можно кнопку, которая переведёт все строки выделенные или все, если нет выделения, в такие». Кнопка в окне «▽ Спуск» и на пульте «Построения». Каждая строка на своём месте заменяется краем своего треугольника спуска, длина та же. Треугольник не строится: бит края k — XOR тех битов строки, где C(k, j) нечётно, а по Лукасу это «j ⊆ k» по двоичным разрядам. Значит, край — подмножественная сумма над GF(2), n·log n вместо n² на строку. Преобразование само себе обратное: второе нажатие возвращает строки. Строки не только из 0 и 1 пропускаются.

v1.586После «⊕ XOR-ом» выделение — на строку под источником

«Пусть переходит просто на следующую вниз под собой после XOR». В v1.584 выделялась самая нижняя строка треугольника. Теперь выделена следующая строка под источником, и новое нажатие пойдёт от неё: так можно спускаться шаг за шагом.

v1.585После XOR цветом «Нов» помечен сам треугольник

«Нужно изменить выделение битов, чтобы побитно выделял не всю строку, а какой треугольник XOR». Раньше «новыми» в цели помечались изменившиеся биты вместе с прежней пометкой строки. У строки, вставленной «⬇ Вставить», пометка была на всю строку, и треугольник в ней терялся. Теперь в каждой строке-цели новыми помечены ровно те биты, на которые лёг этаж, изменились они или нет. Так видна форма треугольника. Прежняя пометка этих строк при этом снимается. То же в построениях «⊕ класть XOR-ом»: там помечен след результата.

v1.584После «⊕ XOR-ом» выделена одна нижняя строка

«Пусть выделяет нижнюю потом строку одну». Раньше после XOR спуска выделялись все строки, куда лёг треугольник. Теперь выделена одна, самая нижняя из них: следующий шаг обычно идёт от неё.

v1.583XOR спуска и построений — по выравниванию цепочки

«Не правильно вставляет XOR, пусть учитывает выравнивание» (окно «▽ Спуск», «⊕ XOR-ом»). Этаж ложился в строку-цель бит в бит от начала, то есть всегда по левому краю, а цепочка показывает строки по своему выравниванию. У «↔» этаж короче строки и стоит под ней посередине, а XOR шёл со сдвигом. Теперь этаж кладётся туда, где он стоял бы на экране, будь он сам строкой на месте цели. Место считается тем же rowShiftFor/rowHalf2x, что и отрисовка, в полустолбцах. Если у «½» этаж стоит между битами, берётся левый. Та же ошибка была в режиме построений «⊕ класть XOR-ом» (v1.549). Расчёт вынесен в одну функцию xorIntoRowAligned, и оба места берут её.

v1.582Знаки П1/П2 на одной линии с битами

«Выровняй верт положения цепочек и паттернов», внутри строки. Текст ячейки паттерна с v1.395 — коробка высотой в знаки (ради заливки находок) с vertical-align:middle. Middle ставит её середину не на середину строки, а на «базовая линия + половина строчной буквы», и знаки сидели на пиксель-два мимо бит. Шрифт у паттернов и бит один, поэтому общая базовая линия даёт ровно то же место, что у бит. Заливка осталась по знакам.

v1.581Толстый хват горизонта под осью, промежуток в три кнопки, ось тонкая всегда

«Горизонт не хватается там, потому что выделение строк ему не даёт; сделай там линию толще посередине и кнопки ещё на 2 ширины раздвинь от центра» и «пусть захватывает, как сейчас, толстые линии, но показывает тонкую верт». Промежуток под осью в меню 2 теперь шириной в три кнопки. В нём стоит своя ручка черты, #m2HzGrip: зона 11px, линия 3px, в слое меню 2. Это выше строк, которые перехватывали нажатие под выделение. Протяжка и двойной клик те же, что у самой черты. Ось под курсором и при протяжке больше не толстеет и не светится, только становится ярче. Ручка у неё прежние 13px.

v1.580Ось в одну точку экрана, горизонт берётся и между кнопок

«Потоньше верт ось, и захвата нет горизонта там между кнопками». Линия оси была 1px CSS, а при масштабе 125% это 1,25 точки, и она размазывалась на две. Теперь толщина 1px / devicePixelRatio, ровно одна точка при любом масштабе. Хват нулевой строки (v1.441) висел только на .chain, а меню 2 из неё перенесено в .main-layout. Промежутки между кнопками ловят группы полосы, и до .chain нажатие не доходило. Тот же обработчик повешен и на полосу, кнопки и слоты он пропускает.

v1.579Горизонт виден и над полосой; ось — пунктир от строки 2

«Не видно… и ось верт надо с 2 строки показывать вниз только и всё, и пунктирной». Линия v1.578 не появлялась. Меню 2 не пускает выше низ меню 1, и оно сползает ниже черты горизонта. Черта шла над кнопками, а проверка «черта внутри полосы» снимала линию совсем. Теперь полоса рисует линию всегда, на высоте черты, даже если та выше её, и в своём слое: он выше всего, что закрывало черту на ширине полосы. Если раскладка сдвинута по вертикали, линия пунктирная, как сама черта. Ось начинается с кромки строки 2 (горизонт плюс два шага строки), выше её нет. Ручка короче вместе с линией. Линия пунктиром 4/4 px.

v1.578Нулевая строка: без оси, с горизонтом между кнопок

«Тут, на 0 строке, убери ось и отобрази горизонт между кнопок». Линию оси маской гасим на высоте полосы меню 2; выше и ниже ось та же, и тянуть её можно везде, маска меняет только видимое. Черта горизонта шла по кромке нулевой строки, но её тон на тёмном ряду не различался. Полоса рисует на той же высоте свою линию тоном оси, под кнопками, так что видна она ровно в промежутках. Обе высоты считает updateAxisSplitPosition после того, как полоса встала на место.

v1.577«№» П1 и её блок — правее колонки номеров

«Убери вправо от столба с номерами, когда они есть, кнопки эти». «№» П1 с блоком цветов и выравнивания садились сразу за линию П1|Ц, то есть над колонкой номеров строк, и закрывали номера верхних строк. Теперь при показанных номерах «№» встаёт за правый край колонки, блок едет следом. Номера скрыты — место прежнее, у линии.

v1.576Выделение не заливает полосу границы «Л»

«Выделение залазит на фон границы Л», у любой строки. Сам жёлтый слой был подрезан на полполосы ещё в v1.380, но под ним в том же шорткате лежал сплошной цвет поля (v1.401). Он крыл и половину полосы границы внутри поля. У невыделенной строки под полосой холст (заливка #fieldBgC кончается на полполосы раньше), у выделенной — цвет поля, и полупрозрачная полоса в этой строке светлела. Цвет поля тоже стал градиентом с тем же стопом, во всех трёх правилах (наведение, выделение, наведение на выделенную).

КАК НАШЛИ

Замер элементов в точках поперёк полосы ничего не дал: у всех фон прозрачный, и дело было не в чужом элементе, а в нижнем слое своего. Увидели глазами, увеличив само полотно (transform: scale(6) у .chain вокруг точки пересечения): в выделенной строке левая половина полосы была светлее.

v1.575У меню 2 снята тень

«Также»: светлым прямоугольником проступала не подложка, а тень самой полосы (box-shadow 0 4px 14px из её первого правила, со времён плашки над холстом). Внешняя тень ложится вокруг коробки, но не под ней, и прозрачная полоса читалась светлым окном в затемнённом ряду. Тень снята.

v1.574Меню 2 без подложек групп

«У меню выравниваний убери фон, пусть прозрачным будет, где нет кнопок». Подложки групп (v1.433) различали группы в сплошном ряду. С v1.563 группы разведены по полосе и видны местом, а подложки проступали полосками в зазорах. Сняты все три, фон остался только у самих кнопок.

v1.573Щелчок по нулевой — выделение, протяжка — горизонт

Нулевая всё ещё не выделялась. Разбор в консоли пользователя показал: нажатие приходит в строку, а события click нет вовсе. Хват горизонта за всю нулевую строку (v1.441) запускал протяжку прямо на нажатии: гасил событие, а на отпускании перерисовывал строки. Строка, на которой нажали, пропадала из документа до того, как браузер выдаёт click, и Chrome его просто не выдавал. Прямой вызов обработчика клика при этом выделял нулевую, отсюда и путаница в прошлых версиях.

Теперь на нажатии хват только взводится. Протяжка горизонта начинается, когда мышь с зажатой кнопкой ушла по вертикали на 4 px (заодно гасится выделение протяжкой, начатое тем же нажатием). Отпустили без движения — это щелчок, и он выделяет строку.

ПРИЗНАК ЭТОЙ БЕДЫ

mousedown есть, click нет, а прямой вызов обработчика работает: значит, между нажатием и отпусканием кто-то перерисовал элемент под курсором. Ищи обработчики нажатия в фазе перехвата (addEventListener(…, true)) и то, что они делают на отпускании.

v1.572Выделенная нулевая строка снова подсвечивается

«Всё так же не выделить 0». С v1.569 нулевая строка в набор попадала, но правило стилей v1.407 («она выделяется визуально фоном — убери») гасило у неё подсветку выделения и наведения, и выбранная строка выглядела невыбранной. Правило закомментировано, вернуть — снять обёртку.

ПОЧЕМУ ЗАНЯЛО ЧЕТЫРЕ ВЕРСИИ

Запрет v1.406 держался в пяти местах двух файлов: клик, протяжка, чистка набора в отрисовке, подсветка в стилях, плюс зона захвата черты горизонта поверх строки. Снимая по одному, каждый раз получали «всё так же». Когда снимаешь давнее решение, сначала найди все места, где оно записано: здесь помог бы поиск по номеру версии v1.406/v1.407 во всех шести файлах.

v1.571«№» возвращает номера, спрятанные окном «ℹ Поле»

«Нет номеров»: кнопка переключала 10/01, а колонки не было. Её прятало окно «ℹ Поле», которое сильнее режима кнопки: пока оно включено, номера убраны из полей в любом режиме (v0.972). Кнопка меняла систему счисления невидимых номеров. Теперь первый клик по «№» при спрятанных номерах выключает окно и возвращает колонку с прежней системой счисления, следующие клики переключают как обычно.

v1.570«№» номеров цепочки вернулась — в меню 2

Кнопку убрали с экрана в v1.419. Пользователь хватился её и выбрал новое место: меню 2, первой в левой группе, перед цветами цепочки. Над колонкой номеров ей больше не место, там стоят «№» П1 и блок цветов П1 (v1.567). Узел перенесён целиком, обработчик висит по id. Два расчёта из её прежней жизни (ширина под колонку номеров и упор, отодвигавший от неё планку «П1») теперь срабатывают, только пока кнопка в старой планке #axisStrip. В полосе ширина по подписи, с постоянным минимумом, чтобы полоса не дёргалась при переключении «10/01/—».

v1.569Нулевая строка выделяется; зона черты горизонта ушла с неё

«Какая-то полоса остаётся и не даёт выделить 0 строку», второй раз. Причин было две.

Кнопка «№» номеров цепочки не пропала: её убрали по просьбе пользователя в v1.419 («№ Ц вообще кнопку убери»), систему счисления с тех пор переключает двойной клик по колонке номеров. Спрошено, возвращать ли.

v1.567–1.568Цвета и выравнивание П1/П2 — у «№»; левая группа меню — к выравниваниям

v1.567 — «это перемести справа от № П1» и «также для П2». Пара цветов и кнопка выравнивания каждой колонки уехали из планки у линии в поле цепочки, в свой блок (#patCtrlL/#patCtrlR) вплотную к «№»: у П1 справа от неё, у П2 слева. У линий остались одни подписи «П»/«Л». Кнопка ближе к «№», цвета с краю (правило v1.321). Меню 2 упирается в эти блоки, а не в «№».

v1.568 — «эти прижми к выравниваниям»: цвета, замок и «⧉» ушли от левой границы и встали вплотную к кнопкам выравнивания. Сдвиг связки под ось теперь делает левый отступ первой группы, а свободное место забирает одно auto-поле у закреплённых значков.

Папки v1567 в архиве этой машины нет: номер подняли, а копию до следующей правки положить забыли. Восстанавливать нечем, пропуск оставлен.

v1.566Растянутое меню 2 не глотает клики по нулевой строке

«Какая-то полоса там ещё лишняя, не даёт выделить 0 строку». Полоса меню с v1.563 растянута на всё поле Ц и лежит поверх нулевой строки. С v1.564 она прозрачная, но мышь забирала вся её коробка: до строки не доходили ни клик, ни наведение, ни начало протяжки. Коробка теперь проницаема, ловят только группы кнопок.

Сама нулевая строка цепочки по-прежнему не выделяется. Это решение v1.406 («не давай 0 строку выделить»), его не трогал. Ячейка её паттерна выделяется, как и раньше.

v1.565«П»/«Л» кеглем полотна; ½-этаж — только над выравниваниями

Подписи «П»/«Л» набирались шрифтом интерфейса (13 px), соседи «№» и биты — кеглем полотна. Буква читалась мелкой и ниже соседей. Кегль теперь общий, по ширине знак полотна как раз равен полосе границы.

Второй (½) ряд меню 2 выпадал от наведения на всю полосу. С v1.563 она во всю ширину поля, и ряд вылезал от касания «⧉» или закреплённых значков. Условие теперь — курсор или фокус над группой выравниваний. Взято в :where(), чтобы специфичность не выросла: иначе показ перебил бы скрытие после выбора (.half-picked).

v1.564Нулевая строка — того же фона, что все

«Фон 0 строки также выделяется от остальных»: это была её собственная светлая заливка #bandBg (v1.384), заведённая, чтобы отделить служебный ряд от цепочки. Теперь ряд отделяют сами кнопки, заливка прозрачная. Элемент оставлен: по его коробке ловится бросок значков в нулевую строку.

v1.563Нулевая строка: меню от границы до границы, ось между кнопками, один фон

Серия правок нулевой строки подряд, по снимкам пользователя.

ПОЧЕМУ УПОР ШИРИНЫ ПОЛЯ ЧИТАЕТ data-nat-w

minBitsWidthPx запрещал ужимать поле уже полосы меню и брал её ширину из коробки. Растянутая полоса равна самому полю, и упор запер бы ширину навсегда. Поэтому перед растяжкой полоса меряется «как есть», и упор берёт это число.

Номер поднят до 1.563, хотя 1.562 ещё не ушла в git: подписи ?v=1562 у пользователя уже в кэше, и правки в .js без нового номера просто не приехали бы. Проверено в браузере по слову пользователя.

v1.562Граница П1 уводит паттерны влево, а не прячет их; знаки целые по высоте

Жалоба: тянешь границу П1 влево — биты паттернов уходят под неё, хотя должны прижиматься к ней и обрезаться слева. Заодно: низ символов срезан «каким-то фоном», а у первого символа линия среза другая.

Все три беды оказались в стилях (Zerkalius-layers.html), код отрисовки не менялся.

ТРЕТИЙ РАЗ ОДНА И ТА ЖЕ ЛОВУШКА

Текст, дописанный после закрывающего маркера комментария, превращается в CSS и молча съедает соседнее правило. Так было с номерами в v0.879, так вышло и здесь. Ошибок в консоли при этом нет: CSS не падает, он пропускает. Дописывая к старому комментарию, вставлять текст ДО его маркера.

Проверено в браузере по слову пользователя: после протяжки границы на 300 px конец паттерна стоит в 13 px от полосы, лишнее срезано слева, первый символ на одной высоте с остальными.

v1.554–1.561Накал по периоду, спуск в цепочку, ползунок помнит размер

v1.554–1.555 — «🔥 Память»: шагом теперь считается любое изменение цепочки (кнопки-правки номер шага не двигают, а для памяти это тот же шаг), и у накала появился второй смысл — «повторяется»: бит горит тем ярче, чем короче его собственный период. v1.556–1.557 — дубли новых кнопок во вкладке «Новое», и дубли научились повторять меняющуюся на ходу надпись. v1.558–1.559 — «👁 Только эти» удалено целиком по просьбе пользователя. v1.560 — у «▽ Спуска» появились «⬇ Вставить» и «⊕ XOR-ом», с выбором «треугольник / только край» и «вниз / вверх». v1.561 — Сброс возвращает ползунку 🔢 то число строк, что было до встройки.

ПОЧЕМУ НАКАЛ ПОТРЕБОВАЛ ВТОРОГО СМЫСЛА

Пользователь: «память включена, цикл прогнан, а 10101 не разгорелась». Память считала верно: под Кругом 10101 → 01010 → 10101, и каждый бит меняется каждый шаг, так что счёт «держит значение» честно стоит на нуле. Но смотрят-то на другое: строка возвращается к себе за два шага, память у неё предельная — просто это не замер, а ритм. Поэтому режима два, и переключаются они одной кнопкой. Период ищется по последним шестнадцати видам строки, и нужно хотя бы два совпадения подряд: одно могло быть случайным.

УРОК ОБ УДАЛЕНИИ КУСКА РАЗМЕТКИ

Удаляя ряд «👁», я захватил лишний </div>. Разметка дальше уехала внутрь блока «Вид», панели #leftPanel/#rightPanel пропали, и страница нарисовала одну верхнюю полосу, упав с Cannot read properties of null. Это ровно то правило, что записано в своде: после вырезания перечитывать ОБЕ границы. Проверять удобно счётом тегов: у рабочих версий открывающих <div 203, закрывающих 204 — соотношение постоянное, и любое расхождение видно сразу.

v1.549–1.553Построение ⊕ в биты и вверх; «⇄🔎 Неподвижные» больше не молчит

v1.549 — переключатель у построений: «⬇ вставлять новой строкой» (как было) или «⊕ класть XOR-ом в строку ниже» — запрос: «построение делать прямо на строках, кладя в биты (XOR) или между имеющихся». v1.553 — зеркальная пара кнопок: «🔻−1 Строка выше» (обратный шаг Паскаля) и «🔢−1 Пред. номер»; у обратного Паскаля последний бит служит проверкой: не сошёлся — родителя у строки нет вовсе, и так у половины всех строк. v1.550–1.552 — починка подсветки неподвижных бит.

ПОЧЕМУ ПАЛИНДРОМЫ «НЕ РАЗГОРАЛИСЬ» — ДВЕ ПРИЧИНЫ СРАЗУ

Пользователь принёс: «1000 горит, а 10101 нет». Первая причина — та же, что была у «🔥 Памяти» в v1.536: подсветка стояла в общей ветке раскраски НИЖЕ служебных пометок «новый / изменён / вставлен», а только что построенная строка помечена новой целиком. Поднята выше (v1.550).

Вторая — набор строк: подсветка красила только ВЫДЕЛЕННЫЕ, унаследовав это правило у кнопки «⇄ Реверс». Той набор нужен — она делает разворот; здесь же чистый показ, и привязка к выделению только врала. Теперь красит всю цепочку (v1.551). Чтобы такие случаи больше не разбирать вслепую, кнопка при включении сама печатает счёт: сколько неподвижных бит в каждой строке (v1.552) — по нему сразу видно, где расходятся счёт и цвет.

Zazerkalius v0.002–0.004 · Layers v1.548Файлы строк, ⇅ вокруг строки, 🔎 Орбита; 🪞 Крест — и в Layers

Zazerkalius: v0.002 — строки из текстового файла (📂, перетаскиванием на страницу, вставкой нескольких строк в поле) и 💾 обратно в файл; v0.003 — в подсказке про счёт зёрен развели T и N («T — это N?» — нет: T — длина зерна, N — длина нужной строки); v0.004 — «⇅ Вокруг текущей» (зеркало проходит через строку, соседи меняются парами) и окно «🔎 Орбита»: где в столбике текущая строка и её отражения — целиком и кусками. Layers v1.548 — вкладка «🪞» с тем же зеркальным крестом и указателями симметрии для выделенной строки.

ПОЧЕМУ И В LAYERS

Пользователь: «в Layers тоже не помешает — там функционал обширнее». Зазеркалиус — чистое окно на симметрию, Layers — мастерская, где строки строят, режут и гоняют. Крест и указатели нужны в обоих местах: в мастерской — чтобы видеть симметрию прямо на том, над чем работаешь. Код креста в Layers свой, короткий, на Манакере самого Layers: подключать zz-core.js туда нельзя — имена его функций GF(2) совпадают с теми, что уже есть в fold-4-tools.js.

Zazerkalius v0.001Новый интерфейс — окно на ту сторону зеркала

Решение пользователя: «легче будет по новой создать для истинного Зеркалиуса интерфейс весь»; «истинный — Зазеркалиус — окно на ту сторону зазеркалья». Главное — симметрия, «в первую очередь недавние» инструменты и указатели, и «все подсказки — чтобы не потерялись, а применились в новом». Новая страница zazerkalius/Zerkalius-zazerkalius.html, ссылка — первой в лаборатории хаба. Слева столбик строк (🔺+1, 🔢+1, 🎲, ⇅); в центре — зеркальный крест: вертикальная черта — разворот ⇄, горизонтальная — инверсия 🔁, в четырёх четвертях вся орбита V₄, золотом неподвижные биты; под крестом — указатели симметрии: скобки под каждым палиндромом и антипалиндромом, черта скобки — сама ось. Окна-инструменты: ▽ Спуск, 🔁 Цикл и память (μ, λ, 🔥 накал), 🧮 GF(2), 🧮 Лин. сложность, 🧬 Лента (оси через стык строк и ядро децимации), 📖 Подсказки. Окна тащатся за шапку, тянутся за угол, у каждого «?» с подсказкой.

ПОЧЕМУ С НУЛЯ, А НЕ ЕЩЁ ОДНОЙ ВКЛАДКОЙ В LAYERS

В Layers 42 тысячи строк и 282 кнопки, и каждая правка интерфейса (ползунок, ось, размеры окон) стала борьбой с наслоениями, а не работой над идеей. Математика же там хорошая и проверенная — её вынули в zz-core.js один в один, без интерфейса: там нет ни DOM, ни состояния страницы. Layers не тронут и работает как работал.

Подсказки не пересказаны заново, а перенесены: тексты «?» у окон — из подсказок кнопок Layers и записей этого журнала (почему спуск — зеркало, а не сжатие; GF(2); Колмогоров; «ударение»; 🔺+1 против ▽). Потеряться им теперь негде: они живут рядом с тем, что объясняют.

v1.547Любое окно тянется за угол

«Режется высота показа окон и ширина, и никак не увеличить руками». За угол тянулся только «Лог находок», остальным ширину держал !important. Теперь уголок есть у каждой плавающей панели и у каждой выпадающей вкладки, вниз — до края экрана. В доке ручной размер гасится: там панель, как и раньше, по ширине дока. Окно «▽» лишилось своего потолка в 60% экрана — размер ему задаёт само окно.

v1.545–1.546Ось тоньше; своё окно «▽ Спуск»

v1.545: ось цепочки — 1 px вместо 2 и вдвое прозрачнее («потоньше и потуше, слишком выделяется»); при наведении и перетаскивании — прежняя яркая. v1.546: в «🧾 Черновике шага» треугольник спуска было не разглядеть — у него теперь своя вкладка «▽» в строке меню: за ⋮⋮ уносится на поле, галкой закрепляется. Цифры — шрифтом, кеглем и разрядкой полотна (те же 0 с точкой внутри), шрифт полотна дан и битам в черновике. Выравнивание у окна СВОЁ — по центру, влево, вправо.

ПОЧЕМУ ВЫРАВНИВАНИЕ НЕ ОТ ЦЕПОЧКИ

Сначала окно брало выравнивание цепочки; пользователь остановил: «выравнивание надо разное, отдельное». У треугольника своя геометрия: по центру каждый бит XOR стоит ровно под своей парой, влево — край выстраивается столбиком и читается сверху вниз. Цепочке нужно одно, спуску другое, и связывать их значило бы переключать одно ради другого.

v1.544Ползунок 🔢 снова прячет хвост — по всем строкам цепочки

Уточнение пользователя: ползунок и был про то, чтобы прятать хвост цепочки вместе с паттернами; сломался он оттого, что раньше строк выше нулевой и вписанных построений не бывало, «а они, даже вписанные, должны быть как родные и считаться». Предел ползунка брался из длины ШАБЛОНА и дальше не менялся: цепочку достроили кнопками — строк стало больше, а ползунок стоял на старом числе.

ПОЧЕМУ СВЕРКА В КАЖДОМ render()

Строки добавляются десятком разных путей (🔺+1, 🔢+1, вставки, склейки, перенос), и сторожить каждый — значит однажды забыть очередной. Поэтому ползунок сверяется с цепочкой при каждой отрисовке: значение — сколько строк видно от нулевой вниз, предел — видно плюс спрятано, но не меньше шаблона. Откуда строка взялась, неважно. Построения над нулевой он, как и раньше, не режет.

v1.543«👁 Только эти» — показать строки с … по …

Запрос: «хотел скрыть строки, оставить только 10–15, а это не работает». Не работал ползунок 🔢 во «Виде», и он не про это: он берёт ПЕРВЫЕ N строк шаблона и режет хвост снизу. Середину им не вырезать, а на цепочке, построенной кнопками, его предел — длина шаблона. Теперь во «Виде», под шрифтом, два поля «с» и «по» и кнопка «Только эти». Номера — как в колонке номеров, Enter тоже показывает.

ПОЧЕМУ ТОЛЬКО ПОКАЗ И ПОЧЕМУ НУЛЕВАЯ СТРОКА ОСТАЁТСЯ

Строки не вырезаются из данных: флаги сдвигов и инверсий привязаны к НОМЕРУ строки, и вырезка сверху сдвинула бы их на чужие строки. Спрятанная строка просто не попадает на экран. Нулевая строка и строка горизонта видны всегда: на первой стоит меню 2, перед второй — черта. В кэш выбор не пишется: после перезагрузки видна вся цепочка, чтобы спрятанное не приняли за потерянное.

v1.542Вкладка «Новое» — все кнопки сессии в одном месте

Запрос: «скопировать в дополнительную вкладку все кнопки, которые понадобятся и которые сделаны в текущей сессии». За два дня их набралось больше десятка, и разбрелись они по «Построениям», «Строкам» и «Выделить». Теперь они собраны на вкладке «Новое» в строке меню: 🔺+1, 🔢+1, ▽ Спуск, ⇄🔎 Неподвижные, 🔁 Инв меняющихся, 🔥 Память по циклу, ⇅ Зеркало по горизонту, 🧮 GF(2) с выбором шага и t, ⤓ Вписать, 🧮 Лин. сложность, 🪞 Оси сквозной с выбором обхода, 🧬 Ядро децимации. На старых местах всё осталось.

ПОЧЕМУ ДУБЛИ-ПУЛЬТЫ, А НЕ КОПИИ

Настоящая копия кнопки — это второй обработчик. Правку внесут в один, про второй забудут, и две кнопки с одной надписью начнут делать разное. Поэтому кнопка на вкладке своего кода не имеет: клик по ней нажимает оригинал. Надпись и подсказку она при запуске берёт у оригинала, и когда тот «включён» (🔥, ⇄🔎), подсвечивается вместе с ним. Списки и поле t держат то же значение, что оригиналы, в обе стороны. Ссылки на оригиналы запоминаются заранее: «🗗 Панели в окно» уносит панели в другое окно живыми, и поиск по id в момент клика их бы уже не нашёл.

СПИСОК «ОСТАЛОСЬ» ПО LAYERS ЗАКРЫТ ЦЕЛИКОМ (v1.531–1.535)

Все шесть пунктов сделаны. Сделаны БЕЗ проверки пользователем — он попросил пройти их подряд и проверить потом. Что проверить в первую очередь:

21.09 Claude прогнал проверку сам — разовое исключение по слову пользователя (на сайте, v1.535; правило «тестирует пользователь» остаётся в силе). Консоль пустая, все функции на месте.

1. 🔥 Память — счёт ВЕРЕН (Круг Инв, три шага: неподвижные позиции набрали 1, перерисовка без шага счёт не двигает), но накал НЕ ВЫХОДИЛ НА ЭКРАН: служебная пометка «изменён» стояла в отрисовке выше и перехватывала бит. Исправлено в v1.536 — накал теперь важнее служебных пометок. Само исправление вживую не проверено: встроенный браузер не открывает локальные файлы.
2. Детектор цикла — счёт ПРОВЕРЕН: Круг λ=6, Круг Инв λ=12 (вдвое), вход μ=3 + петля λ=4 на пробной цепочке; Брент с выключенной таблицей даёт то же. Живым «▶ Авто» не гонялся — остаётся: нет ли ложной остановки (если в ключ состояния не попало поле, от которого зависит шаг, прогон остановится раньше времени — тогда добавить поле в cycleStateKey). И не замедлился ли прогон на большой цепочке: ключ — вся цепочка на каждый шаг.
3. ⇅ Зеркало — блок без горизонта ПРОВЕРЕН (переставил, повторный клик вернул как было); с поднятым горизонтом — не гонялся.
4. 🧬 Ядро — ПРОВЕРЕНО в v1.536: Туэ–Морс замыкается на одном классе при k = 2 и 4, случайная лента растёт. Серпинский, склеенный из строк, растёт тоже — и это верно: склейка строк растущей длины автоматной не является (прежняя подсказка у кнопки ошибалась, исправлена).
5. 🧮 GF(2) — ПРОВЕРЕНО: все четыре Круга совпали с настоящими rotateStr… бит в бит; период Круга Инв 2n, палиндромов длины 5 — 8, у Правила 90 единственное решение — ноль.
6. Оси сквозной — обходы ПРОВЕРЕНЫ (карты ячеек разные; на Серпинском карта одна и та же — его строки палиндромы, так и должно быть); порог ленты 8256 бит — 27.
7. Нулевая строка — откуда в ней брались биты, так и не найдено (сторож v1.529 лечит последствие).

Zerkalius Октаэдр · Binary-Drum-Machine\oktaedr\Zerkalius-oktaedr.html

Знак Zerkalius в объёме: пирамида и её зеркало под общим основанием. Верхняя половина несёт картину бит, нижняя — ту же самую, отражённую и инвертированную. Подробности устройства — в методичке внутри самой страницы (кнопка 📖 Методичка или клавиша H).

v0.001Тело, биты, настройки

Канвас без единой библиотеки. Восемь граней, обход вершин выправляется по факту (нормаль выпуклого тела обязана смотреть туда же, куда её собственный центр) — поэтому отсечение невидимых граней работает без исключений. Биты лежат рядами, параллельными экватору, в барицентрических долях со сдвигом на полшага, чтобы не садиться на рёбра. Настройки: плотность, размер цифр, скорость; всё в памяти браузера.

v0.002Реверс с памятью

Три действия: ⇄ разворот, ⇅ инв-разв, ↻ Круг Инв. keep считает, сколько шагов подряд бит не менял значения.

ПОЧЕМУ ПО ЗНАЧЕНИЮ, А НЕ ПО «ПАЛИНДРОМНОСТИ МЕСТА»

Палиндромность — верный ответ ровно для одного разворота. Возьмёшь другое действие, и правило станет другим, а вопрос тем же. Сравнение «до и после» верно для любого, поэтому все три кнопки пользуются одной памятью.

Место, которое дрогнуло, гаснет почти до фона (на тёмном полотне гаснуть честнее, чем чернеть); место, которое стоит, разгорается и краснеет. Через несколько тактов светится один скелет — это симметрия ряда, ставшая видимой.

Важное про чистый реверс: он сам себе обратен, два шага возвращают ряд. Память насыщается за пару тактов и дальше стоит — это не поломка, это ответ. Чтобы память рисовала, а не замирала, и заведён ↻ Круг Инв: период 2n, каждый такт задевает другие места.

v0.003Запрет выделения

Тело крутят протяжкой мыши, а протяжка для браузера — ещё и выделение текста: подписи кнопок и заголовок закрашивались синим. Запрет на всю страницу разом: это прибор, а не документ. Заодно убрана синяя вспышка по тапу на сенсорном экране.

v0.004Стрелки у ползунков и телефон

Стрелки ◄ ► у каждого ползунка: шаг берётся из атрибута step самого поля, поэтому новый ползунок достаточно разметить — код трогать не нужно. Значение рассылается событием input, иначе ползунок двигался бы, а дело за ним не делалось. Удержание: первый шаг сразу, пауза 380 мс, потом повтор каждые 70 мс.

Узкий экран: панель переезжает вниз отдельным листом со своей прокруткой (раньше она не влезала по высоте, а overflow:hidden у body не давал доскроллить — нижние настройки были недостижимы). Кнопка ⚙ прячет её. Щипок двумя пальцами вместо колеса. Плотность пикселей ограничена двойкой: на телефонах она бывает 3 и выше.

v0.005Связанные биты

Пару не пришлось заводить — она уже была. Бит верхней грани и бит нижней с тем же номером вокруг оси и теми же координатами стоят в зеркальных точках и всегда противоположны по значению. Тронешь один — второй меняется в тот же миг, и не потому, что между ними что-то передалось, а потому, что они с самого начала одно целое, просто увиденное с двух сторон зеркала.

Наведение на цифру зажигает двойника и тянет нить. Кнопка 🔗 Нити показывает занавес целиком, ползунок прореживает (при 26 рядах пар больше тысячи). Нить всегда отвесная: у двойников общие две координаты из трёх, а третья противоположна.

Поиск под курсором идёт по списку, который собирает сама отрисовка, — в нём только то, что реально нарисовано.

v0.006Горячие клавиши и шаг назад

Пробел — вращение, Enter — цикл, ◄ ► — шаг назад и вперёд, ▲ ▼ — такт, 1 2 3 — действие, D·L·F·R·T — кнопки. Буквы работают и в русской раскладке.

Шаг назад: разворот и инв-разв сами себе обратны, а Круг Инв вправо обращается Кругом Инв влево. Счётчик шагов убывает (он показывает, на сколько картина ушла от исходной), а память — нет: она про то, что бит выдержал сделанный шаг, и шаг назад такой же сделанный шаг.

Тогда же вскрылось: раскраска памяти включалась по счётчику шагов и, пройдя вперёд и вернувшись к нулю, погасла бы при набранной памяти. Завёл ей отдельный флаг.

v0.007Методичка внутри страницы

Кнопка 📖 Методичка (H или F1) открывает лист со всем описанием: устройство, управление, настройки, память, связи. Не отдельный файл: справка, живущая рядом с прибором, расходится с ним на второй же правке, а живущая внутри правится тем же движением.

Пока лист открыт, прочие клавиши не работают — иначе Enter, нажатый ради прокрутки, втихую запускал бы цикл за спиной у читающего. Внутри методички выделение текста разрешено (единственное место на странице): отсюда его копируют.

v0.008Ссылка на журнал и переезд в свою папку

В методичку добавлен раздел «Где искать остальное» со ссылкой на этот журнал: из прибора можно уйти читать, не разыскивая файл.

Тогда же все пять новых файлов (октаэдр, журнал, три SVG) переехали из Binary-Drum-Machine\ в Binary-Drum-Machine\oktaedr\ — в корне репозитория они терялись среди рабочих HTML. Ссылка методички на журнал относительная, файлы переехали вместе, поэтому чинить её не пришлось.

Версия 0.007 отдельно в архив не попала: 0.008 последовала сразу за ней. В нумерации archive\Zerkalius-oktaedr\ дырка на 007 — оставлена намеренно, по решению пользователя.

v0.009Свечение бит

Ползунок «Свечение бит», 0–20. Ореол берёт собственный цвет цифры, поэтому красные биты памяти светятся красным, а не голубым: накал и подсветка остаются одним сообщением, а не двумя.

Радиус убывает с расстоянием — тем же делением перспективы, что и кегль. Без этого дальние цифры светились бы как ближние, и объём спереди назад сплющивался бы.

ПОЧЕМУ ПОГАСШИЕ ПАМЯТЬЮ НЕ СВЕТЯТСЯ

По смыслу — они ушли в фон, светиться им нечем. И по делу: тень в холсте считается на каждую букву отдельно и на большой плотности стоит дороже всего остального вместе взятого. Отключить её там, где она не нужна, дешевле, чем нарисовать. Ноль на ползунке — самый быстрый режим.

v0.010Клик закрепляет пару

Наведение держится ровно пока мышь на месте — отвёл, и пара погасла, а тело ещё и само крутится. Клик по цифре оставляет пару гореть своим цветом (сиреневым): можно набрать несколько, отпустить мышь и смотреть, как они ходят при вращении и что с ними делает шаг. Повторный клик по той же цифре снимает её, ✕ Снять или Esc — все разом; на кнопке видно, сколько набрано.

КАК ОТЛИЧАЕТСЯ КЛИК ОТ ПОВОРОТА

Одна и та же кнопка мыши и крутит тело, и закрепляет бит, поэтому решает не нажатие, а то, сдвинулась ли рука: ушли дальше четырёх пикселей — поворот, остались на месте — клик. Порог нужен и для мыши, и особенно для пальца.

Ключ закрепления — строка «слот:ряд:место», а не объект: набор проверяется на КАЖДУЮ цифру каждого кадра, и сравнение строк тут дешевле любого обхода.

Порядок яркости: закреплённый перебивает память, наведение перебивает закреплённый. То, на что показывают сейчас, всегда главнее отложенного про запас.

Смена плотности бит снимает закрепления: мест становится другое число, и старые указывали бы в пустоту.

v0.011Дзен, запись видео, починка скользящих граней

Баг-репорт: «одна синяя грань не видна, а яркая — как типа видна».

ПРИЧИНА ОКАЗАЛАСЬ В РАССОГЛАСОВАНИИ

Рёбра рисуются полной яркостью всегда — это силуэт, ему положено. А заливка грани стояла на глухих 0.07, и яркость цифр падала ПРЯМО пропорционально наклону. Грань, повёрнутая почти ребром, получала цифры на 23% прозрачности, то есть никакие, — и выходила пустым ярким контуром. Снаружи это читается как «лицевая грань, на которой ничего нет».

Теперь наклон грани (facing) считается ОДИН раз и им пользуются все трое: заливка идёт по наклону, а яркость цифр — через корень. Корень поднимает край шкалы, не трогая середину: та же грань получает уже 43% вместо 23%, и пустых контуров не остаётся.

☯ Дзен — прячет всё, кроме тела: панель, заголовок, версию, подсказку, шестерёнку. Вход и выход: кнопка, клавиша Z, щелчок колесом мыши (тот же жест, что на остальных машинах Зеркалиуса), а из Дзена ещё и Escape. Не сохраняется намеренно: открыть страницу и увидеть голое тело без единой кнопки — плохой способ начать.

⏺ Запись видео — подключён общий recorder.js, а не написан свой. Пишется только холст, панели в кадр не попадают, куски ложатся на диск по ходу дела.

ДВА СТОЛКНОВЕНИЯ, КОТОРЫЕ ПРИШЛОСЬ РАЗВЕСТИ

Клавиша R. Её занимал общий модуль записи — на ВСЕХ машинах. Ломать общий уговор ради одной страницы неправильно, поэтому отступила страница: «новая картина» переехала на N.

Средняя кнопка мыши. Один щелчок делал три дела разом: входил в Дзен, начинал поворот и, раз рука не сдвинулась, на отпускании закреплял подвернувшийся бит. Теперь крутит и закрепляет только основная кнопка (e.button !== 0 → return); у пальца и пера button тоже 0, так что касаний это не трогает.

v0.012Правка бита рукой; рёбра гаснут вместе с гранью

Shift+клик по цифре переворачивает бит. Меняется ОДНО число в картине, а на экране переворачиваются ДВА: двойник меняется сам, потому что он не копия, а то же самое число, прочитанное с другой стороны зеркала. Память этого места обнуляется — она считает шаги, а ручная правка шагом не является, и засчитывать её как «бит устоял» было бы враньём.

Обычный клик по-прежнему закрепляет пару. Shift выбран вместо двойного клика: двойной пришлось бы отличать от двух одиночных по времени, и первый успевал бы закрепить пару прежде, чем станет ясно, что клика два.

РЁБРА ГАСНУТ ВМЕСТЕ СО СВОЕЙ ГРАНЬЮ

Прежде ребро рисовалось в полную силу, если хоть одна его грань лицевая. Но отвернувшаяся грань не рисует ни заливки, ни цифр — и оставалась пустым ярким треугольником, обведённым рёбрами соседей. Снаружи это читается как «грань горит, а на ней ничего нет».

Теперь ребро берёт яркость от самой развёрнутой из своих лицевых граней и гаснет вместе с ней. Нижний порог оставлен: силуэт тела обязан читаться всегда, иначе на скользящих ракурсах октаэдр расплылся бы в туман.

Это ВТОРАЯ попытка по тому же баг-репорту. Первая (v0.011) поднимала яркость цифр через корень — и была не о том: на снимке пустой треугольник широкий, а грань, стоящая почти ребром, выглядела бы узкой полоской. Причина оказалась не в затухании, а в том, что яркость рёбер вообще не зависела от наклона.

v0.013Подсветка по наведению — по кнопке

Кнопка ◎ Наведение (клавиша V), по умолчанию ВЫКЛЮЧЕНА. Пока она не нажата, движение мыши над телом ничего не подсвечивает.

ЗАЧЕМ ВЫКЛЮЧАТЕЛЬ

Пара загоралась от ЛЮБОГО движения мыши над телом — в том числе когда её просто ведут мимо или уже отпустили после поворота. На плотной картине это сплошное мельтешение, и главное — оно случается тогда, когда его не просили. Кнопка возвращает подсветке смысл события.

На клик это не влияет: и закрепление пары, и Shift+правка бита работают всегда. Клик — всегда намеренный, в отличие от проезда мышью.

Заодно уходит и лишняя работа: перебор шёл по КАЖДОЙ нарисованной цифре на каждое движение мыши — самая частая работа страницы. Теперь при выключенной кнопке его нет вовсе.

v0.014Скрытые рёбра — пунктиром

Баг-репорт: «рёбра, которые внутри, всё ещё светятся как видимые».

ПОЧЕМУ ЯРКОСТИ БЫЛО МАЛО

Тело полупрозрачное — в том и смысл, иначе не разглядеть нити между двойниками. Значит рёбра дальней стороны просвечивают насквозь и оказываются НА картинке рядом с ближними. Отличать их одной приглушённостью не выходит: на тёмном фоне и четверть яркости читается как светящаяся линия, а глазу приходится сравнивать две яркости вместо того, чтобы просто видеть.

Пунктир снимает вопрос и снимает давно: в черчении штриховая линия — невидимый контур, сплошная — видимый. Сравнивать нечего, достаточно формы. Заодно яркость опущена до 0.16.

Кнопка △ Скрытые рёбра на месте: их по-прежнему можно убрать совсем.

v0.015Грань почти ребром цифр не показывает

Третья попытка по тому же баг-репорту, и, похоже, настоящая причина.

ЯРЧЕ ОТ НАЛОЖЕНИЯ, А НЕ ОТ ЯРКОСТИ

Кегль цифры считается от РАССТОЯНИЯ, а не от наклона грани. На косой грани буквы остаются прежнего размера, а места под них становится в разы меньше — они наезжают друг на друга десятками. Полупрозрачные, они при этом складываются: двадцать цифр по 40% дают сплошную заливку. Узкая полоса выходит ЯРЧЕ нормальной грани, хотя прочесть там нечего.

Вот почему две прошлые попытки не помогли: я крутил общую яркость (v0.011 поднял её цифрам, v0.012 увязал с наклоном рёбра), а дело было не в ней. Против наложения яркость бессильна — чем её меньше, тем больше цифр нужно, чтобы полоса всё равно набралась до сплошной.

Теперь грань с наклоном ниже 0.11 не рисует цифр совсем, а на подходе к порогу гаснет плавно, до нуля, так что перехода не видно. Рёбра остаются: силуэт обязан читаться всегда.

v0.016Экватор толстеет только когда смотрит на нас

Хвост того же разбора: биты спрятались как надо, а полоса осталась. Полосой оказалась линия экватора.

Она нарочно самая заметная — это линия зеркала, — но заметность была глухая: ширина 2.6 и свечение 14 держались при любом повороте. На скользящем ракурсе такая линия ложится поперёк грани жирной светящейся полосой, шире и ярче всего, что рядом, и тянет взгляд на себя, хотя показывать ей в этот момент нечего.

Теперь и толщина, и ореол идут по наклону: смотрит на нас — во всю силу, встал ребром — обычная тонкая линия. Цвет не трогали: экватор остаётся белым и узнаётся по цвету, а не по жирности.

Три правки подряд об одном и том же, и каждая снимала свой слой: v0.015 — наложение цифр, v0.016 — постоянную толщину экватора. Общее у них то, что «слишком ярко» почти никогда не лечится яркостью.

v0.017Видимость грани — от глаза, а не по оси взгляда

И вот, кажется, корень всей этой истории с полосой.

СТАРАЯ ПРОВЕРКА ГОДИЛАСЬ ДЛЯ КАМЕРЫ В БЕСКОНЕЧНОСТИ

Лицевая грань определялась одним сравнением: n[2] > 0 — нормаль смотрит в сторону зрителя по оси Z. Это верно, когда камера удалена БЕСКОНЕЧНО и все лучи взгляда параллельны. У нас же перспектива, и камера стоит в четырёх радиусах от тела: лучи расходятся веером, и у краёв силуэта ось взгляда и направление НА ГЛАЗ заметно расходятся.

Грань могла смотреть «вперёд» по оси и при этом быть отвёрнутой от самого глаза. По старой проверке она числилась лицевой — и её рёбра рисовались сплошными и яркими внутри тела, где им взяться неоткуда. Отсюда и белые линии, которые «светятся как видимые».

Теперь берём вектор от середины грани к глазу и сравниваем с нормалью. Из того же произведения выходит и наклон, которым пользуются заливка, цифры, свечение и яркость рёбер — то есть все прежние правки начинают работать от ВЕРНОГО числа.

Три предыдущие попытки лечили следствия и потому помогали лишь отчасти: они подкручивали яркость того, что вообще не должно было рисоваться.

Знак · Binary-Drum-Machine\oktaedr\zerkalius-*.svg

Три версии, всё векторное и правится текстом:

ОСТАЛОСЬ

Надпись в SVG набрана системным шрифтом (Segoe UI / Inter). Для публикации его надо перевести в кривые или подключить файлом, иначе на чужой машине начертание съедет.

Генератор всех трёх — mklogo.py, лежал во временной папке. Если понадобится править пропорции — попросить положить его рядом.

Словарь · слова, которыми всё это описано

Здесь без формул. Каждое слово — с привязкой к месту, где оно в проекте встречается.

Палиндром
Строка, которая читается одинаково с обоих концов: 1011101. В цепочке это места, которые разворот НЕ трогает — значений всего два, и если бит совпал со своим зеркальным, разворот ничего не изменит. Именно они проступают красным в «памяти».
Антипалиндром
То же, но наоборот: бит ПРОТИВОПОЛОЖЕН своему зеркальному. 0011 — антипалиндром: первый против последнего, второй против третьего. Всегда чётной длины (у нечётной средний бит должен был бы отличаться сам от себя). Это и есть зеркало «инв-разв».
Осьось симметрии
Место, ОТ которого строка отражается. У нечётного палиндрома она проходит по самому биту, у чётного — по шву между двумя соседними. Карта осей показывает все такие места разом.
Зеркала: разв / инв / инв-развчетыре версии паттерна
Разв — развернуть порядок. Инв — заменить 0 на 1 и обратно. Инв-разв — и то и другое. Вместе с «ничего не делать» их четыре, и они складываются между собой как повороты квадрата: сделай любое дважды — вернёшься.
Инволюция
Действие, которое само себя отменяет: сделал дважды — вернулся. Разворот и инв-разв такие. Поэтому в октаэдре шаг назад для них — тот же самый шаг.
Орбита
Всё, во что строка может превратиться под набором действий. У четырёх зеркал орбита любой строки — не больше четырёх штук. Поиск в приложении уже ищет по всей орбите сразу: это и есть «четыре версии паттерна».
Периоди НОК
Сколько шагов надо сделать, чтобы вернуться к началу. У «Круга Инв» на строке из n бит период 2n: за n шагов строка становится своей инверсией, ещё за n возвращается. Для НЕСКОЛЬКИХ строк разом период — наименьшее общее кратное их длин (НОК): момент, когда все они одновременно окажутся дома.
Двулистное накрытие«лента Мёбиуса»
Когда один круг оказывается только половиной пути. Обошёл круг — попал не домой, а в зеркальное отражение; обошёл второй — вернулся. Так устроен «Круг Инв», и отсюда кнопка «Полуоборот».
Алгоритм Манакера
Способ найти ВСЕ оси симметрии строки за один проход по ней, вместо того чтобы проверять каждое место отдельно. Хитрость в том, что уже найденное слева переиспользуется справа — симметрия работает и на самом поиске симметрии.
Линейно / квадратO(n) и O(n²)
Линейно — работа растёт как длина: строка вдвое длиннее, времени вдвое больше. Квадрат — строка вдвое длиннее, времени вчетверо. На тысяче бит разница между тысячей действий и миллионом, и это разница между «мгновенно» и «подвисло».
Сквознаялента
Все строки цепочки, склеенные подряд в одну длинную. Симметрия ленты не знает про границы строк — ось может сесть на стык, половиной в одной строке, половиной в следующей. Ради таких и сделана кнопка «Оси сквозной».
Децимацияпрореживание, «маска»
Брать не все биты подряд, а каждый второй, каждый третий и так далее. Проверка на самоподобие: если прореженная строка совпадает с исходной, значит у неё есть внутреннее правило, а не случайность.
Автоматная последовательность
Строка, которую порождает короткое правило, а не жребий. Признак: сколько её ни прореживай, получается лишь горстка разных вариантов, и новых больше не появляется.
Туэ–Морс
Строка, которая строит себя сама: припиши к тому, что есть, его же инверсию. 0 → 01 → 0110 → 01101001. Никогда не становится периодичной. Из четырёх зеркал такой фокус выходит только у инверсии — остальные быстро вырождаются в повтор.
Бумажное складываниекривая дракона
Сложите лист пополам несколько раз, разверните и запишите сгибы: получится строка, которая тоже строит себя сама — к тому, что есть, приписывается сгиб и развёрнуто-перевёрнутая копия. Буквально физическое складывание, от которого проект и получил имя fold.
GF(2)арифметика по двойке
Счёт, где есть только 0 и 1, а сложение — это XOR. Почти всё, что делает приложение (сдвиг, разворот, XOR, инверсия), в такой арифметике описывается одной формулой, и тогда «какие строки не меняются» можно РЕШИТЬ как уравнение, а не искать перебором.
Аффинное отображение
Действие вида «перемешать по правилу и прибавить постоянное». Все эти действия складываются в одно такое же, сколько их ни делай подряд, — потому и решается уравнением. Исключение — наложение «AND»: оно из этого ряда выпадает, и вот там перебор честен.
Аттрактори алгоритм Брента
Куда всё приходит, если повторять действие долго. Состояний конечное число, значит рано или поздно начнётся круг: сначала «хвост», потом «петля». Алгоритм Брента ловит момент замыкания дёшево и отвечает двумя числами — длиной хвоста и длиной петли.
Барицентрические доли
Способ указать точку внутри треугольника не координатами, а «насколько она близка к каждому из трёх углов». Так в октаэдре расставлены биты по граням: удобно тем, что работает при любом повороте тела.
Изометрияи skewY
Рисунок объёмного тела без перспективных искажений — как чертёж. В логотипе строки цифр наклонены ровно под углом ребра основания (skewY — наклон в CSS), поэтому выглядят лежащими НА грани, а не наклеенными поверх.
Отсечение невидимых гранейи «художник»
Два приёма для объёма. Первый: не рисовать грани, отвёрнутые от зрителя. Второй: рисовать от дальнего к ближнему, чтобы ближнее естественно закрыло дальнее — так же, как кладёт краску художник.
devicePixelRatio
Во сколько раз настоящих точек экрана больше, чем «условных». На телефоне бывает три — и холст рисуется втрое дольше при незаметной на глаз разнице. Поэтому ограничен двойкой.
Кэш и «?v=NNNN»
Браузер запоминает файлы, чтобы не качать их снова, и легко отдаёт вчерашний. Цифры в конце адреса скрипта — способ сказать ему «файл другой, перечитай». Без них правка в коде просто не доезжает.
Якорь и стыкпри правке файла
Кусок текста, по которому находят место для вставки. Главная опасность — посчитать нижнюю границу на строку раньше: тогда от старого кода остаётся лишняя скобка, и файл перестаёт читаться целиком. Отсюда правило перечитывать ОБЕ границы после замены.
GF(2)поле из двух элементов
Арифметика, в которой есть только 0 и 1 и в которой 1 + 1 = 0. Сложение здесь — это XOR, умножение — AND. На таком языке шаги «Круг», «Разворот», «Правило 90» записываются как умножение строки на таблицу из нулей и единиц, а уравнения с ними решаются школьным методом Гаусса, без перебора. На этом держатся кнопки «🧮 GF(2)» и «🧮 Лин. сложность». С AND так не выйдет: он нелинеен, и для него остаётся только перебор.
Колмогоровская сложность
Длина самого короткого правила (программы), которое выдаёт данную строку. У Серпинского она крошечная, у случайной строки — примерно равна длине самой строки. Найти её точно нельзя в принципе, а у большинства строк короткого правила просто нет: коротких правил меньше, чем длинных строк. Точный поиск возможен только внутри одного семейства правил: для линейных это делает «🧮 Лин. сложность».
Ударениеодна запись, разные прочтения
«За́мок» и «замо́к» пишутся одинаково и различаются только тем, как их читают. У бит такое же ударение: где поставить ось сгиба, с какого бита начать, как нарезать на слова, по какому правилу читать (как число, как край треугольника, как зерно). Строка та же, смысл другой. Бесплатного сжатия отсюда не получится: выбор прочтения — тоже информация (два ударения — один бит), просто она хранится у читателя, а не в записи. Этим язык и силён: общее у всех читателей лежит один раз, а в записи остаётся только своё. Zerkalius — такой общий словарь ударений для мира симметрий.
Префиксный XORволна Аниматрицы в Code
Волна идёт сверху вниз и переписывает каждую строку по уже переписанной строке над ней. Если не различать 0 и 1, а смотреть только «есть символ или пусто», после прохода каждая строка равна XOR всех строк над ней и её самой. Это сумма «с накоплением» по модулю 2. Через несколько проходов строка собирается из строк выше по треугольнику Паскаля, взятому по чётности, поэтому на холсте и проступают треугольники Серпинского. Своё у Zerkalius — три символа (1, 0, пробел) и правило «два разных символа → верхний». Оно делает волну нелинейной: нули протекают вниз столбиками и гасятся друг о друга, и только когда они вымрут, включается чистая классика (на сцене «1» — к 65-му проходу). Такого варианта в литературе не встречалось.
Теорема ЛукасаЭдуард Лукас, 1878
Чётность числа сочетаний видна по двоичной записи: сочетание нечётно ровно тогда, когда каждая единица меньшего числа стоит на месте единицы большего. На ней держится весь расчёт волны: по ней видно, какие строки выше входят в строку через k проходов. Родня — Глейшер (1899: в строке n треугольника Паскаля нечётных чисел ровно 2 в степени «число единиц в двоичной записи n»), Серпинский (1915, сам фрактал), Вольфрам с соавторами (1983–84: Правило 90 и линейные клеточные автоматы над двумя значениями — генератор форм в Code оттуда).
Период — степень двойкичто показал журнал Аниматрицы, сцена «1»
Через 2m проходов по теореме Лукаса от всех строк выше остаётся только строка на 2m выше. Когда 2m не меньше числа строк, её нет, и текст возвращается к себе. Поэтому период — ближайшая степень двойки не меньше числа строк: 128 строк → 128 проходов, 100 строк → тоже 128, 200 → 256. Внутри цикла видны все меньшие степени. Через 2 прохода берётся каждая вторая строка, отсюда «густо–редко» через проход: единиц почти вдвое меньше на чётных. Через 8 строка равна XOR строк на 8, 16, 24… выше, поэтому кадры, отстоящие на 8, — родственники с общим мотивом. Через 64 к строке прибавляется строка на 64 выше, и проступает вложенный сдвинутый треугольник. Посмотреть можно в Code: 🎞 GIF у Аниматрицы с шагом 1, 8 или 64.
НотаДо Ре Ми Фа Соль Ля Си
Звук определённой высоты и его знак на письме. Названий семь: до, ре, ми, фа, соль, ля, си (по-латински C D E F G A B); с диезами и бемолями между ними звуков в октаве двенадцать. Подробно — «Нота (музыка)» в Википедии. В хабе (с v0.054) это семь значков над меню, и каждый — своя головка звука фона: До — строки подряд, Ре — столбцы сверху вниз (бас), Ми — строки задом наперёд, Фа — столбцы снизу вверх, Соль и Ля — две диагонали, Си — случайный бит. Каждая звучит от своей ноты (база звукоряда в Zazerkalius — ля, 110 Гц; До выше неё на 3 полутона, Ре — на 5, Ми — на 7, Фа — на 8, Соль — на 10, Си — на 2), поэтому несколько включённых дают созвучие. Цвета — радугой, от красной До до фиолетовой Си.
Дерево длительностей: целая нота делится на две половинные, каждая половинная — на две четверти, каждая четверть — на две восьмые

Длительности — двоичное дерево. Целая нота — это две половинные, половинная — две четверти, четверть — две восьмые, и так дальше: на каждой ступени каждая нота делится ровно пополам (1 → 2 → 4 → 8). Это та же двоичность, на которой стоит весь проект: ступень дерева — как строка из 2n бит, а каждая нота на ступени — место, которое на следующей ступени расщепляется на пару. Картинка — из той же статьи Википедии.
123

Из чего нота. 1 — флажок (хвостик), 2 — штиль (палочка), 3 — головка. Головка своим местом на нотном стане показывает высоту, а видом — длительность: пустая головка без штиля — целая, пустая со штилем — половинная, закрашенная — четверть. Каждый флажок делит длительность ещё пополам: один флажок — восьмая, два — шестнадцатая. Так флажки и продолжают дерево вниз, ступень за ступенью: сколько флажков — столько раз пополам после четверти.

Правила, по которым всё это живёт

Журнал дописывается вручную при каждой правке — одной записью со ссылкой на причину.
Строка Zerkalius-oktaedr.html и Zerkalius-dnevnik.html в CLAUDE.md пока НЕ добавлена: правка свода правил — отдельное решение, его принимает пользователь.