import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15 // import QtQuick.Effects // Disabled - causes issues on linuxfb Rectangle { property alias text: buttonLabel.text property string icon: "" property color buttonColor: "#2196F3" property bool enabled: true property int fontSize: 16 property int iconSize: -1 // -1 means use fontSize + 2 signal clicked() radius: 12 color: enabled ? buttonColor : "#E0E0E0" opacity: enabled ? 1.0 : 0.6 border.width: 1 border.color: Qt.darker(buttonColor, 1.2) // Gradient effect gradient: Gradient { GradientStop { position: 0; color: Qt.lighter(buttonColor, 1.1) } GradientStop { position: 1; color: buttonColor } } // Press animation scale: mouseArea.pressed ? 0.95 : (mouseArea.containsMouse ? 1.02 : 1.0) Behavior on scale { NumberAnimation { duration: 150; easing.type: Easing.OutQuad } } Behavior on color { ColorAnimation { duration: 200 } } // Shadow effect - disabled on linuxfb (causes rendering issues) // Using border instead for visual separation // layer.enabled: true // layer.effect: MultiEffect { // shadowEnabled: true // shadowColor: "#25000000" // shadowBlur: 0.8 // shadowVerticalOffset: 2 // } RowLayout { anchors.centerIn: parent spacing: 8 Text { text: parent.parent.icon font.pixelSize: parent.parent.iconSize > 0 ? parent.parent.iconSize : parent.parent.fontSize + 2 color: "white" visible: parent.parent.icon !== "" } Label { id: buttonLabel color: "white" font.pixelSize: parent.parent.fontSize font.bold: true } } MouseArea { id: mouseArea anchors.fill: parent hoverEnabled: true enabled: parent.enabled onClicked: parent.clicked() // Ripple effect Rectangle { id: ripple width: 0 height: 0 radius: width / 2 color: "#40FFFFFF" anchors.centerIn: parent NumberAnimation { id: rippleAnimation target: ripple property: "width" from: 0 to: parent.width * 1.2 duration: 400 easing.type: Easing.OutQuad onFinished: { ripple.width = 0 ripple.height = 0 } } Connections { target: mouseArea function onPressed() { ripple.height = ripple.width rippleAnimation.start() } } } } }