Skip to content

codelessly_sdk 8.3.0: render gauges and charts, interval reactions, dialog placement, computed variables, formula functions - #77

Open
BuildCodelessly wants to merge 22 commits into
masterfrom
claude/zealous-edison-1mkowx
Open

BuildCodelessly wants to merge 22 commits into
masterfrom
claude/zealous-edison-1mkowx

Conversation

@BuildCodelessly

@BuildCodelessly BuildCodelessly commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Runtime support for the models in Codelessly/CodelesslyAPI#42 (6.2.0), found while rebuilding the RigWatch RV monitor in the editor. This PR is intended ONLY to render and run those features, plus two runtime parity fixes.

  • Widgets:
    • PassiveGaugeWidget / GaugePainter and PassiveBarChartWidget, which take scopedValues so the editor can preview their bindings.
    • The industrial slider.
    • Bound textColor.
    • Icons bound to a Material icon name (iconWithName).
    • Animated opacity for nodes with a transition.
  • Actions:
    • Interval reactions (one timer per period, overlapping ticks skipped, stopped on dispose).
    • Dialogs centered, as a bottom sheet, adaptive or anchored to the trigger; canvas confirms take the same placement.
    • The new toast layout fields.
  • Variables: VariableData.formula computed variables, evaluated by the same code path as master's ${= ...} values (PropertyValueDelegate.variableValueOf). Both forms rebuild on what they read; a typed formula is coerced to the variable's type, self-reference reads null.
  • Formulas: adds pad, alpha, concat, list + and FormulaEvaluator.parses. Master's object, clamp, sin, cos, sqrt, pow, take, skip and keys are kept as they are.
  • Parity fix: a row or column that hugs its cross axis and stretches gives hugging children the thickest child's size, matching the editor's solver. Cards in a row now get equal heights at runtime; canvas.parity showed 324 vs 291.
  • Release: version 8.3.0, codelessly_api: ^6.2.0; the CHANGELOG entry folds in master's unreleased notes.

Rebased on master (16ebc9e); master's value-watching on canvas load is kept next to the interval timers.

CI

CI is red at flutter pub get until codelessly_api 6.2.0 is on pub. With the API resolved by path, every later CI step passes locally:

  • dart format
  • flutter analyze (no issues)
  • flutter test: 725 pass
  • flutter build web --wasm for the example

Merge order

Merge after Codelessly/CodelesslyAPI#42 is merged and 6.2.0 is published (re-run CI then), then publish 8.3.0 before merging Codelessly/CodelesslyEditor#707.

🤖 Generated with Claude Code

https://claude.ai/code/session_01AjsYaRkTHNKszSHjd3j264

claude added 17 commits October 23, 2026 23:44
PassiveGaugeWidget and PassiveBarChartWidget read their bound values,
limits, lists and colors from conditions, variables and formulas.
A canvas runs its interval reactions on one timer per period while it
is shown, skipping a tick while the previous run is still going.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjsYaRkTHNKszSHjd3j264
Braces can't appear inside ${= }, so object(key, value, ...) is how a
formula builds the records a list view shows, e.g. the alerts derived
from live readings and rule limits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjsYaRkTHNKszSHjd3j264
A bottom sheet lays the canvas out at the screen width and its own
height and slides up; adaptive picks a sheet under 600 px and a
centered dialog above; anchored places the canvas at its design size
just below the widget that opened it (above when there's no room),
kept 8 px inside the screen, like a menu.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjsYaRkTHNKszSHjd3j264
A variable with a formula reads as the formula's value, coerced to its
type, wherever variables are read (bindings, text, formulas,
conditions). Widgets listen to the variables the formula reads,
transitively, so derived state like the list of active alerts stays
live. A formula that reaches its own variable reads null there instead
of recursing, and setVariable leaves computed variables alone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjsYaRkTHNKszSHjd3j264
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjsYaRkTHNKszSHjd3j264
A slider can draw a rectangular thumb with border and grip, fill its
active track from the thumb to the end (an "above the limit" zone),
mark divisions with notches under the track (every Nth, every fifth
long), show a bindable marker (e.g. the current reading) and a bindable
active color, keep the thumb inside a selectable part of the track, and
fire changeEnd when the drag ends.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjsYaRkTHNKszSHjd3j264
A text node's textColor binding or condition recolors all its spans,
so readouts and labels can turn red when an alert fires. alpha(color,
opacity) gives the #AARRGGBB tint of a color for soft fills.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjsYaRkTHNKszSHjd3j264
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjsYaRkTHNKszSHjd3j264
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjsYaRkTHNKszSHjd3j264
…, close button, font size

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjsYaRkTHNKszSHjd3j264
…thickest child's size, as the editor's solver does

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjsYaRkTHNKszSHjd3j264
…con name

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjsYaRkTHNKszSHjd3j264
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjsYaRkTHNKszSHjd3j264
…est import

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjsYaRkTHNKszSHjd3j264
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjsYaRkTHNKszSHjd3j264
@BuildCodelessly
BuildCodelessly force-pushed the claude/zealous-edison-1mkowx branch from eabfb63 to bb5267b Compare October 23, 2026 23:50

Copy link
Copy Markdown
Contributor Author

The check job fails at flutter pub get: codelessly_api ^6.2.0 doesn't exist on pub yet. It comes from Codelessly/CodelesslyAPI#42, whose CI is green. This PR can't fix that (going back to ^6.1.0 would break the new models).

With the API resolved by path, every later step of the job passes locally on c5c5de3: format, flutter analyze (no issues), 725 tests and the example's flutter build web --wasm. Once 6.2.0 is published, re-run this job.


Generated by Claude Code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjsYaRkTHNKszSHjd3j264
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjsYaRkTHNKszSHjd3j264
Material Icons SVGs are served per version, from the version an icon was
added in, so a bound name like 'air' (v10) asked for v1 and drew nothing.
iconWithName looks the version up in a table generated from the Google
Fonts icon metadata.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AjsYaRkTHNKszSHjd3j264
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants