Move panel plugins under panels

This commit is contained in:
David Heinemeier Hansson
2026-05-25 14:47:08 +02:00
parent e6d990e31d
commit 10898aea16
31 changed files with 45 additions and 27 deletions
+8 -3
View File
@@ -20,6 +20,12 @@ User-installed plugins live alongside these conceptually but on disk under
| Reminders | `omarchy.reminders` | `overlay` | `reminders/ReminderFlow.qml` |
| Omarchy menu | `omarchy.menu` | `menu`, `bar-widget` | `menu/Menu.qml`, `menu/BarWidget.qml` |
| Notifications | `omarchy.notifications` | `service`, `bar-widget` | `notifications/Service.qml`, `notifications/BarWidget.qml` |
| Audio | `omarchy.audio` | `bar-widget` | `panels/audio/Panel.qml` |
| Bluetooth | `omarchy.bluetooth` | `bar-widget` | `panels/bluetooth/Panel.qml` |
| Monitor | `omarchy.monitor` | `bar-widget` | `panels/monitor/Panel.qml` |
| Network | `omarchy.network` | `bar-widget` | `panels/network/Panel.qml` |
| Power | `omarchy.power` | `bar-widget` | `panels/power/Panel.qml` |
| Weather | `omarchy.weather` | `bar-widget` | `panels/weather/BarWidget.qml` |
| Media | `omarchy.media` | `service`, `bar-widget` | `services/media/Service.qml`, `services/media/BarWidget.qml` |
| Battery | `omarchy.battery` | `service` | `services/battery/Service.qml` |
| Idle | `omarchy.idle` | `service` | `services/idle/Service.qml` |
@@ -28,9 +34,8 @@ User-installed plugins live alongside these conceptually but on disk under
| Polkit agent | `omarchy.polkit` | `service` | `polkit/PolkitAgent.qml` |
First-party bar-only widgets also carry manifests next to their QML files,
e.g. `bar/widgets/Clock.manifest.json`. Rich popup widgets live in feature
plugin directories such as `audio/`, `network/`, and `power/`, each with its
own `manifest.json`.
e.g. `bar/widgets/Clock.manifest.json`. Rich popup widgets live under
`panels/`, each with its own `manifest.json`.
## Bar
+3 -3
View File
@@ -8,7 +8,7 @@ the shell for its whole session.
- `manifest.json` declares the plugin (`id: omarchy.bar`, `kind: bar`) and points at `Bar.qml` as the entry point.
- `Bar.qml` is Omarchy-owned bar engine code, loaded by the omarchy-shell host. Users should not edit it directly.
- `widgets/` holds simple first-party bar widgets with sibling manifests.
- Feature plugins such as `../audio/`, `../network/`, and `../power/` provide richer popup bar widgets.
- Feature plugins such as `../panels/audio/`, `../panels/network/`, and `../panels/power/` provide richer popup bar widgets.
- The bar receives its config from the host shell as a `barConfig` property; the host loads it from `~/.config/omarchy/shell.json` (or `config/omarchy/shell.json` when the user has no file).
- `omarchy-style-bar-position` updates only the user shell.json file.
@@ -167,8 +167,8 @@ Widgets receive `bar` (the shell root), `moduleName` (string), and `settings` (o
First-party bar widgets are manifest-backed just like third-party widgets.
Simple widgets carry sibling manifests such as `widgets/Clock.manifest.json`;
richer popup widgets live in feature directories such as `../audio/` and
`../network/`; and feature plugins such as `omarchy.menu`, `omarchy.media`, and
richer popup widgets live in feature directories such as `../panels/audio/` and
`../panels/network/`; and feature plugins such as `omarchy.menu`, `omarchy.media`, and
`omarchy.notifications` declare their bar-widget entry points in their own
`manifest.json`. Bar layout ids are namespaced, e.g. `omarchy.audio`,
`omarchy.network`, and `omarchy.clock`. Older UpperCamelCase ids such as
+1 -1
View File
@@ -407,7 +407,7 @@ Item {
color: Qt.darker(root.foreground, 1.4)
font.family: root.fontFamily
font.pixelSize: Style.font.bodySmall
text: "Single cursor. Most reusable panel primitives expose hasCursor: bool and emit hovered(bool); composed rows (including sliders) wrap their content in CursorSurface. The panel root owns cursorActive + focusSection + selectedIndex; each element binds hasCursor: root.cursorActive && root.focusSection === 'X' && root.selectedIndex === N, and onHovered flips cursorActive on while updating the same state. No initial highlight, then one highlight on screen once the keyboard or mouse enters. See plugins/audio/Panel.qml for the canonical recipe."
text: "Single cursor. Most reusable panel primitives expose hasCursor: bool and emit hovered(bool); composed rows (including sliders) wrap their content in CursorSurface. The panel root owns cursorActive + focusSection + selectedIndex; each element binds hasCursor: root.cursorActive && root.focusSection === 'X' && root.selectedIndex === N, and onHovered flips cursorActive on while updating the same state. No initial highlight, then one highlight on screen once the keyboard or mouse enters. See plugins/panels/audio/Panel.qml for the canonical recipe."
}
Text {
width: parent.width
@@ -191,11 +191,11 @@ Panel {
function brightness(percent: string): string { return root.brightnessIpc(percent) }
function state(): string { return root.stateIpc() }
function open(): void { root.open() }
function close(): void { root.close() }
function toggle(): void { root.toggle() }
function show(): void { root.open() }
function hide(): void { root.close() }
function open() { root.open() }
function close() { root.close() }
function toggle() { root.toggle() }
function show() { root.open() }
function hide() { root.close() }
}
function refresh() {