换页不再白屏一下、注册页的「手机号注册」能点了
- 点站内链接时,旧页面不再先淡成一片白底 —— 之前新页面要等网络往返才到,中间那一下就是白屏。现在旧页面保持原样,换页后新页面照旧淡入、内容依次上滑。
- 注册页的「手机号注册」原来点了像是没反应:它只是把单选按钮选中,页面上的提示文案与「发验证码」的去向都没变。现在切一下就整页重渲染,提示、去向、表单都跟着变。
- 如果站点没有配置短信服务,注册页不会再把你留在「手机号注册」这个空壳上,而是自动退回邮箱注册。
Все обновления сайта и серверного мода, самые новые сверху
Здесь собрана вся история сайта CloudRidge и серверного мода, от новых к старым, чтобы ты мог посмотреть, когда появилась какая-то функция и когда починили какой-то баг.
#t-xxx по-прежнему сразу открывает нужный инструмент, а на телефоне полосу можно листать вбок. Градиентный текст вместо двух жёстко заданных цветов получил 2~6 цветовых точек: нажатие на полосу добавляет точку, перетаскивание меняет её позицию, выбор точки и «Удалить этот цвет» убирают её; цвета интерполируются посимвольно по позиции, поэтому §-коды / MiniMessage / tellraw / MOTD меняются вместе, а слишком длинный MOTD выдаёт предупреждение_admlogin.php теперь обязан отдавать 404 в проде (он мог сделать посетителя администратором напрямую), и ?to= больше не может увести за пределы сайта; ② ping / dns на странице теста скорости передавал доменное имя для проверки порта, и DNS rebinding мог увести это во внутреннюю сеть — теперь подключение идёт только к уже проверенному IP; ③ подделка X-Real-IP / CF-Connecting-IP позволяла обойти ограничение по IP; теперь такие заголовки принимаются, только если запрос действительно пришёл с loopback. Чтобы закрыть ③ полностью, нужно внедрить X-CDR-Proxy-Secret в nginx и прописать security.proxy_secret в site/config/config.php — это уже настройка сервера, так что жду вашего согласия.127.0.0.1:8100 (внутренний адрес, нужен только для проверки). Теперь выводится публичный адрес веб-карты.body.cdr-body::before (генерируемое содержимое), а генерируемое содержимое всегда рисуется раньше настоящих детей, поэтому видео полностью перекрывало градиент и он ни на что не влиял.pub-bg-video был и классом видеоэлемента, и классом-переключателем на <html>. Из-за этого всё правило полноэкранного фиксированного видеослоя применилось к корневому элементу: корень стал position: fixed, высота страницы схлопнулась до одного экрана, и колесу стало нечего прокручиватьpointer-events: none наследуется: всё дерево документа перестало получать мышь, её ловил только <html>, и кнопка «Назад» стала недосягаемойpub-bg-on, а правило элемента сужено до video.pub-bg-video, чтобы они больше никогда не совпадали<html>, думая, что измеряют видеослойblur(32px) saturate(180%), а на этой странице одновременно видно семь-восемь стеклянных поверхностей — каждый прокрученный кадр должен был заново пересэмплировать все пиксели за ними/* 6% */ —— комментарии CSS не вкладываются, этот */ закрыл внешний комментарий раньше времени, следующая } закрыла правило раньше времени, и парсер проглотил все последующие правилаbackground: none в том же блоке стирал собственный градиент главной кнопки. Тёмно-синий фон с белым текстом превратился в белое на белом, и кнопка исчезла полностьюbackground: none стирал и загружающиеся кнопки, а слои стекла их исключают —— на эти секунды кнопка становилась полностью прозрачной. Теперь фон к ним возвращаетсяtransition заменяет объявление целиком, и добавить переход только к одному свойству нельзя; для этого понадобился бы селектор, который заодно перекрыл бы анимации появления и наведения карточек, и появление при прокрутке превратилось бы из «проявления с подъёмом» в резкий скачок. Поэтому скрипт покадрово сглаживает одно число (интенсивность свечения) и останавливается, как только оно устоялосьbackdrop-filter внутри начинают брать пробу из пустого фона — матовое стекло полностью ломается. При поблочном появлении такого предка нет. Единственные два position: fixed в body (фоновый слой и закреплённая строка с именем) в этот набор не входят, поэтому сдвигать их безопасноbackdrop-filter; карта рисуется один раз через canvas при открытии страницы, и никакого скрипта на каждый кадр нет.cdr-container, а он высотой только с шапку страницы, поэтому ход sticky заперт внутри него: за шапкой строка уезжает вместе со всем остальным. Поэтому строка сделана position: fixed, а скрипт вставляет на её прежнее место заполнитель той же высоты (fixed выводит её из потока; без заполнителя вся страница подпрыгивает на 86px в момент закрепления)/players/zlc) не тронуты ни на байт.is-lit на карточку под курсором, и --glass-spot спускается по цепочке наследования в каждый .stat-mini этой карточки —— один переключатель превращался в семь-восемь светящихся поверхностей. Именно это вы и увидели: «мышь в другом месте, почему всё загорелось?». Доказательство: в жёлтой строке пробы появился счётчик spot=, который считает не элементы с .is-lit, а сколько вычисленных значений --glass-spot не прозрачны —— до исправления курсор на пустой зоне заголовка карточки давал lit=1 spot=8/27--glass-spot в transparent, и цепочка наследования обрывается на ней; .is-lit от скрипта получает только та поверхность, над которой действительно находится курсор. После изменения: spot=1/27.is-lit, и он написан ниже —— по принципу «побеждает последний» простой body.cdr-body .is-lit был бы полностью перекрыт и блик исчез бы совсем (измерено lit=1 spot=0/27). Поэтому правило .is-lit должно перечислить все четыре селектора и поднять специфичность. Пропустите этот шаг —— и ошибка из «светится слишком много» превратится в «не светится вообще»requestAnimationFrame: иначе у первого кадра нет координат и блик вспыхивает в центре карточки, прежде чем перескочить к курсору. Теперь один .is-lit —— это одна светящаяся поверхность: где курсор, там и светradial-gradient, нарисованный в фоне карточки, который читает --glass-mx / --glass-my, записываемые скриптом на лету. Никаких лишних узлов, никакого вмешательства в контекст наложения и никаких помех размытию карточки. В светлой теме используется не белый, а холодный сине-белый: белую карточку (rgb 229~245) белым светом можно поднять лишь на 6 уровней, глаз этого не замечает.page-head вырос с 30px до 160px (около 317px всего), сдвигая весь ряд белых карточек вниз: аватар, имя и значок уровня теперь лежат прямо на изображении баннера —— это и есть «показать больше фона». Только высота, без нового содержимого, на маленьких экранах — 72px. Содержимое намеренно не сдвигалось целиком: это потратило бы самую тёмную часть верхней маски и сделало бы побелевшие строки нечитаемымиcubic-bezier(.34, 1.56, .64, 1) —— у второй контрольной точки y = 1.56 > 1, поэтому кривая проскакивает цель и возвращается; этот заброс и есть «пружина». Чистый CSS, без JavaScript и без физического движкаprefers-reduced-motion теперь гасит только самостоятельное движение: пружина кнопки (которая сама отскакивает после отпускания) превращается в обычный короткий переход, отклик на нажатие сохраняется, а блик за курсором остаётся —— слежение за курсором это прямое управление: движется курсор, а не страница. Ваш собственный референс по жидкому стеклу говорит ровно это: убрать displacement, оставить blur и блик. Это ещё и единственный способ увидеть блик на этой машине: эффекты анимации Windows здесь выключены (MinAnimate = 0 / DragFullWindows = 0 / VisualFXSetting = 2), и браузеры честно сообщают об этом как reduce —— если завязать блик на это, он исчезнет навсегда$pubBgCss !== ''); любая другая страница —— включая профили без баннера —— не изменилась ни на байт, и за этим следят четыре проверки в наборе тестовbody через background-attachment: fixed. Эта запись означает «изображение прикреплено к вьюпорту», и оно не является отдельным композитным слоем —— браузер обязан пересэмплировать его каждый кадр для backdrop-filter каждой карточки; когда окно сэмплирования и позиция прокрутки расходятся, цвет «прыгает». Одновременно карточки движутся, а изображение нет, поэтому каждая полупрозрачная карточка проезжает по всей фотографии. Вместе это и давало «то темнее, то светлее, то нормально»body в отдельный слой position: fixed (body::before, z-index: -1, pointer-events: none, will-change: transform). Отдельный слой может быть повышен до композитного, поэтому источник сэмплирования на протяжении всей прокрутки —— одна уже скомпонованная битмапа--glass-blur --glass-sat --glass-highlight --glass-displacement --glass-noise). Честное замечание: настоящее преломление через SVG feDisplacementMap здесь недостижимо —— Chromium и Safari принимают в backdrop-filter только функции фильтров, но не url(#svgfilter); внутренняя фаска лишь приближает этот вид, а не имитирует егоtext-shadow на стеклянных поверхностях —— при стабильной карточке оно уже не помогает и лишь съедает штрихи 12-пиксельного текстаbackground-attachment: fixed: изображение прикреплено к вьюпорту, а карточки прокручиваются поверх него —— каждая полупрозрачная карточка «проезжает» по всей фотографии: на тёмном небе тускнеет, на светлых зданиях выцветает. Одна и та же карточка в зависимости от положения давала от rgb(99,107,125) до rgb(201,197,200) —— разброс в 100 уровней/players/zlc) этот стиль стекла вообще не выводят —— там не изменился ни один байтtext-shadow) —— незаметный на светлом фоне и проявляющийся только на тёмном: так шрифт несёт собственную локальную подложку. Именно это позволяет опуститься до 34 %saturate(180%) и brightness(1.12). Стекло в стиле Apple подхватывает цвет позади и слегка его поднимает; одно лишь размытие даёт просто матовость00000000-0000-0000-0009-…, а мод мог сообщить только *имя* —— и в тот момент именем оказался сам этот UUID. На самом деле это был birdzhonghuifei, игравший с Bedrock; строку присоединили к её владельцуbirdzhonghuifei теперь полнее‹. Кнопки «назад/вперёд» и «Сегодня» остались, а списки следуют за перелистываниемTrChat начинается только с 2023-09-01, поэтому часть второй половины 2024 года отсутствовала. В трёх никогда не импортированных базах CoreProtect со старых серверов нашлось 34 417 сообщений за 2024-07 — 2024-12; после удаления дублей это чистые 229 сообщений за 37 дней, самое раннее — 2024-07-11TrChat, и в CoreProtect, их метки времени обычно различаются на секунду и иногда переходят через минуту; сравнение по минутам пропустило бы эти несколько десятков как дублиTrChat записал большую часть; вернулись отдельные строки, которые он пропустил. Теперь при просмотре этих дней с июля по декабрь 2024 года разговор виден полнееWinter сразу показывает его цифры рядом с Fruity_oxygen, и не нужно угадывать, под чьим именем он прячется. Попутно исправлена старая ошибка: при сортировке по имени игрока в шапке было на одну колонку меньше, чем в теле, и вся таблица съезжалаFruity_oxygen и Winter объединяются в одну строку, ElfinLettuc и Faithe — в другую), а те, кто не привязывал аккаунт, сохраняют свою строку. Значок «N персонажей» рядом с именем показывает, кто с кем объединён, — прежний рейтинг разносил основной и дополнительный аккаунты по разным строкам, и казалось, что на дополнительном время потрачено зря/accounts/<id>): каждый персонаж аккаунта перечислен отдельно со своим временем игры и числом входов, а сводные цифры сверху — их сумма. Страница полностью публична, вход не нужен. Попутно исправлена одна некорректная запись: персонаж ссылался на несуществующий идентификатор аккаунтаwwwsum честно показывает 2024-08-22, а 7Strawberry — 2024-03-07, и суммарное число входов выросло с 291 до 21 766Даты — это дата выхода соответствующей версии. Нашёл новую проблему — напиши на форуме или сразу владельцу сервера.