Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
8 changes: 8 additions & 0 deletions .github/main-ruleset.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,14 @@
"context": "Rust quality",
"integration_id": 15368
},
{
"context": "Public API",
"integration_id": 15368
},
{
"context": "Rust coverage",
"integration_id": 15368
},
{
"context": "Desktop compile (Windows)",
"integration_id": 15368
Expand Down
52 changes: 49 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,52 @@ jobs:
name: Rust quality
needs: security
runs-on: ubuntu-24.04
timeout-minutes: 45
steps:
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
with:
persist-credentials: false
- name: Install Linux build dependencies
run: ./scripts/install-linux-ci.sh
- uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable
with:
toolchain: '1.98.0'
components: rustfmt, clippy
targets: wasm32-unknown-unknown
- uses: Swatinem/rust-cache@49a0bdc70d2e1b713ca9e2869b211fcce03d3c1c # v2
with:
key: quality-static
cache-on-failure: true
- name: Validate registry manifests
run: python3 scripts/release.py check
- name: Run source, formatting, Clippy, Wasm, and public API checks
run: ./scripts/check-quality-static.sh

semver:
name: Public API
needs: security
runs-on: ubuntu-24.04
timeout-minutes: 30
steps:
- uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
with:
persist-credentials: false
- uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable
with:
toolchain: '1.98.0'
- uses: taiki-e/install-action@3f74d7c16a4242f1c95561e98edc25d36adb4375 # v2
with:
tool: cargo-semver-checks@0.49.0
- uses: Swatinem/rust-cache@49a0bdc70d2e1b713ca9e2869b211fcce03d3c1c # v2
with:
key: semver
- name: Compare publishable APIs with crates.io
run: cargo semver-checks check-release --workspace --release-type minor

coverage:
name: Rust coverage
needs: security
runs-on: ubuntu-24.04
timeout-minutes: 90
env:
ARGUI_NATIVE_TESTS: '1'
Expand Down Expand Up @@ -80,8 +126,8 @@ jobs:
cache-on-failure: true
- name: Validate registry manifests
run: python3 scripts/release.py check
- name: Run the complete 85% quality gate on a private display
run: ./scripts/linux-hidden-display.sh ./scripts/quality.sh
- name: Run the 85% coverage gate on a private display
run: ./scripts/linux-hidden-display.sh ./scripts/check-coverage.sh
- name: Save coverage results
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
Expand Down Expand Up @@ -332,7 +378,7 @@ jobs:

release:
name: Publish crates and GitHub release
needs: [security, quality, desktop, mobile, android-package, ios-package, packages, website]
needs: [security, quality, semver, coverage, desktop, mobile, android-package, ios-package, packages, website]
if: >-
github.event_name == 'push' && github.ref == 'refs/heads/main' &&
github.repository == 'ExtraBinoss/argui' && github.actor == 'ExtraBinoss' &&
Expand Down
83 changes: 81 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,27 @@ that do not use them.

### Added

- Added incremental `TextEdit` delivery for `Input` and `TextArea`, including
`on_edit`, context callback helpers, UTF-8 validation, fragment-based history,
and lazy compatibility delivery for the existing `on_input(String)` API.
- Added opaque `EventHandler`/typed `ValueHandler` bindings and local direct
handlers across interactive widgets, including domain payloads for forms,
selection, ranges, overlays, menus, navigation, data controls, and composites.
- Added the publishable `argui-testing` crate with real headless layout and hit
testing, accessible queries, editing, focus, scrolling, gestures, lifecycle,
multiple windows, diagnostic settle bounds, and deterministic task time.
- Added the small `argui::prelude`, `basic`, `desktop`, and `web` convenience
feature profiles, while preserving every granular feature.
- Added staged archive verification and a public API/SemVer CI job for the 0.3
release line.
- Added installable Android Widget Gallery packaging for ARM64 devices and
x86-64 emulators, including launcher and notification icons, command-line SDK
scripts, USB deployment, and native soft-keyboard integration.
- Added shared mobile background-activity state with an Android foreground
service and ongoing progress notification, plus an iOS ActivityKit bridge and
SwiftUI Lock Screen/Dynamic Island extension kept under `argui-ios`.
- Added direct-touch momentum, configurable natural scrolling, drag-safe click
activation, and draggable text-selection handles shared by Android and iOS.
- Added retained GPU canvases for editor, visualization, game/map and scientific
viewports. `Element::gpu_canvas`, `GpuCanvasSpec` and the renderer-neutral
`CustomPaintContext::gpu_canvas` helper preserve normal Argui layout,
Expand Down Expand Up @@ -44,10 +65,58 @@ that do not use them.
palette while keeping `shadcn` as a compatible alias.
- Added an interactive documentation site whose lessons display and run their
exact Rust source as dedicated WebAssembly examples, including a complete
light/dark, accent and token override configurator.
light/dark, accent and token override configurator, plus side-by-side solid
and backdrop-blurred popover surfaces in the overlays lesson.
- Added dedicated Technicalities and Platforms documentation categories that
explain retained versus immediate UI, Argui's scope, the audited target
support matrix, and a clearly labelled Android/iOS capability roadmap.
- Added an interaction API decision guide with a callback selection table and
an exact-source live example that distinguishes `on_change`, `on_commit`, and
`on_click`.
- Added a Widget Gallery drag-and-drop board with live data reordering, retained
image cards, pointer capture, keyboard/accessibility alternatives, and
velocity-driven squash, stretch, shadow, and spring settling.
- Added a working Widget Gallery split-pane showcase with horizontal, vertical,
trailing, and nested IDE layouts, all resizable by pointer or keyboard.
- Added a Technicalities performance guide explaining `Immediate` versus
`FrameCoalesced`, its requestAnimationFrame-shaped scheduling contract, and
appropriate high-frequency workloads.

### Fixed

- Replaced unsupported checklist glyphs in the clean-code documentation example
with explicit status labels, and made each completion step visible in the
button label before its final disabled state.
- Rebuilt the custom-element lesson as a recognizable video-editor timeline
with labeled tracks, fitted clip text, draggable clips, time ruler, timecode,
and a forgiving draggable, keyboard-accessible playhead.
- Made mouse text selection start from the nearest selectable text when a drag
begins in non-interactive whitespace, matching browser-style document
selection without stealing button, editor, or custom gesture input.
- Embedded Arabic, Hebrew, and emoji fallback fonts in every shipped WebAssembly
application so localized text no longer renders as missing-glyph squares.
- Applied coalesced split-pane gesture deltas to the latest controlled value so
pane sizes no longer drift when the view rerenders during a drag.
- Coalesced drag-and-drop updates to one delivery per rendered frame, skipped
redundant list mutations, and replaced the expensive offscreen blur with
transform-locked shadow plates so fast drags remain responsive and artifact-free.
- Fixed frame-coalesced pan delivery to accumulate every raw delta between
display frames, keeping split-pane handles exactly under the pointer during
fast input on Firefox and other high-rate hosts.
- Smoothed the Widget Gallery drag-and-drop velocity deformation with
frame-rate-independent interpolation while keeping its position and live
velocity label on the same frame-coalesced callback.
- Clamped, wrapped, and clipped split-pane panel text and raised compact vertical
pane minima so content cannot paint outside its panel.
- Made Android and iOS render edge to edge while preserving native safe areas,
painting the active theme behind transparent system regions and matching
Android system-icon contrast to light and dark themes.
- Prevented a closed or animated DevTools dock from reserving the bottom system
inset, which removed the moving band of repeated framebuffer pixels on
Android without hiding content behind the status or navigation bars.
- Made mobile search reliably focus and open the software keyboard, preserved
adjustable selection handles, and stopped a touch scroll from activating the
item released beneath the finger.
- Cleared workspace crate artifacts and the temporary crates.io registry before
archive checks, preventing same-version caches from masking coordinated
workspace changes and breaking dependent archive verification.
Expand All @@ -74,6 +143,12 @@ that do not use them.

### Changed

- Moved the workspace to 0.3.0. `Context::callback` now provides the short
invalidating path; `event_handler`, `listener`, `Element::on`, and typed
behavior/action APIs remain the explicit advanced layer.
- Migrated every naturally local documentation example, its exact generated
website snippet, the Widget Gallery, and the fake AI harness to direct
callbacks while retaining the Events delegation example and complex reducers.
- Made vertical canvas dragging follow the content by default, added an
in-app natural/inverted direction toggle, aligned keyboard panning with the
selected direction and smoothed wheel/pinch zoom interaction.
Expand All @@ -85,6 +160,10 @@ that do not use them.

### Known limitations

- Native file picking is not wired to Android's document provider or the iOS
document picker yet. The cross-platform file-picker widget still compiles on
mobile and reports the mode as unsupported; adding the two native adapters
does not require a change to its public model.
- GPU canvases use Argui-owned WGPU instances, devices, queues and surfaces;
the high-level runtime still does not accept externally owned GPU objects.
- Canvas pixels have no automatic semantic meaning. Applications must provide
Expand Down Expand Up @@ -145,4 +224,4 @@ that do not use them.

[0.2.1]: https://github.com/ExtraBinoss/argui/compare/v0.2.0...v0.2.1
[0.2.0]: https://github.com/ExtraBinoss/argui/releases/tag/v0.2.0
[Unreleased]: https://github.com/ExtraBinoss/argui/compare/v0.2.1...HEAD
[Unreleased]: https://github.com/ExtraBinoss/argui/compare/v0.3.0...HEAD
Loading
Loading