pragma ComponentBehavior: Bound import ".." import QtQuick import QtQuick.Controls import Caelestia.Config import qs.services TextField { id: root color: Colours.palette.m3onSurface placeholderTextColor: Colours.palette.m3outline font.family: Tokens.font.family.sans font.pointSize: Tokens.font.size.smaller renderType: echoMode === TextField.Password ? TextField.QtRendering : TextField.NativeRendering cursorVisible: !readOnly background: null cursorDelegate: StyledRect { id: cursor property bool disableBlink implicitWidth: 2 color: Colours.palette.m3primary radius: Tokens.rounding.normal Connections { function onCursorPositionChanged(): void { if (root.activeFocus && root.cursorVisible) { cursor.opacity = 1; cursor.disableBlink = true; enableBlink.restart(); } } target: root } Timer { id: enableBlink interval: 100 onTriggered: cursor.disableBlink = false } Timer { running: root.activeFocus && root.cursorVisible && !cursor.disableBlink repeat: true triggeredOnStart: true interval: 500 onTriggered: parent.opacity = parent.opacity === 1 ? 0 : 1 } Binding { when: !root.activeFocus || !root.cursorVisible cursor.opacity: 0 } Behavior on opacity { Anim { duration: Tokens.anim.durations.small } } } Behavior on color { CAnim {} } Behavior on placeholderTextColor { CAnim {} } }