@lowdefy/docs-content 0.0.0-experimental-20260710073520
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/LICENSE +201 -0
- package/README.md +20 -0
- package/content/actions/callapi.md +66 -0
- package/content/actions/callmethod.md +41 -0
- package/content/actions/copytoclipboard.md +32 -0
- package/content/actions/displaymessage.md +53 -0
- package/content/actions/downloadcsv.md +89 -0
- package/content/actions/fetch.md +50 -0
- package/content/actions/geolocationcurrentposition.md +56 -0
- package/content/actions/link.md +104 -0
- package/content/actions/login.md +85 -0
- package/content/actions/logout.md +56 -0
- package/content/actions/pdfmake.md +304 -0
- package/content/actions/request.md +67 -0
- package/content/actions/reset.md +27 -0
- package/content/actions/resetvalidation.md +85 -0
- package/content/actions/scrollto.md +85 -0
- package/content/actions/setdarkmode.md +62 -0
- package/content/actions/setfocus.md +33 -0
- package/content/actions/setglobal.md +63 -0
- package/content/actions/setlocale.md +69 -0
- package/content/actions/setstate.md +70 -0
- package/content/actions/throw.md +72 -0
- package/content/actions/validate.md +87 -0
- package/content/actions/wait.md +24 -0
- package/content/agents/agent-endpoint-tools.md +190 -0
- package/content/agents/agent-mcp-tools.md +124 -0
- package/content/agents/agent-multi-agent.md +136 -0
- package/content/agents/agent-properties.md +174 -0
- package/content/agents/agent-server-hooks.md +336 -0
- package/content/agents/agentchat.md +515 -0
- package/content/agents/agentconversations.md +148 -0
- package/content/concepts/ai-agent-docs.md +190 -0
- package/content/concepts/cli.md +213 -0
- package/content/concepts/connections-and-requests.md +7 -0
- package/content/concepts/custom-html.md +3 -0
- package/content/concepts/custom-styling.md +161 -0
- package/content/concepts/events-and-actions.md +271 -0
- package/content/concepts/hosting-files.md +18 -0
- package/content/concepts/i18n.md +320 -0
- package/content/concepts/keyboard-shortcuts.md +218 -0
- package/content/concepts/layout-overview.md +478 -0
- package/content/concepts/lists.md +144 -0
- package/content/concepts/logger.md +43 -0
- package/content/concepts/lowdefy-schema.md +365 -0
- package/content/concepts/menus.md +144 -0
- package/content/concepts/module-authoring.md +564 -0
- package/content/concepts/modules.md +338 -0
- package/content/concepts/operators.md +45 -0
- package/content/concepts/overview.md +19 -0
- package/content/concepts/references-and-templates.md +207 -0
- package/content/concepts/secrets.md +24 -0
- package/content/concepts/selectors.md +143 -0
- package/content/connections/amazonredshift.md +176 -0
- package/content/connections/anthropic.md +232 -0
- package/content/connections/awss3.md +313 -0
- package/content/connections/azureblobstorage.md +133 -0
- package/content/connections/elasticsearch.md +371 -0
- package/content/connections/google.md +228 -0
- package/content/connections/googlecloudstorage.md +139 -0
- package/content/connections/googlesheet.md +313 -0
- package/content/connections/knex.md +206 -0
- package/content/connections/mariadb.md +177 -0
- package/content/connections/mcp.md +134 -0
- package/content/connections/mongodb.md +739 -0
- package/content/connections/mssql.md +191 -0
- package/content/connections/mysql.md +192 -0
- package/content/connections/openai-connection.md +228 -0
- package/content/connections/postgresql.md +200 -0
- package/content/connections/redis.md +116 -0
- package/content/connections/sendgridmail.md +94 -0
- package/content/connections/smtp.md +149 -0
- package/content/connections/sqlite.md +187 -0
- package/content/connections/stripe.md +115 -0
- package/content/container-blocks/affix.md +413 -0
- package/content/container-blocks/alert.md +937 -0
- package/content/container-blocks/badge.md +1222 -0
- package/content/container-blocks/box.md +1453 -0
- package/content/container-blocks/card.md +1200 -0
- package/content/container-blocks/carousel.md +2247 -0
- package/content/container-blocks/collapse.md +1335 -0
- package/content/container-blocks/configprovider.md +1070 -0
- package/content/container-blocks/confirmmodal.md +1159 -0
- package/content/container-blocks/content.md +597 -0
- package/content/container-blocks/descriptions.md +870 -0
- package/content/container-blocks/drawer.md +1379 -0
- package/content/container-blocks/dropdownmenu.md +643 -0
- package/content/container-blocks/flex.md +1510 -0
- package/content/container-blocks/footer.md +380 -0
- package/content/container-blocks/googlemaps.md +546 -0
- package/content/container-blocks/googlemapsheatmap.md +607 -0
- package/content/container-blocks/googlemapsscript.md +61 -0
- package/content/container-blocks/header.md +302 -0
- package/content/container-blocks/label.md +739 -0
- package/content/container-blocks/layout.md +604 -0
- package/content/container-blocks/masonry.md +1090 -0
- package/content/container-blocks/mobilemenu.md +1244 -0
- package/content/container-blocks/modal.md +1180 -0
- package/content/container-blocks/pageheadermenu.md +614 -0
- package/content/container-blocks/pagesidebarlayout.md +438 -0
- package/content/container-blocks/pagesidermenu.md +651 -0
- package/content/container-blocks/popover.md +1421 -0
- package/content/container-blocks/result.md +972 -0
- package/content/container-blocks/sider.md +1064 -0
- package/content/container-blocks/span.md +747 -0
- package/content/container-blocks/spinner.md +267 -0
- package/content/container-blocks/splitter.md +1735 -0
- package/content/container-blocks/tabs.md +1718 -0
- package/content/container-blocks/tooltip.md +1274 -0
- package/content/container-blocks/watermark.md +515 -0
- package/content/controls/for.md +103 -0
- package/content/controls/if.md +107 -0
- package/content/controls/log.md +50 -0
- package/content/controls/parallel.md +71 -0
- package/content/controls/parallel_for.md +36 -0
- package/content/controls/reject.md +56 -0
- package/content/controls/return.md +66 -0
- package/content/controls/set_state.md +98 -0
- package/content/controls/switch.md +90 -0
- package/content/controls/throw.md +79 -0
- package/content/controls/try.md +88 -0
- package/content/deployment/docker.md +149 -0
- package/content/deployment/node-server.md +27 -0
- package/content/deployment/vercel.md +101 -0
- package/content/display-blocks/aggrid.md +1459 -0
- package/content/display-blocks/anchor.md +336 -0
- package/content/display-blocks/avatar.md +1154 -0
- package/content/display-blocks/breadcrumb.md +517 -0
- package/content/display-blocks/button.md +758 -0
- package/content/display-blocks/calendar.md +156 -0
- package/content/display-blocks/dangeroushtml.md +314 -0
- package/content/display-blocks/dangerousmarkdown.md +423 -0
- package/content/display-blocks/diffgit.md +44 -0
- package/content/display-blocks/difflist.md +225 -0
- package/content/display-blocks/diffsidebyside.md +56 -0
- package/content/display-blocks/difftimeline.md +94 -0
- package/content/display-blocks/divider.md +406 -0
- package/content/display-blocks/download.md +60 -0
- package/content/display-blocks/dropdownbutton.md +661 -0
- package/content/display-blocks/echart.md +418 -0
- package/content/display-blocks/floatbutton.md +545 -0
- package/content/display-blocks/html.md +311 -0
- package/content/display-blocks/icon.md +717 -0
- package/content/display-blocks/img.md +479 -0
- package/content/display-blocks/markdown.md +520 -0
- package/content/display-blocks/markdownwithcode.md +730 -0
- package/content/display-blocks/menu.md +1123 -0
- package/content/display-blocks/message.md +941 -0
- package/content/display-blocks/notification.md +1410 -0
- package/content/display-blocks/paragraph.md +643 -0
- package/content/display-blocks/progress.md +818 -0
- package/content/display-blocks/qrcode.md +519 -0
- package/content/display-blocks/s3download.md +240 -0
- package/content/display-blocks/search.md +360 -0
- package/content/display-blocks/skeleton.md +272 -0
- package/content/display-blocks/skeletonavatar.md +222 -0
- package/content/display-blocks/skeletonbutton.md +245 -0
- package/content/display-blocks/skeletoninput.md +223 -0
- package/content/display-blocks/skeletonparagraph.md +201 -0
- package/content/display-blocks/statistic.md +485 -0
- package/content/display-blocks/steps.md +585 -0
- package/content/display-blocks/tag.md +620 -0
- package/content/display-blocks/title.md +654 -0
- package/content/display-blocks/tour.md +2359 -0
- package/content/input-blocks/autocomplete.md +786 -0
- package/content/input-blocks/buttonselector.md +964 -0
- package/content/input-blocks/checkboxselector.md +765 -0
- package/content/input-blocks/checkboxswitch.md +497 -0
- package/content/input-blocks/colorselector.md +884 -0
- package/content/input-blocks/daterangeselector.md +777 -0
- package/content/input-blocks/dateselector.md +693 -0
- package/content/input-blocks/datetimeselector.md +791 -0
- package/content/input-blocks/inputgallery.md +528 -0
- package/content/input-blocks/monthselector.md +717 -0
- package/content/input-blocks/multipleselector.md +1337 -0
- package/content/input-blocks/numberinput.md +855 -0
- package/content/input-blocks/pagination.md +679 -0
- package/content/input-blocks/paragraphinput.md +1664 -0
- package/content/input-blocks/passwordinput.md +480 -0
- package/content/input-blocks/phonenumberinput.md +688 -0
- package/content/input-blocks/radioselector.md +820 -0
- package/content/input-blocks/ratingslider.md +684 -0
- package/content/input-blocks/s3uploadbutton.md +384 -0
- package/content/input-blocks/s3uploaddragger.md +305 -0
- package/content/input-blocks/s3uploadphoto.md +288 -0
- package/content/input-blocks/segmentedselector.md +782 -0
- package/content/input-blocks/selector.md +1162 -0
- package/content/input-blocks/switch.md +552 -0
- package/content/input-blocks/textarea.md +714 -0
- package/content/input-blocks/textinput.md +639 -0
- package/content/input-blocks/tiptapinput.md +226 -0
- package/content/input-blocks/tiptapmentioninput.md +471 -0
- package/content/input-blocks/titleinput.md +1094 -0
- package/content/input-blocks/treeinput.md +144 -0
- package/content/input-blocks/treemultipleselector.md +162 -0
- package/content/input-blocks/treeselector.md +185 -0
- package/content/input-blocks/upload.md +149 -0
- package/content/input-blocks/uploaddragger.md +85 -0
- package/content/input-blocks/uploadphoto.md +84 -0
- package/content/input-blocks/weekselector.md +630 -0
- package/content/list-blocks/controlledlist.md +498 -0
- package/content/list-blocks/list.md +529 -0
- package/content/list-blocks/listselector.md +301 -0
- package/content/list-blocks/masonrylist.md +230 -0
- package/content/migration/upgrade-guide.md +106 -0
- package/content/migration/v4-to-v5.md +589 -0
- package/content/migration/v5-to-v6.md +36 -0
- package/content/operators/_actions.md +58 -0
- package/content/operators/_and.md +76 -0
- package/content/operators/_api.md +254 -0
- package/content/operators/_app.md +114 -0
- package/content/operators/_args.md +65 -0
- package/content/operators/_array.md +331 -0
- package/content/operators/_base64.md +49 -0
- package/content/operators/_boolean.md +33 -0
- package/content/operators/_build.md +166 -0
- package/content/operators/_change_case.md +357 -0
- package/content/operators/_date.md +415 -0
- package/content/operators/_dayjs.md +128 -0
- package/content/operators/_diff.md +61 -0
- package/content/operators/_divide.md +32 -0
- package/content/operators/_eq.md +52 -0
- package/content/operators/_event.md +86 -0
- package/content/operators/_function.md +52 -0
- package/content/operators/_get.md +92 -0
- package/content/operators/_global.md +86 -0
- package/content/operators/_gt.md +50 -0
- package/content/operators/_gte.md +50 -0
- package/content/operators/_hash.md +112 -0
- package/content/operators/_if.md +30 -0
- package/content/operators/_if_none.md +47 -0
- package/content/operators/_index.md +48 -0
- package/content/operators/_input.md +86 -0
- package/content/operators/_intl.md +135 -0
- package/content/operators/_item.md +166 -0
- package/content/operators/_js.md +113 -0
- package/content/operators/_json.md +120 -0
- package/content/operators/_jsonata.md +152 -0
- package/content/operators/_locale.md +65 -0
- package/content/operators/_location.md +40 -0
- package/content/operators/_log.md +22 -0
- package/content/operators/_lt.md +50 -0
- package/content/operators/_lte.md +50 -0
- package/content/operators/_math.md +407 -0
- package/content/operators/_media.md +83 -0
- package/content/operators/_menu.md +62 -0
- package/content/operators/_module.md +340 -0
- package/content/operators/_mql.md +95 -0
- package/content/operators/_ne.md +62 -0
- package/content/operators/_not.md +33 -0
- package/content/operators/_number.md +159 -0
- package/content/operators/_nunjucks.md +117 -0
- package/content/operators/_object.md +253 -0
- package/content/operators/_operator.md +33 -0
- package/content/operators/_or.md +67 -0
- package/content/operators/_product.md +45 -0
- package/content/operators/_random.md +90 -0
- package/content/operators/_ref.md +80 -0
- package/content/operators/_regex.md +69 -0
- package/content/operators/_request.md +35 -0
- package/content/operators/_request_details.md +29 -0
- package/content/operators/_secret.md +56 -0
- package/content/operators/_state.md +134 -0
- package/content/operators/_step.md +98 -0
- package/content/operators/_string.md +327 -0
- package/content/operators/_subtract.md +24 -0
- package/content/operators/_sum.md +45 -0
- package/content/operators/_switch.md +37 -0
- package/content/operators/_t.md +96 -0
- package/content/operators/_theme.md +65 -0
- package/content/operators/_type.md +78 -0
- package/content/operators/_uri.md +49 -0
- package/content/operators/_url_query.md +92 -0
- package/content/operators/_user.md +154 -0
- package/content/operators/_uuid.md +118 -0
- package/content/operators/_var.md +88 -0
- package/content/operators/_yaml.md +96 -0
- package/content/other/introduction.md +39 -0
- package/content/other/next-auth-providers.md +3 -0
- package/content/other/updatesession.md +26 -0
- package/content/plugins/plugins-actions.md +80 -0
- package/content/plugins/plugins-connections.md +98 -0
- package/content/plugins/plugins-dev.md +138 -0
- package/content/plugins/plugins-introduction.md +29 -0
- package/content/plugins/plugins-operators.md +71 -0
- package/content/testing/e2e-auth.md +108 -0
- package/content/testing/e2e-configuration.md +107 -0
- package/content/testing/e2e-getting-started.md +96 -0
- package/content/testing/e2e-introduction.md +53 -0
- package/content/testing/e2e-mocking.md +155 -0
- package/content/testing/e2e-writing-tests.md +214 -0
- package/content/tutorial/tutorial-actions-operators.md +222 -0
- package/content/tutorial/tutorial-add-blocks.md +86 -0
- package/content/tutorial/tutorial-create-page.md +57 -0
- package/content/tutorial/tutorial-display-data-page.md +181 -0
- package/content/tutorial/tutorial-next-steps.md +53 -0
- package/content/tutorial/tutorial-requests-sql.md +22 -0
- package/content/tutorial/tutorial-start.md +71 -0
- package/content/user-authentication/auth-providers.md +15 -0
- package/content/user-authentication/login-and-logout.md +122 -0
- package/content/user-authentication/users-introduction.md +31 -0
- package/index.json +2281 -0
- package/package.json +34 -0
- package/scripts/extractAgentDocs.js +130 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
# ListSelector
|
|
2
|
+
|
|
3
|
+
Data-driven vertical list of headerless cards that doubles as a single-select input. Each card body is rendered from a Nunjucks template against its row item. Clicking a card sets the block value to that data item and highlights it; set `selectable: false` to turn selection off and render a read-only card list. Virtualized via `react-virtuoso` so thousands of variable-height cards render smoothly, with a memoized row component to skip unnecessary re-renders. Optional client-side search bar filters rows by text across any field paths, a built-in loading skeleton stands in while data loads, and `onChange` / `onClick` events report `{ value, index, item }` for the row that was clicked.
|
|
4
|
+
|
|
5
|
+
```yaml
|
|
6
|
+
- id: basic_card_list
|
|
7
|
+
type: ListSelector
|
|
8
|
+
properties:
|
|
9
|
+
data:
|
|
10
|
+
- Alpha
|
|
11
|
+
- Beta
|
|
12
|
+
- Gamma
|
|
13
|
+
html: |
|
|
14
|
+
<h3>{{ index + 1 }}. {{ item }}</h3>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
```yaml
|
|
18
|
+
- id: select_list
|
|
19
|
+
type: ListSelector
|
|
20
|
+
properties:
|
|
21
|
+
hoverable: true
|
|
22
|
+
data:
|
|
23
|
+
- id: 1
|
|
24
|
+
name: Starter
|
|
25
|
+
price: $0
|
|
26
|
+
- id: 2
|
|
27
|
+
name: Pro
|
|
28
|
+
price: $20
|
|
29
|
+
- id: 3
|
|
30
|
+
name: Enterprise
|
|
31
|
+
price: $99
|
|
32
|
+
html: |
|
|
33
|
+
<strong>{{ item.name }}</strong>
|
|
34
|
+
<div style="color:#666;">{{ item.price }} / month</div>
|
|
35
|
+
events:
|
|
36
|
+
onChange:
|
|
37
|
+
- id: capture_selected
|
|
38
|
+
type: SetState
|
|
39
|
+
params:
|
|
40
|
+
selected_plan:
|
|
41
|
+
_event: value
|
|
42
|
+
- id: selected_plan_display
|
|
43
|
+
type: Paragraph
|
|
44
|
+
properties:
|
|
45
|
+
content:
|
|
46
|
+
_nunjucks:
|
|
47
|
+
template: "Selected: {{ selected_plan.name }}"
|
|
48
|
+
on:
|
|
49
|
+
_state: true
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```yaml
|
|
53
|
+
- id: readonly_list
|
|
54
|
+
type: ListSelector
|
|
55
|
+
properties:
|
|
56
|
+
selectable: false
|
|
57
|
+
data:
|
|
58
|
+
- One
|
|
59
|
+
- Two
|
|
60
|
+
- Three
|
|
61
|
+
html: |
|
|
62
|
+
<span>{{ item }}</span>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
```yaml
|
|
66
|
+
- id: empty_list
|
|
67
|
+
type: ListSelector
|
|
68
|
+
properties:
|
|
69
|
+
data: []
|
|
70
|
+
noData: No people to show yet.
|
|
71
|
+
html: |
|
|
72
|
+
<span>{{ item.name }}</span>
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
```yaml
|
|
76
|
+
- id: people_card_list
|
|
77
|
+
type: ListSelector
|
|
78
|
+
properties:
|
|
79
|
+
hoverable: true
|
|
80
|
+
bordered: false
|
|
81
|
+
data:
|
|
82
|
+
- name: Ada Lovelace
|
|
83
|
+
email: ada@example.com
|
|
84
|
+
role: Mathematician
|
|
85
|
+
- name: Linus Torvalds
|
|
86
|
+
email: linus@example.com
|
|
87
|
+
role: Engineer
|
|
88
|
+
- name: Grace Hopper
|
|
89
|
+
email: grace@example.com
|
|
90
|
+
role: Computer Scientist
|
|
91
|
+
html: |
|
|
92
|
+
<div style="display:flex; flex-direction:column; gap:4px;">
|
|
93
|
+
<strong>{{ item.name }}</strong>
|
|
94
|
+
<span style="color:#666;">{{ item.role }}</span>
|
|
95
|
+
<a href="mailto:{{ item.email }}">{{ item.email }}</a>
|
|
96
|
+
</div>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
```yaml
|
|
100
|
+
- id: click_card_list
|
|
101
|
+
type: ListSelector
|
|
102
|
+
properties:
|
|
103
|
+
hoverable: true
|
|
104
|
+
data:
|
|
105
|
+
- id: 1
|
|
106
|
+
label: First
|
|
107
|
+
- id: 2
|
|
108
|
+
label: Second
|
|
109
|
+
- id: 3
|
|
110
|
+
label: Third
|
|
111
|
+
html: |
|
|
112
|
+
<h4>{{ item.label }}</h4>
|
|
113
|
+
<p>Click to see which row was selected.</p>
|
|
114
|
+
events:
|
|
115
|
+
onClick:
|
|
116
|
+
- id: capture_clicked
|
|
117
|
+
type: SetState
|
|
118
|
+
params:
|
|
119
|
+
clicked_card:
|
|
120
|
+
_event: true
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
```yaml
|
|
124
|
+
- id: compact_card_list
|
|
125
|
+
type: ListSelector
|
|
126
|
+
properties:
|
|
127
|
+
size: small
|
|
128
|
+
gap: 4
|
|
129
|
+
data:
|
|
130
|
+
- One
|
|
131
|
+
- Two
|
|
132
|
+
- Three
|
|
133
|
+
- Four
|
|
134
|
+
html: |
|
|
135
|
+
<span>{{ item }}</span>
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
```yaml
|
|
139
|
+
- id: large_card_list
|
|
140
|
+
type: ListSelector
|
|
141
|
+
properties:
|
|
142
|
+
hoverable: true
|
|
143
|
+
height: 480
|
|
144
|
+
data:
|
|
145
|
+
_string.split:
|
|
146
|
+
on:
|
|
147
|
+
_string.repeat:
|
|
148
|
+
on: x,
|
|
149
|
+
count: 999
|
|
150
|
+
separator: ","
|
|
151
|
+
html: >
|
|
152
|
+
<h4>Row {{ index + 1 }}</h4>
|
|
153
|
+
|
|
154
|
+
<p>This list renders one thousand cards. Only rows in (and near) the
|
|
155
|
+
viewport are mounted in the DOM.</p>
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
```yaml
|
|
159
|
+
- id: search_all_card_list
|
|
160
|
+
type: ListSelector
|
|
161
|
+
properties:
|
|
162
|
+
hoverable: true
|
|
163
|
+
height: 360
|
|
164
|
+
search: {}
|
|
165
|
+
data:
|
|
166
|
+
- name: Ada Lovelace
|
|
167
|
+
email: ada@example.com
|
|
168
|
+
role: Mathematician
|
|
169
|
+
- name: Linus Torvalds
|
|
170
|
+
email: linus@example.com
|
|
171
|
+
role: Engineer
|
|
172
|
+
- name: Grace Hopper
|
|
173
|
+
email: grace@example.com
|
|
174
|
+
role: Computer Scientist
|
|
175
|
+
- name: Alan Turing
|
|
176
|
+
email: alan@example.com
|
|
177
|
+
role: Mathematician
|
|
178
|
+
- name: Margaret Hamilton
|
|
179
|
+
email: margaret@example.com
|
|
180
|
+
role: Software Engineer
|
|
181
|
+
html: >
|
|
182
|
+
<strong>{{ item.name }}</strong>
|
|
183
|
+
|
|
184
|
+
<div style="color:#666;">{{ item.role }} · <a href="mailto:{{ item.email
|
|
185
|
+
}}">{{ item.email }}</a></div>
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
```yaml
|
|
189
|
+
- id: search_fields_card_list
|
|
190
|
+
type: ListSelector
|
|
191
|
+
properties:
|
|
192
|
+
hoverable: true
|
|
193
|
+
height: 360
|
|
194
|
+
search:
|
|
195
|
+
placeholder: Filter by name…
|
|
196
|
+
fields:
|
|
197
|
+
- name
|
|
198
|
+
minLength: 1
|
|
199
|
+
data:
|
|
200
|
+
- name: Ada Lovelace
|
|
201
|
+
email: ada@example.com
|
|
202
|
+
role: Mathematician
|
|
203
|
+
- name: Linus Torvalds
|
|
204
|
+
email: linus@example.com
|
|
205
|
+
role: Engineer
|
|
206
|
+
- name: Grace Hopper
|
|
207
|
+
email: grace@example.com
|
|
208
|
+
role: Computer Scientist
|
|
209
|
+
html: |
|
|
210
|
+
<strong>{{ item.name }}</strong>
|
|
211
|
+
<div style="color:#666;">{{ item.role }}</div>
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
```yaml
|
|
215
|
+
- id: keyed_list
|
|
216
|
+
type: ListSelector
|
|
217
|
+
properties:
|
|
218
|
+
valueKey: id
|
|
219
|
+
primaryKey: id
|
|
220
|
+
data:
|
|
221
|
+
- id: 1
|
|
222
|
+
name: Starter
|
|
223
|
+
price: $0
|
|
224
|
+
- id: 2
|
|
225
|
+
name: Pro
|
|
226
|
+
price: $20
|
|
227
|
+
- id: 3
|
|
228
|
+
name: Enterprise
|
|
229
|
+
price: $99
|
|
230
|
+
html: |
|
|
231
|
+
<strong>{{ item.name }}</strong>
|
|
232
|
+
<div style="color:#888;">{{ item.price }} / month</div>
|
|
233
|
+
events:
|
|
234
|
+
onChange:
|
|
235
|
+
- id: capture_keyed
|
|
236
|
+
type: SetState
|
|
237
|
+
params:
|
|
238
|
+
keyed_plan_id:
|
|
239
|
+
_event: value
|
|
240
|
+
- id: keyed_plan_display
|
|
241
|
+
type: Paragraph
|
|
242
|
+
properties:
|
|
243
|
+
content:
|
|
244
|
+
_nunjucks:
|
|
245
|
+
template: 'Selected plan id: {{ keyed_plan_id if keyed_plan_id != null else "—"
|
|
246
|
+
}}'
|
|
247
|
+
on:
|
|
248
|
+
_state: true
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
| Property | Type | Default | Description |
|
|
252
|
+
| --- | --- | --- | --- |
|
|
253
|
+
| `data` | array | `[]` | Array of items. Each item is rendered as one card by passing it to the html Nunjucks template as `item`. |
|
|
254
|
+
| `html` | string | - | Nunjucks template used to render the body of each card. The context exposes `item` (the current data row) and `index` (the zero-based row index). |
|
|
255
|
+
| `selectable` | boolean | `true` | Enable selecting a card. When true, clicking a card sets the block value to that data item and highlights it. When false, the block is a read-only card list that stores no value. |
|
|
256
|
+
| `allowDeselect` | boolean | `true` | Allow clicking the selected card again to clear the selection (sets the value to null). Ignored when `selectable` is false. |
|
|
257
|
+
| `valueKey` | string | - | Field of each data item stored as the block value when a card is selected (e.g. "id"). Omit to store the whole item. Lets the selection be driven with SetState using a simple key. Supports dotted paths. |
|
|
258
|
+
| `primaryKey` | string | - | Field used to match the current value (e.g. set with SetState) back to a card for highlighting. Defaults to `valueKey`. Set this when the stored value is the whole item but a single field (e.g. "id") uniquely identifies it. Supports dotted paths. |
|
|
259
|
+
| `bordered` | boolean | `true` | Toggles the border around each card. |
|
|
260
|
+
| `hoverable` | boolean | `false` | Lift each card up when hovered. |
|
|
261
|
+
| `size` | string | `"default"` | Card size. Enum: `default`, `small`. |
|
|
262
|
+
| `gap` | number | `8` | Pixel gap between cards. |
|
|
263
|
+
| `height` | number \| string | - | Optional pixel height (number) or CSS height string of the scroll container. When omitted, the list scrolls with the page. |
|
|
264
|
+
| `overscan` | number | `400` | Pixels of off-screen rows to render above and below the viewport. Increase for smoother fast-scroll, decrease to reduce DOM cost. |
|
|
265
|
+
| `noData` | string | - | Text shown in place of the list when the `data` array is empty. Defaults to the `blocks.listSelector.noData` message ("No data"). |
|
|
266
|
+
| `search` | object | - | Optional client-side search bar above the list. When this property is set, a debounced search input filters rows by text. Omit to hide the bar. |
|
|
267
|
+
| `search.placeholder` | string | `"Search…"` | Placeholder text in the input. |
|
|
268
|
+
| `search.fields` | array | - | Dotted field paths to match against (e.g. "user.name"). When omitted, every field path is searched (whole-item stringify). |
|
|
269
|
+
| `search.caseSensitive` | boolean | `false` | Match case exactly. |
|
|
270
|
+
| `search.debounce` | number | `150` | Milliseconds to wait after the last keystroke before filtering. |
|
|
271
|
+
| `search.sticky` | boolean | `true` | Stick the search bar to the top while scrolling. |
|
|
272
|
+
| `search.allowClear` | boolean | `true` | Show a clear (×) icon in the input. |
|
|
273
|
+
| `search.minLength` | number | `0` | Skip filtering until the query is at least this many characters. |
|
|
274
|
+
| `search.noResultsText` | string | `"No results"` | Text shown when the filter matches zero items. |
|
|
275
|
+
| `theme` | object | - | Antd design token overrides for the cards. See [antd design tokens](https://ant.design/components/overview#design-token). See [Ant Design card tokens](https://ant.design/components/card#design-token). |
|
|
276
|
+
| `theme.bodyPadding` | number | `24` | Padding of each card body. |
|
|
277
|
+
| `theme.bodyPaddingSM` | number | `12` | Padding of each card body for small cards. |
|
|
278
|
+
| `theme.borderRadiusLG` | number | `8` | Border radius of each card. |
|
|
279
|
+
| `theme.colorBorderSecondary` | string | - | Border color of each card. |
|
|
280
|
+
| `theme.colorBgContainer` | string | - | Background color of each card body. |
|
|
281
|
+
| `theme.colorText` | string | - | Text color inside each card. |
|
|
282
|
+
| `theme.boxShadowTertiary` | string | - | Shadow applied to each card on hover when hoverable is true. |
|
|
283
|
+
|
|
284
|
+
| Event | Event Data | Description |
|
|
285
|
+
| --- | --- | --- |
|
|
286
|
+
| `onChange` | `{ value, index, item }` | Triggered when the selection changes (only fires when `selectable` is true). |
|
|
287
|
+
| `onClick` | `{ index, item }` | Triggered when a card is clicked. |
|
|
288
|
+
| `onSearch` | `{ value, resultCount }` | Triggered when the debounced search query changes (only fires when the `search` property is set). |
|
|
289
|
+
|
|
290
|
+
| Key | Target |
|
|
291
|
+
| --- | --- |
|
|
292
|
+
| `/block` | Outer block wrapper (always available). |
|
|
293
|
+
| `/element` | The list container. |
|
|
294
|
+
| `/card` | Each Card element. |
|
|
295
|
+
| `/body` | Each Card body. |
|
|
296
|
+
| `/selected` | The selected card. |
|
|
297
|
+
| `/search` | The search bar wrapper above the list. |
|
|
298
|
+
| `/noResults` | The "no results" placeholder shown when the search filter matches zero items. |
|
|
299
|
+
| `/noData` | The "no data" placeholder shown when the data array is empty. |
|
|
300
|
+
|
|
301
|
+
No slots defined.
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
# MasonryList
|
|
2
|
+
|
|
3
|
+
Masonry-style grid layout for list data. Items flow into columns and stack vertically, filling gaps left by shorter items. Provide an array in state and use _state operators in the template to access each item's data.
|
|
4
|
+
|
|
5
|
+
```yaml
|
|
6
|
+
- id: ml_basic
|
|
7
|
+
type: MasonryList
|
|
8
|
+
properties:
|
|
9
|
+
columns: 3
|
|
10
|
+
gutter: 16
|
|
11
|
+
blocks:
|
|
12
|
+
- id: ml_basic.$.card
|
|
13
|
+
type: Card
|
|
14
|
+
class:
|
|
15
|
+
_state: ml_basic.$.bg
|
|
16
|
+
properties:
|
|
17
|
+
size: small
|
|
18
|
+
blocks:
|
|
19
|
+
- id: ml_basic.$.title_block
|
|
20
|
+
type: Title
|
|
21
|
+
properties:
|
|
22
|
+
content:
|
|
23
|
+
_state: ml_basic.$.title
|
|
24
|
+
level: 5
|
|
25
|
+
- id: ml_basic.$.desc_block
|
|
26
|
+
type: Paragraph
|
|
27
|
+
properties:
|
|
28
|
+
content:
|
|
29
|
+
_state: ml_basic.$.desc
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
```yaml
|
|
33
|
+
- id: ml_two
|
|
34
|
+
type: MasonryList
|
|
35
|
+
properties:
|
|
36
|
+
columns: 2
|
|
37
|
+
gutter: 16
|
|
38
|
+
blocks:
|
|
39
|
+
- id: ml_two.$.card
|
|
40
|
+
type: Card
|
|
41
|
+
class:
|
|
42
|
+
_state: ml_two.$.bg
|
|
43
|
+
properties:
|
|
44
|
+
size: small
|
|
45
|
+
blocks:
|
|
46
|
+
- id: ml_two.$.title_block
|
|
47
|
+
type: Title
|
|
48
|
+
properties:
|
|
49
|
+
content:
|
|
50
|
+
_state: ml_two.$.title
|
|
51
|
+
level: 5
|
|
52
|
+
- id: ml_two.$.body_block
|
|
53
|
+
type: Paragraph
|
|
54
|
+
properties:
|
|
55
|
+
content:
|
|
56
|
+
_state: ml_two.$.body
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
```yaml
|
|
60
|
+
- id: ml_gutter_tight
|
|
61
|
+
type: MasonryList
|
|
62
|
+
properties:
|
|
63
|
+
columns: 3
|
|
64
|
+
gutter: 6
|
|
65
|
+
blocks:
|
|
66
|
+
- id: ml_gutter_tight.$.card
|
|
67
|
+
type: Card
|
|
68
|
+
class: bg-bg-layout
|
|
69
|
+
properties:
|
|
70
|
+
size: small
|
|
71
|
+
blocks:
|
|
72
|
+
- id: ml_gutter_tight.$.label_block
|
|
73
|
+
type: Paragraph
|
|
74
|
+
properties:
|
|
75
|
+
content:
|
|
76
|
+
_state: ml_gutter_tight.$.label
|
|
77
|
+
- id: ml_gutter_wide
|
|
78
|
+
type: MasonryList
|
|
79
|
+
properties:
|
|
80
|
+
columns: 3
|
|
81
|
+
gutter: 24
|
|
82
|
+
blocks:
|
|
83
|
+
- id: ml_gutter_wide.$.card
|
|
84
|
+
type: Card
|
|
85
|
+
class: bg-bg-layout
|
|
86
|
+
properties:
|
|
87
|
+
size: small
|
|
88
|
+
blocks:
|
|
89
|
+
- id: ml_gutter_wide.$.label_block
|
|
90
|
+
type: Paragraph
|
|
91
|
+
properties:
|
|
92
|
+
content:
|
|
93
|
+
_state: ml_gutter_wide.$.label
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
```yaml
|
|
97
|
+
- id: ml_notes
|
|
98
|
+
type: MasonryList
|
|
99
|
+
properties:
|
|
100
|
+
columns: 3
|
|
101
|
+
gutter: 12
|
|
102
|
+
blocks:
|
|
103
|
+
- id: ml_notes.$.card
|
|
104
|
+
type: Card
|
|
105
|
+
class:
|
|
106
|
+
_state: ml_notes.$.bg
|
|
107
|
+
properties:
|
|
108
|
+
size: small
|
|
109
|
+
blocks:
|
|
110
|
+
- id: ml_notes.$.row
|
|
111
|
+
type: Box
|
|
112
|
+
layout:
|
|
113
|
+
justify: space-between
|
|
114
|
+
align: center
|
|
115
|
+
blocks:
|
|
116
|
+
- id: ml_notes.$.title_block
|
|
117
|
+
type: Title
|
|
118
|
+
layout:
|
|
119
|
+
flex: 1 1 0
|
|
120
|
+
properties:
|
|
121
|
+
content:
|
|
122
|
+
_state: ml_notes.$.title
|
|
123
|
+
level: 5
|
|
124
|
+
- id: ml_notes.$.tag_block
|
|
125
|
+
type: Tag
|
|
126
|
+
layout:
|
|
127
|
+
flex: 0 0 auto
|
|
128
|
+
properties:
|
|
129
|
+
title:
|
|
130
|
+
_state: ml_notes.$.tag
|
|
131
|
+
color:
|
|
132
|
+
_state: ml_notes.$.color
|
|
133
|
+
- id: ml_notes.$.body_block
|
|
134
|
+
type: Paragraph
|
|
135
|
+
properties:
|
|
136
|
+
content:
|
|
137
|
+
_state: ml_notes.$.body
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
```yaml
|
|
141
|
+
- id: ml_team
|
|
142
|
+
type: MasonryList
|
|
143
|
+
properties:
|
|
144
|
+
columns: 4
|
|
145
|
+
gutter: 12
|
|
146
|
+
blocks:
|
|
147
|
+
- id: ml_team.$.card
|
|
148
|
+
type: Card
|
|
149
|
+
properties:
|
|
150
|
+
size: small
|
|
151
|
+
blocks:
|
|
152
|
+
- id: ml_team.$.header
|
|
153
|
+
type: Box
|
|
154
|
+
layout:
|
|
155
|
+
gap: 8
|
|
156
|
+
align: center
|
|
157
|
+
blocks:
|
|
158
|
+
- id: ml_team.$.avatar
|
|
159
|
+
type: Avatar
|
|
160
|
+
layout:
|
|
161
|
+
flex: 0 0 auto
|
|
162
|
+
properties:
|
|
163
|
+
content:
|
|
164
|
+
_state: ml_team.$.initials
|
|
165
|
+
backgroundColor:
|
|
166
|
+
_state: ml_team.$.bg
|
|
167
|
+
- id: ml_team.$.name_block
|
|
168
|
+
type: Title
|
|
169
|
+
layout:
|
|
170
|
+
flex: 1 1 0
|
|
171
|
+
properties:
|
|
172
|
+
content:
|
|
173
|
+
_state: ml_team.$.name
|
|
174
|
+
level: 5
|
|
175
|
+
- id: ml_team.$.role_block
|
|
176
|
+
type: Paragraph
|
|
177
|
+
properties:
|
|
178
|
+
content:
|
|
179
|
+
_state: ml_team.$.role
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
```yaml
|
|
183
|
+
- id: ml_seq
|
|
184
|
+
type: MasonryList
|
|
185
|
+
properties:
|
|
186
|
+
columns: 3
|
|
187
|
+
gutter: 16
|
|
188
|
+
sequential: true
|
|
189
|
+
blocks:
|
|
190
|
+
- id: ml_seq.$.card
|
|
191
|
+
type: Card
|
|
192
|
+
class:
|
|
193
|
+
_state: ml_seq.$.bg
|
|
194
|
+
properties:
|
|
195
|
+
size: small
|
|
196
|
+
blocks:
|
|
197
|
+
- id: ml_seq.$.title_block
|
|
198
|
+
type: Title
|
|
199
|
+
properties:
|
|
200
|
+
content:
|
|
201
|
+
_state: ml_seq.$.title
|
|
202
|
+
level: 5
|
|
203
|
+
- id: ml_seq.$.desc_block
|
|
204
|
+
type: Paragraph
|
|
205
|
+
properties:
|
|
206
|
+
content:
|
|
207
|
+
_state: ml_seq.$.desc
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
| Property | Type | Default | Description |
|
|
211
|
+
| --- | --- | --- | --- |
|
|
212
|
+
| `columns` | integer \| object | - | Number of columns, or responsive breakpoint object (e.g. { xs: 1, sm: 2, md: 3 }). |
|
|
213
|
+
| `fresh` | boolean | `false` | Force refresh the masonry layout. |
|
|
214
|
+
| `gutter` | number \| array | - | Gap between items in pixels. Number or [horizontal, vertical] array. |
|
|
215
|
+
| `sequential` | boolean | `false` | Render items sequentially (top to bottom, then next column). Default is balanced column-fill. |
|
|
216
|
+
| `theme` | object | - | Antd design token overrides for this block. Masonry uses global motion tokens for item animations. See [antd design tokens](https://ant.design/components/overview#design-token). See [Ant Design masonry tokens](https://ant.design/components/masonry). |
|
|
217
|
+
| `theme.motionDurationSlow` | string | `"0.3s"` | Duration of item position and fade-in animations. |
|
|
218
|
+
| `theme.motionDurationFast` | string | `"0.1s"` | Duration of item fade-out animations. |
|
|
219
|
+
| `theme.motionEaseOut` | string | `"cubic-bezier(0.215, 0.61, 0.355, 1)"` | Easing function for item animations. |
|
|
220
|
+
|
|
221
|
+
No events defined.
|
|
222
|
+
|
|
223
|
+
| Key | Target |
|
|
224
|
+
| --- | --- |
|
|
225
|
+
| `/block` | Outer block wrapper (always available). |
|
|
226
|
+
| `/element` | The MasonryList element. |
|
|
227
|
+
|
|
228
|
+
| Slot | Description |
|
|
229
|
+
| --- | --- |
|
|
230
|
+
| `content` | Blocks rendered for each masonry item. |
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Upgrade Guide
|
|
2
|
+
|
|
3
|
+
This guide explains how the Lowdefy upgrade system works — independent of any specific version.
|
|
4
|
+
|
|
5
|
+
For version-specific migration details, see:
|
|
6
|
+
- [Version 5 to Version 6](/v5-to-v6)
|
|
7
|
+
- [Version 4 to Version 5](/v4-to-v5)
|
|
8
|
+
- [Version 3 to Version 4](/v3-to-v4)
|
|
9
|
+
|
|
10
|
+
## Quick start
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npx lowdefy upgrade
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
That's it. The command reads your current version from `lowdefy.yaml`, fetches the latest codemods, resolves the upgrade chain, and walks you through each step.
|
|
17
|
+
|
|
18
|
+
## How Lowdefy versioning works
|
|
19
|
+
|
|
20
|
+
Lowdefy follows [semantic versioning](https://semver.org/). Major versions (4.0 → 5.0) contain breaking changes. Minor and patch versions are backwards-compatible.
|
|
21
|
+
|
|
22
|
+
When breaking changes ship, the `@lowdefy/codemods` package is updated with migration prompts for the new version. The `lowdefy upgrade` command uses this package to guide the migration.
|
|
23
|
+
|
|
24
|
+
## The `lowdefy upgrade` command
|
|
25
|
+
|
|
26
|
+
The upgrade command:
|
|
27
|
+
|
|
28
|
+
1. Reads your current version from `lowdefy.yaml`.
|
|
29
|
+
2. Queries npm for the latest stable Lowdefy version (or uses `--to`).
|
|
30
|
+
3. Fetches `@lowdefy/codemods@latest` — a single package containing all migration prompts for all versions.
|
|
31
|
+
4. Resolves the upgrade chain — which intermediate versions need codemods.
|
|
32
|
+
5. Presents migration prompts phase by phase.
|
|
33
|
+
6. Updates `lowdefy.yaml` after each phase and suggests a git commit.
|
|
34
|
+
|
|
35
|
+
### Options
|
|
36
|
+
|
|
37
|
+
| Option | Description | Default |
|
|
38
|
+
|---|---|---|
|
|
39
|
+
| `--to <version>` | Target version to upgrade to | Latest stable |
|
|
40
|
+
| `--plan` | Show the upgrade plan without executing | |
|
|
41
|
+
| `--resume` | Resume a previously interrupted upgrade | |
|
|
42
|
+
| `--config-directory` | Change config directory | `.` |
|
|
43
|
+
| `--log-level` | Log level (debug, info, warn, error) | `info` |
|
|
44
|
+
|
|
45
|
+
See the [CLI reference](/cli) for the full command documentation.
|
|
46
|
+
|
|
47
|
+
## Multi-version upgrades
|
|
48
|
+
|
|
49
|
+
The upgrade command handles jumps across multiple versions. If you're on 4.5.0 and the latest is 6.0.0, the command resolves the full chain:
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
4.5.0 → 5.0.0 → 6.0.0
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Each step in the chain is a **phase**. The command walks you through all prompts for phase 1, updates `lowdefy.yaml`, suggests a commit, then moves to phase 2. This gives you clean git history per version jump.
|
|
56
|
+
|
|
57
|
+
The version chain is computed from `registry.json` in the `@lowdefy/codemods` package. Each entry specifies a target version and a `from` semver range. The resolver walks the entries in order until the current version reaches the target.
|
|
58
|
+
|
|
59
|
+
## How prompts work
|
|
60
|
+
|
|
61
|
+
Every codemod is a self-contained markdown prompt. For each codemod, the CLI presents three options:
|
|
62
|
+
|
|
63
|
+
1. **Copy prompt to clipboard** — paste into Claude Code, ChatGPT, Cursor, or any AI coding tool.
|
|
64
|
+
2. **View migration guide** — read the step-by-step instructions and apply changes manually.
|
|
65
|
+
3. **Skip for now** — mark as pending. Return later with `--resume`.
|
|
66
|
+
|
|
67
|
+
Each prompt includes:
|
|
68
|
+
|
|
69
|
+
- What changed and why
|
|
70
|
+
- Before/after YAML examples
|
|
71
|
+
- How to find affected files (glob patterns, grep patterns)
|
|
72
|
+
- Edge cases to watch for
|
|
73
|
+
- Verification steps
|
|
74
|
+
|
|
75
|
+
This format works with any AI coding tool. Copy the prompt, paste it into your tool of choice, and let it scan your project and apply changes. Prompts can also be followed manually without any AI tool.
|
|
76
|
+
|
|
77
|
+
## Resuming interrupted upgrades
|
|
78
|
+
|
|
79
|
+
If you stop mid-upgrade (skip a codemod, close the terminal, or hit an error), run:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
npx lowdefy upgrade --resume
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
The command reads `.lowdefy/upgrade-state.json` — a file that tracks which phases and codemods have completed — and picks up where you left off.
|
|
86
|
+
|
|
87
|
+
If you skip codemods, the build warns about pending migrations:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
⚠ Warning: 2 codemod(s) were skipped during upgrade.
|
|
91
|
+
Run "npx lowdefy upgrade --resume" to complete them.
|
|
92
|
+
Or add --skip-codemod-check to suppress this warning.
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Suppress this with `--skip-codemod-check` or `cli.skipCodemodCheck: true` in `lowdefy.yaml`.
|
|
96
|
+
|
|
97
|
+
## Manual upgrades
|
|
98
|
+
|
|
99
|
+
If you prefer to upgrade without the command:
|
|
100
|
+
|
|
101
|
+
1. Read the version-specific migration guide (e.g. [V5 to V6](/v5-to-v6)).
|
|
102
|
+
2. Apply each breaking change manually using the before/after examples.
|
|
103
|
+
3. Update the `lowdefy:` version in `lowdefy.yaml`.
|
|
104
|
+
4. Run `lowdefy dev` and fix any remaining issues.
|
|
105
|
+
|
|
106
|
+
The upgrade command automates this process, but every change is documented in the migration guides for manual reference.
|