Repository navigation
Render gauges, charts and pulses; computed variables; formula functions; canvas previews - #83
Open
BuildCodelessly wants to merge 18 commits into
Open
BuildCodelessly wants to merge 18 commits into
BuildCodelessly wants to merge 18 commits into
Conversation
PassiveGaugeTransformer paints GaugeNode dials (top-anchored, animated
value, zone colors, segments, ticks, labels in Google Fonts, target and
needle). PassiveChartTransformer paints bar, line and timeline charts
from the node's bound data, keeps a selected category, and fires changed
reactions with the tapped index as ${value}. Gradients honor the paint's
tile mode; a repeating linear gradient spans 1 / scale of the box.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FeVQ6NCLHS9Vrfxhii4Mj8
A computed variable (its value is a formula) reads as the formula's result, converted to its type, wherever a variable is read: bindings, formulas, conditions and CodelesslyContext.getVariableValue. Results are cached until the formula or a variable it reads (directly or through other computed variables) changes, unless it reads item, index, screen and the like. Whatever is bound to it listens to those variables too, so it stays live. A cycle stops at the variable that started it. SetVariable leaves a computed variable alone. New formula functions: obj and set build and update maps, get reads a field by a computed key, take and skip slice lists, indexOf finds an item, split and pad handle clock times. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FeVQ6NCLHS9Vrfxhii4Mj8
… preview scoped values
VariablePreview.resolve(node, context) passes the row's IndexedItem to the
editor's scope resolver, so ${item...} text in row N shows row N.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FeVQ6NCLHS9Vrfxhii4Mj8
…iew values concat(list, ...) joins lists (rule-raised alerts with stored ones), range(n) counts, thousands(n, decimals) writes 17,402 and duration(min) writes 6m / 2h 04m. PassiveProgressBarWidget takes scopedValues so the design canvas can bind its value and color. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FeVQ6NCLHS9Vrfxhii4Mj8
…l opacity Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FeVQ6NCLHS9Vrfxhii4Mj8
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FeVQ6NCLHS9Vrfxhii4Mj8
…s and selection Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FeVQ6NCLHS9Vrfxhii4Mj8
… test Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FeVQ6NCLHS9Vrfxhii4Mj8
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FeVQ6NCLHS9Vrfxhii4Mj8
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FeVQ6NCLHS9Vrfxhii4Mj8
A dialog keeps its canvas's design size, so a responsive dialog showed whichever breakpoint the editor last left the canvas at. A canvas holding a responsive layout now fills the space it is given. A formula span that evaluates to empty text showed a placeholder on the design canvas; it now shows nothing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FeVQ6NCLHS9Vrfxhii4Mj8
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FeVQ6NCLHS9Vrfxhii4Mj8
The triggers existed in the API but nothing fired them, so press and hold (start on down, cancel on release) couldn't be built. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FeVQ6NCLHS9Vrfxhii4Mj8
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FeVQ6NCLHS9Vrfxhii4Mj8
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FeVQ6NCLHS9Vrfxhii4Mj8
A one-line text field with a fixed height expanded to fill it, which drops the line limit; Flutter only obscures one-line fields, so the text showed. obscureText also reads a variable binding or condition, so a show/hide toggle drives one field. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FeVQ6NCLHS9Vrfxhii4Mj8
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FeVQ6NCLHS9Vrfxhii4Mj8
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FeVQ6NCLHS9Vrfxhii4Mj8
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Runtime support for the model changes in Codelessly/CodelesslyAPI#48, found while recreating a factory-floor OEE dashboard in the editor. This PR is intended ONLY to add the rendering, evaluation and preview hooks below.
PassiveGaugeWidget/GaugePainterandPassiveChartWidget/ChartPainter.changedtrigger with${value}.pulsefades its opacity in a loop (PulseOpacity), applied inapplyWidgetOpacity.${= ...}variable reads as its formula's result, typed, in bindings, formulas, conditions andgetVariableValue.obj,set,get,take,skip,indexOf,split,pad,concat,range,thousands,duration. All are documented in the formula help.VariablePreview.resolve(node, context)gives a list row's item to the editor's resolver.scopedValues, so a canvas can preview their bindings.The changelog has an Unreleased section.
Checks run locally against the API PR (through a path override):
dart format: cleanflutter analyze: no issuesflutter test: 665 tests passexample:flutter build web --wasmbuildsKnown Issues
codelessly_api6.2.0 (API#48) is published.flutter analyzeresolves the released 6.1.0, which doesn't have these types. Once it's out, bump the constraint to^6.2.0here.Generated by Claude Code