Дрібниці вирішують, чи має воно гарний вигляд
Вилизуйте великі панелі скільки завгодно — око завжди чіпляється за щось маленьке: розірване надвоє слово, зрізане сяйво, затиснутий слот. Чотири такі речі показали 13 вересня 2026 року, і полагоджено їх було у віджетах і темах, а не на екрані демо, тож той самий результат дістається кожному екрану.
| Що виявилося | Причина | Полагоджено |
|---|---|---|
Напис Done на коуч-мітці став Don/e |
Кнопка з увімкненим перенесенням віднімає ширину свого тексту від свого мінімуму — стисніть її, і вона розірветься всередині слова | GoStyle.fit_words(): одне слово не переноситься ніколи; кілька слів переносяться, але найдовше слово вміщається завжди — рішення ухвалюється за показаним текстом, а не за ключем перекладу, і накладається наново формою, коли змінюється мова |
| У кнопки на всю ширину сяйво зрізалося по вертикалі зліва | Контейнер прокрутки обрізає на своєму краю без винятків. Уцілів лише правий бік — завдяки жолобу для смуги прокрутки | GoScroll позичає поле в батька, щоб відсунути свій край на 12dp назовні, і повертає його всередині — вміст лишається на місці |
| Час, іконка й кількість склалися в слоті стовпчиком | Три рядки всередині 48dp | Іконка велика по центру, гаряча клавіша вгорі зліва, кількість бейджем унизу справа, час, що лишився, — бейджем над іконкою; панелі бейджів приходять зі скінового badge_box() |
| Плаский випадний список без видимого вибору | Наведення на пункт брало панель кнопки, а позначки-перемикачі були блідими типовими від рушія | Окрема панель наведення (м'яке акцентне підфарбування), та сама графіка перемикачів, що й у прапорців, висота пункту під дотик |
Дайте кнопкам лише з іконкою опис через GoStyle.icon_button(icon, action, -1, tooltip_key) —
і підказка для тих, хто з мишею, і назва для зчитувачів екрана беруться з цього одного значення.
gohud малює підказку сам: типова від рушія розбиває текст по одному символу на рядок, коли її
обчислення ширини йде не так (виміряно на ширині 1dp).
Картка коуч-мітки тримається осторонь нерухомого
У ландшафті картку раніше відсилало на самий верхній або нижній край — рівно туди, де живуть заголовки
й частини HUD; у демо вона сіла на → × у заголовку. Тепер вона лишається на рівні своєї цілі,
обходить будь-який GoHudAnchor, що резервує місце, і приймає інші перешкоди через
keep_clear. Вона рухається на найкоротшу відстань, яка обходить перешкоду, не накриваючи ціль,
і лишається на місці, коли екран замалий, щоб обійти все, — перекритися краще, ніж зникнути.
Її глибина — щоб читалася як над сторінкою — береться з регуляторів скіна
(float_shadow_size, float_shadow_lift, float_shadow_alpha; скіни зі зрізаними кутами беруть float_glow_size).
tour.keep_clear = [header_bar, toolbar] # нерухомі елементи, що не є прив'язками
Екрани з мишею та клавіатурою
У пальця немає стану наведення. Будуйте лише під мобільні — і два стани, які бувають тільки на
комп'ютері, лишаться неперевіреними; один із них таки був зламаний: у gohud кільце фокуса було
невидиме на головній кнопці. Панель мала колір акценту, і кільце теж: 1,00:1, той самий
колір, намальований сам на собі. Рухаючись клавіатурою, годі було зрозуміти, де ти.
Заліті кнопки (GoPrimaryButton, GoDangerSolidButton) беруть кільце, яке
контрастує з їхньою власною панеллю — темне в темній темі, біле у світлій, темна прицільна дужка
в сай-фай. Перевіряльник контрасту вимірює кільце фокуса проти панелі, на якій воно лежить, тож
правило переживає зміну палітри (WCAG 2.4.11 вимагає 3:1 для індикаторів фокуса).
Віджети HUD
GoHudAnchor — дев'ять місць
Шанує безпечну зону та крайові поля. Дайте йому landscape_spot — і він переїде в ландшафті:
контроли, що в портреті сидять унизу по центру, можуть перейти вниз праворуч.
Як не пускати вміст під HUD
Коли екран із прокруткою ділить дисплей із HUD, вміст з'їжджає під нього, і два набори тексту накладаються, доки жодного не можна прочитати. У цьому доповненні таке траплялося двічі: підказка поля вводу вичавлювалася між швидкими слотами, а повзунок перемикача в налаштуваннях сідав на смугу здоров'я.
form.avoid_hud = true # обходити кожен видимий GoHudAnchor
joystick_anchor.reserve_space = false # …окрім тих, що з'являються лише під пальцем
Кожен прямокутник обходиться в тому напрямку, який коштує найменше площі. Смуга вгорі справа обходиться вниз на телефоні в портреті (13% висоти) і вбік у ландшафті (21% ширини) — обходити її по вертикалі в ландшафті коштувало б 27% екрана. Уже віддану площу віднімають, перш ніж міряти наступний прямокутник.
Частини HUD стикаються й між собою
Дев'ять місць ділять екран; вони не гарантують, що частини розминуться. Широкий снекбар угорі по центру сів просто на смугу здоров'я вгорі справа й затулив значення — годі було прочитати, скільки здоров'я лишилося.
notice_anchor.avoid_peers = true # осідає під нерухомим HUD
notice_anchor.reserve_space = false # і не штовхає сторінку, поки висить
Він відступає лише по вертикалі — відступ убік означав би, що центрований снекбар щоразу з'являється в іншому місці. І він обходить лише ті частини, які не відступають самі: якщо поступляться обидві, вони мінятимуться місцями довіку.
GoBar — здоров'я, мана, досвід
var hp := GoBar.new()
hp.label_text = "HP"
hp.ink = GoUi.color(GoTheme.DANGER_FILL) # токен лише для заливки
hp.set_values(320, 500) # "320 / 500"
Зміни плавно йдуть за 0,18 с — смуга здоров'я, що стрибає, не каже, наскільки сильно вас вдарили.
reduce_motion робить зміну миттєвою. Великі числа скорочуються до 12.3k, щоб
ширина смуги не сіпалася, коли цифри приходять і йдуть.
GoSlot — один швидкий слот
Іконка, кількість, відкат і гаряча клавіша на одному лицьовому боці. Якщо чіпляти бейджі на маленьке коло, кожен слот виходить іншої ширини, і ряд хитається.
touch_peers.
keyboard_focus типово вимкнено, щоб ряд із восьми слотів не стояв у порядку Tab між
користувачем клавіатури й кожним контролом налаштувань. Вмикайте його, коли клавіатура чи геймпад —
єдиний спосіб вводу.
GoJoystick — віртуальний стик
| Режим | Поведінка |
|---|---|
FIXED | Завжди на тому самому місці — легко знайти, не дивлячись |
FOLLOW | З'являється там, де ліг великий палець |
RELATIVE | Після появи далі йде за пальцем — зручно для довгого руху |
Vector2 із сигналу moved має довжину 0–1, тож його можна одразу множити на
швидкість; він не залежить ні від розміру екрана, ні від DPI.
GoIconButton — виглядає малою, натискається великою
touch_peers.