pragma ComponentBehavior: Bound import QtQuick import Caelestia.Config import qs.components import qs.components.effects import qs.services StyledRect { id: root required property int activeWsId required property Repeater workspaces required property Item mask required property bool fullscreen readonly property int currentWsIdx: { let i = activeWsId - 1; while (i < 0) i += Config.bar.workspaces.shown; return i % Config.bar.workspaces.shown; } property real leading: workspaces.count > 0 ? workspaces.itemAt(currentWsIdx)?.y ?? 0 : 0 property real trailing: workspaces.count > 0 ? workspaces.itemAt(currentWsIdx)?.y ?? 0 : 0 property real currentSize: workspaces.count > 0 ? (workspaces.itemAt(currentWsIdx) as Workspace)?.size ?? 0 : 0 property real offset: Math.min(leading, trailing) property real size: { const s = Math.abs(leading - trailing) + currentSize; if (Config.bar.workspaces.activeTrail && lastWs > currentWsIdx) { const ws = workspaces.itemAt(lastWs) as Workspace; return ws ? Math.min(ws.y + ws.size - offset, s) : 0; } return s; } property int cWs property int lastWs onCurrentWsIdxChanged: { lastWs = cWs; cWs = currentWsIdx; } clip: true y: offset + mask.y implicitWidth: Tokens.sizes.bar.innerWidth - Tokens.padding.small implicitHeight: size radius: Tokens.rounding.full color: Colours.palette.m3primary Colouriser { source: root.mask sourceColor: Colours.palette.m3onSurface colorizationColor: Colours.palette.m3onPrimary x: 0 y: -parent.offset implicitWidth: root.mask.implicitWidth implicitHeight: root.mask.implicitHeight anchors.horizontalCenter: parent.horizontalCenter } Behavior on leading { enabled: root.Config.bar.workspaces.activeTrail EAnim {} } Behavior on trailing { enabled: root.Config.bar.workspaces.activeTrail EAnim { duration: Tokens.anim.durations.normal * 2 } } Behavior on currentSize { enabled: root.Config.bar.workspaces.activeTrail EAnim {} } Behavior on offset { enabled: !root.Config.bar.workspaces.activeTrail EAnim {} } Behavior on size { enabled: !root.Config.bar.workspaces.activeTrail EAnim {} } component EAnim: Anim { type: Anim.Emphasized } }