Skip to content

codelessly_sdk 8.4.0: stacked lists, bound x/y, drag and key reactions, popovers, full height sheets - #84

Open
BuildCodelessly wants to merge 15 commits into
masterfrom
claude/peaceful-lovelace-09ud27
Open

BuildCodelessly wants to merge 15 commits into
masterfrom
claude/peaceful-lovelace-09ud27

Conversation

@BuildCodelessly

@BuildCodelessly BuildCodelessly commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

This PR renders the model changes in Codelessly/CodelesslyAPI#49. We found what was missing by rebuilding a real app ("Nook", a tiny-home builder with a drag-and-drop floor-plan builder) in the editor.

The branch is rebased on master. Master's gap/wrap, computed variables, formula functions (obj, concat, money digits, thousands, ...) and presentCanvas (sheets, adaptive, aligned dialogs) landed in parallel. This PR builds on them: popovers and full height sheets are added to presentCanvas, and our duplicate functions were dropped.

Changes

  • Layout
    • Stacked lists place their items at bound x/y.
    • A node's x and y in a freeform parent can be bound, and a freeform child is placed at its bound width and height.
    • ${parent.item} and ${parent.index} read the item of the list one level out.
    • A canvas in a dialog, sheet or popover picks its responsive layout by the screen width.
  • Actions and triggers
    • Drag, drag end, pointer down and pointer up reactions, with ${result.*} positions and deltas.
    • Key Down reactions on screens, with ${result.key}, shift, alt and meta. Modifier keys alone are ignored. Only a reaction set to a specific key takes that key, so Tab and browser shortcuts keep working.
    • Show dialog as a popover anchored to the node that opened it. With an end alignment, the popover lines up with the node's right edge.
    • Show dialog as a full height bottom sheet (90% of the screen, the canvas scrolls its own content).
    • Copy to Clipboard actions.
  • Formulas and variables
    • New functions with, at (a negative index reads nothing), flatMap and feetInches.
    • auth reads as signed out where there is no app user.
    • A computed text that gives nothing shows nothing.
    • On the design canvas, a formula that gives empty text shows nothing instead of a placeholder.
  • Release: version 8.4.0 and its CHANGELOG entry, on top of master's unreleased 8.3.0, with codelessly_api: ^6.3.0.

Checks

These were run locally against the API branch through pubspec_overrides.yaml:

  • dart format --set-exit-if-changed and flutter analyze: clean.
  • flutter test: 752 pass.

Known Issues

  • CI is red until codelessly_api 6.3.0 is on pub.dev. CI resolves the API from pub.dev, and this code needs its new fields. Merge order: API PR, publish 6.3.0, re-run this PR's CI, merge, then the editor PR.

🤖 Generated with Claude Code

https://claude.ai/code/session_0186HDSCvPDpNcgTDiXgg3qb

BuildCodelessly commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor Author

The check job fails at flutter pub get: codelessly_sdk depends on codelessly_api ^6.3.0 which doesn't match any versions. This is the case through the latest head, 1ebb9cd.

This isn't a code failure. The code needs the model changes in Codelessly/CodelesslyAPI#49, and CI resolves codelessly_api from pub.dev. API #49 is rebased on master's 6.2.0 as 6.3.0, and its CI is green.

Built locally against that branch, this PR passes dart format and flutter analyze, and all 752 tests pass.

Once API #49 is merged and codelessly_api 6.3.0 is published, re-running this job should go green. No code change is needed here.


Generated by Claude Code

@BuildCodelessly
BuildCodelessly force-pushed the claude/peaceful-lovelace-09ud27 branch from a066b95 to d5374e2 Compare October 24, 2026 00:10
claude added 10 commits October 24, 2026 00:22
- ListLayout.stack lists place each item at its bound x/y, evaluated per item.
- A node's x, y (freeform parents) and rotation can be bound like its size.
- drag/dragEnd/pointerDown/pointerUp reactions run with the drag's deltas in
  ${result} (deltaX/Y, dx/dy, x/y; velocity on drag end).
- Show dialog can present the canvas as a bottom sheet.
- Formulas build maps and edit lists: obj, with, merge, keys, append, concat,
  insertAt, setAt, removeAt, slice, reverse, first, last, at, indexOf,
  flatMap, range, plus clamp, pow and sqrt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0186HDSCvPDpNcgTDiXgg3qb
A list inside another list's item reads that item as ${parent.item} and its
index as ${parent.index}, e.g. a home card's floor plan scales by its home.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0186HDSCvPDpNcgTDiXgg3qb
feetInches(6.67) reads 6′ 8″. Money without cents and digit grouping
are master's money(value, symbol, 0) and thousands().

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0186HDSCvPDpNcgTDiXgg3qb
Show dialog can open a canvas as a popover anchored to the node that ran
the action: below it, right-aligned near the edge, above it without room.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0186HDSCvPDpNcgTDiXgg3qb
The design canvas and previews have no Codelessly instance, so auth was
null and both signed-in and signed-out nodes showed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0186HDSCvPDpNcgTDiXgg3qb
A screen runs its Key Down reactions for keys pressed while it is on top
and no text field has focus. A full height bottom sheet gives its canvas
90% of the screen so it scrolls its own list. A canvas shown at its design
size in a dialog, sheet or popover picks its responsive layout by the
screen width instead of its own.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0186HDSCvPDpNcgTDiXgg3qb
- A node with bound x/y is always wrapped in its translation, so the first
  drag move no longer rebuilds the node and ends the drag.
- A cloud stacked list doesn't shrink-wrap (a Stack of positioned items
  can't).
- Key Down ignores modifier-only keys and takes a key only for a reaction
  set to that key, so Tab and browser shortcuts keep working; Space reads
  'Space'; reactions refresh when the screen changes.
- at(list, -1) is null.
- A popover's anchor is measured once, in its navigator's coordinates.
- Lints in the formula tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0186HDSCvPDpNcgTDiXgg3qb
Indexing a text variable whose formula is null read the characters of
'null'.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0186HDSCvPDpNcgTDiXgg3qb
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0186HDSCvPDpNcgTDiXgg3qb
Other sheets are master's aligned dialog, so the sheet widget no longer
takes a fullHeight flag or a scrolling content-height mode.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0186HDSCvPDpNcgTDiXgg3qb
@BuildCodelessly
BuildCodelessly force-pushed the claude/peaceful-lovelace-09ud27 branch from d5374e2 to 62689f7 Compare October 24, 2026 00:26
@BuildCodelessly BuildCodelessly changed the title codelessly_sdk 8.3.0: gap and wrap, stacked lists, drag and key reactions, sheets, popovers, computed variables codelessly_sdk 8.4.0: stacked lists, bound x/y, drag and key reactions, popovers, full height sheets Oct 24, 2026
A pinned child was placed at its design size, so a bound width (a meter's
fill, a to-scale dimension line) didn't show.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0186HDSCvPDpNcgTDiXgg3qb
A show dialog action presented as a popover with an end (right)
alignment opens with its right edge on the anchor's, for a menu opened
from a button at the right of a card.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0186HDSCvPDpNcgTDiXgg3qb
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0186HDSCvPDpNcgTDiXgg3qb
It showed a placeholder named after the first variable it reads, so
"Edited ${item.edited}${= if(item.published, ' · ' + …, '')}" read
"Edited just nowPublished" for a draft.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0186HDSCvPDpNcgTDiXgg3qb
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0186HDSCvPDpNcgTDiXgg3qb
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