Repository navigation
Releases: highercomve/Oriel
Release list
v0.18.1
Oriel 0.18.1
Added
- Tray:
.template_pngicons. A monochrome PNG (the mark in black on
transparency) shown as an NSImage template on macOS, so the menu bar
recolours it for light and dark mode itself; Linux and Windows draw the
pixels like.png.
v0.18.0
Oriel 0.18.0
The native renderer (-Dnative_ui) runs full apps that were written for a
web view: dialogs, disclosures, the session history, file and camera
inputs, date pickers, popovers, Intl, and the drawing such an app's CSS
asks for, drawn to match the web view build on Linux and Android.
Added
<dialog>:show(),showModal()(the top layer over every
z-index, with its::backdrop;:modal; the page outside inert, Tab
kept inside),close()andrequestClose(),returnValue,cancelon
Escape and the platform's back,closeafter it, the focus back where it
was,method=dialogforms.<details>and<summary>: closed, only the summary shows, with its
disclosure triangle; a click, Enter oropentoggles it and fires
toggle.- The Popover API:
popover,showPopover(),hidePopover(),
togglePopover(),popovertargetbuttons,:popover-open,
beforetoggleandtoggle; auto popovers close on Escape, a press
outside or another auto popover. - The session history:
history.pushState,replaceState,state,
back,forward,go,popstateandhashchange; the platform's
back closes a modal dialog, then walks the history. <input type=file>: the platform's file dialog (acceptnarrows it on
the desktops), or withcaptureon a phone the camera; the pick is
files[0](read lazily, as a dropped file), theninputandchange;
cancelwhen there's none. New page commandsnui:pick_fileand
nui:picked_file(src/modules/dialog/page.zig).<input type=date>: the platform's date picker on every platform (a
GtkCalendarpopover, the Date and Time Picker control, an
NSDatePickerpopover, aUIDatePicker,DatePickerDialog), the value
YYYY-MM-DD, the date shown in the user's format.Intl:NumberFormat,DateTimeFormat,Collator,PluralRulesand
thetoLocale*StringandlocaleComparemethods over them (English,
Spanish, Portuguese, French, German and Italian data, matching ICU's
output for the common options);navigator.languageis the user's on
Linux and Android.new Image()and<img>:naturalWidth/naturalHeightfrom the file's
header,complete,decode(),loadanderror.conic-gradient()backgrounds (pie and donut charts);background-image
gradients withbackground-size,background-positionand
no-repeat;:emptyin style sheets; anappearance: nonecheckbox's
::beforeand::after(a switch's knob);form.elements,
requestSubmit(submitter)andsubmitevents'submitter;
datalist.options;env()(the safe-area insets are 0).grid-columnplaces grid items (1 / -1,span N, a start line), as
browsers auto-place them row by row; absolutely positioned children take
no cell.::placeholder(and::-webkit-input-placeholder) colors a field's
placeholder; without one it's the platform browser's (WebKit's
darkgray, Chrome's#757575).- Every CSS named color (
darkgray,crimson,rebeccapurple…), not a
dozen. alert,confirmandpromptanswer as a browser with its dialogs
suppressed (they would block the UI thread) and log a warning.- Events the runtime fires are
isTrusted; a promise rejected with no
handler is logged.
Fixed
- The page starts after the app's
setupon the desktops, as a web
view's page does, so its first commands see whatsetupmade (a tray). - A block-level button centres its content only in its height (its
text-alignplaces the text);justify-contentand gaps apply to flex
and grid boxes only. The UA sheet centres a button's text. - A select with
appearance: nonehides the platform's arrow when the
page draws its own beside it; GTK's drop-down takes new options. - Stylesheet and script links with a query (
styles.css?v=8) load. - SVG icons follow the page's CSS
fill,strokeandstroke-widthon
the<svg>; an inline::before/::aftertext stays on its line. - Android: fields inside a modal dialog show; a border on only some sides
of a rotated box no longer draws hairlines on the others. - A focused control that gets disabled or leaves the page loses the focus
(the focus fixup rule), so its focus ring goes. matches(),closest()andquerySelector()know:focus,
:focus-visible,:hoverand:active.- A modal dialog with
margin: auto, a set width and an auto height is
centred, as tall as its content's room up to itsmax-height. - Grid
frcolumns stay equal beside padded cells (a partial last row
ofrepeat(auto-fit, …)), and an auto-fit grid's column count follows
its laid-out width. inline-flexandinline-gridlay their children out asflexand
griddo.- Line heights are in WebKit's 1/64 px units, so text sits on the same
pixel rows as the web view's; SVG elements have
getBoundingClientRect(). - GTK: text fields and selects take the page's
font-weight, style and
family, and place their text where WebKit does;focus()keeps a field's
selection (Tab still selects its text); a field under a modal's backdrop
shows its text, dimmed; a date shows its year in full; text fields use
WebKitGTK's 1px padding and select widths leave room for the arrow only
when it's drawn;gtk-interface-color-scheme(GTK 4.20, the desktop's
light or dark) setsprefers-color-scheme, and a change of it applies
at once. - Android: a date shows its year in full, as Chrome does; a one-line
field shows its text from the start until it's focused, and again once
left; a field under a modal's backdrop stays drawn there, dimmed. - A transparent box (
opacity: 0, a faded-out toast) no longer hides the
fields under it (Android cut a select's label to a sliver; GTK and
Windows hid the field). desktop-entry-release/desktop-entryinstall what the packages put
next to the executable (libggml-cuda.so,libggml-vulkan.so,
contents.files), so an app installed that way finds its GPU backends.- Phones: when the keyboard comes up, the focused field scrolls into what's
left of the page, as Chrome and Safari bring it into view.
v0.17.3
Oriel 0.17.3
Fixed
- Android: apps opened from the launcher icon now appear in Recents. The
launcher activity passed its own exclusion from Recents on to the app's
window; windows also clear it from tasks created by earlier versions.
v0.17.2
Oriel 0.17.2
Fixed
- Windows: a failed allocation while reading the launch arguments freed
them twice. - Linux: the custom media scheme's empty responses (errors, 416) no
longer read from a stack buffer after the handler returned. - Linux tray: a menu child is no longer leaked when its parent's list
runs out of memory. - Windows: the custom media scheme answers 500 when it runs out of memory
building its headers, instead of leaving the page waiting. - System monitor (macOS): the process list no longer reads past its
buffer when the buffer couldn't be allocated.
Changed
- Assertions (Power of 10, rule 5) where outside data enters: IPC, the
updater, the native DOM and the system monitor's samplers. The system
monitor's release builds are ReleaseSafe.
v0.17.1
Oriel 0.17.1
Added
- System monitor example: the version in the header and Check for
updates next to Settings, withoriel.updater. Each release attaches a
signedsystem-monitor-latest.json; a copy updates from its own entry
(its renderer, an executable, the AppImage or the macOS.app), and a
deb/rpm copy says a new version is out. The monitor now has Oriel's
version instead of 0.1.0.
Changed
- System monitor example: the Oriel renderer is the default
(-Drenderer=oriel), and the release packages (AppImage, deb, rpm,
Windows installer and zip, macOS.app) use it.
v0.17.0
Oriel 0.17.0
Oriel tells voices apart: oriel.speakers, speaker embeddings and
offline diarization, the module behind GhostPen's meetings (who said
what, and named voices remembered across meetings).
Added
oriel.speakers(.speakers = true, needs.llamaor.whisper;
Linux, Windows, macOS): speaker embeddings and offline diarization on
voice-detect.cpp (MIT), compiled against the shared ggml build.
Encoderloads a GGUF encoder fromcatalog(WeSpeaker ResNet34 by
default, ECAPA-TDNN) and embeds 16 kHz speech;diarizeembeds 3 s
windows every 1.5 s over the speech regions, clusters them
(average-linkage, cosine; or a known speaker count) and returns speaker
turns with one centroid per speaker;clusterdoes the clustering on
embeddings an app made itself;matchfinds a known voice for a
centroid. Progress and cancellation for long recordings. On LibriSpeech
voices WeSpeaker put one man's halves at cosine 0.73, two women at 0.22,
a man and a woman at 0.08 (the ECAPA GGUF: 0.80, 0.70, 0.45, hence the
default); on three one-minute conversations it found 3, 4 and 1 speakers
for 3, 3 and 1. See docs/speakers.md.
v0.16.1
Oriel 0.16.1
Added
- System monitor example: an Applications list, the default in all
three renderers. Each desktop app shows its combined CPU, summed resident
memory, threads and process count; Show processes opens its members
as a parent/child tree, and All processes lists everything, as
before. Apps are recognized from desktop entries (Linux),.appbundles
(macOS) and window owners (Windows), with process ancestry. Its CI runs
the model tests and builds the Oriel renderer on Windows and macOS.
Fixed
oriel.chat: a Stop that comes after its reply ended no longer stops
the next one. Tokens can reach the page in a burst after the model
finished, andcancel()with no reply running stops the next to start,
so a Stop pressed during the burst left the next message empty.
chat:tokenevents now carry their reply's id (reply), and
cancelReply(id)stops that reply only while it runs; the showcase's
Stop sends it.cancel()is unchanged.- The showcase's chat UI test (iOS CI) no longer waits 5 minutes for a
reply its own late Stop had cancelled: it stops only while the reply
runs, and asks again after a reply with no tokens. - System monitor (Oriel renderer): picking a sort key (CPU, Memory, ...)
no longer flips the direction; only the direction button does, as in the
web frontend.
v0.16.0
Oriel 0.16.0
Oriel apps can advertise over Bluetooth LE: oriel.bluetooth sends a
beacon nearby devices see, from Zig or the page, on every platform.
Added
oriel.bluetooth: Bluetooth LE advertising, a beacon nearby devices
see (docs/bluetooth.md). The same API on every platform, with
capabilities()saying what each stack can send; a field the device
can't send iserror.Unsupported, never dropped. Starts, failures and
platform stops come later as the advertisement's state
(onAdvertiseState, the page'sbluetooth:advertiseevent). On when
the app declares.permissions.bluetooth(or-Dbluetooth); the page
getsoriel.bluetooth.capabilities(),advertise(ad)andstop(id).- Android and ChromeOS: BluetoothLeAdvertiser, every field (tested on a
Chromebook's ARC, one advertisement at a time there). - Linux: BlueZ over the system bus, every field (tested on a BlueZ
adapter). - macOS and iOS: CBPeripheralManager, service UUIDs and the device name
(Apple can't advertise service data);advertisewhile the
permission is undecided shows the prompt (tested on macOS 15). - Windows: BluetoothLEAdvertisementPublisher, service UUIDs and service
data, no device name (not yet tested on a Windows machine).
- Android and ChromeOS: BluetoothLeAdvertiser, every field (tested on a
v0.15.1
Oriel 0.15.1
Fixed
- Breakout (Oriel renderer): dragging a finger on the board moves the
paddle on touch screens. The board now takes the drag when a finger goes
down on it, as the page'stouchmovepreventDefaultdoes, so Android
no longer turns the drag into a scroll and cancels the pointer.
v0.15.0
Oriel 0.15.0
A page drawn by the native renderer can now be ported to the Oriel renderer
and look the same: .oriel says everything the native renderer computes, a
page exports itself as views, and zig build check-views proves it.
HollerShare is the first app ported this way. GTK windows paint only what
changed.
Added
.orielviews can say everything the native renderer computes from
HTML and CSS, so an Oriel-renderer view can look exactly like the web
page it came from: per-side borders and border colors, dashed and dotted
borders, per-corner and elliptical radii,calc()lengths, gradients,
transforms, outlines and focus halos,position: relativeoffsets and
sticky, tables, scrollbar styling and color scheme,align-contentand
any flex direction, max-/fit-content text, keyboard hints for fields,
SVG icons (<icon>with<path>s), and spans that are underlined,
highlighted, boxed (inline<code>-style boxes) or links whose clicks
reach the app as their own ids.unset="..."gives a prop no value. A
test fails the build if a native prop is ever added that no attribute
sets.- Porting a page to the Oriel renderer:
ORIEL_NUI_EXPORTand
ORIEL_NUI_EXPORT_SCRIPTwrite a native-renderer page as.orielviews,
its states merged as blocks, andzig build check-viewsproves each
view compiles to the props the page had (docs/design/zig-ui-experiment.md,
"Porting a page"). Character entities (&, ) in markup. .orielblocks:@when (state)for the app's states
(View.setState), combined with media conditions, up to 64 blocks per
view, applied block by block instead of one compiled variant per
combination;@when (focus)and@when (hover)looks for the focused
and hovered nodes, which also style native fields' focus. Spans take
class..orielviews update in place:View.update(tree, base, bindings)edits
only the bound texts, tooltips and labels that changed, keeping the
view's native controls, scroll positions and media styles. Typed
property updates go straight to the tree (and Android's mirror) without
JSON.zig build bench-ui-updates -Dzig_ui=truemeasures both.- Zig-renderer apps:
Engine.setColorSchemepins dark or light;
Driver.dragtakes drags and drops (dropped files' paths from
Engine.drops); events the app emits reachDriver.eventas "message"
on every platform, as they did on Windows and Android.
Improved
- GTK: windows paint only what changed since the last frame (tiles and
patches GTK composites), and canvases are drawn at the display's real
fractional scale instead of being resampled every frame. An idle system
monitor took 3.7-7.4% of a core, now 1.5%.ORIEL_NUI_FULL_REDRAW=1
paints everything, to compare.
Fixed
- Typed property updates keep the props a backend callback still reads
until it returns. - System monitor (Oriel renderer): the process actions' copy submenu shows,
and copying or ending a process says whether it worked. - A view mounted where another one was starts from its own look (it showed
the old view's media blocks as already applied). - Linux: a
-Dnative_uibuild no longer links a WebKitGTK call for
transparent windows. - iOS (native and Oriel renderers): the status bar and home indicator areas
show the page's background, as CSS spreads the root's over the canvas,
instead of the system's white; the status bar's text follows its
lightness. - System monitor (Oriel renderer): no "0.0 GHz" on Apple Silicon, which
doesn't tell its CPU frequency; the frequency is hidden, as in the web
frontend, and the per-core chart drops its "0.0G". - Render bench: memory readings on macOS and iOS (resident size and
physical footprint, the app's process), instead of 0 MB. - Breakout:
zig build test-gamepasses with any renderer (the WebView
build left out the canvas the physics rules use). - iOS simulator builds no longer print codesign's "replacing existing
signature" as a failed command.