Files
ux/CHANGELOG.md
agra d68a2978eb ux: bulk WIP — UxPlugin→XPlugin rename + new anim/core/navi/reactive packages
Catch-all commit for outstanding pre-existing local changes. Mixes
several themes that would normally be split:

- Rename: UxPlugin → XPlugin across iOS, macOS, Android registrants.
- New top-level packages under lib/src/: anim/ (animated values,
  panes, sheets, dock, measured), core/ (Emitter, ReactiveBuilder
  scaffolding, presenter/widget/value/dispose primitives), navi/
  (Screen/ScreenStack/Router/hero/transitions), reactive/.
- Edits across existing plugins (clipboard, crash, file, gallery,
  keyboard, scanner, sensor, url) to align with the new core.
- Test updates and CHANGELOG/README touches accompanying the above.
2026-05-21 08:58:07 +03:00

87 lines
4.2 KiB
Markdown

### 0.9.0
- `XScanner`: new platform-view widget for QR-code (and forward-compat
barcode) scanning. iOS uses `AVCaptureMetadataOutput` (no extra pod);
Android uses CameraX preview + ZXing decoder
(`com.google.zxing:core:3.5.3`, ~470 KB jar, no Play Services dep).
`XScannerPermission.requestCamera()` requests OS permission first;
decoded payloads stream through `EventChannel('ux/scanner/events')`.
### 0.8.0
- `Log`: pretty, production-ready logger. Static entry (`Log.d/i/w/e/f/t`),
scoped loggers via `Log.tag('KB')`, lazy messages (`Log.d(() => expensive)`),
structured `fields`, ANSI-colored `ConsoleSink`, `DeveloperSink` for DevTools,
`MemorySink` ring buffer (tests + breadcrumbs), `NoopSink`. Sinks fan out via
`+` with per-sink `minLevel`; throwing sinks can't take down the pipeline.
- `Log.configure`: one-call setup that also wires `FlutterError.onError`,
`PlatformDispatcher.onError`, and isolate errors through `Log.e`. Pair of
log-then-rethrow is deduped via an `Expando` mark so crash handlers don't
double-report. Override the `captureCrashes` hook to customise or pass
`() {}` to opt out.
- `XKeyboard`: adaptive-learning debug output now uses `Log.tag('KB').d`
instead of `print`, lazy-built so the formatted line is only constructed
when debug level is enabled.
### 0.7.0
- `AutoMap<K, V>`: insertion-ordered collection with O(1) lookup by key
**and** by index. Backed by a `List<V>` + `Map<K, int>` kept in sync by
four mutation methods (`add`, `addAll`, `remove`, `clear`); both fields
are private so callers cannot break the invariant. Extends `Iterable<V>`
for `where` / `map` / `firstWhere` / etc. `remove` is O(n) to preserve
order; every other op is O(1).
### 0.6.0
- `XFile`: new module for handing files to the OS
- `XFile.share(path, {title, mimeType, sourceRect})` — iOS `UIActivityViewController`,
macOS `NSSharingServicePicker`, Android `Intent.ACTION_SEND` via FileProvider.
`sourceRect` anchors the popover on iPad / macOS.
- `XFile.open(path, {mimeType})` — in-app preview where possible:
iOS `QLPreviewController`, macOS `QLPreviewPanel` (preview on top of the app,
no foreground loss), Android `Intent.ACTION_VIEW` with MIME inference from
`MimeTypeMap` + a fallback set of text/code extensions so unknown types
still resolve to `text/plain` instead of `application/octet-stream`.
- **macOS**: new platform. Plugin registry + `FilePlugin`; keyboard and sensor
plugins remain iOS-only.
- Android: ships a FileProvider under `${applicationId}.ux.fileprovider`
scoped to `ux_share/` in the app cache — host apps don't need manifest
plumbing.
- iOS: `XWindow` helper (`keyWindow` / `topViewController`) in
`NativePlugin.swift`, shared between keyboard and file plugins.
### 0.5.0
- `XSensor.orientation`: accelerometer-driven physical device rotation,
independent of the OS auto-rotate setting or UI orientation lock
- `AppInfo`: version + buildNumber surface
- `XKeyboard`: focus tracking integration
### 0.4.0
- `package:ux/testing.dart`: new entry point for test-only utilities
- `matchesTextGolden(path, {update})`: `matchesGoldenFile`-style matcher for
plain-text snapshots (RPC responses, log output, formatted data). Writes on
first run or when `update: true`; compares byte-for-byte otherwise. Runtime
stays flutter_test-free — depends only on `package:matcher`. For
flutter_test users, pass `update: autoUpdateGoldenFiles` so
`flutter test --update-goldens` regenerates text goldens too.
### 0.3.0
- `XKeyboard`: fix interactive dismiss race conditions — keyboard height no longer
gets stuck when rapidly dismissing and re-focusing
- `XKeyboard`: handle zero-duration keyboard notifications (instant snap)
- `XKeyboard`: gate adaptive learning debug output behind `kDebugMode`
- Example: rewrite as chat UI demonstrating `ListenableBuilder`, scroll freeze,
and interactive dismiss
- Example: modernize Android project (v2 embedding, AGP 8.7, Gradle 8.11)
### 0.2.0
- `XKeyboard`: sampled native animation curves (iOS & Android) with adaptive learning
- `XKeyboard`: interactive dismiss via pan gesture
- Android: keyboard height tracking via JNI/FFI bridge
### 0.1.1
- Bezier utilities
### 0.0.3
- Action Plan
### 0.0.2
- BendBox