Krolyxon
Commit c183b88

Branches

Refs →

aurorac183b88

aurora: nothing os redesign, phase 5 (settings app)

Settings app opens maximized (window rule) in glyph's prefs layout: Doto section words,
captioned pages, key hints. Switch/Choice/Knob/Field restyled as glyph pill toggles,
segmented pills, dotted sliders and pill fields; key caps, credits on about.
Author
krolyxon
Date
2026-10-28 20:49 +0530
Parent
b7d60e8
Commit
c183b8898f05406168dbdef280e80469cc361ff3

+291 −238

14 files changed

  1. M .config/hypr/source/window_rules.lua +2 −4
  2. M .config/quickshell/aurora/Choice.qml +11 −19
  3. M .config/quickshell/aurora/Field.qml +31 −19
  4. M .config/quickshell/aurora/Knob.qml +18 −12
  5. M .config/quickshell/aurora/SetAbout.qml +26 −10
  6. M .config/quickshell/aurora/SetAppearance.qml +8 −6
  7. M .config/quickshell/aurora/SetDisplay.qml +16 −12
  8. M .config/quickshell/aurora/SetInput.qml +6 −4
  9. M .config/quickshell/aurora/SetKeys.qml +14 −15
  10. M .config/quickshell/aurora/SetPower.qml +23 −15
  11. M .config/quickshell/aurora/SetShell.qml +5 −4
  12. M .config/quickshell/aurora/SetWindows.qml +6 −4
  13. M .config/quickshell/aurora/SettingsApp.qml +88 −92
  14. M .config/quickshell/aurora/Switch.qml +37 −22
M .config/hypr/source/window_rules.lua View
@@ -37,7 +37,7 @@ hl.window_rule({
3737 float = true,
3838 })
3939
40−-- aurora's settings app: a normal window, floating and centred by default
40+-- aurora's settings app: a normal window, opened maximized (glyph's full-screen prefs layout, but still a window)
4141 hl.window_rule({
4242 name = "aurora-settings",
4343
@@ -46,7 +46,5 @@ hl.window_rule({
4646 title = "^aurora settings$",
4747 },
4848
49− float = true,
50− size = "960 680",
51− center = true,
49+ maximize = true,
5250 })
M .config/quickshell/aurora/Choice.qml View
@@ -1,7 +1,7 @@
11 import QtQuick
22 import QtQuick.Layouts
33
4−// label + segmented buttons. options: [{value, label}] (settings app)
4+// A settings row: label + a segmented pill where the primary cell slides to the choice. options: [{value, label}]
55 RowLayout {
66 id: c
77 property string label: ""
@@ -9,29 +9,21 @@ RowLayout {
99 property var value
1010 signal picked(var v)
1111 Layout.fillWidth: true
12− spacing: 8
12+ Layout.leftMargin: 18
13+ spacing: 16
1314 Text {
14− Layout.preferredWidth: 150
15+ Layout.preferredWidth: 200
1516 text: c.label
1617 color: Theme.fg
1718 elide: Text.ElideRight
18− font.family: Theme.font
19− font.pixelSize: Theme.fontSize
19+ font.family: Theme.ui
20+ font.pixelSize: 15
2021 }
21− RowLayout {
22+ Segmented {
2223 Layout.fillWidth: true
23− spacing: 2
24− Repeater {
25− model: c.options
26− delegate: IconBtn {
27− required property var modelData
28− Layout.fillWidth: true
29− Layout.preferredWidth: 1 // equal widths, whatever the label length
30− implicitHeight: 26
31− label: modelData.label
32− active: c.value === modelData.value
33− onClicked: c.picked(modelData.value)
34− }
35− }
24+ implicitHeight: 46
25+ options: c.options
26+ value: c.value
27+ onPicked: v => c.picked(v)
3628 }
3729 }
M .config/quickshell/aurora/Field.qml View
@@ -1,43 +1,54 @@
11 import QtQuick
22 import QtQuick.Layouts
33
4−// label + one-line text input; `submitted` fires on Enter or when focus leaves with a changed value (settings app)
4+// A settings row: label + a one-line text pill with the live caret; `submitted` fires on Enter or when focus leaves
5+// with a changed value, `edited` on every keystroke (live filters)
56 RowLayout {
67 id: f
78 property string label: ""
89 property string value: ""
910 property string placeholder: ""
1011 signal submitted(string v)
11− signal edited(string v) // every keystroke (live filters)
12+ signal edited(string v)
1213 Layout.fillWidth: true
13− spacing: 8
14+ Layout.leftMargin: 18
15+ Layout.rightMargin: 14
16+ spacing: 16
1417 Text {
15− Layout.preferredWidth: 150
18+ Layout.preferredWidth: 200
19+ visible: f.label !== ""
1620 text: f.label
1721 color: Theme.fg
1822 elide: Text.ElideRight
19− font.family: Theme.font
20− font.pixelSize: Theme.fontSize
23+ font.family: Theme.ui
24+ font.pixelSize: 15
2125 }
2226 Rectangle {
2327 Layout.fillWidth: true
24− implicitHeight: 28
25− color: Theme.surface
28+ implicitHeight: 46
29+ radius: 23
30+ color: Theme.s2
2631 border.width: 1
27− border.color: input.activeFocus ? Theme.accent : Theme.line
32+ border.color: input.activeFocus ? Theme.fill : Theme.s2
2833 TextInput {
2934 id: input
3035 anchors.fill: parent
31− anchors.leftMargin: 8
32− anchors.rightMargin: 8
36+ anchors.leftMargin: 20
37+ anchors.rightMargin: 20
3338 verticalAlignment: TextInput.AlignVCenter
3439 clip: true
3540 text: f.value
3641 color: Theme.fg
37− selectionColor: Theme.accent
38− selectedTextColor: Theme.bg
39− font.family: Theme.font
40− font.pixelSize: Theme.fontSize
42+ selectionColor: Theme.fill
43+ selectedTextColor: Theme.fillFg
44+ font.family: Theme.ui
45+ font.pixelSize: 15
46+ cursorDelegate: Rectangle {
47+ width: 2
48+ color: Theme.live
49+ visible: input.activeFocus
50+ Timer { running: input.activeFocus; interval: 500; repeat: true; onTriggered: parent.opacity = 1 - parent.opacity }
51+ }
4152 onTextEdited: f.edited(text)
4253 onAccepted: { if (text !== f.value) f.submitted(text); focus = false }
4354 onActiveFocusChanged: if (!activeFocus && text !== f.value) f.submitted(text)
@@ -45,13 +56,14 @@ RowLayout {
4556 }
4657 Text {
4758 anchors.fill: parent
48− anchors.leftMargin: 8
59+ anchors.leftMargin: 20
4960 verticalAlignment: Text.AlignVCenter
5061 visible: input.text === "" && !input.activeFocus
5162 text: f.placeholder
52− color: Theme.dim
53− font.family: Theme.font
54− font.pixelSize: Theme.fontSize
63+ elide: Text.ElideRight
64+ color: Theme.mute
65+ font.family: Theme.ui
66+ font.pixelSize: 15
5567 }
5668 }
5769 }
M .config/quickshell/aurora/Knob.qml View
@@ -1,7 +1,7 @@
11 import QtQuick
22 import QtQuick.Layouts
33
4−// label + slider + value, for an integer or real setting (settings app)
4+// A settings row: label + dotted slider + value, for an integer or real setting
55 RowLayout {
66 id: k
77 property string label: ""
@@ -12,14 +12,17 @@ RowLayout {
1212 property string unit: ""
1313 signal moved(real v)
1414 Layout.fillWidth: true
15− spacing: 8
15+ Layout.leftMargin: 18
16+ Layout.rightMargin: 14
17+ implicitHeight: 48
18+ spacing: 16
1619 Text {
17− Layout.preferredWidth: 150
20+ Layout.preferredWidth: 200
1821 text: k.label
1922 color: Theme.fg
2023 elide: Text.ElideRight
21− font.family: Theme.font
22− font.pixelSize: Theme.fontSize
24+ font.family: Theme.ui
25+ font.pixelSize: 15
2326 }
2427 BarSlider {
2528 Layout.fillWidth: true
@@ -29,12 +32,15 @@ RowLayout {
2932 value: k.value
3033 onMoved: v => k.moved(k.decimals ? Math.round(v * 100) / 100 : Math.round(v))
3134 }
32− Text {
33− Layout.preferredWidth: 56
34− horizontalAlignment: Text.AlignRight
35− text: (k.decimals ? k.value.toFixed(k.decimals) : String(Math.round(k.value))) + k.unit
36− color: Theme.fg
37− font.family: Theme.font
38− font.pixelSize: Theme.fontSize
35+ Rectangle {
36+ Layout.preferredWidth: 76
37+ implicitHeight: 32
38+ radius: 16
39+ color: Theme.s2
40+ Lb {
41+ anchors.centerIn: parent
42+ text: (k.decimals ? k.value.toFixed(k.decimals) : String(Math.round(k.value))) + k.unit
43+ color: Theme.fg
44+ }
3945 }
4046 }
M .config/quickshell/aurora/SetAbout.qml View
@@ -50,7 +50,7 @@ Flickable {
5050 Text {
5151 text: Theme.iArch
5252 color: Theme.accent
53− font.family: Theme.font
53+ font.family: Theme.ui
5454 font.pixelSize: 56
5555 }
5656 ColumnLayout {
@@ -58,16 +58,16 @@ Flickable {
5858 Text {
5959 text: flick.info.length ? flick.info[0][1] : ""
6060 color: Theme.fg
61− font.family: Theme.font
62− font.pixelSize: Theme.fontSize + 6
61+ font.family: Theme.ui
62+ font.pixelSize: 21
6363 font.bold: true
6464 }
6565 Text {
6666 text: Quickshell.env("USER") + "@" + (flick.info.length > 2 ? flick.info[2][1] : "")
6767 + " · up " + Theme.fmtTime(SysStats.uptime)
6868 color: Theme.dim
69− font.family: Theme.font
70− font.pixelSize: Theme.fontSize
69+ font.family: Theme.ui
70+ font.pixelSize: 15
7171 }
7272 }
7373 }
@@ -83,16 +83,17 @@ Flickable {
8383 Layout.preferredWidth: 150
8484 text: modelData[0]
8585 color: Theme.accent
86− font.family: Theme.font
87− font.pixelSize: Theme.fontSize
86+ font.family: Theme.ui
87+ font.pixelSize: 15
8888 }
8989 Text {
9090 Layout.fillWidth: true
91+ Layout.leftMargin: 18
9192 text: modelData[1]
9293 color: Theme.fg
9394 elide: Text.ElideRight
94− font.family: Theme.font
95− font.pixelSize: Theme.fontSize
95+ font.family: Theme.ui
96+ font.pixelSize: 15
9697 }
9798 }
9899 }
@@ -109,9 +110,24 @@ Flickable {
109110 required property var modelData
110111 label: modelData.label
111112 frac: modelData.used / modelData.size
112− fill: frac > 0.9 ? Theme.err : Theme.accent
113+ fill: frac > 0.9 ? Theme.err : Theme.fill
113114 valueText: flick.size(modelData.used) + " / " + flick.size(modelData.size)
114115 }
115116 }
117+
118+ SectionLabel { text: "credits"; Layout.topMargin: 6 }
119+ Text {
120+ Layout.fillWidth: true
121+ Layout.leftMargin: 18
122+ wrapMode: Text.WordWrap
123+ lineHeight: 1.3
124+ color: Theme.fgDim
125+ font.family: Theme.ui
126+ font.pixelSize: 14
127+ text: "The look follows Nothing OS through glyph-rice by Nebelung-cloud (GPL-3.0): its design language, "
128+ + "dot-matrix shaders and several components. Fonts: Doto, Space Grotesk, Space Mono (SIL OFL). "
129+ + "Colours: matugen (Material You). Nothing, Nothing OS and Glyph are trademarks of Nothing Technology Ltd; "
130+ + "this is a fan setup, not affiliated with Nothing."
131+ }
116132 }
117133 }
M .config/quickshell/aurora/SetAppearance.qml View
@@ -20,11 +20,12 @@ Flickable {
2020 SectionLabel { text: "wallpaper" }
2121 Text {
2222 Layout.fillWidth: true
23+ Layout.leftMargin: 18
2324 text: Wall.current !== "" ? Wall.current.replace(Wall.home, "~") : "-"
2425 elide: Text.ElideLeft
2526 color: Theme.dim
26− font.family: Theme.font
27− font.pixelSize: Theme.fontSize - 1
27+ font.family: Theme.ui
28+ font.pixelSize: 14
2829 }
2930 RowLayout {
3031 Layout.fillWidth: true
@@ -45,8 +46,8 @@ Flickable {
4546 Text {
4647 text: "random picks from"
4748 color: Theme.fg
48− font.family: Theme.font
49− font.pixelSize: Theme.fontSize
49+ font.family: Theme.ui
50+ font.pixelSize: 15
5051 }
5152 Flow {
5253 Layout.fillWidth: true
@@ -89,11 +90,12 @@ Flickable {
8990 SectionLabel { text: "colours" }
9091 Text {
9192 Layout.fillWidth: true
93+ Layout.leftMargin: 18
9294 text: "matugen scheme from the wallpaper, accent = its primary"
9395 elide: Text.ElideRight
9496 color: Theme.dim
95− font.family: Theme.font
96− font.pixelSize: Theme.fontSize - 1
97+ font.family: Theme.ui
98+ font.pixelSize: 14
9799 }
98100 Flow {
99101 Layout.fillWidth: true
M .config/quickshell/aurora/SetDisplay.qml View
@@ -155,10 +155,11 @@ Flickable {
155155 anchors.margins: 6
156156 Text {
157157 Layout.fillWidth: true
158+ Layout.leftMargin: 18
158159 text: "keep this display setup? reverting in " + flick.countdown + "s"
159160 color: Theme.fg
160− font.family: Theme.font
161− font.pixelSize: Theme.fontSize
161+ font.family: Theme.ui
162+ font.pixelSize: 15
162163 }
163164 IconBtn { icon: Theme.iCheck; label: "keep"; active: true; onClicked: flick.keep() }
164165 IconBtn { icon: Theme.iRefresh; label: "revert"; onClicked: flick.revert() }
@@ -166,12 +167,13 @@ Flickable {
166167 }
167168 Text {
168169 Layout.fillWidth: true
170+ Layout.leftMargin: 18
169171 visible: flick.message !== ""
170172 text: flick.message
171173 color: Theme.err
172174 wrapMode: Text.WordWrap
173− font.family: Theme.font
174− font.pixelSize: Theme.fontSize - 1
175+ font.family: Theme.ui
176+ font.pixelSize: 14
175177 }
176178
177179 SectionLabel { text: "layout" }
@@ -184,11 +186,12 @@ Flickable {
184186 }
185187 Text {
186188 Layout.fillWidth: true
189+ Layout.leftMargin: 18
187190 text: "applies whenever a monitor is plugged in. external only turns the laptop panel back on when the last external screen is unplugged."
188191 color: Theme.dim
189192 wrapMode: Text.WordWrap
190− font.family: Theme.font
191− font.pixelSize: Theme.fontSize - 1
193+ font.family: Theme.ui
194+ font.pixelSize: 14
192195 }
193196
194197 Repeater {
@@ -204,20 +207,21 @@ Flickable {
204207 SectionLabel { text: mon.m.name }
205208 Text {
206209 Layout.fillWidth: true
210+ Layout.leftMargin: 18
207211 text: mon.m.description + (mon.m.disabled ? " · disabled"
208212 : " · " + mon.curMode + " @ " + mon.m.refreshRate.toFixed(2) + "Hz · scale " + mon.m.scale
209213 + " · at " + mon.m.x + "," + mon.m.y)
210214 color: Theme.dim
211215 elide: Text.ElideRight
212− font.family: Theme.font
213− font.pixelSize: Theme.fontSize - 1
216+ font.family: Theme.ui
217+ font.pixelSize: 14
214218 }
215219 Text {
216220 visible: !mon.m.disabled
217221 text: "mode"
218222 color: Theme.fg
219− font.family: Theme.font
220− font.pixelSize: Theme.fontSize
223+ font.family: Theme.ui
224+ font.pixelSize: 15
221225 }
222226 Flow {
223227 Layout.fillWidth: true
@@ -278,8 +282,8 @@ Flickable {
278282 visible: !Toggles.hasNightLight
279283 text: "night light: gammastep isn't running"
280284 color: Theme.dim
281− font.family: Theme.font
282− font.pixelSize: Theme.fontSize - 1
285+ font.family: Theme.ui
286+ font.pixelSize: 14
283287 }
284288 }
285289 }
M .config/quickshell/aurora/SetInput.qml View
@@ -19,12 +19,13 @@ Flickable {
1919
2020 Text {
2121 Layout.fillWidth: true
22+ Layout.leftMargin: 18
2223 visible: HyprConf.message !== ""
2324 text: HyprConf.message
2425 color: Theme.err
2526 wrapMode: Text.WordWrap
26− font.family: Theme.font
27− font.pixelSize: Theme.fontSize - 1
27+ font.family: Theme.ui
28+ font.pixelSize: 14
2829 }
2930
3031 SectionLabel { text: "keyboard" }
@@ -70,11 +71,12 @@ Flickable {
7071 Layout.fillWidth: true
7172 Text {
7273 Layout.fillWidth: true
74+ Layout.leftMargin: 18
7375 text: "per-device settings (hl.device) stay in source/input.lua"
7476 elide: Text.ElideRight
7577 color: Theme.dim
76− font.family: Theme.font
77− font.pixelSize: Theme.fontSize - 2
78+ font.family: Theme.ui
79+ font.pixelSize: 13
7880 }
7981 IconBtn { icon: Theme.iRefresh; label: "reset to config"; onClicked: HyprConf.resetAll(["input:", "cursor:", "gestures:"]) }
8082 }
M .config/quickshell/aurora/SetKeys.qml View
@@ -113,21 +113,20 @@ ColumnLayout {
113113 }
114114 Rectangle {
115115 visible: !parent.isHeader
116− Layout.preferredWidth: 220
117− implicitHeight: 24
118− color: Theme.surface
119− border.width: 1
120− border.color: Theme.line
121− Text {
116+ Layout.preferredWidth: 240
117+ Layout.leftMargin: 18
118+ implicitHeight: 30
119+ radius: 15
120+ color: Theme.s2
121+ Lb {
122122 anchors.fill: parent
123− anchors.leftMargin: 6
123+ anchors.leftMargin: 14
124+ anchors.rightMargin: 10
124125 verticalAlignment: Text.AlignVCenter
125126 text: modelData.keys || ""
126− color: Theme.accent
127+ color: Theme.fill
127128 elide: Text.ElideRight
128− font.family: Theme.font
129− font.pixelSize: Theme.fontSize - 1
130− font.bold: true
129+ px: 10
131130 }
132131 }
133132 Text {
@@ -136,15 +135,15 @@ ColumnLayout {
136135 text: modelData.action || ""
137136 color: Theme.fg
138137 elide: Text.ElideRight
139− font.family: Theme.font
140− font.pixelSize: Theme.fontSize - 1
138+ font.family: Theme.ui
139+ font.pixelSize: 14
141140 }
142141 }
143142 }
144143 Text {
145144 text: page.binds.length + " binds · " + page.file.replace(Quickshell.env("HOME"), "~")
146145 color: Theme.dim
147− font.family: Theme.font
148− font.pixelSize: Theme.fontSize - 2
146+ font.family: Theme.ui
147+ font.pixelSize: 13
149148 }
150149 }
M .config/quickshell/aurora/SetPower.qml View
@@ -21,6 +21,7 @@ Flickable {
2121 }
2222
2323 // one timeout row: slider in 30s steps (0 = never) + readable value
24+ // one timeout row, like a Knob: slider in 30s steps (0 = never) + the readable value in a chip
2425 component Timeout: RowLayout {
2526 id: t
2627 property string label: ""
@@ -28,13 +29,16 @@ Flickable {
2829 property int value: 0
2930 property int max: 1800
3031 Layout.fillWidth: true
31− spacing: 8
32+ Layout.leftMargin: 18
33+ Layout.rightMargin: 14
34+ implicitHeight: 48
35+ spacing: 16
3236 Text {
33− Layout.preferredWidth: 150
37+ Layout.preferredWidth: 200
3438 text: t.label
3539 color: Theme.fg
36− font.family: Theme.font
37− font.pixelSize: Theme.fontSize
40+ font.family: Theme.ui
41+ font.pixelSize: 15
3842 }
3943 BarSlider {
4044 Layout.fillWidth: true
@@ -44,13 +48,16 @@ Flickable {
4448 value: t.value
4549 onMoved: v => Idle.setTimeout(t.key, Math.round(v / 30) * 30)
4650 }
47− Text {
48− Layout.preferredWidth: 70
49− horizontalAlignment: Text.AlignRight
50− text: flick.dur(t.value)
51− color: t.value > 0 ? Theme.fg : Theme.dim
52− font.family: Theme.font
53− font.pixelSize: Theme.fontSize
51+ Rectangle {
52+ Layout.preferredWidth: 76
53+ implicitHeight: 32
54+ radius: 16
55+ color: Theme.s2
56+ Lb {
57+ anchors.centerIn: parent
58+ text: flick.dur(t.value)
59+ color: t.value > 0 ? Theme.fg : Theme.grey
60+ }
5461 }
5562 }
5663
@@ -78,8 +85,8 @@ Flickable {
7885 + (Battery.capOn ? "on" : "off") + "."
7986 : "charges to 100%"
8087 color: Theme.dim
81− font.family: Theme.font
82− font.pixelSize: Theme.fontSize - 2
88+ font.family: Theme.ui
89+ font.pixelSize: 13
8390 }
8491 Knob {
8592 visible: Battery.hasBat
@@ -141,11 +148,12 @@ Flickable {
141148 }
142149 Text {
143150 Layout.fillWidth: true
151+ Layout.leftMargin: 18
144152 text: "saved to ~/.config/aurora/hypridle.conf, hypridle restarts on change"
145153 color: Theme.dim
146154 elide: Text.ElideLeft
147− font.family: Theme.font
148− font.pixelSize: Theme.fontSize - 2
155+ font.family: Theme.ui
156+ font.pixelSize: 13
149157 }
150158 }
151159 }
M .config/quickshell/aurora/SetShell.qml View
@@ -24,8 +24,8 @@ Flickable {
2424 Text {
2525 text: "pinned apps (pin more from the dock's right-click)"
2626 color: Theme.dim
27− font.family: Theme.font
28− font.pixelSize: Theme.fontSize - 1
27+ font.family: Theme.ui
28+ font.pixelSize: 14
2929 }
3030 Flow {
3131 Layout.fillWidth: true
@@ -67,11 +67,12 @@ Flickable {
6767 Layout.fillWidth: true
6868 Text {
6969 Layout.fillWidth: true
70+ Layout.leftMargin: 18
7071 text: "~/.config/aurora/settings.json"
7172 elide: Text.ElideLeft
7273 color: Theme.dim
73− font.family: Theme.font
74− font.pixelSize: Theme.fontSize - 2
74+ font.family: Theme.ui
75+ font.pixelSize: 13
7576 }
7677 IconBtn { icon: Theme.iRefresh; label: "reset shell settings"; onClicked: Settings.reset() }
7778 }
M .config/quickshell/aurora/SetWindows.qml View
@@ -20,12 +20,13 @@ Flickable {
2020
2121 Text {
2222 Layout.fillWidth: true
23+ Layout.leftMargin: 18
2324 visible: HyprConf.message !== ""
2425 text: HyprConf.message
2526 color: Theme.err
2627 wrapMode: Text.WordWrap
27− font.family: Theme.font
28− font.pixelSize: Theme.fontSize - 1
28+ font.family: Theme.ui
29+ font.pixelSize: 14
2930 }
3031
3132 SectionLabel { text: "gaps & borders" }
@@ -98,11 +99,12 @@ Flickable {
9899 Layout.fillWidth: true
99100 Text {
100101 Layout.fillWidth: true
102+ Layout.leftMargin: 18
101103 text: "saved to ~/.config/aurora/hypr.lua (loaded last by hyprland.lua)"
102104 elide: Text.ElideLeft
103105 color: Theme.dim
104− font.family: Theme.font
105− font.pixelSize: Theme.fontSize - 2
106+ font.family: Theme.ui
107+ font.pixelSize: 13
106108 }
107109 IconBtn {
108110 icon: Theme.iRefresh
M .config/quickshell/aurora/SettingsApp.qml View
@@ -1,10 +1,11 @@
11 import QtQuick
2−import QtQuick.Layouts
32 import Quickshell
43
5−// The settings app: a normal Hyprland window (class org.quickshell, title "aurora settings"; floated + sized by a
6−// window rule). Sidebar of sections, one Loader so only the shown section runs (net scans, bt discovery).
7−// Esc closes, Ctrl+Tab / Ctrl+Shift+Tab (or Ctrl+J/K) cycle sections. Opened with the `settings [section]` IPC.
4+// The settings app: a normal Hyprland window (class org.quickshell, title "aurora settings"), opened maximized by a
5+// window rule. glyph's prefs layout: the sections as a column of Doto words (the selected one large with the live dot),
6+// the page on the right under a caption, key hints at the bottom. One Loader, so only the shown section runs.
7+// Up/Down (outside text fields), Ctrl+Tab / Ctrl+Shift+Tab or Ctrl+J/K = sections, Esc closes.
8+// Opened with the `settings [section]` IPC. After glyph-rice (github.com/Nebelung-cloud/glyph-rice, GPL-3.0), prefs/Prefs.qml.
89 FloatingWindow {
910 id: win
1011 property bool opened: false
@@ -15,32 +16,35 @@ FloatingWindow {
1516
1617 visible: opened
1718 title: "aurora settings"
18− implicitWidth: 960
19− implicitHeight: 680
19+ implicitWidth: 1600
20+ implicitHeight: 900
2021 color: Theme.bg
2122 // closed by the compositor (killactive): keep shell state in sync
2223 onVisibleChanged: if (!visible && opened) closeRequested()
2324
2425 readonly property var sections: [
25− { id: "network", icon: Theme.iWifi, name: "network", group: "connections" },
26− { id: "bluetooth", icon: Theme.iBt, name: "bluetooth", group: "connections" },
27− { id: "sound", icon: Theme.iVolHigh, name: "sound", group: "connections" },
28− { id: "appearance", icon: Theme.iPalette, name: "appearance", group: "look" },
29− { id: "shell", icon: Theme.iDock, name: "shell", group: "look" },
30− { id: "windows", icon: Theme.iWindow, name: "windows", group: "hyprland" },
31− { id: "input", icon: Theme.iMouse, name: "input", group: "hyprland" },
32− { id: "keybinds", icon: Theme.iKeyboard, name: "keybinds", group: "hyprland" },
33− { id: "display", icon: Theme.iMonitor, name: "display", group: "system" },
34− { id: "power", icon: Theme.iPower, name: "power", group: "system" },
35− { id: "about", icon: Theme.iArch, name: "about", group: "system" }
26+ { id: "network", word: "network", caption: "network · wi-fi, wired, tethering" },
27+ { id: "bluetooth", word: "bluetooth", caption: "bluetooth · devices, pairing" },
28+ { id: "sound", word: "sound", caption: "sound · levels, devices, apps" },
29+ { id: "appearance", word: "look", caption: "look · wallpaper, home screen, colours, sizes" },
30+ { id: "shell", word: "shell", caption: "shell · home screen, dock, osd, notifications" },
31+ { id: "windows", word: "windows", caption: "windows · hyprland gaps, borders, effects, layout" },
32+ { id: "input", word: "input", caption: "input · keyboard, mouse, touchpad" },
33+ { id: "keybinds", word: "keys", caption: "keys · hyprland binds" },
34+ { id: "display", word: "display", caption: "display · monitors, layout, night light" },
35+ { id: "power", word: "power", caption: "power · battery, profiles, idle" },
36+ { id: "about", word: "about", caption: "about · this system" }
3637 ]
3738 readonly property int index: {
3839 for (var i = 0; i < sections.length; i++) if (sections[i].id === section) return i
3940 return 0
4041 }
4142 function cycle(d) { sectionRequested(sections[(index + d + sections.length) % sections.length].id) }
43+ // typing in a field: arrows belong to it
44+ function inText() { var a = win.activeFocusItem; return a !== null && a.cursorPosition !== undefined }
4245
4346 Item {
47+ id: root
4448 anchors.fill: parent
4549 focus: true
4650 Keys.onPressed: e => {
@@ -49,92 +53,70 @@ FloatingWindow {
4953 else if (ctrl && (e.key === Qt.Key_Tab || e.key === Qt.Key_J)) { win.cycle(1); e.accepted = true }
5054 else if (ctrl && (e.key === Qt.Key_Backtab || e.key === Qt.Key_K)) { win.cycle(-1); e.accepted = true }
5155 }
56+ // a click outside the page drops the focus out of text fields (arrows switch sections again)
57+ MouseArea { anchors.fill: parent; onClicked: root.forceActiveFocus() }
5258
53− RowLayout {
59+ Item {
60+ id: stage
5461 anchors.fill: parent
55− spacing: 0
62+ Keys.forwardTo: [root]
5663
57− // sidebar
58− Rectangle {
59− Layout.fillHeight: true
60− Layout.preferredWidth: 200
61− color: Theme.surface
62− ColumnLayout {
63− anchors.fill: parent
64− anchors.margins: 10
65− spacing: 2
66− Text {
67− Layout.bottomMargin: 8
68− text: Theme.iCog + " aurora settings"
69− color: Theme.accent
70− font.family: Theme.font
71− font.pixelSize: Theme.fontSize + 1
72− font.bold: true
73− }
74− Repeater {
75− model: win.sections
76− delegate: ColumnLayout {
77− id: entry
78− required property var modelData
79− required property int index
80− readonly property bool current: win.section === modelData.id
81− readonly property bool firstOfGroup: index === 0 || win.sections[index - 1].group !== modelData.group
82− Layout.fillWidth: true
83− spacing: 2
84− Text {
85− visible: entry.firstOfGroup
86− Layout.topMargin: entry.index === 0 ? 0 : 8
87− text: entry.modelData.group.toUpperCase()
88− color: Theme.dim
89− font.family: Theme.font
90− font.pixelSize: Theme.fontSize - 3
91− font.letterSpacing: 1.5
92− }
93− Rectangle {
94− Layout.fillWidth: true
95− implicitHeight: 30
96− color: entry.current ? Theme.accent : (em.containsMouse ? Theme.surfaceHi : "transparent")
97− Text {
98− anchors.verticalCenter: parent.verticalCenter
99− x: 10
100− text: entry.modelData.icon + " " + entry.modelData.name
101− color: entry.current ? Theme.bg : Theme.fg
102− font.family: Theme.font
103− font.pixelSize: Theme.fontSize
104− font.bold: entry.current
105− }
106− MouseArea {
107− id: em
108− anchors.fill: parent
109− hoverEnabled: true
110− cursorShape: Qt.PointingHandCursor
111− onClicked: win.sectionRequested(entry.modelData.id)
112− }
64+ // ---- sections ----
65+ Column {
66+ id: words
67+ x: Math.round(Math.min(150, win.width * 0.07))
68+ anchors.verticalCenter: parent.verticalCenter
69+ spacing: 12
70+ Repeater {
71+ model: win.sections
72+ Row {
73+ id: w
74+ required property var modelData
75+ required property int index
76+ readonly property bool on: win.index === index
77+ spacing: 20
78+ Rectangle {
79+ anchors.verticalCenter: parent.verticalCenter
80+ visible: w.on
81+ width: 20
82+ height: 20
83+ radius: 10
84+ color: Theme.live
85+ }
86+ Num {
87+ text: w.modelData.word.toUpperCase()
88+ font.pixelSize: w.on ? 76 : 32
89+ color: w.on ? Theme.fg : wm.hovered ? Theme.grey : Theme.mute
90+ Behavior on font.pixelSize {
91+ enabled: Theme.motion
92+ NumberAnimation { duration: Theme.t; easing.type: Easing.BezierSpline; easing.bezierCurve: Theme.glide }
11393 }
94+ Behavior on color { enabled: Theme.motion; ColorAnimation { duration: Theme.t } }
11495 }
96+ HoverHandler { id: wm; cursorShape: Qt.PointingHandCursor }
97+ TapHandler { onTapped: { win.sectionRequested(w.modelData.id); root.forceActiveFocus() } }
11598 }
116− Item { Layout.fillHeight: true }
11799 }
118100 }
119− Rectangle { Layout.fillHeight: true; Layout.preferredWidth: 1; color: Theme.line }
120101
121− // content
122− ColumnLayout {
123− Layout.fillWidth: true
124− Layout.fillHeight: true
125− Layout.margins: 16
126− spacing: 12
127− Text {
128− text: win.sections[win.index].name.toUpperCase()
129− color: Theme.fg
130− font.family: Theme.font
131− font.pixelSize: Theme.fontSize + 4
132− font.bold: true
133− font.letterSpacing: 2
102+ // ---- the page ----
103+ Item {
104+ id: pageBox
105+ x: Math.max(words.x + 560, Math.round(win.width * 0.42))
106+ y: 96
107+ width: Math.min(900, win.width - x - 80)
108+ height: parent.height - y - 110
109+ Lb {
110+ id: caption
111+ x: 18
112+ text: win.sections[win.index].caption
134113 }
135114 Loader {
136− Layout.fillWidth: true
137− Layout.fillHeight: true
115+ anchors.top: caption.bottom
116+ anchors.topMargin: 24
117+ anchors.left: parent.left
118+ anchors.right: parent.right
119+ anchors.bottom: parent.bottom
138120 active: win.opened
139121 sourceComponent: {
140122 switch (win.section) {
@@ -153,7 +135,21 @@ FloatingWindow {
153135 }
154136 }
155137 }
138+
139+ Row {
140+ x: words.x
141+ anchors.bottom: parent.bottom
142+ anchors.bottomMargin: 50
143+ spacing: 34
144+ Repeater {
145+ model: ["↑↓ section", "ctrl tab next", "esc close"]
146+ Lb { required property string modelData; text: modelData }
147+ }
148+ }
156149 }
150+ // ↑↓ switch sections unless a text field has the keyboard
151+ Keys.onUpPressed: e => { if (win.inText()) { e.accepted = false; return } win.cycle(-1) }
152+ Keys.onDownPressed: e => { if (win.inText()) { e.accepted = false; return } win.cycle(1) }
157153 }
158154
159155 Component { id: netC; NetPage { active: true } }
M .config/quickshell/aurora/Switch.qml View
@@ -1,7 +1,9 @@
11 import QtQuick
22 import QtQuick.Layouts
33
4−// label (+ optional hint) and an on/off box; the whole row is clickable (settings app)
4+// A settings row: label (+ optional hint) and glyph's pill toggle on the right; the whole row is clickable.
5+// The toggle: off = a dark pill with a dim knob on the left, on = the primary fill runs to the right with a dot.
6+// After glyph-rice (github.com/Nebelung-cloud/glyph-rice, GPL-3.0), prefs/Toggle.qml.
57 Rectangle {
68 id: s
79 property string label: ""
@@ -10,49 +12,62 @@ Rectangle {
1012 signal toggled(bool on)
1113
1214 Layout.fillWidth: true
13− implicitHeight: Math.max(30, txt.implicitHeight + 10)
14− color: m.containsMouse ? Theme.surface : "transparent"
15+ implicitHeight: Math.max(56, txt.implicitHeight + 20)
16+ radius: 28
17+ color: m.containsMouse ? Theme.s2 : "transparent"
1518
1619 ColumnLayout {
1720 id: txt
1821 anchors.left: parent.left
22+ anchors.leftMargin: 18
1923 anchors.right: box.left
20− anchors.rightMargin: 10
24+ anchors.rightMargin: 16
2125 anchors.verticalCenter: parent.verticalCenter
22− spacing: 0
26+ spacing: 3
2327 Text {
2428 Layout.fillWidth: true
2529 text: s.label
2630 color: Theme.fg
2731 elide: Text.ElideRight
28− font.family: Theme.font
29− font.pixelSize: Theme.fontSize
32+ font.family: Theme.ui
33+ font.pixelSize: 15
3034 }
31− Text {
35+ Lb {
3236 Layout.fillWidth: true
3337 visible: s.hint !== ""
3438 text: s.hint
35− color: Theme.dim
3639 wrapMode: Text.WordWrap
37− font.family: Theme.font
38− font.pixelSize: Theme.fontSize - 2
40+ px: 10
3941 }
4042 }
41− Rectangle { // the switch: square track, knob left (off) / right (on)
43+ Rectangle {
4244 id: box
4345 anchors.right: parent.right
46+ anchors.rightMargin: 14
4447 anchors.verticalCenter: parent.verticalCenter
45− width: 36
46− height: 18
47− color: s.checked ? Theme.accent : Theme.surfaceHi
48− border.width: 1
49− border.color: s.checked ? Theme.accent : Theme.line
48+ width: 64
49+ height: 34
50+ radius: 17
51+ color: Theme.s3
5052 Rectangle {
51− width: 12
52− height: 12
53− anchors.verticalCenter: parent.verticalCenter
54− x: s.checked ? parent.width - width - 3 : 3
55− color: s.checked ? Theme.bg : Theme.dim
53+ x: 4
54+ y: 4
55+ width: s.checked ? parent.width - 8 : height
56+ height: parent.height - 8
57+ radius: height / 2
58+ color: s.checked ? Theme.fill : Theme.mute
59+ Behavior on width { enabled: Theme.motion; NumberAnimation { duration: Theme.t; easing.type: Easing.BezierSpline; easing.bezierCurve: Theme.glide } }
60+ Behavior on color { enabled: Theme.motion; ColorAnimation { duration: Theme.t } }
61+ Rectangle {
62+ anchors.right: parent.right
63+ anchors.rightMargin: 8
64+ anchors.verticalCenter: parent.verticalCenter
65+ visible: s.checked
66+ width: 10
67+ height: 10
68+ radius: 5
69+ color: Theme.fillFg
70+ }
5671 }
5772 }
5873 MouseArea {