Skip to content

Render signatures, hold-to-confirm, full-screen dialogs, bound flex and record helpers - #79

Open
BuildCodelessly wants to merge 14 commits into
masterfrom
claude/busy-lovelace-m5cijt
Open

BuildCodelessly wants to merge 14 commits into
masterfrom
claude/busy-lovelace-m5cijt

Conversation

@BuildCodelessly

@BuildCodelessly BuildCodelessly commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Runtime support for Codelessly/CodelesslyAPI#44, found while rebuilding a jobsite daily log app in the editor. This branch is merged with master. Master's wrap and spacing (#75), dialog presentation and alignment (#76) and its formula functions replace this branch's versions. What this PR still adds:

  • Signature nodes
    • Draw a signature by finger, pen or mouse; strokes are written to the bound value and fire changed.
    • Setting the variable redraws the box; read-only boxes only show it.
  • Hold to confirm
    • The hold trigger runs its actions once the node has been held for its duration.
    • While held, the node and everything inside it can read ${hold} (0 to 1).
  • Dialogs
    • presentCanvas shows full-screen dialogs.
    • Bottom sheets are as wide as the screen and as tall as their content, up to 90% of it (CanvasSizing.sheet), and always sit on the bottom edge.
    • A responsive layout in a dialog picks its layout by the screen width.
  • Bound flex
    • A row now reads a child's bound flex when it lays out its Flexibles. Master's binding patched the child's own style, which can't change its share of the row, so bound bars kept equal widths. flex_binding_test.dart covers this.
    • A bound flex of 0 collapses the child.
  • Bindings: strokeWeight, and the icon a node shows.
  • Formula record helpers: unset, prepend, updateWhere, removeWhere, findIndex and newId. set also takes a list and an index, and indexOf and slice also take text.
  • ${hovered} was dropped in favour of the editor's per-node interaction states.

Everything is under ## Unreleased in CHANGELOG.md.

Checks run locally against Codelessly/CodelesslyAPI#44: dart format, flutter analyze --no-pub (no issues) and flutter test (749 tests passing). The merge also fixes two quote lints in master's formula_math_test.dart.

Known Issues

  • CI stays red until codelessly_api 6.2.0 is on pub.dev. Master already requires codelessly_api ^6.2.0, which isn't published yet, so dependency resolution fails, including for the example app's web build.

🤖 Generated with Claude Code

https://claude.ai/code/session_0147gqWiq3xoEdAGwWSpq9JK

claude added 12 commits October 23, 2026 16:47
obj, set, unset, merge, append, prepend, concat, updateWhere,
removeWhere, findIndex, indexOf, slice, take, skip, first, last, range
and newId let a setVariable change a record inside a list variable,
which formulas couldn't express because they can't contain braces.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0147gqWiq3xoEdAGwWSpq9JK
iconName (bound, from a condition or set by an action) swaps the icon
for the Material Symbol of that name, keeping its style, so list items
can each show their own icon. thousands(value, decimals) groups digits
without money's symbol and cents.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0147gqWiq3xoEdAGwWSpq9JK
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0147gqWiq3xoEdAGwWSpq9JK
A flex bound to a variable or formula, or set by a condition, replaces
the node's own when a row or column shares out its free space.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0147gqWiq3xoEdAGwWSpq9JK
showLayoutDialog follows the action's presentation: showModalBottomSheet
with the canvas spanning the width at its content's height, a sheet on
mobile widths for adaptive, or a full-screen route.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0147gqWiq3xoEdAGwWSpq9JK
The hold trigger exposes its progress to the nodes inside as ${hold}.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0147gqWiq3xoEdAGwWSpq9JK
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0147gqWiq3xoEdAGwWSpq9JK
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0147gqWiq3xoEdAGwWSpq9JK
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0147gqWiq3xoEdAGwWSpq9JK
Master's per-node interaction states style a node and the nodes inside it
when hovered, pressed, focused, selected or disabled, so a second hover
mechanism only adds confusion. The hold trigger keeps its scope above the
node's build, so the held node's own bindings read ${hold} too.

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

Copy link
Copy Markdown
Contributor Author

The check job fails at flutter analyze, as expected for this PR. Formatting passes; all 32 analyzer errors are types and fields this PR uses from Codelessly/CodelesslyAPI#44 that the published codelessly_api 6.1.0 doesn't have yet: SignatureNode, TriggerType.hold, TriggerModel.duration, DialogPresentation, and RowColumnNode.wrap/spacing/runSpacing.

This PR can't fix that itself. Once API#44 merges and the API is released, raising codelessly_api to the new version here should turn CI green. Locally, against the API branch, flutter analyze reports no issues and flutter test passes all 667 tests.


Generated by Claude Code

Master landed row/column spacing and wrap (CodelesslyWrap), flex and
rotation bindings and many of the same formula functions. Keep master's
versions and drop this branch's Wrap rendering and its test; master's
wrap and spacing tests cover them.

Kept from this branch: a child whose bound flex is 0 collapses, and the
row reads a bound flex when it lays out its Flexibles, since the child's
own style overrides can't change its share (flex_binding_test caught
that); the record helpers master lacks (obj, unset, prepend, concat,
updateWhere, removeWhere, findIndex, newId), set on a list and indexOf
and slice on text. Formatted two quotes in master's formula_math_test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0147gqWiq3xoEdAGwWSpq9JK
Master landed presentCanvas (dialog, bottom sheet, adaptive) with an
alignment for dialogs, and obj, concat and a decimals argument for
money. Keep master's and add what this branch had: full screen dialogs,
sheets as wide as the screen and up to 90% of its height
(CanvasSizing.sheet), and sheets on the bottom edge wherever an action
places a dialog. Both branches added test/dialog_presentation_test.dart;
this branch's moves to test/dialog_sizing_test.dart.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0147gqWiq3xoEdAGwWSpq9JK
@BuildCodelessly BuildCodelessly changed the title Render signatures, hold-to-confirm, wrapping rows, dialog presentations and new bindings Render signatures, hold-to-confirm, full-screen dialogs, bound flex and record helpers Oct 24, 2026
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