diff --git a/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/Clock.qml b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/Clock.qml
new file mode 100644
index 00000000..f076d28b
--- /dev/null
+++ b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/Clock.qml
@@ -0,0 +1,14 @@
+import QtQuick 2.15
+import SddmComponents 2.0
+
+Clock {
+ id: time
+ color: config.text
+ timeFont.family: config.Font
+ dateFont.family: config.Font
+ anchors {
+ margins: 10
+ top: parent.top
+ right: parent.right
+ }
+}
diff --git a/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/LoginPanel.qml b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/LoginPanel.qml
new file mode 100644
index 00000000..e0dec79b
--- /dev/null
+++ b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/LoginPanel.qml
@@ -0,0 +1,147 @@
+import QtQuick 2.15
+import QtQuick.Window 2.15
+import QtQuick.Controls 2.15
+
+Item {
+ property var user: userField.text
+ property var password: passwordField.text
+ property var session: sessionPanel.session
+ property var inputHeight: Screen.height * 0.032
+ property var inputWidth: Screen.width * 0.16
+ Rectangle {
+ id: loginBackground
+ anchors {
+ verticalCenter: parent.verticalCenter
+ horizontalCenter: parent.horizontalCenter
+ }
+ height: inputHeight * 5.3
+ width: inputWidth * 1.2
+ radius: 5
+ visible: config.LoginBackground == "true" ? true : false
+ color: config.mantle
+ }
+ Column {
+ spacing: 8
+ anchors {
+ bottom: parent.bottom
+ left: parent.left
+ }
+ PowerButton {
+ id: powerButton
+ }
+ RebootButton {
+ id: rebootButton
+ }
+ SleepButton {
+ id: sleepButton
+ }
+ z: 5
+ }
+ Column {
+ spacing: 8
+ anchors {
+ bottom: parent.bottom
+ right: parent.right
+ }
+ SessionPanel {
+ id: sessionPanel
+ }
+ z: 5
+ }
+ Column {
+ spacing: 8
+ z: 5
+ width: inputWidth
+ anchors {
+ verticalCenter: parent.verticalCenter
+ horizontalCenter: parent.horizontalCenter
+ }
+ UserField {
+ id: userField
+ height: inputHeight
+ width: parent.width
+ }
+ PasswordField {
+ id: passwordField
+ height: inputHeight
+ width: parent.width
+ onAccepted: loginButton.clicked()
+ }
+ Button {
+ id: loginButton
+ height: inputHeight
+ width: parent.width
+ enabled: user != "" && password != "" ? true : false
+ hoverEnabled: true
+ contentItem: Text {
+ id: buttonText
+ renderType: Text.NativeRendering
+ font {
+ family: config.Font
+ pointSize: config.FontSize
+ bold: true
+ }
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ color: config.crust
+ text: "Login"
+ }
+ background: Rectangle {
+ id: buttonBackground
+ color: config.sapphire
+ radius: 3
+ }
+ states: [
+ State {
+ name: "pressed"
+ when: loginButton.down
+ PropertyChanges {
+ target: buttonBackground
+ color: config.teal
+ }
+ PropertyChanges {
+ target: buttonText
+ }
+ },
+ State {
+ name: "hovered"
+ when: loginButton.hovered
+ PropertyChanges {
+ target: buttonBackground
+ color: config.teal
+ }
+ PropertyChanges {
+ target: buttonText
+ }
+ },
+ State {
+ name: "enabled"
+ when: loginButton.enabled
+ PropertyChanges {
+ target: buttonBackground
+ }
+ PropertyChanges {
+ target: buttonText
+ }
+ }
+ ]
+ transitions: Transition {
+ PropertyAnimation {
+ properties: "color"
+ duration: 300
+ }
+ }
+ onClicked: {
+ sddm.login(user, password, session)
+ }
+ }
+ }
+ Connections {
+ target: sddm
+
+ function onLoginFailed() {
+ passwordField.text = ""
+ passwordField.focus = true
+ }
+ }
+}
diff --git a/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/PasswordField.qml b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/PasswordField.qml
new file mode 100644
index 00000000..dd0f384b
--- /dev/null
+++ b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/PasswordField.qml
@@ -0,0 +1,48 @@
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+
+TextField {
+ id: passwordField
+ focus: true
+ selectByMouse: true
+ placeholderText: "Password"
+ echoMode: TextInput.Password
+ passwordCharacter: "•"
+ passwordMaskDelay: config.PasswordShowLastLetter
+ selectionColor: config.overlay0
+ renderType: Text.NativeRendering
+ font.family: config.Font
+ font.pointSize: config.FontSize
+ font.bold: true
+ color: config.text
+ horizontalAlignment: TextInput.AlignHCenter
+ background: Rectangle {
+ id: passFieldBackground
+ radius: 3
+ color: config.surface0
+ }
+ states: [
+ State {
+ name: "focused"
+ when: passwordField.activeFocus
+ PropertyChanges {
+ target: passFieldBackground
+ color: config.surface1
+ }
+ },
+ State {
+ name: "hovered"
+ when: passwordField.hovered
+ PropertyChanges {
+ target: passFieldBackground
+ color: config.surface1
+ }
+ }
+ ]
+ transitions: Transition {
+ PropertyAnimation {
+ properties: "color"
+ duration: 300
+ }
+ }
+}
diff --git a/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/PowerButton.qml b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/PowerButton.qml
new file mode 100644
index 00000000..dc742692
--- /dev/null
+++ b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/PowerButton.qml
@@ -0,0 +1,41 @@
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+
+Item {
+ implicitHeight: powerButton.height
+ implicitWidth: powerButton.width
+ Button {
+ id: powerButton
+ height: inputHeight
+ width: inputHeight
+ hoverEnabled: true
+ icon {
+ source: Qt.resolvedUrl("../icons/power.svg")
+ height: height
+ width: width
+ color: config.crust
+ }
+ background: Rectangle {
+ id: powerButtonBackground
+ radius: 3
+ color: config.red
+ }
+ states: [
+ State {
+ name: "hovered"
+ when: powerButton.hovered
+ PropertyChanges {
+ target: powerButtonBackground
+ color: config.rosewater
+ }
+ }
+ ]
+ transitions: Transition {
+ PropertyAnimation {
+ properties: "color"
+ duration: 300
+ }
+ }
+ onClicked: sddm.powerOff()
+ }
+}
diff --git a/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/RebootButton.qml b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/RebootButton.qml
new file mode 100644
index 00000000..a2c9b9ff
--- /dev/null
+++ b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/RebootButton.qml
@@ -0,0 +1,41 @@
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+
+Item {
+ implicitHeight: rebootButton.height
+ implicitWidth: rebootButton.width
+ Button {
+ id: rebootButton
+ height: inputHeight
+ width: inputHeight
+ hoverEnabled: true
+ icon {
+ source: Qt.resolvedUrl("../icons/reboot.svg")
+ height: height
+ width: width
+ color: config.crust
+ }
+ background: Rectangle {
+ id: rebootButtonBackground
+ radius: 3
+ color: config.red
+ }
+ states: [
+ State {
+ name: "hovered"
+ when: rebootButton.hovered
+ PropertyChanges {
+ target: rebootButtonBackground
+ color: config.rosewater
+ }
+ }
+ ]
+ transitions: Transition {
+ PropertyAnimation {
+ properties: "color"
+ duration: 300
+ }
+ }
+ onClicked: sddm.reboot()
+ }
+}
diff --git a/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/SessionPanel.qml b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/SessionPanel.qml
new file mode 100644
index 00000000..0edfcb30
--- /dev/null
+++ b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/SessionPanel.qml
@@ -0,0 +1,156 @@
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+import QtQml.Models 2.15
+
+Item {
+ property var session: sessionList.currentIndex
+ implicitHeight: sessionButton.height
+ implicitWidth: sessionButton.width
+ DelegateModel {
+ id: sessionWrapper
+ model: sessionModel
+ delegate: ItemDelegate {
+ id: sessionEntry
+ height: inputHeight
+ width: parent.width
+ highlighted: sessionList.currentIndex == index
+ contentItem: Text {
+ renderType: Text.NativeRendering
+ font.family: config.Font
+ font.pointSize: config.FontSize
+ font.bold: true
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ color: config.text
+ text: name
+ }
+ background: Rectangle {
+ id: sessionEntryBackground
+ color: config.surface1
+ radius: 3
+ }
+ states: [
+ State {
+ name: "hovered"
+ when: sessionEntry.hovered
+ PropertyChanges {
+ target: sessionEntryBackground
+ color: config.surface2
+ }
+ }
+ ]
+ transitions: Transition {
+ PropertyAnimation {
+ property: "color"
+ duration: 300
+ }
+ }
+ MouseArea {
+ anchors.fill: parent
+ onClicked: {
+ sessionList.currentIndex = index
+ sessionPopup.close()
+ }
+ }
+ }
+ }
+ Button {
+ id: sessionButton
+ height: inputHeight
+ width: inputHeight
+ hoverEnabled: true
+ icon {
+ source: Qt.resolvedUrl("../icons/settings.svg")
+ height: height
+ width: width
+ color: config.text
+ }
+ background: Rectangle {
+ id: sessionButtonBackground
+ color: config.surface0
+ radius: 3
+ }
+ states: [
+ State {
+ name: "pressed"
+ when: sessionButton.down
+ PropertyChanges {
+ target: sessionButtonBackground
+ color: config.surface1
+ }
+ },
+ State {
+ name: "hovered"
+ when: sessionButton.hovered
+ PropertyChanges {
+ target: sessionButtonBackground
+ color: config.surface2
+ }
+ },
+ State {
+ name: "selection"
+ when: sessionPopup.visible
+ PropertyChanges {
+ target: sessionButtonBackground
+ color: config.surface2
+ }
+ }
+ ]
+ transitions: Transition {
+ PropertyAnimation {
+ properties: "color"
+ duration: 150
+ }
+ }
+ onClicked: {
+ sessionPopup.visible ? sessionPopup.close() : sessionPopup.open()
+ sessionButton.state = "pressed"
+ }
+ }
+ Popup {
+ id: sessionPopup
+ width: inputWidth + padding * 2
+ x: (sessionButton.width + sessionList.spacing) * -7.6
+ y: -(contentHeight + padding * 2) + sessionButton.height
+ padding: inputHeight / 10
+ background: Rectangle {
+ radius: 5.4
+ color: config.surface0
+ }
+ contentItem: ListView {
+ id: sessionList
+ implicitHeight: contentHeight
+ spacing: 8
+ model: sessionWrapper
+ currentIndex: sessionModel.lastIndex
+ clip: true
+ }
+ enter: Transition {
+ ParallelAnimation {
+ NumberAnimation {
+ property: "opacity"
+ from: 0
+ to: 1
+ duration: 400
+ easing.type: Easing.OutExpo
+ }
+ NumberAnimation {
+ property: "x"
+ from: sessionPopup.x + (inputWidth * 0.1)
+ to: sessionPopup.x
+ duration: 500
+ easing.type: Easing.OutExpo
+ }
+ }
+ }
+ exit: Transition {
+ NumberAnimation {
+ property: "opacity"
+ from: 1
+ to: 0
+ duration: 300
+ easing.type: Easing.OutExpo
+ }
+ }
+ }
+}
diff --git a/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/SleepButton.qml b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/SleepButton.qml
new file mode 100644
index 00000000..f4a4b7a0
--- /dev/null
+++ b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/SleepButton.qml
@@ -0,0 +1,41 @@
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+
+Item {
+ implicitHeight: sleepButton.height
+ implicitWidth: sleepButton.width
+ Button {
+ id: sleepButton
+ height: inputHeight
+ width: inputHeight
+ hoverEnabled: true
+ icon {
+ source: Qt.resolvedUrl("../icons/sleep.svg")
+ height: height
+ width: width
+ color: config.crust
+ }
+ background: Rectangle {
+ id: sleepButtonBg
+ color: config.red
+ radius: 3
+ }
+ states: [
+ State {
+ name: "hovered"
+ when: sleepButton.hovered
+ PropertyChanges {
+ target: sleepButtonBg
+ color: config.rosewater
+ }
+ }
+ ]
+ transitions: Transition {
+ PropertyAnimation {
+ properties: "color"
+ duration: 300
+ }
+ }
+ onClicked: sddm.suspend()
+ }
+}
diff --git a/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/UserField.qml b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/UserField.qml
new file mode 100644
index 00000000..9f8ca61a
--- /dev/null
+++ b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Components/UserField.qml
@@ -0,0 +1,50 @@
+import QtQuick 2.15
+import QtQuick.Controls 2.15
+
+TextField {
+ id: userField
+ height: inputHeight
+ width: inputWidth
+ selectByMouse: true
+ echoMode: TextInput.Normal
+ selectionColor: config.overlay0
+ renderType: Text.NativeRendering
+ font {
+ family: config.Font
+ pointSize: config.FontSize
+ bold: true
+ }
+ color: config.text
+ horizontalAlignment: Text.AlignHCenter
+ placeholderText: "Username"
+ text: userModel.lastUser
+ background: Rectangle {
+ id: userFieldBackground
+ color: config.surface0
+ radius: 3
+ }
+ states: [
+ State {
+ name: "focused"
+ when: userField.activeFocus
+ PropertyChanges {
+ target: userFieldBackground
+ color: config.surface1
+ }
+ },
+ State {
+ name: "hovered"
+ when: userField.hovered
+ PropertyChanges {
+ target: userFieldBackground
+ color: config.surface1
+ }
+ }
+ ]
+ transitions: Transition {
+ PropertyAnimation {
+ properties: "color"
+ duration: 300
+ }
+ }
+}
diff --git a/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Main.qml b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Main.qml
new file mode 100644
index 00000000..422054bf
--- /dev/null
+++ b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/Main.qml
@@ -0,0 +1,48 @@
+import QtQuick 2.15
+import QtQuick.Window 2.15
+import QtQuick.Controls 2.15
+import "Components"
+
+Item {
+ id: root
+ height: Screen.height
+ width: Screen.width
+ Rectangle {
+ id: background
+ anchors.fill: parent
+ height: parent.height
+ width: parent.width
+ z: 0
+ color: config.base
+ }
+ Image {
+ id: backgroundImage
+ anchors.fill: parent
+ height: parent.height
+ width: parent.width
+ fillMode: Image.PreserveAspectCrop
+ visible: config.CustomBackground == "true" ? true : false
+ z: 1
+ source: config.Background
+ asynchronous: false
+ cache: true
+ mipmap: true
+ clip: true
+ }
+ Item {
+ id: mainPanel
+ z: 3
+ anchors {
+ fill: parent
+ margins: 50
+ }
+ Clock {
+ id: time
+ visible: config.ClockEnabled == "true" ? true : false
+ }
+ LoginPanel {
+ id: loginPanel
+ anchors.fill: parent
+ }
+ }
+}
diff --git a/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/assets/angle-down.png b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/assets/angle-down.png
new file mode 100644
index 00000000..f621bfc9
Binary files /dev/null and b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/assets/angle-down.png differ
diff --git a/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/backgrounds/.gitkeep b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/backgrounds/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/icons/power.svg b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/icons/power.svg
new file mode 100644
index 00000000..83cd4cdf
--- /dev/null
+++ b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/icons/power.svg
@@ -0,0 +1,14 @@
+
+
\ No newline at end of file
diff --git a/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/icons/reboot.svg b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/icons/reboot.svg
new file mode 100644
index 00000000..5506bbb0
--- /dev/null
+++ b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/icons/reboot.svg
@@ -0,0 +1,13 @@
+
+
\ No newline at end of file
diff --git a/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/icons/settings.svg b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/icons/settings.svg
new file mode 100644
index 00000000..9a64fbdf
--- /dev/null
+++ b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/icons/settings.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/icons/sleep.svg b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/icons/sleep.svg
new file mode 100644
index 00000000..85d315cf
--- /dev/null
+++ b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/icons/sleep.svg
@@ -0,0 +1,5 @@
+
+
\ No newline at end of file
diff --git a/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/metadata.desktop b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/metadata.desktop
new file mode 100644
index 00000000..d6693d51
--- /dev/null
+++ b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/metadata.desktop
@@ -0,0 +1,14 @@
+[SddmGreeterTheme]
+Name=Catppuccin macchiato
+Description=Soothing pastel theme for SDDM
+Type=sddm-theme
+Version=2.1
+Website=https://github.com/catppuccin/sddm
+Screenshot=preview.png
+MainScript=Main.qml
+ConfigFile=theme.conf
+TranslationsDirectory=translations
+Theme-Id=Catppuccin
+Theme-API=2.0
+License=MIT
+QtVersion=6
diff --git a/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/preview.png b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/preview.png
new file mode 100644
index 00000000..bc262d2e
Binary files /dev/null and b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/preview.png differ
diff --git a/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/theme.conf b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/theme.conf
new file mode 100644
index 00000000..e9036030
--- /dev/null
+++ b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/theme.conf
@@ -0,0 +1,39 @@
+[General]
+Font="Noto Sans"
+FontSize=9
+ClockEnabled="true"
+CustomBackground="false"
+LoginBackground="false"
+Background="backgrounds/wall.jpg"
+
+# Uncomment this option to show the last letter of the password
+# for the number of milliseconds specified
+# PasswordShowLastLetter=1000
+
+# DON'T CHANGE THESE
+rosewater = "#f4dbd6"
+flamingo = "#f0c6c6"
+pink = "#f5bde6"
+mauve = "#c6a0f6"
+red = "#ed8796"
+maroon = "#ee99a0"
+peach = "#f5a97f"
+yellow = "#eed49f"
+green = "#a6da95"
+teal = "#8bd5ca"
+sky = "#91d7e3"
+sapphire = "#7dc4e4"
+blue = "#8aadf4"
+lavender = "#b7bdf8"
+text = "#cad3f5"
+subtext1 = "#b8c0e0"
+subtext0 = "#a5adcb"
+overlay2 = "#939ab7"
+overlay1 = "#8087a2"
+overlay0 = "#6e738d"
+surface2 = "#5b6078"
+surface1 = "#494d64"
+surface0 = "#363a4f"
+base = "#24273a"
+mantle = "#1e2030"
+crust = "#181926"
diff --git a/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/theme.conf.user b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/theme.conf.user
new file mode 100644
index 00000000..68c66429
--- /dev/null
+++ b/roles/config/files/usr/share/sddm/themes/catppuccin-macchiato/theme.conf.user
@@ -0,0 +1,2 @@
+[General]
+type=image
diff --git a/roles/config/tasks/main.yml b/roles/config/tasks/main.yml
index 35c421c0..965bee71 100644
--- a/roles/config/tasks/main.yml
+++ b/roles/config/tasks/main.yml
@@ -58,6 +58,7 @@
dest: "/"
loop:
- "etc"
+ - "usr"
become: true
tags: config