softr-vibe-coding 1.11.1 → 1.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,11 @@ All notable changes to this skill are documented here. Versions follow [Semantic
4
4
 
5
5
  Entries from 1.3.1 onward are generated automatically from git commit subjects between version bumps (see `.github/workflows/publish.yml`). Entries before 1.3.1 were backfilled by hand from the existing commit history.
6
6
 
7
+ ## [1.11.2] - 2026-07-08
8
+ - Bump to 1.11.2 — publish recordId-less useRecord note and input.textAsync correction
9
+ - Correct input.textAsync in airtable-automations.md — it is not a real method in EITHER Airtable scripting environment; calling it in the Scripting Extension throws TypeError: input.textAsync is not a function. buttonsAsync is the only interactive runtime prompt; free-text values (e.g. an API key) go through an input.config({...}) setting at the top or a hardcoded constant. Also generalize the Automation Scripts bullet to "no interactive prompts".
10
+ - Document recordId-less useRecord via Studio data binding
11
+
7
12
  ## [1.11.1] - 2026-06-12
8
13
  - Document the tabbed-list visibility gotcha in native-block-filters.md — Softr renders tabs with Radix and keeps the INACTIVE tab's blocks in the DOM (display:none, not unmounted), so a data-block-id lookup on a tabbed page matches BOTH tabs' lists; injecting a custom control into the hidden one makes it 'disappear' on tab switch. Add §4d: require the matched block to be visible (offsetParent !== null) and home into whichever tab is active so one control follows all tabs (each tab-list keeps its own conditional filter; ~250ms interval for snappier flips), plus a Gotchas bullet. Bump to 1.11.1
9
14
 
@@ -84,6 +84,8 @@ var result = useRecord({
84
84
  });
85
85
  ```
86
86
 
87
+ **`recordId` can be omitted when Softr Studio supplies the record context.** `useRecord({ select })` with no `recordId` loads the record the block is bound to via its data-source binding in Studio — verified by deployed block, July 2026 (an Airtable-backed stats block rendered live values this way). Keep `useCurrentRecordId()` + explicit `recordId` as the pattern for URL-driven detail pages (`/page?recordId=...`). When editing an existing **working** block that already omits `recordId`, leave the call shape as-is: adding an explicit `recordId` from `useCurrentRecordId()` can change behavior on pages whose URL carries no `recordId` param. Corollary for reviews: a recordId-less `useRecord` is NOT by itself a defect — check whether the block is deployed and loading data before flagging it.
88
+
87
89
  ## useLinkedRecords -- Fetch Linked/Related Options
88
90
 
89
91
  ```jsx
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "softr-vibe-coding",
3
- "version": "1.11.1",
3
+ "version": "1.11.2",
4
4
  "description": "Claude Code skill for generating production-ready Softr Vibe Coding blocks (JSX). Installs into ~/.claude/skills/ and auto-updates on each Claude Code session.",
5
5
  "bin": {
6
6
  "softr-vibe-coding": "./bin/cli.js"
@@ -28,7 +28,7 @@ Background-only. No UI. Receives input from the automation trigger; can output v
28
28
  - Output to downstream steps via `output.set(key, value)`.
29
29
  - `console.log()` appears in the automation's run log (NOT the browser console). This is your ONLY progress / debug surface.
30
30
  - **NO `output.markdown`, NO `output.text`, NO `output.table`, NO `output.inspect`** — those throw `TypeError: output.<x> is not a function` here. They're Scripting-Extension-only.
31
- - **NO `input.buttonsAsync` / `input.textAsync`** — interactive UI is not available in the background runner.
31
+ - **NO interactive prompts** (`input.buttonsAsync` and friends) — interactive UI is not available in the background runner. (Note: `input.textAsync` is not a real method in *either* environment — see the Scripting Extension section.)
32
32
  - Execution cap: 120 seconds (recently raised from 30s).
33
33
  - Can be triggered manually via the "Test" button on the automation, useful for one-shot scripts you don't want to set up a real trigger for.
34
34
 
@@ -59,7 +59,7 @@ await main();
59
59
  Foreground, interactive. Used for one-off transforms, bulk fixes, building admin dashboards. Has a richer API. Requires installing the "Scripting" extension in the base — most bases don't have it by default.
60
60
 
61
61
  - Configure interactive inputs via `input.config({ title, items: [...] })` — note: takes an OBJECT here, unlike Automation Scripts.
62
- - Show prompts with `await input.buttonsAsync(prompt, options)`, `input.textAsync(...)`, etc.
62
+ - Show prompts with `await input.buttonsAsync(prompt, options)` — this is the **only** interactive runtime prompt. **There is no `input.textAsync`**; calling it throws `TypeError: input.textAsync is not a function`. For a free-text value (e.g. an API key), declare it as an `input.config({...})` setting at the top, or hardcode a constant for a one-off script.
63
63
  - Render output with `output.markdown(...)`, `output.table(...)`.
64
64
  - `console.log()` shows in the browser devtools console.
65
65
 
@@ -65,6 +65,8 @@ var recordId = useCurrentRecordId();
65
65
  var result = useRecord({ recordId: recordId, select: select });
66
66
  ```
67
67
 
68
+ `recordId` may be omitted when the block's Studio data binding supplies the record context (verified by deployed block, July 2026) — see [reading.md](../datasources/reading.md#userecord----fetch-a-single-record).
69
+
68
70
  ## Current User
69
71
 
70
72
  ```jsx