-
-
Notifications
You must be signed in to change notification settings - Fork 78
PANEL_FAMILIES
iNiR has two completely separate UI families that share the same services and config backend. Switch between them at runtime with Super+Shift+W.
The default family. Material Design language with six style variants that form a spectrum from structured to expressive.
| Style | Character |
|---|---|
| material | Clean Google-standard Material 3. Solid surfaces, standard elevation. The baseline. |
| cards | Material variant with a card-based layout. Same colors, different structure. |
| aurora | Professional glass transparency. Blur-backed surfaces, frosted panels. |
| inir | TUI-inspired elegance. Border and text hierarchy, muted tones, monospace accents. |
| angel | The flagship. Neo-brutalism meets glass. Offset shadows, partial borders, inset glow, warm golden palette. |
| zzz | Zenless Zone Zero poster UI: wallpaper-generated signal colors, black console surfaces, technical grid frames, cut-corner plates, sticker badges, segmented metrics, halftone texture, and Oxanium type. |
Style dispatch priority: zzz > angel > inir > aurora > material. This means if you're checking which style to apply, check zzz first:
color: Appearance.zzzEverywhere ? Appearance.colors.colLayer1
: Appearance.angelEverywhere ? Appearance.angel.colGlassCard
: Appearance.inirEverywhere ? Appearance.inir.colLayer1
: Appearance.auroraEverywhere ? Appearance.aurora.colSubSurface
: Appearance.colors.colLayer1- Bar: top of screen (horizontal), or left/right edge (vertical). The horizontal bar is modular: left edge, two center-side zones, centered workspace pivot, right edge.
- Sidebars: left sidebar (AI chat, YT Music, widgets), right sidebar (toggles, calendar, tools)
- Dock: application dock (any of 4 edges)
-
Overview: workspace overview with app launcher and search (
Super+Space) - Settings: overlay panel rendered on top of the current desktop
All ii components use Appearance.*:
color: Appearance.colors.colPrimary
radius: Appearance.rounding.normal
font.family: Appearance.font.mainNever hardcode colors, radii, or font sizes. The entire point of the token system is that switching styles, themes, or wallpapers changes everything at once.
ii loads about 25 panels through ShellIiPanels.qml. Some notable ones:
| Panel ID | What it is |
|---|---|
iiBar |
Top bar (horizontal mode) |
iiVerticalBar |
Side bar (vertical mode) |
iiDock |
Application dock |
iiSidebarLeft |
Left sidebar (AI, music, widgets) |
iiSidebarRight |
Right sidebar (toggles, calendar, system) |
iiOverview |
Workspace overview + app search |
iiBackground |
Desktop wallpaper layer |
iiMediaControls |
MPRIS media player popup |
iiClipboard |
Clipboard history browser |
The ii horizontal bar uses five zones:
| Zone | Role |
|---|---|
left |
Left edge controls, usually sidebar button + active window/taskbar |
centerLeft |
Left center pill, usually resources/media |
center |
Pivot, normally workspaces |
centerRight |
Right center pill, usually clock/util/battery |
right |
Right edge controls, usually sidebar button/tray/timer/update/weather |
Change it from Settings -> Bar -> Bar module layout. Do not hand-edit unless you enjoy typo archaeology.
Windows 11 Fluent Design. Not "ii with a different skin" but a completely separate family with its own design language, interaction patterns, and density.
- Taskbar: bottom of screen (Windows 11 style)
- Start Menu: app grid with search, pinned apps, recent files
- Action Center: quick settings (WiFi, Bluetooth, volume, brightness, toggles)
- Screen Time: optional entry in Action Center when usage tracking is enabled
- Notification Center: notification list with calendar
- Settings: standalone window (separate from ii settings)
Waffle uses Looks.* exclusively. Never Appearance.* in waffle code:
color: Looks.colors.accent
radius: Looks.rounding.medium
font.family: Looks.font.fontFamily| Aspect | ii | waffle |
|---|---|---|
| Density | Spacious Material spacing | Dense Win11 information density |
| Motion | Organic, 200-500ms durations | Snappy and mechanical, 67-250ms |
| Surfaces | Layered elevation (5 layers) | 3-tier chrome (bg0/bg1/bg2) |
| Controls | Material ripple, elevation | Flat with subtle hover reveals |
| Typography | 6 font families, expressive | Single family, pragmatic sizing |
Waffle loads about 22 panels through ShellWafflePanels.qml:
| Panel ID | What it is |
|---|---|
wBar |
Bottom taskbar |
wStartMenu |
Start menu |
wActionCenter |
Quick settings panel |
wNotificationCenter |
Notification center + calendar |
wTaskView |
Task view (workspace overview) |
wWidgets |
Desktop widgets panel |
wBackground |
Desktop wallpaper layer |
Some panels are shared between families (cheatsheet, region selector, on-screen keyboard, screen corners) and keep their ii prefix even when running under waffle.
Super+Shift+W triggers a family transition with an animated overlay. The transition:
- Overlay fades in
- Current family panels unload
-
panelFamilyconfig key changes - New family panels load
- Overlay fades out
The transition is handled by FamilyTransitionOverlay.qml. Config persists the choice, so the next startup uses whichever family you last selected.
Both families use the same loading system. Each panel is a PanelLoader:
PanelLoader {
identifier: "iiBar"
extraCondition: !(Config.options?.bar?.vertical ?? false)
component: Bar {}
}Three conditions must all be true for a panel to load:
-
Config.readyis true (config file loaded) -
Identifier in
enabledPanels(user hasn't disabled it) -
extraConditionpasses (panel-specific logic)
Panels are split into immediate (bar, background, OSD) and deferred (sidebars, overview, clipboard). Deferred panels load 500ms after the first frame to keep startup fast.
If you're adding a new panel:
- Create the QML component in the appropriate module directory
- Add a
PanelLoaderentry inShellIiPanels.qmlorShellWafflePanels.qml - Add the identifier to
enabledPanelsdefault indefaults/config.json - If it has settings, add them to the correct Settings UI
If your change affects both families, update both. If your change touches a shared component (notifications, lock screen, polkit), test under both families.
iNiR documentation. main is stable. prerelease is development.