Skip to content

codelessly_sdk 8.4.0: charts, side sheets and overlay caps, new bindings, batch writes, multi-page publishing - #78

Open
BuildCodelessly wants to merge 19 commits into
masterfrom
claude/relaxed-cerf-h3r5kj
Open

BuildCodelessly wants to merge 19 commits into
masterfrom
claude/relaxed-cerf-h3r5kj

Conversation

@BuildCodelessly

@BuildCodelessly BuildCodelessly commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Runtime changes found while rebuilding the Swellbook surf-report reference app in CodelesslyEditor. Each one closes a gap where the editor couldn't match the code-built app. Releases as codelessly_sdk 8.4.0 (CHANGELOG entry included), on top of master's 8.3.0, and depends on codelessly_api ^6.3.0 (Codelessly/CodelesslyAPI#43).

The branch is rebased onto current master (after #76). Where master already had a feature, this keeps master's version:

  • Dropped in favour of master's: row/column spacing and wrap (CodelesslyWrap), rotation binding (rotation) and object().
  • Overlays: they go through master's presentCanvas, which keeps adaptive and ActionChainOpener. This branch adds side sheets, insets, maxHeightFactor and content-height sheets to it.
  • List items: master's list-item text preview, with VariablePreview.scopeFor, which only overrides the sample item when the item carries data.
  • Canvas-to-layout lookup: one path now. SDKPublishModel.resolveLayoutId falls back to the layoutCanvases index for layouts not loaded yet.

What this adds:

  • Layout
    • Chart rendering with tap/drag selection.
    • Wrapping lists.
    • A list that doesn't scroll and has a known count lays out without a viewport, so stretched rows of cards keep equal heights.
    • Flexible scrolling bodies size to their content.
    • Text span ranges are clamped to the text.
  • Bindings
    • Corner radius, padding, stroke weight and icon glyph (by name) bind to variables, formulas and conditions.
    • Variable overrides are looked up by name.
  • Overlays and actions
    • Side sheets, dialog insets, overlay max height as a share of the screen, and content-height sheets.
    • An action chain continues after a replace navigation.
    • Batch Firestore writes (removeDocuments / setDocuments, in batches of up to 500).
    • Toast styling; text field contentPadding.
  • Publishing: navigation, dialogs and links resolve canvases on any published page, and publishing one page keeps the other pages' fonts and APIs.

Merge order

  1. codelessly_api 6.3.0: charts, list wrap, side sheets, batch cloud writes, style bindings CodelesslyAPI#43, then publish codelessly_api 6.3.0.
  2. This PR, then publish codelessly_sdk 8.4.0.
  3. Codelessly/CodelesslyEditor#704.

Checks (run locally, same steps as CI)

  • dart format is clean.
  • flutter analyze: no issues.
  • flutter test: 807 passed, including master's dialog presentation tests.

CI stays red until codelessly_api 6.3.0 is published. flutter pub get resolves ^6.3.0 from pub.dev.

Known Issues

  • Dragging a bottom sheet whose content takes the drag doesn't dismiss it.
  • A dialog or sheet picks its layout breakpoint by its own width, not the screen's.

🤖 Generated with Claude Code

https://claude.ai/code/session_01SyH8twyrBoe4wFCTw78Cz5

Copy link
Copy Markdown
Contributor Author

CI check is red at flutter pub get: codelessly_sdk depends on codelessly_api ^6.2.0 which doesn't match any versions. That's the release order, not a code problem. This PR needs codelessly_api 6.2.0 (Codelessly/CodelesslyAPI#43) on pub.dev. Locally, with the API resolved from its branch, format and flutter analyze are clean and flutter test passes (732). Once 6.2.0 is published, re-run the job and it should go green with no changes here.


Generated by Claude Code

claude added 18 commits October 24, 2026 00:12
A StartEndProp past the end of its text (left by an edit that shortened
the text) threw a RangeError on every layout and paint, which blanked the
editor canvas and blocked even deleting the node.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SyH8twyrBoe4wFCTw78Cz5
PassiveChartTransformer paints the chart like the surf reference app's
tide card: grid and labels, shaded ranges, curve and fill, markers, a
dashed reference line, and the selection band, line and dot. Points,
markers and selectedX read their bound variables (paths or formulas).
A tap or horizontal drag snaps and clamps the x under the pointer,
writes the bound selectedX variable (or the node value, or local state),
sets the node state so actions read it as ${value}, and fires changed.

Needs codelessly_api with ChartNode.

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

A list that doesn't scroll, hugs its items and has a known item count builds
every item anyway. It now lays them out in a Flex instead of a ListView, so a
Row/Column that stretches its children (IntrinsicHeight) no longer falls back
to start when one child holds such a list: cards side by side stay equal.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SyH8twyrBoe4wFCTw78Cz5
A bound 'icon' names the Material icon or symbol to show (e.g. star or
star_border by a favorite flag); materialIconVersions gives the SVG version
for a name chosen at runtime.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SyH8twyrBoe4wFCTw78Cz5
VariablePreview.scopeFor overlays the list item from the build context on
the editor's preview scope, and text spans pass it, so each item of a bound
list on the canvas shows its own data instead of the first item's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SyH8twyrBoe4wFCTw78Cz5
A list with wrap on and a known item count (itemCount or bound data, no
cloud query) builds all its items in a Wrap along its scroll direction:
the separator spacing between items (no dividers), runSpacing between
runs, aligned to the start, sized by its own fits (shrink-wrap hugs the
runs). It never scrolls. A list with an unknown count ignores wrap.
Items keep their own size in a run instead of being aligned across the
list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SyH8twyrBoe4wFCTw78Cz5
applyStyleOverrides applies a cornerRadius binding (a number or
[tl, tr, br, bl]) on corner nodes and a padding binding (a number, [h, v] or
[l, t, r, b]) on any node.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SyH8twyrBoe4wFCTw78Cz5
setCloudStorage gains removeDocuments (ids from a variable or formula, where
filters, or the whole collection) and setDocuments (a list of documents,
optionally replacing the collection), each committed in Firestore batches of
up to 500 writes. CloudDatabase.removeDocuments/setDocuments default to one
write per document for other implementations.

applyStyleOverrides also applies a strokeWeight binding.

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

SDKPublishUpdates.merge applies a publish of some layouts (one page) on
top of the published updates, keeping the per-layout fonts/apis of the
layouts it doesn't touch. A new layoutCanvases index (layout id -> canvas
ids) lets navigation and dialogs resolve a destination canvas whose layout
is not downloaded yet; FunctionsRepository.resolveLayoutIdForCanvas is the
one lookup both actions use.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SyH8twyrBoe4wFCTw78Cz5
A replace navigation awaited Navigator.pushReplacement, whose future only
completes when the new screen pops, so the actions after it (pop a dialog,
replace the page, show a toast) never ran. It no longer waits, and the new
screen's ActionChainHost joins the chain (ActionChainAdopter), so the
remaining actions run there once the old screen unmounts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SyH8twyrBoe4wFCTw78Cz5
InputDecorationModel.contentPadding, when set, replaces the node's padding
(12 x 16 by default for text fields) as the InputDecoration's content
padding, so a collapsed, borderless field can sit flush.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SyH8twyrBoe4wFCTw78Cz5
showToast reads ShowToastAction.actionColor (the button's label), showClose
(a close button), cornerRadius, fontSize and offset (a variable or formula
for the distance from the screen edge). Without a font of its own the toast
takes the app's text style at the trigger. Toasts without the new fields
look as before.

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

- A flexible Row/Column that scrolls on its main axis hugs its content there,
  capped by its Flexible parent (Flutter loose Flexible), instead of taking its
  solved design size: a form body between header and footer no longer
  collapses to its padding.
- ShowDialogAction.maxHeightFactor caps a dialog (and a bottom sheet, default
  88%) at a share of the screen height; the canvas takes
  min(design height, cap).
- A canvas that hugs vertically makes a bottom sheet, side sheet (vertically
  centred) or dialog as tall as its content, up to the cap.
- ScopedValues keys variable overrides by name, as formulas look them up
  (they were keyed by id and never found).
- PassiveIconWidget takes the scoped values its bindings read, for the
  editor canvas.

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

Links and actions now resolve a canvas the same way, including layouts on
other pages that aren't loaded yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SyH8twyrBoe4wFCTw78Cz5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SyH8twyrBoe4wFCTw78Cz5
@BuildCodelessly
BuildCodelessly force-pushed the claude/relaxed-cerf-h3r5kj branch from 74f7b3d to 64d4cb8 Compare October 24, 2026 00:16
@BuildCodelessly BuildCodelessly changed the title codelessly_sdk 8.3.0: charts, wrap and gap, sheets, new bindings, batch writes, multi-page publishing codelessly_sdk 8.4.0: charts, side sheets and overlay caps, new bindings, batch writes, multi-page publishing Oct 24, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SyH8twyrBoe4wFCTw78Cz5
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