UIButton, UIInput и UITextArea
Три элемента, принимающие ввод пользователя. UIButton — единственный тапабельный контейнер —
обработчики касаний существуют только на UIButton, UIScreen и UIWidget (см.
События указателя); чтобы сделать что-либо кликабельным (карточку, строку
списка, иконку), оберни это в UIButton. UIInput — однострочное текстовое поле, UITextArea — его
многострочный собрат.
Обзор
let input: UIInput
const form = UIColumn([
input = UIInput()
.style({ height: 40, px: 12, borderRadius: 8, bgColor: "white", color: "black",
placeholder: "Your name", placeholderColor: "#999" })
.onChange(v => console.log("typing:", v)),
UIButton([ UIText("Submit").style({ color: "white" }) ])
.style({ height: 40, justifyContent: "center", bgColor: "#FF4032", borderRadius: 8,
onPressed: { opacity: 0.7 }, rippleColor: "default" })
.onClick(() => console.log("submitted:", input.value)),
]).style({ gap: 8 })UIButton
UIButton(): UIButton
UIButton(children: UINodeChild[]): UIButtonКонтейнер, действующий как UIRow с вертикально центрированными детьми. Полная поверхность
контейнера: .append / .insert / .remove / .setContent, .style, .animateTo /
.animateFrom, .onLayout. Используй flexDirection: "column" для кнопки в форме карточки.
button.onClick(ev => …) // отпускание над кнопкой; ev: ClickEvent
button.onTouchStart(ev => …) // нажатие; ev.track({...}) начинает жест перетаскивания
button.isPressed(): boolean // true, пока палец сейчас на кнопкеСобытия onClick / onTouchStart несут clientX / clientY / pointerId (логические px).
Перетаскивания — ev.track(), claim — работают ровно как описано в
События указателя.
кнопки не рисуют собственного оформления — стилизуй их как любой контейнер (bgColor,
borderRadius, отступы). Дай кнопке явный height: сама по себе она высотой только со свой текст.
Отклик на нажатие — по желанию
button.style({
onPressed: { opacity: 0.7, bgColor: "#c22", duration: 150 }, // стиль во время нажатия
rippleColor: "default", // Android-ripple; или любой Color
})Визуально при нажатии ничего не происходит, пока не попросишь. onPressed принимает рисуемые/базовые
стили (bgColor, opacity, border*, transform, …), применяемые, пока палец внизу, плюс
необязательный переход duration (мс). rippleColor — только Android и заменяет там визуал
onPressed — так что установка обоих даёт ripple на Android и стиль onPressed на iOS.
Для стойкого визуального состояния, которое переключаешь сам (выбрано, отмечено, активно), а не
управляемого системой, объяви класс стиля ($name) и переключай его через setClass/toggleClass
— см. Классы стилей. onPressed всегда бьёт класс, пока нажато.
UIInput и UITextArea
UIInput(): UIInput // однострочное поле
UITextArea(): UITextArea // многострочноеinput.value // get/set текущего текста (свойство контента, не стиль)
input.onChange(cb: (value: string) => void): this // каждое изменение
input.onFocus(cb: () => void): this
input.onBlur(cb: () => void): thisСпецифичные для инпута стили, поверх обычных стилей элемента + текста (fontSize, color,
fontFamily, …):
input.style({
placeholder: "Search…",
placeholderColor: "#999",
type: "search", // "text" (по умолчанию) | "password" | "search"
onFocused: { borderColor: "#FF4032", duration: 150 }, // стиль во время фокуса (как onPressed)
})дай инпутам явный height и flexGrow: 1 (в строке) или width — инпут схлопывается до ширины
своего плейсхолдера и высоты своего текста, он не растягивается как веб-<input>.
события отправки нет — ни onSubmit, ни колбэка по клавише enter. Паттерн — кнопка
Send/Submit UIButton рядом с полем, читающая input.value.
Подводные камни
// ✗ обработчик касания на обычном контейнере
UIColumn([...]).onTouchStart(cb) // нет такого метода — только UIButton/UIScreen/UIWidget
// ✓ оберни в UIButton
UIButton([...]).onTouchStart(cb)
// ✗ кнопка рядом с инпутом 40px сжимается до высоты своего текста
UIRow([ input.style({ height: 40 }), UIButton([icon]) ])
// ✓ дай контролам одинаковый явный height
UIRow([ input.style({ height: 40 }), UIButton([icon]).style({ height: 40 }) ])Смотрите также
- События указателя и жесты — объекты событий,
ev.track(),claim. - Стилизация —
.style(), состояния стиля,animateTo. - Контейнеры — правила раскладки
UIRow/UIColumn, которые наследует кнопка.