softr-vibe-coding 2.14.4 → 2.15.0
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 +8 -0
- package/README.md +25 -11
- package/SKILL.md +2 -0
- package/datasources/hubspot.md +4 -1
- package/package.json +1 -1
- package/references/browser-checks.md +4 -0
- package/references/date-picker.md +1107 -0
- package/references/searchable-dropdown.md +7 -1
- package/references/softr-mcp.md +57 -3
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,14 @@ 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
|
+
## [2.15.0] - 2026-10-07
|
|
8
|
+
- Release 2.15.0
|
|
9
|
+
- Add the brand date picker reference
|
|
10
|
+
|
|
11
|
+
## [2.14.5] - 2026-10-07
|
|
12
|
+
- Release 2.14.5
|
|
13
|
+
- Document condition-based user groups over the MCP
|
|
14
|
+
|
|
7
15
|
## [2.14.4] - 2026-10-07
|
|
8
16
|
- Release 2.14.4
|
|
9
17
|
- Add the Safari focus rule to the Combo reference
|
package/README.md
CHANGED
|
@@ -208,7 +208,12 @@ softr-vibe-coding/
|
|
|
208
208
|
│ │ # alone, DATETIME create shape, offset paging;
|
|
209
209
|
│ │ # OAuth grant per ticked workspace, email
|
|
210
210
|
│ │ # senders, formulas fixed at creation, loop
|
|
211
|
-
│ │ # counter, workflow time zone and publish state
|
|
211
|
+
│ │ # counter, workflow time zone and publish state;
|
|
212
|
+
│ │ # Oct 7 2026: condition-based user groups over
|
|
213
|
+
│ │ # MCP (subject USER:<field id>, not USER:::),
|
|
214
|
+
│ │ # list_users omits conditional membership,
|
|
215
|
+
│ │ # reading userGroups in the preview iframe,
|
|
216
|
+
│ │ # what __softr_current_user carries
|
|
212
217
|
│ ├── browser-checks.md # Checking a pushed block in a browser with
|
|
213
218
|
│ │ # the agent-browser CLI (ask before installing):
|
|
214
219
|
│ │ # preview cookie, shadow-DOM refs grepped in the
|
|
@@ -256,16 +261,25 @@ softr-vibe-coding/
|
|
|
256
261
|
│ │ # Imports, hook signatures, mutation shapes,
|
|
257
262
|
│ │ # field mapping, component skeleton,
|
|
258
263
|
│ │ # Softr navigation variables, container queries
|
|
259
|
-
│
|
|
260
|
-
│
|
|
261
|
-
│
|
|
262
|
-
│
|
|
263
|
-
│
|
|
264
|
-
│
|
|
265
|
-
│
|
|
266
|
-
│
|
|
267
|
-
│
|
|
268
|
-
│
|
|
264
|
+
│ ├── searchable-dropdown.md # THE dropdown pattern for blocks
|
|
265
|
+
│ │ # why native <select> and shadcn <Select> both
|
|
266
|
+
│ │ # break in the shadow DOM, composedPath()
|
|
267
|
+
│ │ # click-outside, A-Z inside the component,
|
|
268
|
+
│ │ # multi-token filter, searchable BY DEFAULT
|
|
269
|
+
│ │ # (bare = click-only; searchable={false} only
|
|
270
|
+
│ │ # for a fixed enum being set — Sep 10 2026),
|
|
271
|
+
│ │ # overflow-clipping ancestors: never clip a cell
|
|
272
|
+
│ │ # holding a Combo, clip-aware drop-up + list
|
|
273
|
+
│ │ # height, list-only scrolling (Sep 30 2026)
|
|
274
|
+
│ └── date-picker.md # THE date field for blocks: no native
|
|
275
|
+
│ # <input type="date"> (its calendar is browser
|
|
276
|
+
│ # UI no CSS reaches); the DatePicker kit (API +
|
|
277
|
+
│ # full component), the kit-between-markers
|
|
278
|
+
│ # convention + sync script, rollout lessons
|
|
279
|
+
│ # (clipping, short modal bodies, textClass for
|
|
280
|
+
│ # named containers, Escape, backdrop clicks,
|
|
281
|
+
│ # deferred focus fix-up, Safari focus,
|
|
282
|
+
│ # "yyyy-MM-dd" values), verification (Oct 7 2026)
|
|
269
283
|
│
|
|
270
284
|
├── tools/ # Bundled CLI scripts (run, not read)
|
|
271
285
|
│ ├── get-airtable-base # Full Airtable base schema export (bash + jq)
|
package/SKILL.md
CHANGED
|
@@ -95,6 +95,7 @@ You generate complete, production-ready Softr Vibe Coding blocks as TypeScript R
|
|
|
95
95
|
- Sequential multi-row saves use `await hook.mutateAsync(...)` per row, in order, with stop-on-failure + retry state — `mutateAsync` is fully supported on the current platform (verified 2026-08-25; the old ".mutate() only" Action-parser rule is gone — see [datasources/writing.md](datasources/writing.md)). Independent writes to **different tables** may run in parallel via `Promise.all`; drag/reassign UIs should be optimistic with an Undo toast — see [writing.md → Parallel writes across tables](datasources/writing.md#parallel-writes-across-tables-the-one-sanctioned-parallelism)
|
|
96
96
|
- No hardcoded domains in links -- use relative paths (`/page?recordId=...`); same-page anchors written relative too (`/#section`)
|
|
97
97
|
- **No `<select>` and no shadcn `<Select>`** — both break inside a block's shadow DOM (native hands the list to the OS; shadcn portals outside the shadow root and arrives unstyled). Use the `Combo` pattern in [references/searchable-dropdown.md](references/searchable-dropdown.md) — **searchable by default** for every framed filter or form field whatever the option count; `bare` inline editors are click-only; `searchable={false}` only on a short fixed enum the user is setting (a status, a location, a group-by). Opening a Combo moves focus into it (the search box, or the trigger on a click-only list), because Safari does not focus a clicked button. Escape on an open list closes only the list ([Move focus into the Combo when it opens](references/searchable-dropdown.md#move-focus-into-the-combo-when-it-opens))
|
|
98
|
+
- **No native date field** — no `<input type="date">`, `type="datetime-local"` or `type="month"` in a branded block: the browser draws its calendar pop-up, and no CSS reaches it. Use the module-scope `DatePicker` kit in [references/date-picker.md](references/date-picker.md), pasted verbatim between its marker lines (block-specific code, `textClass` included, stays outside them). Values stay `"yyyy-MM-dd"` strings, compared as strings. Same rules as the Combo: nothing between the field and its scroller clips, and Escape on an open calendar closes only the calendar
|
|
98
99
|
- App page with Softr navigation: **no shadcn `<Dialog>` / `<Sheet>`** — its overlay is z-50, under Softr's top bar (z-index 800), and it portals out of the shadow root. Use the in-block modal (`fixed inset-0 z-[1000]`, rendered as a sibling of the block's `@container` wrapper, with its own Escape, focus trap, scroll lock and focus return) in [references/common-patterns.md → A modal above Softr's bars](references/common-patterns.md#a-modal-above-softrs-bars) (measured live 2026-10-06)
|
|
99
100
|
- No clipping class (`overflow-hidden`, `overflow-*-auto`, `truncate`, `line-clamp-*`) on any element that contains a `Combo` — its panel is absolutely positioned in local DOM, so a clipping `<td>` cuts the menu to the row's height; bound an over-wide chip at the chip (`min-w-0 truncate`), and never `scrollIntoView` inside the panel. See [references/searchable-dropdown.md](references/searchable-dropdown.md#the-four-things-that-will-bite-you), item 4
|
|
100
101
|
- Any **Print** control opens a **new window with its own document** — `window.open` straight from the click, an escaped standalone HTML printout written into it, `print()` once its stylesheets, fonts and images are in, the button disabled until the data has fully loaded. No `window.print()` on the Softr page, no in-page print view (Hard Constraint 28). See [references/printing.md](references/printing.md)
|
|
@@ -184,6 +185,7 @@ For advanced patterns beyond data fetching, load the relevant reference when the
|
|
|
184
185
|
| Debugging a broken block, checking patterns before delivery, full violation catalog | [references/anti-patterns.md](references/anti-patterns.md) |
|
|
185
186
|
| Quick syntax check — import paths, hook signatures, mutation call shapes, field mapping, Softr navigation variables (`--nav-height` etc.), container-query syntax | [references/quick-reference.md](references/quick-reference.md) |
|
|
186
187
|
| Any **dropdown / picker / combobox** in a block — why shadcn `<Select>` and native `<select>` both fail inside the shadow DOM, the `composedPath()` click-outside, sorting A→Z inside the component, multi-token filtering, **searchable by default** regardless of option count (`bare` inline editors click-only; `searchable={false}` only for a short fixed enum being set), the `bare` inline-editor variant, focus moved into the Combo on open (Safari does not focus a clicked button) and Escape that closes only the list | [references/searchable-dropdown.md](references/searchable-dropdown.md) |
|
|
188
|
+
| Any **date field** in a block — why `<input type="date">` can't carry a brand (its calendar is browser UI), the `DatePicker` kit (API, the full component), the kit-between-markers convention with a sync script for shared components, lessons from a 12-block rollout (clipping, short modal bodies, named containers and `textClass`, Escape, backdrop clicks, a modal's focus fix-up, Safari focus, `"yyyy-MM-dd"` values) and how to verify a block | [references/date-picker.md](references/date-picker.md) |
|
|
187
189
|
| **Printing** anything from a block — always a new window/tab holding its own document, never `window.print()` on the page or an in-page print view: the escaped HTML builder, pop-up-safe opening from the click, print-when-ready (stylesheets, fonts and images, capped), Print disabled until the data has loaded, the `?print=1` deep link from another page, paper layout (shared `<colgroup>`, `vertical-align: middle`, tick boxes) | [references/printing.md](references/printing.md) |
|
|
188
190
|
| Small reusable patterns — `localStorage` cross-page state, clipboard copy button, measuring the block's own width (not the window's), clearing Softr's sticky top bar and phone tab bar, an in-block modal above Softr's bars (instead of shadcn `Dialog`) | [references/common-patterns.md](references/common-patterns.md) |
|
|
189
191
|
| Writing Airtable Automation Scripts / Scripting Extension scripts / Airtable formulas — companion to Softr blocks for cross-table cascades and computed values | [references/airtable-automations.md](references/airtable-automations.md) |
|
package/datasources/hubspot.md
CHANGED
|
@@ -452,7 +452,10 @@ page ([details](multi-datasource.md#one-connection--one-read-payload-the-union-o
|
|
|
452
452
|
HubSpot: anyone who can edit that property there can grant the group's access.
|
|
453
453
|
- **`application_list_users` is not a membership check.** It showed `userGroups: []` for every
|
|
454
454
|
user, including members of condition groups that demonstrably applied (verified 2026-10-05).
|
|
455
|
-
Test membership by what the user can reach, e.g. preview as them against a group-gated block
|
|
455
|
+
Test membership by what the user can reach, e.g. preview as them against a group-gated block, or
|
|
456
|
+
read their groups in the preview
|
|
457
|
+
([how](../references/softr-mcp.md#testing-as-any-app-user-without-logins--the-preview-as-switcher);
|
|
458
|
+
same result on Softr Database, 2026-10-07).
|
|
456
459
|
|
|
457
460
|
## Audit trail
|
|
458
461
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "softr-vibe-coding",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.15.0",
|
|
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"
|
|
@@ -111,6 +111,10 @@ i.dispatchEvent(new Event('input', { bubbles: true }));
|
|
|
111
111
|
i.dispatchEvent(new Event('change', { bubbles: true }));
|
|
112
112
|
```
|
|
113
113
|
|
|
114
|
+
A block that uses the brand `DatePicker` ([date-picker.md](date-picker.md)) has no date input: the
|
|
115
|
+
field is a button with a ref in `-i`. Click it, then click the day by its ref; each day is a button
|
|
116
|
+
named like `Thursday, October 15, 2026`.
|
|
117
|
+
|
|
114
118
|
### 4. Block saves before any click, and prove it
|
|
115
119
|
|
|
116
120
|
The preview writes to the live data
|