js_widget_runtime 0.4.128
js_widget_runtime: ^0.4.128 copied to clipboard
Run JavaScript widgets as Flutter widgets using QuickJS (VM) or Web Workers (web).
0.4.128 #
- New
jsr.capture(opts?)— widgets can photograph their own rendered tree from inside their JS ({name}option names the file). Core bridge channel, host-dependent: the jsr_widget CLI implements it —--capture-dir <dir>writes the PNGs and the--jsonreport lists them undercaptures[], so agent-authored widgets self-screenshot at the exact moment of their logic mid-event. Hosts without a handler reject the promise (graceful degradation). Fire-and-forget channel: a slow/unavailable capture can never stall the message queue.
0.4.127 #
- Automated patch bump.
0.4.127 #
-
Automated patch bump.
-
New
voxelrenderer node: a chunked voxel world rendered by a pure-Dart software pipeline onCustomPaint(no native deps, no new packages). Widget JS pushes per-chunk vertex buffers withjsr.hostCall('voxel.mesh', {id, key, origin, positions, colors, indices})— plain arrays, rebuilt only on edit — and steers the camera withjsr.hostCall('voxel.camera', {id, position, yaw, pitch, light, skyColor}).voxel.attachprobes support (older runtimes reject, so widgets degrade gracefully). The world state is bridge-owned (core capability):voxel.*host calls are intercepted before the host handler and feed the renderer'svoxelnodes. Example:example/widgets/voxel-sandbox/.
0.4.126 #
- New
jsr_widgetCLI for headless widget verification by agents and humans:dart run bin/jsr_widget.dart test <widget-dir>runs the widget's real JavaScript on the QuickJS backend with NO rendering — dispatch events (--event, repeatable), seed storage, injectfetchJsonfixtures, assert the finaljsr.exportState(deep-subset match) and console output;--jsonprints a machine report and the exit code is 0/1.... screenshot <widget-dir>pumps the rendered tree through the production renderer and writes a PNG (width/height/ scale/theme,--freeze-clockfor determinism). Works from any project depending on the package; the QuickJS native library is auto-discovered from the pub cache whenJSR_QUICKJS_LIBis unset. Documented in the authoring skill section 8.3.
0.4.125 #
- Automated patch bump.
0.4.124 #
- Automated patch bump.
0.4.123 #
- Automated patch bump.
0.4.122 #
- Maintenance release: the in-repo agent memory store is refreshed (fa_widgets pins-only publish contract, flutter_agent coordination notes, live state-sync protocol references). No API or renderer changes — 0.4.121 remains the last functional release.
0.4.121 #
videonode: newonError: '<actionId>'prop — host playback failures (controller init, network, codec) arrive as{value: message}instead of a silent black box. Backed by the optionalJsMediaController.errorStream(default null — existing hosts stay source-compatible); the referencevideo_playerhost publisheserrorDescription+ init failures, the web host the elementerrorevent. A synchronously throwingcreateVideoControllerno longer crashes the build — it firesonError.WidgetManifest.fromStorageparses tolerantly: a wrong-typed legacy field (e.g. a localization map undername) degrades that field to its fallback instead of discarding the whole manifest. Additive i18n keys (nameI18n/descriptionI18n) parse without loss — compat tests lock the host-side i18n schema contract.video-playerexample widget (1.0.7) wiresonErrorto an inline error banner and exportsvideoErrorfor headless tests/CLI.
0.4.120 #
pathnode: JsPathPainter supports pure vertical/horizontal strokes with zero-width bounds (previously rendered nothing).
0.4.119 #
- Automated patch bump.
0.4.118 #
- Automated patch bump.
0.4.117 #
- Automated patch bump.
0.4.116 #
- Automated patch bump.
0.4.115 #
- New declarative shape nodes from the Motion-Canvas port (yoclip#1):
rect({width, height, radius?, fill, stroke?, strokeWidth?, opacity?}),circle({size, fill, stroke?, strokeWidth?, opacity?}),line({x1, y1, x2, y2, stroke, strokeWidth? (default 2), opacity?}) andpolygon({points, fill, stroke?, strokeWidth?, opacity?} —pointsis a FLAT [x1, y1, x2, y2, ...] array).rect/circlesize to their box with inside strokes;line/polygonsize to the tight geometry bounds plus stroke inset. Pure CustomPaint — no web-view or SVG parsing.
0.4.114 #
- New
jsr.motionbuiltins for declarative, Motion-Canvas-style animation (agreed with the yoclip port, IstiN/yoclip#1):tween(ms, startMs, durMs, from, to, easing?)— eased scalar clamped tofrom/tooutside its window so results drop straight into the tree;mapRange(v, inMin, inMax, outMin, outMax, easing?)with clamped input;clamp(v, min, max); andwave(ms, periodMs, amplitude, phase?)— a zero-centered sine for beat-synced motion. All times are elapsed milliseconds;easing?accepts a function or ajsr.easename string (defaultlinear). - Extended
jsr.ease: new curveseaseInOutCubic,easeInOutQuart,easeOutExpo, plus canonical-name aliaseseaseOutBack/easeOutBounce/easeOutElastic(the original short names stay), andcubicBezier(x1, y1, x2, y2)— a factory for arbitrary CSS-style timing curves (Newton-Raphson solve with a bisection fallback, overshoot-safe).
0.4.113 #
- Automated patch bump.
0.4.112 #
videonode:fitnow actually maps the picture when the parent reserved a fixed box (aspectRatio/sizedBoxw+h/stack→ tight constraints). Previously the surface was always wrapped in a natural-aspectAspectRatio, socontain/cover/fillrendered identically (everything letterboxed) and fit buttons looked dead. Loose parents (column/row children) keep the natural-shape behavior.videonode: real fullscreen — the transport controls gain a fullscreen button (hidden withfullscreenButton: false) that pushes an in-app fullscreen route reusing the SAME media controller, so playback continues seamlessly and position/volume survive the round trip.
0.4.111 #
textnodes honorwidth/height: the text box gets exactly that size, sotextAlign: 'center'centers across the requested box instead of the intrinsic label width, at any nesting depth (CSS-style box semantics).column/row/stack/wrapnodes honorwidth/height(SizedBox cap, same loose-constraint semantics ascontainer): siblings center across the requested span instead of the parent's full width. Reported via the yoclip deck renderer, where scenes placewidth+textAlign: 'center'on captions nested in columns.
0.4.110 #
- Fix compilation on Flutter 3.47+ stable: the flame_3d-backed GLB/glTF host
now uses vendored
flame_3dsources (lib/src/flame_3d_vendor, see VENDOR.md) carrying the flutter_gpu API fix (flame-engine/flame#3995 backport) instead of hostedflame_3d: ^0.3.0, which no longer compiles against the Flutter 3.47 flutter_gpu API. No public API changes;createJs3dHost,createFlame3dHost, and the shader assets keep working unchanged. - Requires Flutter 3.47+ now (
environment.flutter >=3.47.0); CI moved from the 3.44.4 pin to 3.47.1 and theflame-3.47branch/automerge workflow are retired.
0.4.109 #
- Automated patch bump.
0.4.108 #
- Automated patch bump.
0.4.107 #
- Automated patch bump.
0.4.106 #
- Automated patch bump.
0.4.105 #
- Automated patch bump.
0.4.104 #
- Automated patch bump.
0.4.103 #
- Automated patch bump.
0.4.102 #
- Automated patch bump.
0.4.101 #
- Automated patch bump.
0.4.100 #
- Automated patch bump.
0.4.99 #
- Automated patch bump.
0.4.98 #
- Automated patch bump.
0.4.97 #
- Automated patch bump.
0.4.96 #
- Automated patch bump.
0.4.95 #
- Automated patch bump.
0.4.94 #
- Automated patch bump.
0.4.93 #
- Automated patch bump.
0.4.92 #
- Automated patch bump.
0.4.91 #
- Automated patch bump.
0.4.90 #
- Automated patch bump.
0.4.89 #
- Automated patch bump.
0.4.88 #
- Automated patch bump.
0.4.87 #
- Automated patch bump.
0.4.86 #
- Automated patch bump.
0.4.85 #
- Automated patch bump.
0.4.84 #
- Automated patch bump.
0.4.83 #
- Automated patch bump.
0.4.82 #
- Automated patch bump.
0.4.81 #
- Automated patch bump.
0.4.80 #
- Automated patch bump.
0.4.79 #
- fix(web): declare __IID before the shared bootstrap in the web worker
script — the 0.4.75 iid tagging made
__tagreference__IIDunconditionally, but the web worker never declared it, so every widget message threwReferenceError: __IID is not definedand JS widgets on the web client hung on the loading spinner (engine loaded, renderer built, first render never arrived).
0.4.78 #
- Automated patch bump.
0.4.77 #
- Automated patch bump.
0.4.76 #
- Automated patch bump.
0.4.75 #
- fix(engine): cross-engine message routing on macOS JSC — flutter_js
registers the native
sendMessagecallback as a STATIC, so every new runtime overwrites it and ALL live JS contexts dispatch through the LAST runtime's channel map. With several engines alive (a board with multiple widgets), one widget's fetch/render messages were delivered to a neighbour widget — e.g. the weather widget stayed on its loading spinner forever while its data rendered inside another widget (deterministic two-engine repro test included). The bootstrap now tags every message payload with the engineiid; a Dart-side router (installed into every live channel map) delivers each message to its owning engine and strips the tag before handlers run. QuickJS backend (per-engine native routing) only unwraps raw-id channels.
0.4.74 #
- Automated patch bump.
0.4.73 #
- Automated patch bump.
0.4.72 #
- Automated patch bump.
0.4.71 #
- Automated patch bump.
0.4.70 #
- fix(engine): SIGSEGV on widget dispose — native runtime release moved from
scheduleMicrotask(same event-loop turn) toFuture.delayed(Duration.zero)(next turn), with a finalexecutePendingJob()drain before the release. flutter_js resolves promise bridges via microtasks (future.then→evaluate), so a microtask-scheduled release could free the JSContextGroup while a sibling microtask was still about to evaluate into it, crashing inJSValueToStringCopywith a deadJSC::VM. Applies to bothdispose()and the old-runtime release path inrun().
0.4.69 #
- Automated patch bump.
0.4.68 #
- Automated patch bump.
0.4.67 #
- Automated patch bump.
0.4.66 #
- Automated patch bump.
0.4.65 #
- Automated patch bump.
0.4.64 #
- Automated patch bump.
0.4.62 #
- Automated patch bump.
0.4.61 #
- Automated patch bump.
0.4.60 #
- Automated patch bump.
0.4.59 #
- Automated patch bump.
0.4.58 #
- Automated patch bump.
0.4.57 #
- Automated patch bump.
0.4.56 #
- Automated patch bump.
0.4.55 #
- Automated patch bump.
0.4.54 #
- Automated patch bump.
0.4.53 #
- Automated patch bump.
0.4.52 #
- Automated patch bump.
0.4.51 #
- Automated patch bump.
0.4.50 #
- Automated patch bump.
0.4.49 #
- Automated patch bump.
0.4.48 #
- Automated patch bump.
0.4.47 #
- Automated patch bump.
0.4.46 #
- Automated patch bump.
0.4.45 #
- Perf: micro-optimizations in JS bootstrap:
- Monotonic counter for IDs instead of Math.random()+Date.now()
- Reusable argument joiner for console.log (avoids Array.slice alloc)
- setTimeout uses one-shot Timer instead of periodic
- Manual JSON string building for timer/RAF messages (avoids JSON.stringify)
0.4.44 #
- Fix JS widget cross-engine leaks on macOS/JSC:
- callEvent is now synchronous (skips __jsr_event_done round-trip)
- Render trees tagged with __iid, routed to correct panel
- requestAnimationFrame tagged with __iid for game loop routing
- _isLive guard + try/catch on callEvent to prevent SIGSEGV on disposed runtime
0.4.43 #
0.4.42 #
- Fix callEvent deadlock: _handleEventDone was nulling _eventCompleter before _runEvent could complete it. On macOS (merged thread), JSC bridge callback fires DURING rt.evaluate() inside send(). Nulling the completer meant _runEvent's await never completed.
0.4.40 #
- Automated patch bump.
0.4.39 #
- Automated patch bump.
0.4.38 #
- Automated patch bump.
0.4.37 #
- Automated patch bump.
0.4.36 #
- Automated patch bump.
0.4.35 #
- Fix SIGSEGV: defer old runtime release until AFTER new runtime init completes (was releasing during init via scheduleMicrotask, which ran between evaluate() calls and freed the old JSContextGroup out from under in-flight native callbacks).
- Reduce callEvent timeout from 30s to 5s — a single stuck event was blocking ALL widget interactions for 30 seconds.
0.4.34 #
- Fix dispose: use scheduleMicrotask instead of Future.delayed(Duration.zero) to avoid event-loop ordering issues that caused widgets to get stuck in loading state.
0.4.33 #
- Fix SIGSEGV: defer native JSContextGroup release to the next event-loop turn. During run() → dispose() → evaluate(), the current stack may still be inside executePendingJob() which holds native JSC callbacks. Releasing the context synchronously freed the JSContextGroup out from under those in-flight callbacks → crash in JSValueToStringCopy.
0.4.32 #
- Fix 3D host-flip: remember per-sceneId host selection so controllers recreated after a callEvent timeout route to the same host (Flame3dHost stays Flame3dHost) even when the renderer-side config lacks engine/src.
0.4.31 #
- Automated patch bump.
0.4.30 #
- Automated patch bump.
0.4.29 #
- Automated patch bump.
0.4.28 #
- Automated patch bump.
0.4.27 #
- Automated patch bump.
0.4.26 #
- Automated patch bump.
Unreleased #
-
feat(renderer):
audio_playernode — frame-driven declarative audio for JS scenes. Per-frameplaying/volume/loopprops andseekToMschange-seeks are reconciled against a hostJsAudioController;JsMediaControllergained concrete no-opsetVolume/setLoopdefaults, so existing hosts stay source-compatible. Zero-size widget, host-less renders are safe no-ops. -
fix(3d): flame_3d model
rotationapplied yaw as pitch and vice versa —Quaternion.euler(yaw, pitch, roll)takes yaw first, but the conversion passed pitch. Arotation: [0, 180, 0]model entry flipped the model nose-over-tail (wheels up) instead of turning it around; small yaw values (the only kind used before) looked like a slight lean.
0.4.25 #
- Automated patch bump.
0.4.24 #
- feat(3d):
unlit: trueon declarative scene3d model entries — swaps the loaded GLB's SpatialMaterial for an UnlitMaterial with the same albedo, so flat brand marks (logos, UI panels) render at their exact colors instead of being dimmed by the scene light rig.
0.4.23 #
- feat(3d):
jsrSetFlameAssetBundle— replace Flame's global asset bundle (bothFlame.bundleand the eagerly createdFlame.assetscache) so host apps rendering projects from arbitrary directories (YoClip Studio) can serve GLB/OBJ model files that are not in the app's own bundle.
0.4.22 #
- fix(3d): anti-aliased headless GLB capture — the flame_3d offscreen painter now renders the world into a 2x render target and downscales it into the widget rect with FilterQuality.high (SSAA); 1x output — and a point-sampled downscale — had visibly jagged edges on hard GLB silhouettes (extruded logos, low-poly models).
0.4.21 #
- fix(3d): the 3D host dispatcher reference-counts shared controllers — when a scene3d node unmounts and remounts within the same frame (per-frame scene rebuilds in video pipelines), the new State's initState runs before the old State's dispose; previously the late dispose killed the controller the new State had just acquired, leaving the scene permanently empty for the rest of the export.
0.4.20 #
- fix(3d): headless capture mounts the game tree manually and renders the world's children directly — an unmounted FlameGame renders and updates nothing (frozen skeletal animations, unregistered lights, invisible scenes), and a vanilla world renderTree never reached Object3D children in offscreen capture (empty GPU pass).
- fix(3d): teardown races — disposed-controller guards and a MediaQuery-free World3D (pixel ratio explicit) so final-frame capture can't crash.
- feat(3d): headless GLB rendering for the flame_3d host — offscreen capture path renders the scene into a GPU render target and composites it into any canvas (video export / board snapshots), replacing the old headless placeholder. Requires Impeller + Flutter GPU enabled by the embedder.
- feat(3d): declarative
scene3dconfigs —models: [{modelId, src, position, rotation, scale, animation}]+camera+timeapplied idempotently on every rebuild (diff-only), so video pipelines that re-render the node tree per frame can drive GLB scenes frame-accurately. - feat(3d):
Js3dCaptureSyncpending-work tracker lets headless renderers wait for GPU init / model loads before capturing a frame. - fix(3d): transparent scene background (Flame's opaque black default no longer covers layers composited behind the 3D scene).
- fix(3d): no more build→apply→notify→rebuild loop when declarative configs are applied on every widget rebuild; disposed-controller release guard; idempotent controller dispose (unmount/remount + final tree teardown).
0.4.19 #
- Automated patch bump.
0.4.18 #
- Automated patch bump.
0.4.17 #
- Automated patch bump.
0.4.16 #
- Automated patch bump.
0.4.15 #
- Automated patch bump.
0.4.14 #
- Automated patch bump.
0.4.13 #
- The
imagenode now sends a browser-ishUser-Agentfor network URLs: dart:io's defaultDart/x.y (dart:io)UA is rejected by popular CDNs (Wikimedia answers HTTP 400), which made every remote image render as a broken-image icon.
0.4.12 #
- Fix dead
button/iconButtontaps:_buttonActionIdignored the documentedonPressedprop (SKILL.md and every bundled demo use it) and fired the_tapfallback instead, so JS handlers keyed by action id never matched.onPressednow takes priority,onTapstays supported.
0.4.11 #
- Chore: split
json_widget_renderer.dart(~1900 lines) intopartfiles underlib/src/renderer/nodes/(js_layout_nodes.dart,js_text_nodes.dart,js_input_nodes.dart) via private extensions, so every source file is back under the 1500-line PR gate. Pure refactor — no behavior or public API changes.
0.4.10 #
- Add a pure-Dart software 3D pipeline to the
scene3dnode: when the node carries ameshesprop it renders onCustomPaint— perspective-projected triangles, painter's z-sort, flat Lambert shading — with zero native dependencies and noJs3dHostrequired. Props:meshes({vertices, faces, color}),camera(position,target,fov),rotation(x/y/zstatic transform; JS animates by re-rendering on raf/timer),light.direction,background, andonTap(fires with{x, y}local coordinates). Nodes withoutmesheskeep routing to the host-providedJs3dHostengine. Malformed meshes/vertices/faces are skipped, never fatal. Seedocs/3d-spike.mdfor the flutter_gl evaluation and poly-budget guidance.
0.4.9 #
- Add 3D scene support via the new
scene3drenderer node andjsr.scene3d.*JS API. The runtime provides aJs3dHostabstraction so host apps can plug in any engine (Flame 3D, three_dart,flutter_3d_controller, etc.). - Supported JS commands:
create,destroy,addModel,removeModel,setTransform,playAnimation,stopAnimation,setCamera,setLight. - The node accepts
id,width,height,camera,lightsand renders a placeholder when noJs3dHostis registered. - Add a
3d-viewerexample widget usingflutter_3d_controllerto load and display GLB models. - Add bridge and renderer tests for scene lifecycle and command forwarding.
0.4.8 #
- Add a
textAreanode to the JSON renderer: a multiline text input built on the same field machinery astextField. Props:value/initialValue,hint,minLines(default 3),maxLines(default 8, clamped to at leastminLines; the field grows tomaxLinesthen scrolls internally),onChange(fires per keystroke with{value}, exactly liketextField), and an optionalonSubmit(shows adonekeyboard action and fires with{value}; without it Enter inserts a newline).storageKey/id/nameregister the live value with the field registry. The tree normalizer aliasestextarea/TextAreaand applies the same prop aliases (placeholder,value,onChanged) astextField. - Make
listView/gridViewscrolling configurable. Both acceptshrinkWrap(bool, defaulttrue) andphysics('never'/'always'/'platform'). Defaults:listViewis always scrollable;gridViewkeeps its previousshrinkWrap: true+ non-scrollable behavior for backwards compatibility. PreviouslygridViewwas hardcoded toshrinkWrap: true+NeverScrollableScrollPhysics. Follows the renderer's input tolerance:shrinkWrapaccepts'true'/'false'strings and numbers, unknownphysicsvalues fall back to the defaults.
0.4.7 #
- Fix and extend the
chartnode. It now reads its values from the documenteddataprop (pointsremains as a backwards-compatible alias), so apps passingdatano longer render an empty box. New props:fillColor(hex with alpha allowed, e.g.#22c55e33; falls back to the line color at ~20% alpha),strokeWidth(default 2), andchartType—'line'(default, the existing sparkline) or'bar'(equal-width bars with rounded tops and a baseline). Follows the renderer's input tolerance: unknownchartTypefalls back to'line', non-numericdataentries are skipped, empty data renders nothing.
0.4.6 #
- Add transition animation nodes to the JSON renderer.
entranceplays a one-shot mount animation (animation:fade,slideUp,slideDown,slideLeft,slideRight,scale,fadeScale;delayms for staggered list entrances,duration,curve) — implemented overTweenAnimationBuilderwith anIntervalcurve, so no timers are ever scheduled.animatedSwitcherwraps Flutter'sAnimatedSwitcher: whenswitchKeychanges between renders the old child animates out and the new one in (animation:fade,slideLeft,slideRight,slideUp,scale,fadeScale), keyed viaValueKey(switchKey). Both follow the renderer's input tolerance: unknown variants fall back tofade, numeric strings parse, garbage never crashes. The curve parser is now shared asjsCurveinjs_node_helpers.dart.
0.4.5 #
- Add a
mapnode to the JSON renderer, built onflutter_map+latlong2with OpenStreetMap tiles (no API key). Props:center {lat, lng},zoom,markers [{id, lat, lng, label?, color?}],polylines [{points, color?, width?}], andfitBounds(trueto fit all markers/polylines, or an explicit[[lat, lng], [lat, lng]]corner list). Events route through the standard bridge:onTapfires with{lat, lng}andonMarkerTapwith{id}.JsonWidgetRenderer.mapTileProviderlets hosts/tests inject a customTileProviderso tile loading never has to hit the network.
0.4.4 #
- Automated patch bump.
0.4.3 #
- Renderer no longer crashes on malformed numeric props from generated
widgets:
jsDouble/jsDoubleOrNullnow parse numeric strings, take the first numeric element of a list, and fall back instead of throwing a cast error (e.g.borderRadius: [14, 14, 0, 0]previously killed the whole render tree).borderRadiusin decorations, cards, inkWell and clipRRect also accepts CSS-style corner lists ([all],[tl-br, tr-bl],[tl, tr-bl, br],[tl, tr, br, bl]) via the newjsBorderRadius.
0.4.2 #
- Fix web compilation of
JsWidgetEngine:_defaultBackendreferencedFlutterJsWidgetEngineBackendunconditionally, but the conditional import resolves to the Web Worker backend on the web, so any web build importing the wrapper failed with "Method not found: 'FlutterJsWidgetEngineBackend'". The platform pick now lives in a factory behind its own conditional import (js_widget_engine_default.dart/js_widget_engine_default_web.dart).
0.4.1 #
- Fix
JsWidgetBridge.callEventfor rapid-fire gestures: concurrent events (tap-down / tap-up / tap) raced on a single completer, so a stale__jsr_event_donecompleted the next event early and the following callEvent crashed with "Future already completed", permanently wedging event delivery (dead buttons in gesture-heavy widgets). Events are now serialized through an internal queue, and__jsr_event_donehandling is take-and-null so stray/duplicate dones are ignored.
0.4.0 #
- Add pluggable JS engine backend:
- New
JsWidgetEngineBackendinterface. JsRuntimeConfig.backendlets hosts use a custom engine (e.g. QuickJS FFI).- Default backends remain
flutter_json VM and Web Worker on web.
- New
- Add host-provided media support for
video/audionodes:JsMediaHost,JsVideoController,JsAudioControllerinterfaces.JsonWidgetRenderer.mediaHostwires real players while the core package stays free of heavy native media dependencies.
- Add
ExternalAssetResolverandJsonWidgetRenderer.externalAssetResolverforexternal:<id>image sources. - Add dynamic font loading via
JsFontResolver,JsFontLoader, and thefontFamilytext style prop.
0.3.2 #
- Export
UiViewTreeNormalizerfrom the public API so hosts can reuse the same React/HTML-style node-name aliases.
0.3.1 #
- Automated patch bump.
0.3.0 #
- Add
pathnode for SVG path stroking with optional progress animation. - Add
absoluteFillnode (aliasfill) for expanded background fills. - Add
stack.fitsupport (expand/loose). - Add universal effect props (
offsetX/offsetY,scale,rotation,opacity,blur) on any node. - Text improvements:
style.gradientrenders text with a gradient viaShaderMask.style.fontStyle: 'italic'supported in addition toitalic: true.style.lineHeightaliasesstyle.height.
- Image improvements:
asset:andfile:source prefixes.- Optional
imageResolvercallback for custom image providers.
- Add
customBuildersmap for host-defined node types. - Add
videoandaudioplaceholder nodes.
0.2.0 #
- Add
jsr.ease.*easing helpers (linear,easeIn,easeOut,easeInOut,bounce,elastic,backIn,backOut). - Add renderer effects from YoClip:
- Radial gradients (
gradient.type: 'radial'). - Box shadows (
decoration.shadows). - Blur node and
blurproperty on containers. clip: trueon rounded containers.- Static 3D transforms (
rotateX,rotateY,perspective) on containers. - Text shadows and
textTransform(uppercase/lowercase).
- Radial gradients (
0.1.1 #
- Automated patch bump.
0.1.0 #
- BREAKING CHANGE: Rename global JS object and channels from
yoloittojsr.- All widgets must use
jsr.render(),jsr.onEvent(),jsr.fetchJson(), etc. - All internal bridge channels are now prefixed with
__jsr_instead of__yoloit_.
- All widgets must use
- Add
JsRuntimeConfig.hostBootstrapJsso hosts can inject host-specific APIs (e.g.,jsr.yoloit = {...}) without polluting the core runtime. - Update example widgets and documentation to use the new
jsrAPI. - Add
AGENTS.md,CLAUDE.md, and agent skills for widget authoring and engine maintenance.
0.0.7 #
- Automated patch bump.
0.0.6 #
- Automated patch bump.
0.0.5 #
- Automated patch bump.
0.0.4 #
- Automated patch bump.
0.0.3 #
- Automated patch bump.
0.0.1 #
- Initial release.
- JavaScript widget runtime for Flutter (VM via
flutter_js, web via Web Workers). - JSON-to-Flutter renderer (
JsonWidgetRenderer) with layout, input, list, image, chart and animation nodes. - Widget manifest loader (
WidgetManifest,WidgetFileReader,AssetWidgetFileReader). - Bridge APIs:
render,fetchJson,exec,storage,secrets, timers andrequestAnimationFrame.