@lowdefy/docs-content 0.0.0-experimental-20260909201552 → 6.0.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/README.md +0 -1
- package/content/actions/login.md +5 -23
- package/content/actions/logout.md +5 -5
- package/content/agents/agentchat.md +1 -13
- package/content/concepts/ai-agent-docs.md +4 -90
- package/content/concepts/custom-styling.md +5 -50
- package/content/concepts/events-and-actions.md +2 -64
- package/content/concepts/i18n.md +1 -1
- package/content/connections/mongodb.md +3 -109
- package/content/container-blocks/modal.md +1 -1
- package/content/container-blocks/pagesidebarlayout.md +0 -1
- package/content/controls/reject.md +1 -3
- package/content/controls/throw.md +0 -1
- package/content/controls/try.md +2 -3
- package/content/display-blocks/difflist.md +1 -1
- package/content/display-blocks/difftimeline.md +1 -1
- package/content/display-blocks/s3download.md +1 -1
- package/content/display-blocks/search.md +0 -1
- package/content/input-blocks/checkboxselector.md +4 -80
- package/content/input-blocks/radioselector.md +3 -65
- package/content/input-blocks/s3uploadbutton.md +1 -1
- package/content/input-blocks/s3uploaddragger.md +1 -1
- package/content/input-blocks/s3uploadphoto.md +1 -1
- package/content/input-blocks/tiptapmentioninput.md +1 -1
- package/content/list-blocks/masonrylist.md +1 -1
- package/content/operators/_type.md +3 -14
- package/content/operators/_user.md +3 -3
- package/content/user-authentication/login-and-logout.md +8 -158
- package/content/user-authentication/users-introduction.md +0 -8
- package/index.json +1 -99
- package/package.json +1 -3
- package/content/actions/emailotpsend.md +0 -58
- package/content/actions/emailotpverify.md +0 -77
- package/content/actions/magiclinkverify.md +0 -113
- package/content/controls/while.md +0 -46
- package/content/input-blocks/captcha.md +0 -40
- package/content/input-blocks/tagmultipleselector.md +0 -101
- package/content/input-blocks/tagselector.md +0 -101
- package/content/migration/auth-upgrade.md +0 -315
- package/content/other/mongodbadapter.md +0 -3
- package/content/user-authentication/auth-steps.md +0 -111
- package/content/user-authentication/mcp-oauth.md +0 -289
- package/content/user-authentication/organizations.md +0 -134
- package/content/user-authentication/two-factor.md +0 -225
- package/content/user-authentication/user-object.md +0 -58
- package/hazards.json +0 -44
package/index.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "5.
|
|
2
|
+
"version": "5.4.0",
|
|
3
3
|
"docs": [
|
|
4
4
|
{
|
|
5
5
|
"slug": "other/introduction",
|
|
@@ -283,48 +283,12 @@
|
|
|
283
283
|
"section": "User Authentication",
|
|
284
284
|
"path": "content/user-authentication/login-and-logout.md"
|
|
285
285
|
},
|
|
286
|
-
{
|
|
287
|
-
"slug": "user-authentication/two-factor",
|
|
288
|
-
"title": "Two-Factor Authentication",
|
|
289
|
-
"section": "User Authentication",
|
|
290
|
-
"path": "content/user-authentication/two-factor.md"
|
|
291
|
-
},
|
|
292
|
-
{
|
|
293
|
-
"slug": "user-authentication/organizations",
|
|
294
|
-
"title": "Organizations & Multi-Tenancy",
|
|
295
|
-
"section": "User Authentication",
|
|
296
|
-
"path": "content/user-authentication/organizations.md"
|
|
297
|
-
},
|
|
298
|
-
{
|
|
299
|
-
"slug": "user-authentication/auth-steps",
|
|
300
|
-
"title": "Auth Steps",
|
|
301
|
-
"section": "User Authentication",
|
|
302
|
-
"path": "content/user-authentication/auth-steps.md"
|
|
303
|
-
},
|
|
304
|
-
{
|
|
305
|
-
"slug": "user-authentication/mcp-oauth",
|
|
306
|
-
"title": "MCP Server & OAuth",
|
|
307
|
-
"section": "User Authentication",
|
|
308
|
-
"path": "content/user-authentication/mcp-oauth.md"
|
|
309
|
-
},
|
|
310
|
-
{
|
|
311
|
-
"slug": "user-authentication/user-object",
|
|
312
|
-
"title": "User Object",
|
|
313
|
-
"section": "User Authentication",
|
|
314
|
-
"path": "content/user-authentication/user-object.md"
|
|
315
|
-
},
|
|
316
286
|
{
|
|
317
287
|
"slug": "other/next-auth-providers",
|
|
318
288
|
"title": "next-auth-providers",
|
|
319
289
|
"section": "Other",
|
|
320
290
|
"path": "content/other/next-auth-providers.md"
|
|
321
291
|
},
|
|
322
|
-
{
|
|
323
|
-
"slug": "other/mongodbadapter",
|
|
324
|
-
"title": "MongoDBAdapter",
|
|
325
|
-
"section": "Other",
|
|
326
|
-
"path": "content/other/mongodbadapter.md"
|
|
327
|
-
},
|
|
328
292
|
{
|
|
329
293
|
"slug": "testing/e2e-introduction",
|
|
330
294
|
"title": "E2E Testing",
|
|
@@ -385,14 +349,6 @@
|
|
|
385
349
|
"kind": "block",
|
|
386
350
|
"typeName": "ButtonSelector"
|
|
387
351
|
},
|
|
388
|
-
{
|
|
389
|
-
"slug": "input-blocks/captcha",
|
|
390
|
-
"title": "Captcha",
|
|
391
|
-
"section": "Input Blocks",
|
|
392
|
-
"path": "content/input-blocks/captcha.md",
|
|
393
|
-
"kind": "block",
|
|
394
|
-
"typeName": "Captcha"
|
|
395
|
-
},
|
|
396
352
|
{
|
|
397
353
|
"slug": "input-blocks/checkboxselector",
|
|
398
354
|
"title": "CheckboxSelector",
|
|
@@ -585,22 +541,6 @@
|
|
|
585
541
|
"kind": "block",
|
|
586
542
|
"typeName": "Switch"
|
|
587
543
|
},
|
|
588
|
-
{
|
|
589
|
-
"slug": "input-blocks/tagmultipleselector",
|
|
590
|
-
"title": "TagMultipleSelector",
|
|
591
|
-
"section": "Input Blocks",
|
|
592
|
-
"path": "content/input-blocks/tagmultipleselector.md",
|
|
593
|
-
"kind": "block",
|
|
594
|
-
"typeName": "TagMultipleSelector"
|
|
595
|
-
},
|
|
596
|
-
{
|
|
597
|
-
"slug": "input-blocks/tagselector",
|
|
598
|
-
"title": "TagSelector",
|
|
599
|
-
"section": "Input Blocks",
|
|
600
|
-
"path": "content/input-blocks/tagselector.md",
|
|
601
|
-
"kind": "block",
|
|
602
|
-
"typeName": "TagSelector"
|
|
603
|
-
},
|
|
604
544
|
{
|
|
605
545
|
"slug": "input-blocks/textarea",
|
|
606
546
|
"title": "TextArea",
|
|
@@ -1521,22 +1461,6 @@
|
|
|
1521
1461
|
"kind": "action",
|
|
1522
1462
|
"typeName": "DownloadCsv"
|
|
1523
1463
|
},
|
|
1524
|
-
{
|
|
1525
|
-
"slug": "actions/emailotpsend",
|
|
1526
|
-
"title": "EmailOtpSend",
|
|
1527
|
-
"section": "Actions",
|
|
1528
|
-
"path": "content/actions/emailotpsend.md",
|
|
1529
|
-
"kind": "action",
|
|
1530
|
-
"typeName": "EmailOtpSend"
|
|
1531
|
-
},
|
|
1532
|
-
{
|
|
1533
|
-
"slug": "actions/emailotpverify",
|
|
1534
|
-
"title": "EmailOtpVerify",
|
|
1535
|
-
"section": "Actions",
|
|
1536
|
-
"path": "content/actions/emailotpverify.md",
|
|
1537
|
-
"kind": "action",
|
|
1538
|
-
"typeName": "EmailOtpVerify"
|
|
1539
|
-
},
|
|
1540
1464
|
{
|
|
1541
1465
|
"slug": "actions/fetch",
|
|
1542
1466
|
"title": "Fetch",
|
|
@@ -1577,14 +1501,6 @@
|
|
|
1577
1501
|
"kind": "action",
|
|
1578
1502
|
"typeName": "Logout"
|
|
1579
1503
|
},
|
|
1580
|
-
{
|
|
1581
|
-
"slug": "actions/magiclinkverify",
|
|
1582
|
-
"title": "MagicLinkVerify",
|
|
1583
|
-
"section": "Actions",
|
|
1584
|
-
"path": "content/actions/magiclinkverify.md",
|
|
1585
|
-
"kind": "action",
|
|
1586
|
-
"typeName": "MagicLinkVerify"
|
|
1587
|
-
},
|
|
1588
1504
|
{
|
|
1589
1505
|
"slug": "actions/pdfmake",
|
|
1590
1506
|
"title": "PdfMake",
|
|
@@ -2343,26 +2259,12 @@
|
|
|
2343
2259
|
"kind": "block",
|
|
2344
2260
|
"typeName": ":try"
|
|
2345
2261
|
},
|
|
2346
|
-
{
|
|
2347
|
-
"slug": "controls/while",
|
|
2348
|
-
"title": ":while",
|
|
2349
|
-
"section": "Controls",
|
|
2350
|
-
"path": "content/controls/while.md",
|
|
2351
|
-
"kind": "block",
|
|
2352
|
-
"typeName": ":while"
|
|
2353
|
-
},
|
|
2354
2262
|
{
|
|
2355
2263
|
"slug": "migration/upgrade-guide",
|
|
2356
2264
|
"title": "Upgrade Guide",
|
|
2357
2265
|
"section": "Migration",
|
|
2358
2266
|
"path": "content/migration/upgrade-guide.md"
|
|
2359
2267
|
},
|
|
2360
|
-
{
|
|
2361
|
-
"slug": "migration/auth-upgrade",
|
|
2362
|
-
"title": "Auth Upgrade (BetterAuth)",
|
|
2363
|
-
"section": "Migration",
|
|
2364
|
-
"path": "content/migration/auth-upgrade.md"
|
|
2365
|
-
},
|
|
2366
2268
|
{
|
|
2367
2269
|
"slug": "migration/v5-to-v6",
|
|
2368
2270
|
"title": "Version 5 to Version 6",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lowdefy/docs-content",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.0.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"description": "Lowdefy documentation extracted as markdown for AI coding agents.",
|
|
6
6
|
"homepage": "https://lowdefy.com",
|
|
@@ -20,13 +20,11 @@
|
|
|
20
20
|
"type": "module",
|
|
21
21
|
"exports": {
|
|
22
22
|
"./index.json": "./index.json",
|
|
23
|
-
"./hazards.json": "./hazards.json",
|
|
24
23
|
"./scripts/extractAgentDocs.js": "./scripts/extractAgentDocs.js",
|
|
25
24
|
"./content/*": "./content/*"
|
|
26
25
|
},
|
|
27
26
|
"files": [
|
|
28
27
|
"content/**",
|
|
29
|
-
"hazards.json",
|
|
30
28
|
"index.json",
|
|
31
29
|
"scripts/*"
|
|
32
30
|
],
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
# EmailOtpSend
|
|
2
|
-
|
|
3
|
-
```
|
|
4
|
-
(params: {
|
|
5
|
-
email: string
|
|
6
|
-
captchaToken?: string
|
|
7
|
-
}): void
|
|
8
|
-
```
|
|
9
|
-
|
|
10
|
-
The `EmailOtpSend` action emails a one-time sign-in code to an address. It requires `auth.emailOTP` to be enabled — see [Configuration](/auth-configuration).
|
|
11
|
-
|
|
12
|
-
A code is typed into the tab the person started from, so the sign-in survives corporate mail security that pre-fetches links (which consumes a single-use magic link before the person clicks it), and it works when the email is read on another device.
|
|
13
|
-
|
|
14
|
-
Use [`EmailOtpVerify`](/EmailOtpVerify) to complete the sign-in with the code.
|
|
15
|
-
|
|
16
|
-
When `auth.magicLink` is enabled alongside `auth.emailOTP`, the magic-link email already carries the code: the [`Login`](/Login) action with `magicLink: true` sends one email that serves both paths, and `EmailOtpSend` is then only needed for a code-only page that offers no link at all.
|
|
17
|
-
|
|
18
|
-
Under an invite-only signup policy an address that is not admitted gets no email, and the action still resolves successfully — the response is identical either way, so the "check your email" screen gives nothing away about who has an account.
|
|
19
|
-
|
|
20
|
-
#### Parameters
|
|
21
|
-
|
|
22
|
-
###### object
|
|
23
|
-
- `email: string`: __required__ - The email address to send the sign-in code to.
|
|
24
|
-
- `captchaToken: string`: A captcha token minted by a `Captcha` block, sent as the `x-captcha-response` header when `auth.captcha` is enabled. Tokens are single-use, so reset the `Captcha` block in `onError` for retries.
|
|
25
|
-
|
|
26
|
-
#### Examples
|
|
27
|
-
|
|
28
|
-
###### Send a sign-in code:
|
|
29
|
-
```yaml
|
|
30
|
-
- id: send_code
|
|
31
|
-
type: EmailOtpSend
|
|
32
|
-
params:
|
|
33
|
-
email:
|
|
34
|
-
_state: email
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
###### Send a code and tell the user to check their inbox:
|
|
38
|
-
```yaml
|
|
39
|
-
- id: send_code
|
|
40
|
-
type: Button
|
|
41
|
-
properties:
|
|
42
|
-
title: Send code
|
|
43
|
-
events:
|
|
44
|
-
onClick:
|
|
45
|
-
- id: validate
|
|
46
|
-
type: Validate
|
|
47
|
-
params:
|
|
48
|
-
regex: ^email$
|
|
49
|
-
- id: send
|
|
50
|
-
type: EmailOtpSend
|
|
51
|
-
params:
|
|
52
|
-
email:
|
|
53
|
-
_state: email
|
|
54
|
-
- id: sent
|
|
55
|
-
type: DisplayMessage
|
|
56
|
-
params:
|
|
57
|
-
content: Check your email for the sign-in code.
|
|
58
|
-
```
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
# EmailOtpVerify
|
|
2
|
-
|
|
3
|
-
```
|
|
4
|
-
(params: {
|
|
5
|
-
email: string
|
|
6
|
-
otp: string
|
|
7
|
-
callbackUrl?: {
|
|
8
|
-
home?: boolean
|
|
9
|
-
pageId?: string
|
|
10
|
-
url?: string
|
|
11
|
-
urlQuery?: object
|
|
12
|
-
} | false
|
|
13
|
-
}): void
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
The `EmailOtpVerify` action signs a user in with the one-time code emailed to them by [`EmailOtpSend`](/EmailOtpSend), or carried on the magic-link email when `auth.magicLink` and `auth.emailOTP` are both enabled. It requires `auth.emailOTP` to be enabled — see [Configuration](/auth-configuration).
|
|
17
|
-
|
|
18
|
-
On success the session cookie is set — creating the account on first sign-in, unless `emailOTP.disableSignUp` is `true` — and the browser lands on the resolved `callbackUrl`. Three sources are consulted, in order:
|
|
19
|
-
|
|
20
|
-
1. The `callbackUrl` param, if given.
|
|
21
|
-
2. The `?callbackUrl=` query parameter, which Lowdefy sets when it redirects an unauthenticated user to the sign-in page.
|
|
22
|
-
3. The app's home page.
|
|
23
|
-
|
|
24
|
-
To sign in without navigating, set `callbackUrl: false` — valid here, unlike on the magic-link and social paths, because this is a plain JSON sign-in with no redirect hop.
|
|
25
|
-
|
|
26
|
-
If the user has two-factor authentication enrolled, the code mints a challenge rather than a session: the action navigates to `authPages.twoFactor` carrying the resolved destination as `?callbackUrl=`, where [`TwoFactorVerify`](/two-factor) finishes the sign-in, and the event chain stops.
|
|
27
|
-
|
|
28
|
-
An expired, mistyped or already-used code is the auth server rejecting the attempt, not an app fault. The action throws a `UserError`: `catch` actions still run and the message still displays, but it is logged to the browser console only and is never reported to the server.
|
|
29
|
-
|
|
30
|
-
#### Parameters
|
|
31
|
-
|
|
32
|
-
###### object
|
|
33
|
-
- `email: string`: __required__ - The email address the code was sent to.
|
|
34
|
-
- `otp: string`: __required__ - The one-time code from the email.
|
|
35
|
-
- `callbackUrl: object | false`: Set to `false` to sign in without navigating. As an object:
|
|
36
|
-
- `home: boolean`: Land on the app's home page.
|
|
37
|
-
- `pageId: string`: The pageId to land on.
|
|
38
|
-
- `url: string`: The URL to land on. An absolute URL is not `basePath`-prefixed, so it can be an external landing page.
|
|
39
|
-
- `urlQuery: object`: The urlQuery to set on the destination.
|
|
40
|
-
|
|
41
|
-
#### Examples
|
|
42
|
-
|
|
43
|
-
###### Sign in with the code and land on the home page (or the page the user was bounced from):
|
|
44
|
-
```yaml
|
|
45
|
-
- id: verify_code
|
|
46
|
-
type: EmailOtpVerify
|
|
47
|
-
params:
|
|
48
|
-
email:
|
|
49
|
-
_state: email
|
|
50
|
-
otp:
|
|
51
|
-
_state: otp
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
###### Sign in and land on a specific page:
|
|
55
|
-
```yaml
|
|
56
|
-
- id: verify_code
|
|
57
|
-
type: EmailOtpVerify
|
|
58
|
-
params:
|
|
59
|
-
email:
|
|
60
|
-
_state: email
|
|
61
|
-
otp:
|
|
62
|
-
_state: otp
|
|
63
|
-
callbackUrl:
|
|
64
|
-
pageId: dashboard
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
###### Sign in inside a modal, without navigating:
|
|
68
|
-
```yaml
|
|
69
|
-
- id: verify_code
|
|
70
|
-
type: EmailOtpVerify
|
|
71
|
-
params:
|
|
72
|
-
email:
|
|
73
|
-
_state: email
|
|
74
|
-
otp:
|
|
75
|
-
_state: otp
|
|
76
|
-
callbackUrl: false
|
|
77
|
-
```
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
# MagicLinkVerify
|
|
2
|
-
|
|
3
|
-
```
|
|
4
|
-
(params?: {
|
|
5
|
-
callbackUrl?: {
|
|
6
|
-
home?: boolean
|
|
7
|
-
pageId?: string
|
|
8
|
-
url?: string
|
|
9
|
-
urlQuery?: object
|
|
10
|
-
}
|
|
11
|
-
errorCallbackUrl?: {
|
|
12
|
-
home?: boolean
|
|
13
|
-
pageId?: string
|
|
14
|
-
url?: string
|
|
15
|
-
urlQuery?: object
|
|
16
|
-
}
|
|
17
|
-
newUserCallbackUrl?: {
|
|
18
|
-
home?: boolean
|
|
19
|
-
pageId?: string
|
|
20
|
-
url?: string
|
|
21
|
-
urlQuery?: object
|
|
22
|
-
}
|
|
23
|
-
token?: string
|
|
24
|
-
}): void
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
The `MagicLinkVerify` action completes a magic-link sign-in from the landing page the sign-in email points at. It navigates the browser to the auth server's verify endpoint, which sets the session cookie and redirects the user on to their destination.
|
|
28
|
-
|
|
29
|
-
## Why a landing page
|
|
30
|
-
|
|
31
|
-
A magic-link token is single-use, and the verify endpoint consumes it on the **first** `GET` of the URL. Corporate mail security — Microsoft Defender Safe Links, Proofpoint URL Defense, Mimecast — fetches every link in a message as it is delivered. When the email links straight at the verify endpoint the scanner spends the token minutes before the person clicks, and the person lands on the auth error page with `INVALID_TOKEN`.
|
|
32
|
-
|
|
33
|
-
Setting [`auth.authPages.magicLink`](/auth-configuration#the-magic-link-landing-page) to a page in your app moves the email's link to that page, carrying the token and callback destinations on the URL query. Fetching a Lowdefy page has no side effect, so the token stays unspent until a person clicks a button that runs `MagicLinkVerify`.
|
|
34
|
-
|
|
35
|
-
This action **must** be bound to a click. Do not run it in `onMount` and do not auto-redirect from the landing page: scanning sandboxes that execute JavaScript would consume the token anyway, and you would be no better off than linking at the verify endpoint directly.
|
|
36
|
-
|
|
37
|
-
## Defaults come from the URL query
|
|
38
|
-
|
|
39
|
-
Every parameter is optional. The auth server minted the landing URL with the verify query on it, so the action reads its defaults from the page's own URL:
|
|
40
|
-
|
|
41
|
-
| Parameter | Default |
|
|
42
|
-
| --------- | ------- |
|
|
43
|
-
| `token` | the `?token=` query parameter |
|
|
44
|
-
| `callbackUrl` | the `?callbackURL=` query parameter, else the auth server's default |
|
|
45
|
-
| `newUserCallbackUrl` | the `?newUserCallbackURL=` query parameter, else `callbackUrl` |
|
|
46
|
-
| `errorCallbackUrl` | the `?errorCallbackURL=` query parameter, else `auth.authPages.error` |
|
|
47
|
-
|
|
48
|
-
Pass a parameter only to override what the email carried. The action throws if there is no token in either place, because there is nothing to verify.
|
|
49
|
-
|
|
50
|
-
`callbackUrl: false` is not valid here. Verification redirects through a hop the app does not control, so there is no staying put.
|
|
51
|
-
|
|
52
|
-
The event chain ends after this action, like every other action that navigates the browser away — a step after it would race the page being replaced.
|
|
53
|
-
|
|
54
|
-
#### Parameters
|
|
55
|
-
|
|
56
|
-
###### object
|
|
57
|
-
- `token: string`: The single-use magic-link token. Defaults to the `?token=` URL query parameter of the landing page.
|
|
58
|
-
- `callbackUrl: object`: Where a successful sign-in lands. Defaults to the `?callbackURL=` URL query parameter.
|
|
59
|
-
- `home: boolean`: Land on the app's home page.
|
|
60
|
-
- `pageId: string`: The pageId to land on.
|
|
61
|
-
- `url: string`: The URL to land on. An absolute URL is not `basePath`-prefixed, so it can be an external landing page.
|
|
62
|
-
- `urlQuery: object`: The urlQuery to set on the destination.
|
|
63
|
-
- `newUserCallbackUrl: object`: Where a sign-in that creates a new account lands, for a first-run or onboarding page. Defaults to the `?newUserCallbackURL=` URL query parameter. Same fields as `callbackUrl`.
|
|
64
|
-
- `errorCallbackUrl: object`: Where a failed verification lands, with the reason in `?error=`. Defaults to the `?errorCallbackURL=` URL query parameter, then to `auth.authPages.error`. Same fields as `callbackUrl`.
|
|
65
|
-
|
|
66
|
-
#### Examples
|
|
67
|
-
|
|
68
|
-
###### The landing page, with everything taken from the URL query:
|
|
69
|
-
```yaml
|
|
70
|
-
id: magic-link
|
|
71
|
-
type: PageHeaderMenu
|
|
72
|
-
blocks:
|
|
73
|
-
- id: content
|
|
74
|
-
type: Box
|
|
75
|
-
blocks:
|
|
76
|
-
- id: title
|
|
77
|
-
type: Title
|
|
78
|
-
properties:
|
|
79
|
-
content: Sign in
|
|
80
|
-
level: 3
|
|
81
|
-
- id: description
|
|
82
|
-
type: Paragraph
|
|
83
|
-
properties:
|
|
84
|
-
content: Click the button below to finish signing in.
|
|
85
|
-
- id: verify_button
|
|
86
|
-
type: Button
|
|
87
|
-
properties:
|
|
88
|
-
title: Sign in
|
|
89
|
-
events:
|
|
90
|
-
onClick:
|
|
91
|
-
- id: verify
|
|
92
|
-
type: MagicLinkVerify
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
###### Send a new user to an onboarding page instead:
|
|
96
|
-
```yaml
|
|
97
|
-
- id: verify
|
|
98
|
-
type: MagicLinkVerify
|
|
99
|
-
params:
|
|
100
|
-
newUserCallbackUrl:
|
|
101
|
-
pageId: welcome
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
###### Override where a successful sign-in lands:
|
|
105
|
-
```yaml
|
|
106
|
-
- id: verify
|
|
107
|
-
type: MagicLinkVerify
|
|
108
|
-
params:
|
|
109
|
-
callbackUrl:
|
|
110
|
-
pageId: dashboard
|
|
111
|
-
urlQuery:
|
|
112
|
-
source: magic-link
|
|
113
|
-
```
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
# :while
|
|
2
|
-
|
|
3
|
-
```
|
|
4
|
-
({:while: boolean, :do: routine}): void
|
|
5
|
-
```
|
|
6
|
-
|
|
7
|
-
The `:while` control implements a while loop within a routine. The routine defined in the `:do` key will be repeated as long as the test defined using the `:while` key is true.
|
|
8
|
-
|
|
9
|
-
#### Keys
|
|
10
|
-
|
|
11
|
-
- `:while: boolean`: __Required__ - The test that will determine whether or not the defined routine should execute again.
|
|
12
|
-
- `:do: routine`: __Required__ - The routine to run while the test condition holds.
|
|
13
|
-
|
|
14
|
-
The `:while` condition is evaluated fresh before every iteration, against the routine's current `state` and `steps`. This is how the loop terminates - the routine in `:do` changes the state or step results that the condition reads.
|
|
15
|
-
|
|
16
|
-
Unlike `:for`, a `:while` loop does not index the step results of its body. A `:while` has no item to index by, so each iteration overwrites the previous iteration's step results, and `_step: my_step` inside or after the loop reads the value from the latest iteration.
|
|
17
|
-
|
|
18
|
-
There is no iteration cap and no timeout. A condition that the routine in `:do` never falsifies loops forever, exactly as it would in JavaScript.
|
|
19
|
-
|
|
20
|
-
#### Examples
|
|
21
|
-
|
|
22
|
-
###### Simple Example
|
|
23
|
-
```
|
|
24
|
-
- :set_state:
|
|
25
|
-
count: 0
|
|
26
|
-
- :while:
|
|
27
|
-
_lt:
|
|
28
|
-
- _state: count
|
|
29
|
-
- 5
|
|
30
|
-
:do:
|
|
31
|
-
- :log:
|
|
32
|
-
_state: count
|
|
33
|
-
- :set_state:
|
|
34
|
-
count:
|
|
35
|
-
_sum:
|
|
36
|
-
- _state: count
|
|
37
|
-
- 1
|
|
38
|
-
```
|
|
39
|
-
Logs:
|
|
40
|
-
```
|
|
41
|
-
0
|
|
42
|
-
1
|
|
43
|
-
2
|
|
44
|
-
3
|
|
45
|
-
4
|
|
46
|
-
```
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
# Captcha
|
|
2
|
-
|
|
3
|
-
Renders a captcha widget (Cloudflare Turnstile) and writes the minted token into state under its blockId. Configure `provider` and `siteKey` from the `_build.authConfig` projection when `auth.captcha` is enabled. The `reset` method clears the value and mints a fresh token; expiry clears the value automatically.
|
|
4
|
-
|
|
5
|
-
> The widget script loads from the provider's CDN at render - apps behind a strict CSP should allowlist challenges.cloudflare.com. Tokens are single-use and short-lived: pass the block value as the `captchaToken` param of auth actions, and call the block's `reset` method from the action's `onError` chain to mint a fresh token for retries.
|
|
6
|
-
|
|
7
|
-
```yaml
|
|
8
|
-
- id: captcha_basic
|
|
9
|
-
type: Captcha
|
|
10
|
-
properties:
|
|
11
|
-
provider: cloudflare-turnstile
|
|
12
|
-
siteKey: 1x00000000000000000000AA
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
```yaml
|
|
16
|
-
- id: captcha_compact
|
|
17
|
-
type: Captcha
|
|
18
|
-
properties:
|
|
19
|
-
provider: cloudflare-turnstile
|
|
20
|
-
siteKey: 1x00000000000000000000AA
|
|
21
|
-
theme: light
|
|
22
|
-
size: compact
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
| Property | Type | Default | Description |
|
|
26
|
-
| --- | --- | --- | --- |
|
|
27
|
-
| `provider` | string | `"cloudflare-turnstile"` | Captcha provider to render. Normally fed from the auth config projection: { _build.authConfig: captcha.provider }. Enum: `cloudflare-turnstile`. |
|
|
28
|
-
| `siteKey` | string | - | The provider site key - public, rendered into the page. Normally fed from the auth config projection: { _build.authConfig: captcha.siteKey }. |
|
|
29
|
-
| `theme` | string | `"auto"` | Widget theme. Enum: `auto`, `light`, `dark`. |
|
|
30
|
-
| `size` | string | `"normal"` | Widget size. Enum: `normal`, `compact`, `flexible`. |
|
|
31
|
-
|
|
32
|
-
| Event | Event Data | Description |
|
|
33
|
-
| --- | --- | --- |
|
|
34
|
-
| `onSuccess` | \- | Trigger actions when the captcha challenge succeeds and a token is minted. |
|
|
35
|
-
| `onExpire` | \- | Trigger actions when the minted token expires - the block value is cleared so a late submit fails with a clear missing-token error. |
|
|
36
|
-
| `onError` | \- | Trigger actions when the captcha provider reports an error. |
|
|
37
|
-
|
|
38
|
-
No CSS keys defined.
|
|
39
|
-
|
|
40
|
-
No slots defined.
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
# TagMultipleSelector
|
|
2
|
-
|
|
3
|
-
Multi-select input rendered as a row of toggleable, colored tag pills.
|
|
4
|
-
|
|
5
|
-
```yaml
|
|
6
|
-
- id: basic_strings
|
|
7
|
-
type: TagMultipleSelector
|
|
8
|
-
properties:
|
|
9
|
-
title: Domains
|
|
10
|
-
options:
|
|
11
|
-
- Ethics
|
|
12
|
-
- Environment
|
|
13
|
-
- Governance
|
|
14
|
-
- Social
|
|
15
|
-
- Data Privacy
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
```yaml
|
|
19
|
-
- id: label_value
|
|
20
|
-
type: TagMultipleSelector
|
|
21
|
-
properties:
|
|
22
|
-
title: Status Filter
|
|
23
|
-
options:
|
|
24
|
-
- label: Draft
|
|
25
|
-
value: draft
|
|
26
|
-
- label: In Review
|
|
27
|
-
value: in_review
|
|
28
|
-
- label: Published
|
|
29
|
-
value: published
|
|
30
|
-
- label: Archived
|
|
31
|
-
value: archived
|
|
32
|
-
disabled: true
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
```yaml
|
|
36
|
-
- id: explicit_colors
|
|
37
|
-
type: TagMultipleSelector
|
|
38
|
-
properties:
|
|
39
|
-
title: Priorities
|
|
40
|
-
options:
|
|
41
|
-
- label: Low
|
|
42
|
-
value: low
|
|
43
|
-
color: "#59A14F"
|
|
44
|
-
- label: Medium
|
|
45
|
-
value: medium
|
|
46
|
-
color: "#EDC948"
|
|
47
|
-
- label: High
|
|
48
|
-
value: high
|
|
49
|
-
color: "#E15759"
|
|
50
|
-
- id: single_accent
|
|
51
|
-
type: TagMultipleSelector
|
|
52
|
-
properties:
|
|
53
|
-
title: Interests
|
|
54
|
-
colored: false
|
|
55
|
-
options:
|
|
56
|
-
- Design
|
|
57
|
-
- Engineering
|
|
58
|
-
- Product
|
|
59
|
-
- Research
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
| Property | Type | Default | Description |
|
|
63
|
-
| --- | --- | --- | --- |
|
|
64
|
-
| `options` | array | - | Options to select from. Primitives, or { label, value, color, disabled } - an explicit color overrides the stable palette color. |
|
|
65
|
-
| `options.$.label` | string | - | Tag label. Defaults to the value. |
|
|
66
|
-
| `options.$.value` | - | - | Option value written into the selection array. |
|
|
67
|
-
| `options.$.color` | string | - | Explicit tag color (hex or CSS color). Overrides the stable palette color. |
|
|
68
|
-
| `options.$.disabled` | boolean | `false` | Disable this tag. |
|
|
69
|
-
| `colored` | boolean | `true` | Give each option a stable color (hash of its value over a fixed palette). false = single primary accent. |
|
|
70
|
-
| `disabled` | boolean | `false` | Disable the block if true. |
|
|
71
|
-
| `size` | string | `"default"` | Size of the block. Enum: `small`, `default`, `large`. |
|
|
72
|
-
| `label` | object | - | Label properties. |
|
|
73
|
-
| `label.align` | string | `"left"` | Align label left or right when inline. Enum: `left`, `right`. |
|
|
74
|
-
| `label.colon` | boolean | `true` | Append label with colon. |
|
|
75
|
-
| `label.extra` | string | - | Extra text to display beneath the content - supports html. |
|
|
76
|
-
| `label.title` | string | - | Label title - supports html. |
|
|
77
|
-
| `label.tooltip` | string \| object | - | Help tooltip shown via an icon beside the label. A string sets the tooltip text (supports html), or an object to also customize the icon and color. Use the block's onTooltipClick event to respond to clicks on the icon. |
|
|
78
|
-
| `label.tooltip.title` | string | - | Tooltip text shown on hover - supports html. |
|
|
79
|
-
| `label.tooltip.icon` | string | `"AiOutlineQuestionCircle"` | Name of the icon to show beside the label. |
|
|
80
|
-
| `label.tooltip.color` | string | - | Color of the tooltip icon. |
|
|
81
|
-
| `label.span` | number | - | Label inline span. |
|
|
82
|
-
| `label.disabled` | boolean | `false` | Hide input label. |
|
|
83
|
-
| `label.hasFeedback` | boolean | `true` | Display feedback extra from validation, this does not disable validation. |
|
|
84
|
-
| `label.inline` | boolean | `false` | Render input and label inline. |
|
|
85
|
-
| `title` | string | - | Title to describe the input component, if no title is specified the block id is displayed - supports html. |
|
|
86
|
-
|
|
87
|
-
| Event | Event Data | Description |
|
|
88
|
-
| --- | --- | --- |
|
|
89
|
-
| `onChange` | `{ value }` | Trigger actions when the selection is changed. |
|
|
90
|
-
| `onTooltipClick` | \- | Trigger actions when the tooltip icon is clicked. |
|
|
91
|
-
|
|
92
|
-
| Key | Target |
|
|
93
|
-
| --- | --- |
|
|
94
|
-
| `/block` | Outer block wrapper (always available). |
|
|
95
|
-
| `/element` | The TagMultipleSelector tag row. |
|
|
96
|
-
| `/tag` | Each tag pill. |
|
|
97
|
-
| `/label` | The TagMultipleSelector label. |
|
|
98
|
-
| `/extra` | The TagMultipleSelector extra content. |
|
|
99
|
-
| `/feedback` | The TagMultipleSelector validation feedback. |
|
|
100
|
-
|
|
101
|
-
No slots defined.
|