Software that holds still while you use it.
Seven principles every VexelRay application is held to. Each one is already written down in the framework's own documentation, linked beside it.
Where a mockup and a principle disagree, the principle wins. vexplore/README.md
Nothing moves under your hand.
Nothing appears, moves or grows on hover. The space a control needs is reserved before you get there, so a click that's already on its way lands on what you aimed at. Focus changes how a control looks, never its size or position.
- Status barA slot's place never changes, only what it says.
- OverflowA scrollbar appears when content overflows, not when the pointer comes near.
- VexploreNothing it shows may cover anything else. Suggestions have their own place in the layout, and appear only there.
Revealed on hover
The row grows as you reach it, and the one below jumps away from your click.
Space reserved
Hover changes colour only. Every target stays where it was.
An illustration in this page's HTML, not a VexelRay widget.
Never a frozen window.
A component that gets stuck takes only its own lane with it. The window keeps painting and taking input, and you can always close it. Frames are drawn when something changed and skipped when nothing did, without trading smoothness for either.
- LanesComponents run in their own lanes, so a stall in one never reaches the window's own drawing.
- Last resortA watchdog outside every lane ends the process if nothing else worked.
From kronometer/docs/render-on-demand.md, measured on Win32 and Vulkan.
The keyboard reaches everything.
A link only a mouse can follow isn't a feature. Every control can be reached and used from the keyboard, there is always a way out of a field, and the key bindings belong to you.
- Your bindingsRebind a key and it simply takes effect. A conflict dialog would ask you to resolve something you just resolved by pressing the key.
- RepeatCommand keys auto-repeat. Typed characters never do.
From keyboard-focus-text.md and navigation.md.
Colour is a role, not a value.
Widgets ask the theme for a role, such as ink, page or accent, and never name a colour themselves. A build test fails any framework class that makes one up. That's how one set of roles serves both dark and light, and how the whole interface scales evenly when you zoom.
- PaletteNine authored numbers, not a table of colours.
- Hover & pressOne signed lightness step, computed in Oklab.
- ZoomFrom 0.5× to 3×, and the whole UI scales together.
- ChromeWhere the title bar's controls go is the framework's. How they look is the application's.
Colour is a role, never a literal.
vexelray-gui/README.md
A
vexelray-gui/README.mdPaletteis nine authored numbers, not a table of colours.
A lightness step applied in Oklab to whatever the control already is.
vexelray-gui/README.md, on hover and press
Foreshadow it, show it, undo it.
Before a change happens, you see what it will do. After, you see what it did, in the place it did it. And when you undo it, you watch it go back: Ctrl+Z first takes you to where the change was made, then reverses it there. An undo that can't be applied is refused with a reason, never silently skipped.
- Every controlToggles, sliders, number fields, choices and colour pickers record into their window's history on their own.
- VexploreStates the effect first: the counts, the bytes and where they go. Then every move, copy, archive and delete can be undone.
- VexA save cannot half-happen, and unsaved work is never remembered silently.
- PixA picture that won't open says why, in place of the picture.
An illustration in this page's HTML, following how Vexplore and the window history behave.
Agents use the same hand, in plain sight.
Macros and agents drive an application with the same hand a person has: the same pointer, the same keys, the same controls. They find a control by what it is, not where it was drawn. Automation is never hidden: whatever turned it on, the title bar says so.
- The cursorStateful, and it never teleports.
- AddressingBy role and name. Coordinates are exactly the thing that goes stale.
- You stay in chargeA run an agent started can always be ended by the person at the desk.
The automation cursor is stateful, and it never teleports.
automation.md
Whatever turned a socket on, the title bar says so.
automation.md
Separate programs that know about each other.
Each application stands on its own, but they share one look and pass work between them. A text file in Vexplore opens in Vex, a picture opens in Pix, and Vex can show any file in Vexplore.
- One lookShared widgets and a shared palette, so a control behaves the same in every application.
- UpdatesOther applications are asked to close, and you can skip or cancel. Nothing is ever forced.
- Comes backWindows reopen where you left them, clamped to the screens you have now.
They are separate programs that know about each other.
vexelray-framework docs
Every failure mode degrades to defaults, never an exception at launch.
vexelray-gui/README.md, on settings
What we leave out.
Some things are missing on purpose.
Web pages inside the apps
The applications are drawn by the framework itself, not by a browser engine. Vexplore's mockups are HTML, and its handoff says to translate them, not port them.
vexplore/docs/design/HANDOFF.mdImmediate-mode GUI
The interface is a retained tree, not re-emitted every frame, so state lives in the widgets and the loop can sleep.
architecture.mdBlur and bloom
Effects compose in one pass against a single light. Multi-pass effects are deliberately out of scope.
vexelray-gui/README.mdDrag and drop first
It still works, but it's a fallback. Vexplore makes common tasks easy and guesses sensibly from context instead.
vexplore design notes