import QtQuick import QtQuick.Controls import QtQuick.Controls.Material import QtQuick.Layouts import TactileIPC 1.0 Item { id: root implicitWidth: 350 property alias title: titleText.text property bool expanded: true property int contentPadding: 12 property color panelBgColor: Backend.lightMode ? "#FFFFFF" : "#2F2F2F" property color panelBorderColor: Backend.lightMode ? "#E0E0E0" : "#3A3A3A" property color titleColor: Backend.lightMode ? "#424242" : "#E0E0E0" property color dividerColor: Backend.lightMode ? "#EEEEEE" : "#3A3A3A" default property alias content: contentArea.data implicitHeight: header.height + contentWrapper.height Rectangle { id: panelBg anchors.fill: parent radius: 6 color: root.panelBgColor border.color: root.panelBorderColor } Rectangle { id: header width: parent.width height: 44 radius: 6 color: "transparent" anchors.top: parent.top anchors.left: parent.left anchors.right: parent.right MouseArea { anchors.fill: parent onClicked: root.expanded = !root.expanded } RowLayout { anchors.fill: parent anchors.leftMargin: 12 anchors.rightMargin: 8 spacing: 8 Rectangle { width: 10 height: 10 radius: 2 color: Material.color(Material.Green) Layout.alignment: Qt.AlignVCenter } Label { id: titleText text: "placehold" font.pixelSize: 16 color: root.titleColor Layout.fillWidth: true Layout.alignment: Qt.AlignVCenter } ToolButton { id: arrowBtn text: "\u25BE" font.pixelSize: 18 background: null rotation: root.expanded ? 180 : 0 Layout.alignment: Qt.AlignVCenter Behavior on rotation { NumberAnimation { duration: 200; easing.type: Easing.InOutQuad } } onClicked: root.expanded = !root.expanded } } Rectangle { height: 1 anchors.left: parent.left anchors.right: parent.right anchors.bottom: parent.bottom color: root.dividerColor visible: true } } Item { id: contentWrapper anchors.top: header.bottom anchors.left: parent.left anchors.right: parent.right height: root.expanded ? contentArea.implicitHeight + root.contentPadding * 2 : 0 clip: true Behavior on height { NumberAnimation { duration: 220; easing.type: Easing.InOutQuad } } ColumnLayout { id: contentArea anchors.fill: parent anchors.margins: root.contentPadding spacing: 10 } } }