Compare commits
23 Commits
v0.4.0
...
ca30bf6107
| Author | SHA1 | Date | |
|---|---|---|---|
| ca30bf6107 | |||
| dac189b124 | |||
| c9e2f1a9e4 | |||
| 7a17ec11de | |||
| ec1579a039 | |||
| 153e77174d | |||
| 6e21eb2d4b | |||
| d8a31def52 | |||
| 5b49bce690 | |||
| 584a383d22 | |||
| 28dbc1a0ff | |||
| 0f0a842f34 | |||
| 88c5357268 | |||
| 3bd9adc73b | |||
| 51c95b32c1 | |||
| 3593b39e43 | |||
| 5f9d74ae4f | |||
| 79cee25b66 | |||
| 2993b462a1 | |||
| 7645f0302a | |||
| e5531a44cd | |||
| 3b1cd891ed | |||
| f06040b511 |
@@ -21,7 +21,7 @@ jobs:
|
|||||||
-e RENOVATE_PLATFORM=gitea \
|
-e RENOVATE_PLATFORM=gitea \
|
||||||
-e RENOVATE_REPOSITORIES=${{ github.repository }} \
|
-e RENOVATE_REPOSITORIES=${{ github.repository }} \
|
||||||
-e RENOVATE_TOKEN \
|
-e RENOVATE_TOKEN \
|
||||||
renovate/renovate:44.75.1
|
renovate/renovate:44.132.0
|
||||||
|
|
||||||
# After the renovate job, cut ONE tag covering the renovate-bot commits merged to main since the
|
# After the renovate job, cut ONE tag covering the renovate-bot commits merged to main since the
|
||||||
# last tag (batch per run). Targets origin/main — the real post-merge tip; the checkout SHA is the
|
# last tag (batch per run). Targets origin/main — the real post-merge tip; the checkout SHA is the
|
||||||
|
|||||||
@@ -447,9 +447,12 @@ one-time setup. A file-map or table row gets a clause, not a paragraph.
|
|||||||
same rule in their own language. An unmapped Kratos id renders Kratos' own wording — map the id when
|
same rule in their own language. An unmapped Kratos id renders Kratos' own wording — map the id when
|
||||||
it matters. **Held by the author, never by a test:** slightly different wording is often the right
|
it matters. **Held by the author, never by a test:** slightly different wording is often the right
|
||||||
call, and a build-failing check takes that judgment away.
|
call, and a build-failing check takes that judgment away.
|
||||||
- Use well formed, standard compliant, rich URIs. Prefer state in the URL over POSTing it, for
|
- Use well formed, standard compliant, rich URIs. **State lives in the URL or on the server, never in
|
||||||
example on list pages with filters and pagination. Do `ids=x&ids=y`, not `ids[]=x&ids[]=y` and not
|
a cookie.** Prefer state in the URL over POSTing it, for example on list pages with filters and
|
||||||
`ids=x,y`.
|
pagination. A message for the page a redirect lands on rides its query string — `info-msg`,
|
||||||
|
`warn-msg`, `error-msg` — since a fragment never reaches the server. A cookie carries only what
|
||||||
|
must be bound to the browser: the session (`plainpages_jwt`) and the CSRF token (`plainpages_csrf`).
|
||||||
|
Do `ids=x&ids=y`, not `ids[]=x&ids[]=y` and not `ids=x,y`.
|
||||||
|
|
||||||
## Comments
|
## Comments
|
||||||
|
|
||||||
|
|||||||
@@ -961,6 +961,16 @@ underneath it — cramped, but nothing is unreachable. List state
|
|||||||
(`?q=…&status=…&sort=…&page=…`) lives **in the URL**, so a view is bookmarkable and shareable; the
|
(`?q=…&status=…&sort=…&page=…`) lives **in the URL**, so a view is bookmarkable and shareable; the
|
||||||
URL is the only state the UI keeps.
|
URL is the only state the UI keeps.
|
||||||
|
|
||||||
|
**A field whose options depend on another field is asked for in steps, one GET form each**, so every
|
||||||
|
choice is in the URL, and nothing typed is lost to one because nothing is typed until they are made.
|
||||||
|
Once the query names a value, that field renders read-only (`field` with `readonly`, and a `link` back
|
||||||
|
to the URL without it) above the next step's form, which carries the earlier choices as hidden inputs,
|
||||||
|
plus `locale` from `localeParam`. The form that writes comes last and posts to the URL naming every
|
||||||
|
choice, so its handler reads them from `ctx.query`, never from the body; a value the query names that
|
||||||
|
the step does not offer is that step's error, never a silent fallback. Don't redraw a half-filled form
|
||||||
|
through a submit that writes nothing instead: a `required` field blocks it, and the choice never
|
||||||
|
reaches the URL.
|
||||||
|
|
||||||
Plugins that genuinely need it — live dashboards, bulk actions, client-side validation — may **opt
|
Plugins that genuinely need it — live dashboards, bulk actions, client-side validation — may **opt
|
||||||
into progressive enhancement** (htmx, Alpine, vanilla JS) on top of working server-rendered HTML.
|
into progressive enhancement** (htmx, Alpine, vanilla JS) on top of working server-rendered HTML.
|
||||||
The baseline never depends on it.
|
The baseline never depends on it.
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ services:
|
|||||||
# Dev mail catcher — Kratos recovery/verification emails land here (web UI on 8025).
|
# Dev mail catcher — Kratos recovery/verification emails land here (web UI on 8025).
|
||||||
# kratos.yml points the courier at smtp://mailpit:1025; prod uses a real SMTP via env.
|
# kratos.yml points the courier at smtp://mailpit:1025; prod uses a real SMTP via env.
|
||||||
mailpit:
|
mailpit:
|
||||||
image: axllent/mailpit:v1.31.1
|
image: axllent/mailpit:v1.31.3
|
||||||
ports:
|
ports:
|
||||||
- "8025:8025"
|
- "8025:8025"
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|||||||
Generated
+12
-12
@@ -8,12 +8,12 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@larvit/log": "2.3.0",
|
"@larvit/log": "2.3.0",
|
||||||
"ejs": "6.0.1",
|
"ejs": "6.0.1",
|
||||||
"lucide-static": "1.39.0",
|
"lucide-static": "1.49.0",
|
||||||
"postgres": "3.4.9"
|
"postgres": "3.4.9"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/ejs": "3.1.5",
|
"@types/ejs": "3.1.5",
|
||||||
"@types/node": "24.13.4",
|
"@types/node": "24.19.0",
|
||||||
"typescript": "7.0.2"
|
"typescript": "7.0.2"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -37,13 +37,13 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "24.13.4",
|
"version": "24.19.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.4.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.19.0.tgz",
|
||||||
"integrity": "sha512-YJ7EqCstVTzIr0fMr7qul/977en+pQHrfmuKIo6Zr9i75Be21dr3MovcfvGtyvi2HAUrRerWps5sMO9I7WaxDw==",
|
"integrity": "sha512-zY+5tKxXdhGh1PYI0ac+7juvEu4OI6vWtVVoj5i2m42jxAY1U+zHGt6QCyOFwykdP62sM3MJ9stoYYUw5aCWew==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"undici-types": "~7.18.0"
|
"undici-types": ">=7.24.0 <7.24.7"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript/typescript-aix-ppc64": {
|
"node_modules/@typescript/typescript-aix-ppc64": {
|
||||||
@@ -399,9 +399,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/lucide-static": {
|
"node_modules/lucide-static": {
|
||||||
"version": "1.39.0",
|
"version": "1.49.0",
|
||||||
"resolved": "https://registry.npmjs.org/lucide-static/-/lucide-static-1.39.0.tgz",
|
"resolved": "https://registry.npmjs.org/lucide-static/-/lucide-static-1.49.0.tgz",
|
||||||
"integrity": "sha512-TaDiwNFZ78c+HrZRNWHoR+LVkIOL8ebYOyNYvytdPkaLWE29G9umks6p1aeCE8kSEIoifnlNLPxMvvE3zqT/YA==",
|
"integrity": "sha512-gSjtl7bR2v26oDInh2Wua1PrF2BRRXl9inhnLWcFfnRqRShmgZvlFRisPHqTfU7kxsuZU8ThNjAFotbInrzKow==",
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
"node_modules/postgres": {
|
"node_modules/postgres": {
|
||||||
@@ -453,9 +453,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/undici-types": {
|
"node_modules/undici-types": {
|
||||||
"version": "7.18.2",
|
"version": "7.24.6",
|
||||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
|
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz",
|
||||||
"integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
|
"integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -18,12 +18,12 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@larvit/log": "2.3.0",
|
"@larvit/log": "2.3.0",
|
||||||
"ejs": "6.0.1",
|
"ejs": "6.0.1",
|
||||||
"lucide-static": "1.39.0",
|
"lucide-static": "1.49.0",
|
||||||
"postgres": "3.4.9"
|
"postgres": "3.4.9"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/ejs": "3.1.5",
|
"@types/ejs": "3.1.5",
|
||||||
"@types/node": "24.13.4",
|
"@types/node": "24.19.0",
|
||||||
"typescript": "7.0.2"
|
"typescript": "7.0.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ services:
|
|||||||
|
|
||||||
# Catches Kratos' recovery/verification emails — UI on http://localhost:8025
|
# Catches Kratos' recovery/verification emails — UI on http://localhost:8025
|
||||||
mailpit:
|
mailpit:
|
||||||
image: axllent/mailpit:v1.31.1
|
image: axllent/mailpit:v1.31.3
|
||||||
ports:
|
ports:
|
||||||
- "8025:8025"
|
- "8025:8025"
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|||||||
Reference in New Issue
Block a user