@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.
Files changed (304) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +20 -0
  3. package/content/actions/callapi.md +66 -0
  4. package/content/actions/callmethod.md +41 -0
  5. package/content/actions/copytoclipboard.md +32 -0
  6. package/content/actions/displaymessage.md +53 -0
  7. package/content/actions/downloadcsv.md +89 -0
  8. package/content/actions/fetch.md +50 -0
  9. package/content/actions/geolocationcurrentposition.md +56 -0
  10. package/content/actions/link.md +104 -0
  11. package/content/actions/login.md +85 -0
  12. package/content/actions/logout.md +56 -0
  13. package/content/actions/pdfmake.md +304 -0
  14. package/content/actions/request.md +67 -0
  15. package/content/actions/reset.md +27 -0
  16. package/content/actions/resetvalidation.md +85 -0
  17. package/content/actions/scrollto.md +85 -0
  18. package/content/actions/setdarkmode.md +62 -0
  19. package/content/actions/setfocus.md +33 -0
  20. package/content/actions/setglobal.md +63 -0
  21. package/content/actions/setlocale.md +69 -0
  22. package/content/actions/setstate.md +70 -0
  23. package/content/actions/throw.md +72 -0
  24. package/content/actions/validate.md +87 -0
  25. package/content/actions/wait.md +24 -0
  26. package/content/agents/agent-endpoint-tools.md +190 -0
  27. package/content/agents/agent-mcp-tools.md +124 -0
  28. package/content/agents/agent-multi-agent.md +136 -0
  29. package/content/agents/agent-properties.md +174 -0
  30. package/content/agents/agent-server-hooks.md +336 -0
  31. package/content/agents/agentchat.md +515 -0
  32. package/content/agents/agentconversations.md +148 -0
  33. package/content/concepts/ai-agent-docs.md +190 -0
  34. package/content/concepts/cli.md +213 -0
  35. package/content/concepts/connections-and-requests.md +7 -0
  36. package/content/concepts/custom-html.md +3 -0
  37. package/content/concepts/custom-styling.md +161 -0
  38. package/content/concepts/events-and-actions.md +271 -0
  39. package/content/concepts/hosting-files.md +18 -0
  40. package/content/concepts/i18n.md +320 -0
  41. package/content/concepts/keyboard-shortcuts.md +218 -0
  42. package/content/concepts/layout-overview.md +478 -0
  43. package/content/concepts/lists.md +144 -0
  44. package/content/concepts/logger.md +43 -0
  45. package/content/concepts/lowdefy-schema.md +365 -0
  46. package/content/concepts/menus.md +144 -0
  47. package/content/concepts/module-authoring.md +564 -0
  48. package/content/concepts/modules.md +338 -0
  49. package/content/concepts/operators.md +45 -0
  50. package/content/concepts/overview.md +19 -0
  51. package/content/concepts/references-and-templates.md +207 -0
  52. package/content/concepts/secrets.md +24 -0
  53. package/content/concepts/selectors.md +143 -0
  54. package/content/connections/amazonredshift.md +176 -0
  55. package/content/connections/anthropic.md +232 -0
  56. package/content/connections/awss3.md +313 -0
  57. package/content/connections/azureblobstorage.md +133 -0
  58. package/content/connections/elasticsearch.md +371 -0
  59. package/content/connections/google.md +228 -0
  60. package/content/connections/googlecloudstorage.md +139 -0
  61. package/content/connections/googlesheet.md +313 -0
  62. package/content/connections/knex.md +206 -0
  63. package/content/connections/mariadb.md +177 -0
  64. package/content/connections/mcp.md +134 -0
  65. package/content/connections/mongodb.md +739 -0
  66. package/content/connections/mssql.md +191 -0
  67. package/content/connections/mysql.md +192 -0
  68. package/content/connections/openai-connection.md +228 -0
  69. package/content/connections/postgresql.md +200 -0
  70. package/content/connections/redis.md +116 -0
  71. package/content/connections/sendgridmail.md +94 -0
  72. package/content/connections/smtp.md +149 -0
  73. package/content/connections/sqlite.md +187 -0
  74. package/content/connections/stripe.md +115 -0
  75. package/content/container-blocks/affix.md +413 -0
  76. package/content/container-blocks/alert.md +937 -0
  77. package/content/container-blocks/badge.md +1222 -0
  78. package/content/container-blocks/box.md +1453 -0
  79. package/content/container-blocks/card.md +1200 -0
  80. package/content/container-blocks/carousel.md +2247 -0
  81. package/content/container-blocks/collapse.md +1335 -0
  82. package/content/container-blocks/configprovider.md +1070 -0
  83. package/content/container-blocks/confirmmodal.md +1159 -0
  84. package/content/container-blocks/content.md +597 -0
  85. package/content/container-blocks/descriptions.md +870 -0
  86. package/content/container-blocks/drawer.md +1379 -0
  87. package/content/container-blocks/dropdownmenu.md +643 -0
  88. package/content/container-blocks/flex.md +1510 -0
  89. package/content/container-blocks/footer.md +380 -0
  90. package/content/container-blocks/googlemaps.md +546 -0
  91. package/content/container-blocks/googlemapsheatmap.md +607 -0
  92. package/content/container-blocks/googlemapsscript.md +61 -0
  93. package/content/container-blocks/header.md +302 -0
  94. package/content/container-blocks/label.md +739 -0
  95. package/content/container-blocks/layout.md +604 -0
  96. package/content/container-blocks/masonry.md +1090 -0
  97. package/content/container-blocks/mobilemenu.md +1244 -0
  98. package/content/container-blocks/modal.md +1180 -0
  99. package/content/container-blocks/pageheadermenu.md +614 -0
  100. package/content/container-blocks/pagesidebarlayout.md +438 -0
  101. package/content/container-blocks/pagesidermenu.md +651 -0
  102. package/content/container-blocks/popover.md +1421 -0
  103. package/content/container-blocks/result.md +972 -0
  104. package/content/container-blocks/sider.md +1064 -0
  105. package/content/container-blocks/span.md +747 -0
  106. package/content/container-blocks/spinner.md +267 -0
  107. package/content/container-blocks/splitter.md +1735 -0
  108. package/content/container-blocks/tabs.md +1718 -0
  109. package/content/container-blocks/tooltip.md +1274 -0
  110. package/content/container-blocks/watermark.md +515 -0
  111. package/content/controls/for.md +103 -0
  112. package/content/controls/if.md +107 -0
  113. package/content/controls/log.md +50 -0
  114. package/content/controls/parallel.md +71 -0
  115. package/content/controls/parallel_for.md +36 -0
  116. package/content/controls/reject.md +56 -0
  117. package/content/controls/return.md +66 -0
  118. package/content/controls/set_state.md +98 -0
  119. package/content/controls/switch.md +90 -0
  120. package/content/controls/throw.md +79 -0
  121. package/content/controls/try.md +88 -0
  122. package/content/deployment/docker.md +149 -0
  123. package/content/deployment/node-server.md +27 -0
  124. package/content/deployment/vercel.md +101 -0
  125. package/content/display-blocks/aggrid.md +1459 -0
  126. package/content/display-blocks/anchor.md +336 -0
  127. package/content/display-blocks/avatar.md +1154 -0
  128. package/content/display-blocks/breadcrumb.md +517 -0
  129. package/content/display-blocks/button.md +758 -0
  130. package/content/display-blocks/calendar.md +156 -0
  131. package/content/display-blocks/dangeroushtml.md +314 -0
  132. package/content/display-blocks/dangerousmarkdown.md +423 -0
  133. package/content/display-blocks/diffgit.md +44 -0
  134. package/content/display-blocks/difflist.md +225 -0
  135. package/content/display-blocks/diffsidebyside.md +56 -0
  136. package/content/display-blocks/difftimeline.md +94 -0
  137. package/content/display-blocks/divider.md +406 -0
  138. package/content/display-blocks/download.md +60 -0
  139. package/content/display-blocks/dropdownbutton.md +661 -0
  140. package/content/display-blocks/echart.md +418 -0
  141. package/content/display-blocks/floatbutton.md +545 -0
  142. package/content/display-blocks/html.md +311 -0
  143. package/content/display-blocks/icon.md +717 -0
  144. package/content/display-blocks/img.md +479 -0
  145. package/content/display-blocks/markdown.md +520 -0
  146. package/content/display-blocks/markdownwithcode.md +730 -0
  147. package/content/display-blocks/menu.md +1123 -0
  148. package/content/display-blocks/message.md +941 -0
  149. package/content/display-blocks/notification.md +1410 -0
  150. package/content/display-blocks/paragraph.md +643 -0
  151. package/content/display-blocks/progress.md +818 -0
  152. package/content/display-blocks/qrcode.md +519 -0
  153. package/content/display-blocks/s3download.md +240 -0
  154. package/content/display-blocks/search.md +360 -0
  155. package/content/display-blocks/skeleton.md +272 -0
  156. package/content/display-blocks/skeletonavatar.md +222 -0
  157. package/content/display-blocks/skeletonbutton.md +245 -0
  158. package/content/display-blocks/skeletoninput.md +223 -0
  159. package/content/display-blocks/skeletonparagraph.md +201 -0
  160. package/content/display-blocks/statistic.md +485 -0
  161. package/content/display-blocks/steps.md +585 -0
  162. package/content/display-blocks/tag.md +620 -0
  163. package/content/display-blocks/title.md +654 -0
  164. package/content/display-blocks/tour.md +2359 -0
  165. package/content/input-blocks/autocomplete.md +786 -0
  166. package/content/input-blocks/buttonselector.md +964 -0
  167. package/content/input-blocks/checkboxselector.md +765 -0
  168. package/content/input-blocks/checkboxswitch.md +497 -0
  169. package/content/input-blocks/colorselector.md +884 -0
  170. package/content/input-blocks/daterangeselector.md +777 -0
  171. package/content/input-blocks/dateselector.md +693 -0
  172. package/content/input-blocks/datetimeselector.md +791 -0
  173. package/content/input-blocks/inputgallery.md +528 -0
  174. package/content/input-blocks/monthselector.md +717 -0
  175. package/content/input-blocks/multipleselector.md +1337 -0
  176. package/content/input-blocks/numberinput.md +855 -0
  177. package/content/input-blocks/pagination.md +679 -0
  178. package/content/input-blocks/paragraphinput.md +1664 -0
  179. package/content/input-blocks/passwordinput.md +480 -0
  180. package/content/input-blocks/phonenumberinput.md +688 -0
  181. package/content/input-blocks/radioselector.md +820 -0
  182. package/content/input-blocks/ratingslider.md +684 -0
  183. package/content/input-blocks/s3uploadbutton.md +384 -0
  184. package/content/input-blocks/s3uploaddragger.md +305 -0
  185. package/content/input-blocks/s3uploadphoto.md +288 -0
  186. package/content/input-blocks/segmentedselector.md +782 -0
  187. package/content/input-blocks/selector.md +1162 -0
  188. package/content/input-blocks/switch.md +552 -0
  189. package/content/input-blocks/textarea.md +714 -0
  190. package/content/input-blocks/textinput.md +639 -0
  191. package/content/input-blocks/tiptapinput.md +226 -0
  192. package/content/input-blocks/tiptapmentioninput.md +471 -0
  193. package/content/input-blocks/titleinput.md +1094 -0
  194. package/content/input-blocks/treeinput.md +144 -0
  195. package/content/input-blocks/treemultipleselector.md +162 -0
  196. package/content/input-blocks/treeselector.md +185 -0
  197. package/content/input-blocks/upload.md +149 -0
  198. package/content/input-blocks/uploaddragger.md +85 -0
  199. package/content/input-blocks/uploadphoto.md +84 -0
  200. package/content/input-blocks/weekselector.md +630 -0
  201. package/content/list-blocks/controlledlist.md +498 -0
  202. package/content/list-blocks/list.md +529 -0
  203. package/content/list-blocks/listselector.md +301 -0
  204. package/content/list-blocks/masonrylist.md +230 -0
  205. package/content/migration/upgrade-guide.md +106 -0
  206. package/content/migration/v4-to-v5.md +589 -0
  207. package/content/migration/v5-to-v6.md +36 -0
  208. package/content/operators/_actions.md +58 -0
  209. package/content/operators/_and.md +76 -0
  210. package/content/operators/_api.md +254 -0
  211. package/content/operators/_app.md +114 -0
  212. package/content/operators/_args.md +65 -0
  213. package/content/operators/_array.md +331 -0
  214. package/content/operators/_base64.md +49 -0
  215. package/content/operators/_boolean.md +33 -0
  216. package/content/operators/_build.md +166 -0
  217. package/content/operators/_change_case.md +357 -0
  218. package/content/operators/_date.md +415 -0
  219. package/content/operators/_dayjs.md +128 -0
  220. package/content/operators/_diff.md +61 -0
  221. package/content/operators/_divide.md +32 -0
  222. package/content/operators/_eq.md +52 -0
  223. package/content/operators/_event.md +86 -0
  224. package/content/operators/_function.md +52 -0
  225. package/content/operators/_get.md +92 -0
  226. package/content/operators/_global.md +86 -0
  227. package/content/operators/_gt.md +50 -0
  228. package/content/operators/_gte.md +50 -0
  229. package/content/operators/_hash.md +112 -0
  230. package/content/operators/_if.md +30 -0
  231. package/content/operators/_if_none.md +47 -0
  232. package/content/operators/_index.md +48 -0
  233. package/content/operators/_input.md +86 -0
  234. package/content/operators/_intl.md +135 -0
  235. package/content/operators/_item.md +166 -0
  236. package/content/operators/_js.md +113 -0
  237. package/content/operators/_json.md +120 -0
  238. package/content/operators/_jsonata.md +152 -0
  239. package/content/operators/_locale.md +65 -0
  240. package/content/operators/_location.md +40 -0
  241. package/content/operators/_log.md +22 -0
  242. package/content/operators/_lt.md +50 -0
  243. package/content/operators/_lte.md +50 -0
  244. package/content/operators/_math.md +407 -0
  245. package/content/operators/_media.md +83 -0
  246. package/content/operators/_menu.md +62 -0
  247. package/content/operators/_module.md +340 -0
  248. package/content/operators/_mql.md +95 -0
  249. package/content/operators/_ne.md +62 -0
  250. package/content/operators/_not.md +33 -0
  251. package/content/operators/_number.md +159 -0
  252. package/content/operators/_nunjucks.md +117 -0
  253. package/content/operators/_object.md +253 -0
  254. package/content/operators/_operator.md +33 -0
  255. package/content/operators/_or.md +67 -0
  256. package/content/operators/_product.md +45 -0
  257. package/content/operators/_random.md +90 -0
  258. package/content/operators/_ref.md +80 -0
  259. package/content/operators/_regex.md +69 -0
  260. package/content/operators/_request.md +35 -0
  261. package/content/operators/_request_details.md +29 -0
  262. package/content/operators/_secret.md +56 -0
  263. package/content/operators/_state.md +134 -0
  264. package/content/operators/_step.md +98 -0
  265. package/content/operators/_string.md +327 -0
  266. package/content/operators/_subtract.md +24 -0
  267. package/content/operators/_sum.md +45 -0
  268. package/content/operators/_switch.md +37 -0
  269. package/content/operators/_t.md +96 -0
  270. package/content/operators/_theme.md +65 -0
  271. package/content/operators/_type.md +78 -0
  272. package/content/operators/_uri.md +49 -0
  273. package/content/operators/_url_query.md +92 -0
  274. package/content/operators/_user.md +154 -0
  275. package/content/operators/_uuid.md +118 -0
  276. package/content/operators/_var.md +88 -0
  277. package/content/operators/_yaml.md +96 -0
  278. package/content/other/introduction.md +39 -0
  279. package/content/other/next-auth-providers.md +3 -0
  280. package/content/other/updatesession.md +26 -0
  281. package/content/plugins/plugins-actions.md +80 -0
  282. package/content/plugins/plugins-connections.md +98 -0
  283. package/content/plugins/plugins-dev.md +138 -0
  284. package/content/plugins/plugins-introduction.md +29 -0
  285. package/content/plugins/plugins-operators.md +71 -0
  286. package/content/testing/e2e-auth.md +108 -0
  287. package/content/testing/e2e-configuration.md +107 -0
  288. package/content/testing/e2e-getting-started.md +96 -0
  289. package/content/testing/e2e-introduction.md +53 -0
  290. package/content/testing/e2e-mocking.md +155 -0
  291. package/content/testing/e2e-writing-tests.md +214 -0
  292. package/content/tutorial/tutorial-actions-operators.md +222 -0
  293. package/content/tutorial/tutorial-add-blocks.md +86 -0
  294. package/content/tutorial/tutorial-create-page.md +57 -0
  295. package/content/tutorial/tutorial-display-data-page.md +181 -0
  296. package/content/tutorial/tutorial-next-steps.md +53 -0
  297. package/content/tutorial/tutorial-requests-sql.md +22 -0
  298. package/content/tutorial/tutorial-start.md +71 -0
  299. package/content/user-authentication/auth-providers.md +15 -0
  300. package/content/user-authentication/login-and-logout.md +122 -0
  301. package/content/user-authentication/users-introduction.md +31 -0
  302. package/index.json +2281 -0
  303. package/package.json +34 -0
  304. 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&#39;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.