Skip to content

codelessly_sdk 8.3.0: motion, formulas, computed variables, triggers, layout - #80

Merged
BuildCodelessly merged 14 commits into
masterfrom
claude/relaxed-noether-3wtt92
Oct 24, 2026
Merged

BuildCodelessly merged 14 commits into
masterfrom
claude/relaxed-noether-3wtt92

Conversation

@BuildCodelessly

@BuildCodelessly BuildCodelessly commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Runtime support for the features in Codelessly/CodelesslyAPI#45. They were found while recreating a code-built app (Crate Digger) in the Codelessly editor; every gap is logged with its fix in the editor repo's references/crate_digger/blockers.md.

What's new

  • Motion: NodeMotion animates transforms, spin, loops, entrances (from rest or enterFrom, replayed on replayKey) and delays.
  • Triggers: timer, key press, swipe (with the mouse wheel), double tap and hover.
  • Layout:
    • stacked and wrapping lists;
    • vertical, inverted and rectangular-thumb sliders with bound min/max;
    • the row/column gap now uses master's spacing. This branch's duplicate itemSpacing runtime was dropped in the merge.
  • Formulas and variables:
    • computed variables follow master's model, a ${= ...} value evaluated on read. ComputedVariables keeps the editor helpers: inputs, cycles, preview resolution;
    • new functions on top of master's: strings, durations, money(v, decimals), luminance, slice/take/skip/reverse, and text indexOf;
    • object literals, index lambdas, multi-key sortBy.
  • Style bindings:
    • effects, stroke weight, corner radius, font weight and icon (StyleBindings), alongside master's bindable flex and rotation;
    • image fills listen to the variables in their URL.
  • Navigation:
    • a screen's route is set before its load actions run;
    • a link's parameters also set the variables they name;
    • CodelesslyWidget.initialScreen.
  • Fixes:
    • a screen variable shadows an app variable of the same name in Set variable;
    • dashed strokes draw their caps, and a zero pattern no longer hangs.
  • Release: version 8.3.0 on codelessly_api ^6.2.0, with one CHANGELOG entry covering master's changes and this branch's.

Checks

  • Run locally on the merge with master, against the API from Better Exception Handling #45: dart format, flutter analyze (no issues) and flutter test (808 pass).
  • CI fails until codelessly_api 6.2.0 is on pub. It resolves the API from pub (codelessly_api ^6.2.0 doesn't match any versions), and 6.1.0 lacks these models. Re-run CI after the API is published.

Merge order

  1. Merge codelessly_api 6.2.0: motion, new triggers, gaps and wrapping lists, computed variables CodelesslyAPI#45 and publish codelessly_api 6.2.0.
  2. Re-run CI on this PR, then merge it and publish codelessly_sdk 8.3.0.
  3. Merge the editor PR, Codelessly/CodelesslyEditor#706.

🤖 Generated with Claude Code

https://claude.ai/code/session_013oMokUGNW6txknJs7xxTik

claude added 12 commits October 23, 2026 16:47
- NodeMotion draws a node's motion (offset, scale, opacity, rotation,
  3D tilt, transitions and spin) with bound values resolved per build;
  the design canvas shows it at rest.
- Canvases run timer reactions every interval and key press reactions for
  their key; frames and rectangles run swipe reactions (and wheel scroll).
- Stacked lists draw their items on top of each other, first on top.
- Set variable resolves its variable by id, and lookups by name take the
  screen's own variable over a shared one of the same name, as bindings
  do.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013oMokUGNW6txknJs7xxTik
A site can link to any screen (/<slug>/<screen>) instead of only the entry
one; names match loosely, so record-form opens "Record form".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013oMokUGNW6txknJs7xxTik
- Formulas: padLeft/padRight, substring, replace, split, indexOf, matches,
  slug, seconds/duration, slice/take/skip/reverse/findIndex, index params
  in lambdas, multi-key sortBy and sortByDesc, object literals with
  merge/set, money decimals, luminance.
- Lists can wrap their items onto further lines.
- StyleBindings: effects, stroke weight, icon, font weight and corner
  radius follow variables and formulas, on the canvas and at runtime.
- Bindings inside a list row read that row's item on the design canvas.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013oMokUGNW6txknJs7xxTik
- ComputedVariables keeps formula variables up to date from their inputs;
  Set variable leaves them alone.
- NodeMotion loops, animates in on first show and honours delays.
- Design canvas splits text by formulas before variables.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013oMokUGNW6txknJs7xxTik
Formula-hidden children take no gap; children keep their state while
siblings show and hide.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013oMokUGNW6txknJs7xxTik
…d thumb stroke

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013oMokUGNW6txknJs7xxTik
…ns no longer hang

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013oMokUGNW6txknJs7xxTik
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013oMokUGNW6txknJs7xxTik
…n formulas

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013oMokUGNW6txknJs7xxTik
…canvas slider bindings, formula paths

- NodeMotion plays an entrance from enterFrom and again when the bound
  replayKey changes.
- RoundedRectSliderThumbShape; PassiveSliderWidget takes the scope its
  bindings read.
- A node's used variables include the paths its formulas read.
- Lint fixes.

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

Copy link
Copy Markdown
Contributor Author

CI fails at flutter pub get, before any check runs: "codelessly_sdk depends on codelessly_api ^6.2.0 which doesn't match any versions".

This is expected. The SDK needs the models in Codelessly/CodelesslyAPI#45, and CI resolves the API from pub. The fix is release order, not code:

  1. merge codelessly_api 6.2.0: motion, new triggers, gaps and wrapping lists, computed variables CodelesslyAPI#45;
  2. publish codelessly_api 6.2.0;
  3. re-run this check.

Locally, with the API from that branch, this PR passes:

  • dart format;
  • flutter analyze (no issues);
  • flutter test (773 pass);
  • the example's flutter build web --wasm.

Generated by Claude Code

…unctions, link fixes

- Master's row/column spacing replaces itemSpacing rendering.
- Computed variables are master's: a ${= ...} value evaluated when read.
  ComputedVariables keeps the helpers the editor uses (formula checks,
  inputs, cycles, previews), reading the formula from the value; the
  runtime binding is gone. Set variable still leaves them alone.
- Formula functions both sides added (slice, take, skip, reverse, merge,
  set) keep one implementation; indexOf takes text, a value or a predicate.
- VariableSpan takes master's list item; scopeOf accepts it too.
- A link's first screen gets master's parameter fallback, and the link's
  parameters still set the variables they name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013oMokUGNW6txknJs7xxTik
- Hover enter/exit run as master's cursorEnter/cursorExit through
  wrapWithCursorReactions; double tap keeps its own wrapper.
- A link resolved through a screen's URL path also sets the variables its
  parameters name, and sets the screen's route before its load actions.
- Formulas: master's functions and this branch's are merged into one
  table. Where both defined one, this branch's implementation stays, with
  master's behavior: split without a separator splits into characters,
  substring/left/right count negative indexes from the end, matches is
  false for a missing value, and reverse is null for other values.
- Both computed variable test files are kept (this branch's as
  computed_variable_helpers_test.dart).
- This branch's changes go under master's Unreleased changelog section.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013oMokUGNW6txknJs7xxTik
@BuildCodelessly
BuildCodelessly merged commit 90707d0 into master Oct 24, 2026
0 of 2 checks passed
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