1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
|
# DMS Quickshell Interface
QML-based desktop shell interface for DankMaterialShell providing panels, widgets, and overlays.
**See [root README](../README.md) for project overview and installation.**
## Architecture
**Modular QML Structure**
- `Modules/` - UI components (panels, widgets, overlays)
- `Services/` - System integration singletons (audio, network, bluetooth)
- `Widgets/` - Reusable UI controls
- `Common/` - Shared resources and themes
**Technology Stack**
- [Quickshell](https://quickshell.org/) - QML-based shell framework
- Qt/QtQuick - UI rendering and controls
- Material Design 3 - Design system and theming
## Development
**Run the shell:**
```bash
quickshell -p quickshell/
```
**Code formatting:**
```bash
qmlfmt -t 4 -i 4 -b 250 -w path/to/file.qml
make lint-qml # Run from repo root; requires quickshell/.qmlls.ini (generated by `qs -p quickshell/`)
# Uses Qt 6 qmllint. Override path with QMLLINT=/path/to/qmllint if needed.
# Auto-detects `qmllint6`, Fedora's `qmllint-qt6`, `/usr/lib/qt6/bin/qmllint`, then `qmllint`.
```
## Components
**Panels & Bars**
- `Modules/TopBar/` - Multi-monitor status bars with workspace switching
- `Modules/DankBar/` - Customizable widget bar with plugin support
- `Modules/Dock/` - Application dock with window management
**System Controls**
- `Modules/ControlCenter/` - WiFi, Bluetooth, audio, display settings
- `Modules/Notifications/` - Notification center with popups
- `Modules/Greetd/` - Login greeter interface
**Overlays**
- `Modules/Spotlight/` - Application and file launcher
- `Modules/Overview/` - Workspace overview
- `Modules/Lock/` - Screen lock system
**Utilities**
- `Modules/ProcessList/` - System monitoring and process management
- `Modules/Calendar/` - Calendar widget with event sync
- `Modules/Weather/` - Weather display
## Services
Singletons providing system integration:
**Media & Audio**
- `AudioService` - PipeWire/PulseAudio volume and device control
- `MprisController` - Media player integration
**Network**
- `NetworkService` - NetworkManager WiFi control
- `BluetoothService` - BlueZ Bluetooth management
**Display**
- `DisplayService` - Brightness control and night mode
- `WallpaperService` - Wallpaper management and effects
**System**
- `BatteryService` - Battery status and power profiles
- `IdleService` - Idle detection and inhibit locks
- `ClipboardService` - Clipboard history with images
- `DgopService` - System metrics (CPU, RAM, GPU)
**Integration**
- `NiriService` - Niri workspace integration
- `HyprlandService` - Hyprland workspace integration
- `PluginService` - Plugin discovery and lifecycle
## Widgets
Reusable Material Design 3 components in `Widgets/`:
- `DankIcon` - Icon component with Material font
- `DankSlider` - Enhanced slider with animations
- `DankToggle` - Toggle switch component
- `DankTabBar` - Tab bar implementation
- `DankGridView` - Grid layout with adaptive columns
- `DankListView` - Scrollable list view
- `DankTextField` - Text input with validation
- `DankDropdown` - Dropdown selection
- `DankPopout` - Base for overlay components
- `StateLayer` - Material interaction states
## Theming
**Dynamic Color Schemes**
Wallpaper-based theming using [matugen](https://github.com/InioX/matugen):
```qml
import qs.Common
Rectangle {
color: Theme.container
border.color: Theme.outline
}
```
Theme singleton provides Material Design 3 color system, spacing, fonts, and elevation.
**Application Themes**
Templates in `scripts/templates/` generate themes for:
- GTK 3/4
- Qt5/Qt6
- Alacritty, Kitty, Ghostty, Foot, Wezterm terminals
- Neovim
- VSCode/VSCodium
- Firefox
## Multi-Monitor Support
Per-monitor panel instances using Quickshell `Variants`:
```qml
Variants {
model: Quickshell.screens
PanelWindow {
screen: modelData
// Per-screen configuration
}
}
```
Workspace switchers adapt to compositor (Niri/Hyprland).
## Plugin System
External plugins in `~/.config/DankMaterialShell/plugins/`:
**Widget plugins** - UI components in DankBar
**Daemon plugins** - Background processes without UI
Plugin manifest (`plugin.json`):
```json
{
"id": "pluginId",
"name": "Plugin Name",
"version": "1.0.0",
"type": "widget",
"component": "./Widget.qml",
"settings": "./Settings.qml",
"permissions": ["settings_read", "settings_write"]
}
```
Plugins access `pluginService` for persistent data:
```qml
pluginService.savePluginData("pluginId", "key", value)
pluginService.loadPluginData("pluginId", "key", defaultValue)
```
## IPC Integration
Backend IPC socket communication:
```qml
import Quickshell.Io
Process {
command: ["dms", "ipc", "call", "spotlight", "toggle"]
running: true
}
```
Common IPC commands exposed through services for reactive property bindings.
## Code Conventions
**Component Structure:**
```qml
import QtQuick
import Quickshell
import qs.Common
import qs.Services
Item {
id: root
property type name: value
signal customSignal(type param)
Component { /* children */ }
}
```
**Services (Singletons):**
```qml
import QtQuick
import Quickshell
pragma Singleton
pragma ComponentBehavior: Bound
Singleton {
id: root
property bool featureAvailable: false
property type currentValue: defaultValue
function performAction(param) { /* implementation */ }
}
```
**Guidelines:**
- Use `Theme.propertyName` for consistent styling
- Bind directly to service properties for reactivity
- Use `DankIcon` for all icons
- Implement feature detection and graceful degradation
- 4-space indentation, no unnecessary comments
## Translation
Internationalization using POEditor:
```bash
export POEDITOR_API_TOKEN="token"
export POEDITOR_PROJECT_ID="id"
python3 scripts/i18nsync.py sync
```
Pre-commit hook checks translation sync status.
## License
MIT License - See [LICENSE](../LICENSE) for details.
|