@protobase/ui 0.63.4 → 0.64.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.
Files changed (300) hide show
  1. package/dist/account/change-email-dialog.js +1 -1
  2. package/dist/account/devices-section.js +12 -6
  3. package/dist/account/messages.js +2 -333
  4. package/dist/account/passkeys-section.js +3 -3
  5. package/dist/account/password-change-dialog.js +3 -3
  6. package/dist/account/sign-in-policy-form.js +6 -3
  7. package/dist/account/sign-in-providers-section.js +1 -1
  8. package/dist/account/staff-sign-in-log.js +5 -5
  9. package/dist/action-card/messages.js +2 -5
  10. package/dist/activity-chart/activity-chart.js +5 -7
  11. package/dist/activity-chart/activity-tooltip.js +1 -1
  12. package/dist/activity-chart/messages.js +2 -11
  13. package/dist/app/app.js +2 -3
  14. package/dist/app/batch-failure.js +5 -1
  15. package/dist/app/change-confirm/messages.js +2 -13
  16. package/dist/app/change-confirm/use-change-confirm.js +15 -18
  17. package/dist/app/charts/chart-groups.js +3 -1
  18. package/dist/app/charts/chart-view.js +1 -1
  19. package/dist/app/charts/group-bars.js +1 -1
  20. package/dist/app/charts/messages.js +2 -23
  21. package/dist/app/charts/period-chart.js +1 -1
  22. package/dist/app/comments/comment-composer.js +1 -1
  23. package/dist/app/comments/comments-section.js +2 -2
  24. package/dist/app/comments/messages.js +2 -19
  25. package/dist/app/confirm-sign-in-messages.js +2 -19
  26. package/dist/app/confirm-sign-in.js +1 -1
  27. package/dist/app/create/create-page.js +3 -3
  28. package/dist/app/create/create-record-form.js +3 -3
  29. package/dist/app/create/create-route.js +1 -1
  30. package/dist/app/create/messages.js +2 -29
  31. package/dist/app/custom-section.js +2 -3
  32. package/dist/app/delete/blocked-delete.js +5 -2
  33. package/dist/app/delete/dialogs.js +21 -8
  34. package/dist/app/delete/messages.js +2 -63
  35. package/dist/app/delete/use-delete-flow.js +6 -5
  36. package/dist/app/displays/board-column.js +2 -2
  37. package/dist/app/displays/board-columns.js +1 -1
  38. package/dist/app/displays/board-display.js +21 -9
  39. package/dist/app/displays/calendar-display.js +16 -7
  40. package/dist/app/displays/cards-display.js +2 -2
  41. package/dist/app/displays/custom-display.js +1 -2
  42. package/dist/app/displays/list-cards.js +2 -2
  43. package/dist/app/displays/map-display.js +19 -6
  44. package/dist/app/displays/messages.js +2 -147
  45. package/dist/app/displays/period-controls.js +2 -2
  46. package/dist/app/displays/timeline-display.js +16 -7
  47. package/dist/app/displays/timeline-range.js +1 -1
  48. package/dist/app/displays/use-board-move.js +4 -4
  49. package/dist/app/displays/use-calendar-move.js +2 -2
  50. package/dist/app/document-title.js +1 -1
  51. package/dist/app/embedded-list/cut-off-note.js +7 -1
  52. package/dist/app/embedded-list/embedded-list.js +1 -1
  53. package/dist/app/embedded-list/embedded-row-targets.js +3 -3
  54. package/dist/app/embedded-list/messages.js +2 -21
  55. package/dist/app/export/builder-port.js +1 -1
  56. package/dist/app/export/export-dialog.js +14 -8
  57. package/dist/app/export/messages.js +2 -75
  58. package/dist/app/export/use-export-flow.js +9 -3
  59. package/dist/app/field-editor.js +3 -3
  60. package/dist/app/field-errors.js +18 -7
  61. package/dist/app/field-messages.js +2 -45
  62. package/dist/app/field-types/members/messages.js +2 -15
  63. package/dist/app/field-types/messages.js +2 -5
  64. package/dist/app/field-types/widget-part.js +1 -1
  65. package/dist/app/file-field.js +3 -3
  66. package/dist/app/gallery/gallery-section.js +6 -3
  67. package/dist/app/gallery/messages.js +2 -27
  68. package/dist/app/gallery/photo-details.js +3 -3
  69. package/dist/app/hand-order/hand-sorted-list.js +2 -3
  70. package/dist/app/hand-order/messages.js +2 -29
  71. package/dist/app/hand-order/use-hand-order.js +2 -2
  72. package/dist/app/history/describe-change.js +1 -1
  73. package/dist/app/history/history-section.js +1 -1
  74. package/dist/app/history/messages.js +2 -29
  75. package/dist/app/import/convert.js +19 -10
  76. package/dist/app/import/import-check-step.js +5 -5
  77. package/dist/app/import/import-dialog.js +5 -2
  78. package/dist/app/import/import-file-step.js +1 -1
  79. package/dist/app/import/import-mapping-step.js +3 -3
  80. package/dist/app/import/messages.js +2 -197
  81. package/dist/app/import/prepare-rows.js +11 -4
  82. package/dist/app/import/sheet-cell.js +1 -1
  83. package/dist/app/import/xlsx-reader.js +2 -2
  84. package/dist/app/import/zip-reader.js +4 -1
  85. package/dist/app/incoming-card.js +1 -1
  86. package/dist/app/list-actions/use-list-actions.js +4 -1
  87. package/dist/app/list-edit/messages.js +2 -11
  88. package/dist/app/list-edit/use-list-edits.js +1 -1
  89. package/dist/app/list-empty-state.js +7 -4
  90. package/dist/app/list-group-chart.js +1 -1
  91. package/dist/app/list-messages.js +2 -53
  92. package/dist/app/list-page.js +9 -9
  93. package/dist/app/live-update/messages.js +2 -11
  94. package/dist/app/map/messages.js +2 -11
  95. package/dist/app/messages.js +2 -139
  96. package/dist/app/meta-gate-messages.js +2 -13
  97. package/dist/app/nav-from-meta.js +2 -2
  98. package/dist/app/new-version/messages.js +2 -21
  99. package/dist/app/new-version/new-version-banner.js +1 -2
  100. package/dist/app/new-version/new-version-toast.js +1 -1
  101. package/dist/app/pages/action-inputs/action-inputs-dialog.js +1 -1
  102. package/dist/app/pages/action-inputs/input-answers.js +1 -1
  103. package/dist/app/pages/blocks/field.js +1 -1
  104. package/dist/app/pages/blocks/modal-form.js +3 -3
  105. package/dist/app/pages/blocks/settings.js +3 -3
  106. package/dist/app/pages/blocks/tabs.js +1 -1
  107. package/dist/app/pages/composed-page.js +1 -2
  108. package/dist/app/pages/custom-boundary.js +1 -2
  109. package/dist/app/pages/messages.js +2 -79
  110. package/dist/app/pages/record-actions.js +1 -1
  111. package/dist/app/pages/render-node.js +2 -3
  112. package/dist/app/pages/use-run-action.js +15 -7
  113. package/dist/app/picker/picker-combobox.js +1 -1
  114. package/dist/app/rank-after/dependency-rule.js +8 -2
  115. package/dist/app/rank-after/messages.js +2 -5
  116. package/dist/app/rank-after/ranked-place.js +7 -1
  117. package/dist/app/record-chart/messages.js +2 -25
  118. package/dist/app/record-chart/record-chart-section.js +2 -2
  119. package/dist/app/record-lines-cell.js +4 -1
  120. package/dist/app/record-lines.js +5 -5
  121. package/dist/app/record-messages.js +2 -83
  122. package/dist/app/record-page.js +8 -8
  123. package/dist/app/record-row/messages.js +2 -23
  124. package/dist/app/record-row/record-row-body.js +2 -2
  125. package/dist/app/record-row/record-row.js +3 -3
  126. package/dist/app/record-row/saved-record-row.js +3 -3
  127. package/dist/app/related-cards/messages.js +2 -15
  128. package/dist/app/related-cards/related-card.js +1 -1
  129. package/dist/app/related-cards/related-cards.js +1 -1
  130. package/dist/app/related-dots/dots-summary.js +1 -1
  131. package/dist/app/related-dots/messages.js +2 -5
  132. package/dist/app/related-dots/related-dots.js +2 -3
  133. package/dist/app/related-section.js +1 -1
  134. package/dist/app/relation-picker.js +1 -1
  135. package/dist/app/runtime/messages.js +2 -55
  136. package/dist/app/runtime/runtime-status.js +12 -3
  137. package/dist/app/saved/messages.js +2 -19
  138. package/dist/app/saved/saved-list.js +3 -3
  139. package/dist/app/search/messages.js +2 -19
  140. package/dist/app/search/navigation-hits.js +1 -1
  141. package/dist/app/search/search-model.js +9 -3
  142. package/dist/app/searches/messages.js +2 -93
  143. package/dist/app/searches/save-search-button.js +3 -3
  144. package/dist/app/searches/saved-search-rows.js +3 -3
  145. package/dist/app/searches/saved-search-section.js +4 -4
  146. package/dist/app/searches/saved-searches.js +14 -12
  147. package/dist/app/searches/search-controls.js +2 -2
  148. package/dist/app/searches/search-diff.js +8 -2
  149. package/dist/app/searches/update-search-dialog.js +10 -4
  150. package/dist/app/searches/use-save-search.js +2 -2
  151. package/dist/app/searches/use-search-row.js +2 -2
  152. package/dist/app/sensitive-field.js +3 -3
  153. package/dist/app/source-notice.js +3 -3
  154. package/dist/app/staff-banner.js +12 -8
  155. package/dist/app/use-live-save.js +2 -2
  156. package/dist/app/value-badge.js +3 -4
  157. package/dist/app-shell/global-search.js +2 -2
  158. package/dist/app-shell/messages.js +2 -63
  159. package/dist/app-shell/profile-menu.js +2 -2
  160. package/dist/app-shell/sidebar-group.js +2 -2
  161. package/dist/app-shell/sidebar.js +1 -2
  162. package/dist/app-shell/top-bar.js +1 -1
  163. package/dist/assistant-dock/messages.js +2 -23
  164. package/dist/auth/auth-gate.js +1 -1
  165. package/dist/auth/auth-messages.js +9 -88
  166. package/dist/auth/email-code-form.js +2 -3
  167. package/dist/auth/forgot-password-form.js +3 -4
  168. package/dist/auth/messages.js +2 -203
  169. package/dist/auth/provider-sign-in-page.js +3 -3
  170. package/dist/auth/resend-code-button.js +1 -1
  171. package/dist/auth/reset-password-form.js +1 -1
  172. package/dist/auth/reset-password-page.js +1 -1
  173. package/dist/auth/sign-in-form.js +3 -3
  174. package/dist/auth/sign-up-code-form.js +2 -3
  175. package/dist/auth/sign-up-details-form.js +3 -4
  176. package/dist/auth/staff-sign-in-form.js +3 -3
  177. package/dist/calls/call-guests-panel.js +2 -2
  178. package/dist/calls/call-lobby-notice.js +1 -1
  179. package/dist/calls/call-mark.js +1 -1
  180. package/dist/calls/call-people.js +1 -1
  181. package/dist/calls/call-rings.js +1 -1
  182. package/dist/calls/call-tile.js +2 -2
  183. package/dist/calls/messages.js +2 -139
  184. package/dist/carousel/carousel-controls.js +4 -1
  185. package/dist/carousel/messages.js +2 -13
  186. package/dist/chat/chat-message.js +1 -1
  187. package/dist/chat/messages.js +2 -19
  188. package/dist/compact-table/compact-table.js +1 -1
  189. package/dist/compact-table/messages.js +2 -15
  190. package/dist/data-grid/cell-text.js +8 -7
  191. package/dist/data-grid/cells.js +9 -6
  192. package/dist/data-grid/grid-footer.js +1 -1
  193. package/dist/data-grid/grid-row.js +2 -2
  194. package/dist/data-grid/header-menu.js +1 -1
  195. package/dist/data-grid/messages.js +2 -49
  196. package/dist/data-grid/resize-handle.js +1 -1
  197. package/dist/data-grid/row-reorder.js +20 -5
  198. package/dist/filter-panel/active-filter-chips.js +1 -1
  199. package/dist/filter-panel/date-presets.js +2 -2
  200. package/dist/filter-panel/facet-combobox.js +1 -1
  201. package/dist/filter-panel/facet-group.js +1 -1
  202. package/dist/filter-panel/messages.js +2 -49
  203. package/dist/filter-panel/range-filter.js +1 -1
  204. package/dist/format/date.js +4 -4
  205. package/dist/format/messages.js +2 -21
  206. package/dist/format/money.js +1 -1
  207. package/dist/format/number.js +5 -2
  208. package/dist/forms/messages.js +2 -21
  209. package/dist/forms/public-form-page.js +1 -1
  210. package/dist/index.js +3 -3
  211. package/dist/inline-child-table/inline-child-table.js +19 -4
  212. package/dist/inline-child-table/line-row.js +2 -2
  213. package/dist/inline-child-table/messages.js +2 -51
  214. package/dist/invitations/link-notice.js +2 -3
  215. package/dist/invitations/messages.js +2 -21
  216. package/dist/invitations/pending-invitation-row.js +1 -1
  217. package/dist/lists/messages.js +2 -5
  218. package/dist/live/columns-from-model.js +14 -31
  219. package/dist/live/display-value.js +1 -1
  220. package/dist/live/messages.js +2 -15
  221. package/dist/live/value-color.js +13 -3
  222. package/dist/live/view-fields.js +4 -2
  223. package/dist/locale/en.js +1399 -0
  224. package/dist/locale/messages.js +38 -7
  225. package/dist/locale/nl.js +1399 -0
  226. package/dist/markdown/messages.js +2 -13
  227. package/dist/mentions/messages.js +2 -13
  228. package/dist/notifications/bell/messages.js +2 -35
  229. package/dist/notifications/bell/notification-item.js +1 -1
  230. package/dist/notifications/bell/unread-label.js +1 -1
  231. package/dist/organizations/invitation-page.js +32 -14
  232. package/dist/organizations/invitations-page.js +1 -1
  233. package/dist/organizations/members-page.js +2 -2
  234. package/dist/organizations/messages.js +2 -187
  235. package/dist/organizations/organization-page.js +4 -4
  236. package/dist/organizations/organizations-page.js +1 -1
  237. package/dist/package.js +1 -1
  238. package/dist/plugins/load-plugin.js +2 -2
  239. package/dist/plugins/messages.js +2 -33
  240. package/dist/plugins/plugin-notice.js +7 -5
  241. package/dist/primitives/badge.d.ts +2 -1
  242. package/dist/primitives/dialog.d.ts +7 -2
  243. package/dist/primitives/dialog.js +9 -4
  244. package/dist/primitives/messages.js +2 -13
  245. package/dist/primitives/token.js +1 -1
  246. package/dist/record-view/field.js +3 -3
  247. package/dist/record-view/messages.js +2 -37
  248. package/dist/record-view/record-header.js +4 -4
  249. package/dist/roles/messages.js +2 -11
  250. package/dist/shell/assets/app-CN_7en9q.js +8 -0
  251. package/dist/shell/assets/{calls-BIXaKTs0.js → calls-D5RK7EJu.js} +2 -2
  252. package/dist/shell/assets/export-worker-ClXdfeuq.js +15 -0
  253. package/dist/shell/assets/{index-BshKxX1Z.js → index-DMaCBpbN.js} +2 -2
  254. package/dist/shell/assets/index-Or2wt-ck.css +2 -0
  255. package/dist/shell/assets/{maplibre-CjNYwEqW.js → maplibre-CRmpQfDl.js} +3 -3
  256. package/dist/shell/assets/parse-worker-DxsmAjef.js +18 -0
  257. package/dist/shell/assets/preload-helper-BgLOXTzV.js +2 -0
  258. package/dist/shell/assets/{record-map-DjqQGqZ2.js → record-map-DsP4sXes.js} +2 -2
  259. package/dist/shell/assets/{records-map-D1SJKyvj.js → records-map-WFMHgKdf.js} +2 -2
  260. package/dist/shell/assets/shared-protobase-ui-CP2mMFbh.js +2 -0
  261. package/dist/shell/assets/vendor-Kvdo8Jrw.js +73 -0
  262. package/dist/shell/index.html +6 -6
  263. package/dist/shell/protobase.shell.json +2 -2
  264. package/dist/shell/protobase.sw.js +2 -2
  265. package/dist/shell-source-maps/assets/app-CN_7en9q.js.map +1 -0
  266. package/dist/shell-source-maps/assets/{calls-BIXaKTs0.js.map → calls-D5RK7EJu.js.map} +1 -1
  267. package/dist/shell-source-maps/assets/export-worker-ClXdfeuq.js.map +1 -0
  268. package/dist/shell-source-maps/assets/{index-BshKxX1Z.js.map → index-DMaCBpbN.js.map} +1 -1
  269. package/dist/shell-source-maps/assets/{maplibre-CjNYwEqW.js.map → maplibre-CRmpQfDl.js.map} +1 -1
  270. package/dist/shell-source-maps/assets/parse-worker-DxsmAjef.js.map +1 -0
  271. package/dist/shell-source-maps/assets/preload-helper-BgLOXTzV.js.map +1 -0
  272. package/dist/shell-source-maps/assets/{record-map-DjqQGqZ2.js.map → record-map-DsP4sXes.js.map} +1 -1
  273. package/dist/shell-source-maps/assets/{records-map-D1SJKyvj.js.map → records-map-WFMHgKdf.js.map} +1 -1
  274. package/dist/shell-source-maps/assets/shared-protobase-ui-CP2mMFbh.js.map +1 -0
  275. package/dist/shell-source-maps/assets/vendor-Kvdo8Jrw.js.map +1 -0
  276. package/dist/side-panel/messages.js +2 -5
  277. package/dist/status/messages.js +2 -59
  278. package/dist/status/status-dialog.js +1 -1
  279. package/dist/toasts/messages.js +2 -5
  280. package/dist/users/create-user-form.js +1 -1
  281. package/dist/users/messages.js +2 -49
  282. package/package.json +5 -4
  283. package/dist/app-shell/nav.js +0 -85
  284. package/dist/locale/slotted.js +0 -14
  285. package/dist/mocks/activity.js +0 -24
  286. package/dist/mocks/rng.js +0 -20
  287. package/dist/mocks/users.js +0 -63
  288. package/dist/shell/assets/app-CBYlZ19-.js +0 -9
  289. package/dist/shell/assets/export-worker-3e4Zsv0a.js +0 -3
  290. package/dist/shell/assets/index-BvT0X9o1.css +0 -2
  291. package/dist/shell/assets/parse-worker-UhbwEjS0.js +0 -6
  292. package/dist/shell/assets/preload-helper-SYSsmQ2O.js +0 -2
  293. package/dist/shell/assets/shared-protobase-ui-DibYt-TM.js +0 -2
  294. package/dist/shell/assets/vendor-xNCj9Gc_.js +0 -63
  295. package/dist/shell-source-maps/assets/app-CBYlZ19-.js.map +0 -1
  296. package/dist/shell-source-maps/assets/export-worker-3e4Zsv0a.js.map +0 -1
  297. package/dist/shell-source-maps/assets/parse-worker-UhbwEjS0.js.map +0 -1
  298. package/dist/shell-source-maps/assets/preload-helper-SYSsmQ2O.js.map +0 -1
  299. package/dist/shell-source-maps/assets/shared-protobase-ui-DibYt-TM.js.map +0 -1
  300. package/dist/shell-source-maps/assets/vendor-xNCj9Gc_.js.map +0 -1
@@ -64,7 +64,7 @@ const ChangeEmailDialog = ({ email, change, onDone, onClose }) => {
64
64
  });
65
65
  return /* @__PURE__ */ jsxs(Dialog, {
66
66
  title: text("changeEmail"),
67
- description: text("codeSentTo", sentTo),
67
+ description: text("codeSentTo", { email: sentTo }),
68
68
  onClose,
69
69
  actions: /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Button, {
70
70
  variant: "ghost",
@@ -1,8 +1,8 @@
1
1
  import { text } from "./messages.js";
2
2
  import { Button } from "../primitives/button.js";
3
3
  import { Dialog } from "../primitives/dialog.js";
4
- import { formatDateTime } from "../format/date.js";
5
4
  import { Badge } from "../primitives/badge.js";
5
+ import { formatDateTime } from "../format/date.js";
6
6
  import { AccountSection, SectionError } from "./account-section.js";
7
7
  import { authMessage } from "../auth/auth-messages.js";
8
8
  import { deviceOf } from "./device-name.js";
@@ -12,10 +12,13 @@ import { AuthError } from "@protobase/client";
12
12
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
13
13
  //#region src/account/devices-section.tsx
14
14
  const nameOf = (session, operator) => {
15
- if (session.staff) return operator ? text("staffOf", operator) : text("staff");
15
+ if (session.staff) return operator ? text("staffOf", { operator }) : text("staff");
16
16
  const { browser, system } = deviceOf(session.userAgent);
17
- if (browser && system) return text("browserOn", browser, system);
18
- if (system) return text("aBrowserOn", system);
17
+ if (browser && system) return text("browserOn", {
18
+ browser,
19
+ system
20
+ });
21
+ if (system) return text("aBrowserOn", { system });
19
22
  return browser ?? text("unknownDevice");
20
23
  };
21
24
  const iconOf = (session) => {
@@ -76,7 +79,10 @@ const DevicesSection = ({ sessions, operator, onSignOut, onSignOutOthers }) => {
76
79
  })]
77
80
  }), /* @__PURE__ */ jsxs("span", {
78
81
  className: "block text-xs text-muted-foreground",
79
- children: [text("signedInFromUntil", formatDateTime(Date.parse(session.createdAt)), formatDateTime(Date.parse(session.expiresAt))), !session.staff && session.ipAddress && ` · ${session.ipAddress}`]
82
+ children: [text("signedInFromUntil", {
83
+ from: formatDateTime(Date.parse(session.createdAt)),
84
+ until: formatDateTime(Date.parse(session.expiresAt))
85
+ }), !session.staff && session.ipAddress && ` · ${session.ipAddress}`]
80
86
  })]
81
87
  }),
82
88
  !session.current && /* @__PURE__ */ jsx(Button, {
@@ -98,7 +104,7 @@ const DevicesSection = ({ sessions, operator, onSignOut, onSignOutOthers }) => {
98
104
  children: text("signOutOthers")
99
105
  }),
100
106
  confirming && /* @__PURE__ */ jsx(Dialog, {
101
- title: confirming.kind === "one" ? text("signOutDevice", nameOf(confirming.session, operator)) : text("signOutOthersTitle"),
107
+ title: confirming.kind === "one" ? text("signOutDevice", { name: nameOf(confirming.session, operator) }) : text("signOutOthersTitle"),
102
108
  description: confirming.kind === "one" ? text("signOutDeviceDescription") : text("signOutOthersDescription"),
103
109
  onClose: () => setConfirming(void 0),
104
110
  actions: /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Button, {
@@ -1,336 +1,5 @@
1
- import { defineMessages } from "../locale/messages.js";
1
+ import { messages } from "../locale/messages.js";
2
2
  //#region src/account/messages.ts
3
- const text = defineMessages({
4
- en: {
5
- account: "Account",
6
- noAccount: "No account page",
7
- noAccountDescription: "This app has no account page for you.",
8
- signInPolicy: "Sign-in policy",
9
- couldNotReadMethods: "Could not read your sign-in methods",
10
- couldNotReadProfile: "Could not read your profile",
11
- profile: "Profile",
12
- profileDescription: "Your name as others see it in this app, and the address you sign in with.",
13
- email: "Email",
14
- changeName: "Change name",
15
- changeNameDescription: "The name others see on your comments, changes and invitations.",
16
- changeEmail: "Change email",
17
- changeEmailDescription: "We email a code to the new address. Once you enter it here, you sign in with that address.",
18
- newEmail: "New email",
19
- sendCode: "Send code",
20
- codeSentTo: (email) => `Enter the 6-digit code we emailed to ${email}. It works for 5 minutes. No code comes when another account has the address.`,
21
- code: "Code",
22
- otherAddress: "Use another address",
23
- theProvider: "the provider",
24
- loading: "Loading",
25
- backupCodes: "Backup codes",
26
- copied: "Copied",
27
- copy: "Copy",
28
- download: "Download",
29
- cancel: "Cancel",
30
- save: "Save",
31
- name: "Name",
32
- yourPassword: "Your password",
33
- passwordIsSet: "Sign in with your email address and this password. Changing it asks for the current one.",
34
- passwordNotSet: "You sign in without a password now. Set one to sign in with your email address and a password too; you stay signed in everywhere.",
35
- passwordForbidden: "Your admin turned passwords off for this app, so they cannot be used to sign in.",
36
- passwordStaff: "Staff signed in as someone cannot change their password.",
37
- passwordSaved: "Your password is saved.",
38
- changePassword: "Change password",
39
- setPassword: "Set a password",
40
- currentPassword: "Current password",
41
- newPassword: "New password",
42
- repeatPassword: "Repeat new password",
43
- atLeast: (length) => `At least ${length} characters.`,
44
- useAtLeast: (length) => `Use at least ${length} characters.`,
45
- passwordTooLong: "That password is too long.",
46
- passwordsDiffer: "The passwords are not the same.",
47
- continue: "Continue",
48
- on: "On",
49
- off: "Off",
50
- optional: "Optional",
51
- required: "Required",
52
- passkeys: "Passkeys",
53
- passkey: "Passkey",
54
- passkeysAllowed: "Sign in with Face ID, Touch ID, Windows Hello, your phone or a security key instead of a password.",
55
- passkeysRequired: "This app requires a passkey for every account. Sign in with Face ID, Touch ID, Windows Hello, your phone or a security key.",
56
- passkeysForbidden: "Your admin turned passkeys off for this app, so they cannot be used to sign in.",
57
- addedOn: (date) => `Added ${date}`,
58
- addedEarlier: "Added earlier",
59
- synced: "Synced across your devices",
60
- oneDevice: "On one device",
61
- rename: "Rename",
62
- remove: "Remove",
63
- keepLastPasskey: "Passkeys are required: add another one before removing this one.",
64
- addPasskey: "Add a passkey",
65
- renamePasskey: "Rename passkey",
66
- renamePasskeyDescription: "A name that tells you where this passkey lives, such as the device or password manager.",
67
- removePasskey: "Remove passkey?",
68
- removePasskeyDescription: (name) => `${name} will no longer sign you in here. It stays on the device until you delete it there.`,
69
- thisPasskey: "This passkey",
70
- connectedAccounts: "Connected accounts",
71
- connectedAccountsDescription: "Sign in with these instead of your password. Connecting one asks you to sign in there; its address may differ from yours here.",
72
- connected: "Connected",
73
- connect: (name) => `Connect ${name}`,
74
- mailbox: "Mailbox",
75
- mailboxDescription: "Mail this app sends for you goes out from your own mailbox. Connecting one asks you to sign in there and allow sending mail; it cannot read your mail.",
76
- stopped: (time) => `Stopped ${time}`,
77
- ended: (time) => `Ended ${time}`,
78
- signedInUntil: (time) => `Signed in until ${time}`,
79
- devices: "Devices",
80
- devicesDescription: "The browsers and apps signed in to your account. To sign out this one, use Sign out in the menu.",
81
- couldNotReadDevices: "Could not read your devices",
82
- noDevices: "No device is signed in.",
83
- thisDevice: "This device",
84
- browserOn: (browser, system) => `${browser} on ${system}`,
85
- aBrowserOn: (system) => `A browser on ${system}`,
86
- unknownDevice: "Unknown device",
87
- staffOf: (operator) => `${operator} staff`,
88
- staff: "Staff",
89
- signedInFromUntil: (from, until) => `Signed in ${from}, until ${until}`,
90
- signOut: "Sign out",
91
- signOutDevice: (name) => `Sign out ${name}?`,
92
- signOutDeviceDescription: "It has to sign in again to use your account.",
93
- signOutOthers: "Sign out of all other devices",
94
- signOutOthersTitle: "Sign out of all other devices?",
95
- signOutOthersDescription: "Every other browser and app signed in to your account has to sign in again. This device stays signed in.",
96
- staffSignIns: "Staff sign-ins",
97
- staffSignInsDescription: (operator) => `Each time staff of ${operator} signed in as someone here, newest first.`,
98
- noStaffSignIns: "No staff has signed in as anyone yet.",
99
- as: "as",
100
- qrCode: "QR code for your authenticator app",
101
- twoFactor: "Two-factor authentication",
102
- twoFactorAllowed: "Ask for a second step after your password or an emailed sign-in code: a code from an authenticator app, or one emailed to you. A passkey needs no second step.",
103
- twoFactorRequired: "This app requires two-factor authentication for every account. Turn it on to keep using the app.",
104
- twoFactorForbidden: "Your admin turned two-factor authentication off for this app.",
105
- twoFactorOnWithApp: "Signing in with a password or an emailed sign-in code also asks for a code from your authenticator app. Backup codes work when you do not have the app.",
106
- twoFactorOnWithAppOrMail: "Signing in with a password or an emailed sign-in code also asks for a code from your authenticator app, or one emailed to you. Backup codes work when you do not have the app.",
107
- twoFactorOnWithMail: "Signing in with a password or an emailed sign-in code also asks for a code emailed to you.",
108
- turnOn: "Turn on",
109
- turnOff: "Turn off",
110
- addAuthenticator: "Add an authenticator app",
111
- newBackupCodes: "New backup codes",
112
- twoFactorIsRequired: "This app requires two-factor authentication.",
113
- turnOffTitle: "Turn off two-factor authentication?",
114
- turnOffDescription: "Signing in then needs only your password or an emailed code. Your backup codes stop working.",
115
- newCodesTitle: "Make new backup codes?",
116
- newCodesDescription: "Your current backup codes stop working, and you get ten new ones.",
117
- makeNewCodes: "Make new codes",
118
- yourNewCodes: "Your new backup codes",
119
- keepCodesSafe: "Keep them somewhere safe: each one signs you in once if you lose your phone. They are not shown again.",
120
- savedCodes: "I saved my backup codes",
121
- authenticatorApp: "Authenticator app",
122
- authenticatorAppDescription: "A code from an app such as Google Authenticator, Microsoft Authenticator or 1Password. Comes with backup codes.",
123
- emailedCode: "Emailed code",
124
- emailedCodeDescription: "A code mailed to your address each time you sign in with a password or an emailed sign-in code.",
125
- twoFactorIsOn: "Two-factor authentication is on. Keep these backup codes somewhere safe: each one signs you in once if you lose your phone. They are not shown again.",
126
- scanCode: "Scan this code with your authenticator app, then enter the 6-digit code it shows.",
127
- cannotScan: "Can't scan it? Enter this key in the app:",
128
- codeFromApp: "Code from the app",
129
- secondStep: "Second step",
130
- password: "Password",
131
- passwordDescription: "Sign in with the email address and a password.",
132
- emailedSignInCode: "Emailed sign-in code",
133
- emailedSignInCodeDescription: "Sign in with a one-time code mailed to the account's address.",
134
- passkeysPolicyDescription: "Sign in with Face ID, Touch ID, Windows Hello, a phone or a security key. Required: everyone adds one after signing in.",
135
- twoFactorPolicyDescription: "A code from an authenticator app, or an emailed one, after a password or an emailed sign-in code. Required: everyone turns it on after signing in.",
136
- staffAccess: "Staff sign-in as a person",
137
- staffAccessDescription: "The team that runs this app signs in as someone to help them, with a reason, for a short session. Each time is in the log below; with \"Email the person\" they are told too.",
138
- emailThePerson: "Email the person",
139
- platformSignIn: "Sign-in through the platform",
140
- platformSignInDescription: "The sign-in provider the platform that runs this app adds, for people who have an account here already. It never creates accounts.",
141
- platformSignInWith: (provider) => `Sign in with ${provider} through the platform`,
142
- codeNeedsMail: "Needs mail settings (PROTOBASE_SMTP_URL and PROTOBASE_MAIL_FROM): off until they are set.",
143
- passwordStaysOn: "Without mail settings, password sign-in stays on so nobody is locked out.",
144
- staffNeedsMail: "Needs mail settings (PROTOBASE_SMTP_URL and PROTOBASE_MAIL_FROM): staff cannot sign in until they are set.",
145
- platformOff: "Off while passkeys or two-factor authentication are required: it skips the second step.",
146
- appliesAs: (rule) => `Applies as ${rule} for now.`,
147
- lastSaved: (time) => `Last saved on ${time}.`,
148
- lastSavedBy: (name, time) => `Last saved by ${name} on ${time}.`,
149
- neverChanged: "Never changed: this is the app's default.",
150
- reset: "Reset",
151
- couldNotReadStaffSignIns: "Could not read the staff sign-ins",
152
- couldNotReadPolicy: "Could not read the sign-in policy",
153
- policySaved: "Saved. It applies to every sign-in from now on.",
154
- policySubtitle: "How people sign in to this app. Signed-in people keep their session, and are asked for what is newly required within 15 minutes.",
155
- mcpAddress: "MCP address",
156
- mcpAddressDescription: "Add this address to an AI assistant or code editor that speaks MCP, as a custom connector or remote MCP server. It opens this app in your browser, where you sign in and allow it; it then works with your access.",
157
- copyMcpAddress: "Copy the MCP address",
158
- addToClaude: "Add to Claude",
159
- deleteAccount: "Delete account",
160
- deleteAccountDescription: "Delete your account and sign out everywhere. You can no longer sign in with it, and this cannot be undone.",
161
- deleteAccountStaff: "Staff signed in as someone cannot delete their account.",
162
- deleteAccountQuestion: "Delete your account?",
163
- deleteAccountWarning: "Your account, its sign-in methods and every device signed in to it are deleted. This cannot be undone.",
164
- deleteAccountPassword: "Enter your password to confirm.",
165
- deleteAccountConfirm: "Delete my account",
166
- deleteAccountLastAdmin: "You are the last admin of this app. Make someone else an admin first.",
167
- deleteAccountLocked: "This account is locked, so it cannot be deleted."
168
- },
169
- nl: {
170
- account: "Account",
171
- noAccount: "Geen accountpagina",
172
- noAccountDescription: "Deze app heeft geen accountpagina voor je.",
173
- signInPolicy: "Inlogbeleid",
174
- couldNotReadMethods: "Kon je inlogmethoden niet lezen",
175
- couldNotReadProfile: "Kon je profiel niet lezen",
176
- profile: "Profiel",
177
- profileDescription: "Je naam zoals anderen die in deze app zien, en het adres waarmee je inlogt.",
178
- email: "E-mail",
179
- changeName: "Naam wijzigen",
180
- changeNameDescription: "De naam die anderen zien bij je opmerkingen, wijzigingen en uitnodigingen.",
181
- changeEmail: "E-mailadres wijzigen",
182
- changeEmailDescription: "We mailen een code naar het nieuwe adres. Zodra je die hier invult, log je in met dat adres.",
183
- newEmail: "Nieuw e-mailadres",
184
- sendCode: "Code versturen",
185
- codeSentTo: (email) => `Vul de code van 6 cijfers in die we naar ${email} mailden. Die werkt 5 minuten. Heeft een ander account het adres, dan komt er geen code.`,
186
- code: "Code",
187
- otherAddress: "Ander adres gebruiken",
188
- theProvider: "de provider",
189
- loading: "Laden",
190
- backupCodes: "Back-upcodes",
191
- copied: "Gekopieerd",
192
- copy: "Kopiëren",
193
- download: "Downloaden",
194
- cancel: "Annuleren",
195
- save: "Bewaren",
196
- name: "Naam",
197
- yourPassword: "Je wachtwoord",
198
- passwordIsSet: "Log in met je e-mailadres en dit wachtwoord. Wijzigen vraagt het huidige.",
199
- passwordNotSet: "Je logt nu in zonder wachtwoord. Stel er een in om ook met je e-mailadres en een wachtwoord in te loggen; je blijft overal ingelogd.",
200
- passwordForbidden: "Je beheerder heeft wachtwoorden uitgezet voor deze app, dus je kunt er niet mee inloggen.",
201
- passwordStaff: "Een medewerker die als iemand anders is ingelogd, kan diens wachtwoord niet wijzigen.",
202
- passwordSaved: "Je wachtwoord is bewaard.",
203
- changePassword: "Wachtwoord wijzigen",
204
- setPassword: "Wachtwoord instellen",
205
- currentPassword: "Huidig wachtwoord",
206
- newPassword: "Nieuw wachtwoord",
207
- repeatPassword: "Nieuw wachtwoord herhalen",
208
- atLeast: (length) => `Minstens ${length} tekens.`,
209
- useAtLeast: (length) => `Gebruik minstens ${length} tekens.`,
210
- passwordTooLong: "Dat wachtwoord is te lang.",
211
- passwordsDiffer: "De wachtwoorden zijn niet hetzelfde.",
212
- continue: "Doorgaan",
213
- on: "Aan",
214
- off: "Uit",
215
- optional: "Optioneel",
216
- required: "Verplicht",
217
- passkeys: "Passkeys",
218
- passkey: "Passkey",
219
- passkeysAllowed: "Log in met Face ID, Touch ID, Windows Hello, je telefoon of een beveiligingssleutel in plaats van een wachtwoord.",
220
- passkeysRequired: "Deze app vraagt een passkey voor elk account. Log in met Face ID, Touch ID, Windows Hello, je telefoon of een beveiligingssleutel.",
221
- passkeysForbidden: "Je beheerder heeft passkeys uitgezet voor deze app, dus je kunt er niet mee inloggen.",
222
- addedOn: (date) => `Toegevoegd ${date}`,
223
- addedEarlier: "Eerder toegevoegd",
224
- synced: "Gesynchroniseerd op je apparaten",
225
- oneDevice: "Op één apparaat",
226
- rename: "Naam wijzigen",
227
- remove: "Verwijderen",
228
- keepLastPasskey: "Passkeys zijn verplicht: voeg er nog een toe voordat je deze verwijdert.",
229
- addPasskey: "Passkey toevoegen",
230
- renamePasskey: "Naam van passkey wijzigen",
231
- renamePasskeyDescription: "Een naam die zegt waar deze passkey staat, zoals het apparaat of de wachtwoordbeheerder.",
232
- removePasskey: "Passkey verwijderen?",
233
- removePasskeyDescription: (name) => `Met ${name} log je hier niet meer in. Die blijft op het apparaat tot je die daar verwijdert.`,
234
- thisPasskey: "deze passkey",
235
- connectedAccounts: "Gekoppelde accounts",
236
- connectedAccountsDescription: "Log hiermee in in plaats van met je wachtwoord. Koppelen vraagt je daar in te loggen; het adres daar kan anders zijn dan hier.",
237
- connected: "Gekoppeld",
238
- connect: (name) => `${name} koppelen`,
239
- mailbox: "Mailbox",
240
- mailboxDescription: "Mail die deze app voor je verstuurt, gaat uit vanuit je eigen mailbox. Koppelen vraagt je daar in te loggen en het versturen van mail toe te staan; je mail lezen kan de app niet.",
241
- stopped: (time) => `Gestopt ${time}`,
242
- ended: (time) => `Afgelopen ${time}`,
243
- signedInUntil: (time) => `Ingelogd tot ${time}`,
244
- devices: "Apparaten",
245
- devicesDescription: "De browsers en apps die op je account zijn ingelogd. Log hier uit met Uitloggen in het menu.",
246
- couldNotReadDevices: "Kon je apparaten niet lezen",
247
- noDevices: "Er is geen apparaat ingelogd.",
248
- thisDevice: "Dit apparaat",
249
- browserOn: (browser, system) => `${browser} op ${system}`,
250
- aBrowserOn: (system) => `Een browser op ${system}`,
251
- unknownDevice: "Onbekend apparaat",
252
- staffOf: (operator) => `Medewerker van ${operator}`,
253
- staff: "Medewerker",
254
- signedInFromUntil: (from, until) => `Ingelogd ${from}, tot ${until}`,
255
- signOut: "Uitloggen",
256
- signOutDevice: (name) => `${name} uitloggen?`,
257
- signOutDeviceDescription: "Dat moet opnieuw inloggen om je account te gebruiken.",
258
- signOutOthers: "Uitloggen op alle andere apparaten",
259
- signOutOthersTitle: "Uitloggen op alle andere apparaten?",
260
- signOutOthersDescription: "Elke andere browser en app die op je account is ingelogd, moet opnieuw inloggen. Dit apparaat blijft ingelogd.",
261
- staffSignIns: "Inlogs van medewerkers",
262
- staffSignInsDescription: (operator) => `Elke keer dat een medewerker van ${operator} hier als iemand anders inlogde, nieuwste eerst.`,
263
- noStaffSignIns: "Nog geen medewerker heeft als iemand anders ingelogd.",
264
- as: "als",
265
- qrCode: "QR-code voor je authenticator-app",
266
- twoFactor: "Tweestapsverificatie",
267
- twoFactorAllowed: "Vraag een tweede stap na je wachtwoord of een gemailde inlogcode: een code uit een authenticator-app, of een die je gemaild krijgt. Een passkey heeft geen tweede stap nodig.",
268
- twoFactorRequired: "Deze app vraagt tweestapsverificatie voor elk account. Zet het aan om de app te blijven gebruiken.",
269
- twoFactorForbidden: "Je beheerder heeft tweestapsverificatie uitgezet voor deze app.",
270
- twoFactorOnWithApp: "Inloggen met een wachtwoord of een gemailde inlogcode vraagt ook een code uit je authenticator-app. Back-upcodes werken als je de app niet bij de hand hebt.",
271
- twoFactorOnWithAppOrMail: "Inloggen met een wachtwoord of een gemailde inlogcode vraagt ook een code uit je authenticator-app, of een die je gemaild krijgt. Back-upcodes werken als je de app niet bij de hand hebt.",
272
- twoFactorOnWithMail: "Inloggen met een wachtwoord of een gemailde inlogcode vraagt ook een code die je gemaild krijgt.",
273
- turnOn: "Aanzetten",
274
- turnOff: "Uitzetten",
275
- addAuthenticator: "Authenticator-app toevoegen",
276
- newBackupCodes: "Nieuwe back-upcodes",
277
- twoFactorIsRequired: "Deze app vraagt tweestapsverificatie.",
278
- turnOffTitle: "Tweestapsverificatie uitzetten?",
279
- turnOffDescription: "Inloggen vraagt dan alleen je wachtwoord of een gemailde code. Je back-upcodes werken niet meer.",
280
- newCodesTitle: "Nieuwe back-upcodes maken?",
281
- newCodesDescription: "Je huidige back-upcodes werken niet meer, en je krijgt tien nieuwe.",
282
- makeNewCodes: "Nieuwe codes maken",
283
- yourNewCodes: "Je nieuwe back-upcodes",
284
- keepCodesSafe: "Bewaar ze op een veilige plek: met elke code log je één keer in als je je telefoon kwijt bent. Ze worden niet opnieuw getoond.",
285
- savedCodes: "Ik heb mijn back-upcodes bewaard",
286
- authenticatorApp: "Authenticator-app",
287
- authenticatorAppDescription: "Een code uit een app zoals Google Authenticator, Microsoft Authenticator of 1Password. Met back-upcodes.",
288
- emailedCode: "Gemailde code",
289
- emailedCodeDescription: "Een code naar je adres, elke keer dat je inlogt met een wachtwoord of een gemailde inlogcode.",
290
- twoFactorIsOn: "Tweestapsverificatie staat aan. Bewaar deze back-upcodes op een veilige plek: met elke code log je één keer in als je je telefoon kwijt bent. Ze worden niet opnieuw getoond.",
291
- scanCode: "Scan deze code met je authenticator-app en vul daarna de code van 6 cijfers in die de app toont.",
292
- cannotScan: "Lukt scannen niet? Vul deze sleutel in de app in:",
293
- codeFromApp: "Code uit de app",
294
- secondStep: "Tweede stap",
295
- password: "Wachtwoord",
296
- passwordDescription: "Inloggen met het e-mailadres en een wachtwoord.",
297
- emailedSignInCode: "Gemailde inlogcode",
298
- emailedSignInCodeDescription: "Inloggen met een eenmalige code naar het adres van het account.",
299
- passkeysPolicyDescription: "Inloggen met Face ID, Touch ID, Windows Hello, een telefoon of een beveiligingssleutel. Verplicht: iedereen voegt er een toe na het inloggen.",
300
- twoFactorPolicyDescription: "Een code uit een authenticator-app, of een gemailde, na een wachtwoord of een gemailde inlogcode. Verplicht: iedereen zet het aan na het inloggen.",
301
- staffAccess: "Medewerker logt in als iemand anders",
302
- staffAccessDescription: "Het team dat deze app beheert, logt in als iemand om die te helpen, met een reden, voor een korte sessie. Elke keer staat in het logboek hieronder; met \"De persoon mailen\" krijgt die het ook te horen.",
303
- emailThePerson: "De persoon mailen",
304
- platformSignIn: "Inloggen via het platform",
305
- platformSignInDescription: "De inlogprovider die het platform van deze app toevoegt, voor mensen die hier al een account hebben. Die maakt nooit accounts.",
306
- platformSignInWith: (provider) => `Inloggen met ${provider} via het platform`,
307
- codeNeedsMail: "Vraagt mailinstellingen (PROTOBASE_SMTP_URL en PROTOBASE_MAIL_FROM): uit tot die zijn ingesteld.",
308
- passwordStaysOn: "Zonder mailinstellingen blijft inloggen met een wachtwoord aan, zodat niemand wordt buitengesloten.",
309
- staffNeedsMail: "Vraagt mailinstellingen (PROTOBASE_SMTP_URL en PROTOBASE_MAIL_FROM): medewerkers kunnen niet inloggen tot die zijn ingesteld.",
310
- platformOff: "Uit zolang passkeys of tweestapsverificatie verplicht zijn: het slaat de tweede stap over.",
311
- appliesAs: (rule) => `Geldt voorlopig als ${rule}.`,
312
- lastSaved: (time) => `Laatst bewaard op ${time}.`,
313
- lastSavedBy: (name, time) => `Laatst bewaard door ${name} op ${time}.`,
314
- neverChanged: "Nooit gewijzigd: dit is de standaard van de app.",
315
- reset: "Terugzetten",
316
- couldNotReadStaffSignIns: "Kon de inlogs van medewerkers niet lezen",
317
- couldNotReadPolicy: "Kon het inlogbeleid niet lezen",
318
- policySaved: "Bewaard. Het geldt vanaf nu voor elke inlog.",
319
- policySubtitle: "Hoe mensen inloggen bij deze app. Wie is ingelogd, houdt de sessie en krijgt binnen 15 minuten de vraag naar wat nieuw verplicht is.",
320
- mcpAddress: "MCP-adres",
321
- mcpAddressDescription: "Voeg dit adres toe aan een AI-assistent of code-editor die MCP spreekt, als aangepaste connector of externe MCP-server. Die opent deze app in je browser, waar je inlogt en hem toestaat; daarna werkt hij met jouw toegang.",
322
- copyMcpAddress: "Het MCP-adres kopiëren",
323
- addToClaude: "Toevoegen aan Claude",
324
- deleteAccount: "Account verwijderen",
325
- deleteAccountDescription: "Verwijder je account en log overal uit. Je kunt er daarna niet meer mee inloggen, en dit kan niet ongedaan worden gemaakt.",
326
- deleteAccountStaff: "Een medewerker die als iemand anders is ingelogd, kan diens account niet verwijderen.",
327
- deleteAccountQuestion: "Je account verwijderen?",
328
- deleteAccountWarning: "Je account, je inlogmethoden en elk apparaat dat ermee is ingelogd worden verwijderd. Dit kan niet ongedaan worden gemaakt.",
329
- deleteAccountPassword: "Vul je wachtwoord in om te bevestigen.",
330
- deleteAccountConfirm: "Mijn account verwijderen",
331
- deleteAccountLastAdmin: "Je bent de laatste beheerder van deze app. Maak eerst iemand anders beheerder.",
332
- deleteAccountLocked: "Dit account is vergrendeld en kan dus niet worden verwijderd."
333
- }
334
- });
3
+ const text = messages("account");
335
4
  //#endregion
336
5
  export { text };
@@ -1,9 +1,9 @@
1
1
  import { text } from "./messages.js";
2
2
  import { Button } from "../primitives/button.js";
3
3
  import { Dialog } from "../primitives/dialog.js";
4
+ import { Badge } from "../primitives/badge.js";
4
5
  import { formatDate } from "../format/date.js";
5
6
  import { Input } from "../primitives/input.js";
6
- import { Badge } from "../primitives/badge.js";
7
7
  import { AccountSection, SectionError } from "./account-section.js";
8
8
  import { authMessage } from "../auth/auth-messages.js";
9
9
  import { useState } from "react";
@@ -57,7 +57,7 @@ const PasskeysSection = ({ rule, passkeys, onAdd, onRename, onRemove }) => {
57
57
  }), /* @__PURE__ */ jsxs("span", {
58
58
  className: "block text-xs text-muted-foreground",
59
59
  children: [
60
- passkey.createdAt ? text("addedOn", formatDate(Date.parse(passkey.createdAt))) : text("addedEarlier"),
60
+ passkey.createdAt ? text("addedOn", { date: formatDate(Date.parse(passkey.createdAt)) }) : text("addedEarlier"),
61
61
  " · ",
62
62
  passkey.backedUp ? text("synced") : text("oneDevice")
63
63
  ]
@@ -122,7 +122,7 @@ const PasskeysSection = ({ rule, passkeys, onAdd, onRename, onRemove }) => {
122
122
  }),
123
123
  editing?.kind === "remove" && /* @__PURE__ */ jsx(Dialog, {
124
124
  title: text("removePasskey"),
125
- description: text("removePasskeyDescription", editing.passkey.name ?? text("thisPasskey")),
125
+ description: text("removePasskeyDescription", { name: editing.passkey.name ?? text("thisPasskey") }),
126
126
  onClose: () => setEditing(void 0),
127
127
  actions: /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Button, {
128
128
  onClick: () => setEditing(void 0),
@@ -10,12 +10,12 @@ import { AuthError } from "@protobase/client";
10
10
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
11
11
  //#region src/account/password-change-dialog.tsx
12
12
  const passwordMessage = (error) => {
13
- if (error.code === "PASSWORD_TOO_SHORT") return text("useAtLeast", 12);
13
+ if (error.code === "PASSWORD_TOO_SHORT") return text("useAtLeast", { length: 12 });
14
14
  if (error.code === "PASSWORD_TOO_LONG") return text("passwordTooLong");
15
15
  return authMessage(error);
16
16
  };
17
17
  const draftProblem = (next, repeat) => {
18
- if (next.length < 12) return text("useAtLeast", 12);
18
+ if (next.length < 12) return text("useAtLeast", { length: 12 });
19
19
  if (next !== repeat) return text("passwordsDiffer");
20
20
  };
21
21
  /** Changes the account's password with the current one, or sets a first one for an account without. */
@@ -47,7 +47,7 @@ const PasswordChangeDialog = ({ hasPassword, onSave, onClose }) => {
47
47
  };
48
48
  return /* @__PURE__ */ jsx(Dialog, {
49
49
  title: hasPassword ? text("changePassword") : text("setPassword"),
50
- description: text("atLeast", 12),
50
+ description: text("atLeast", { length: 12 }),
51
51
  onClose,
52
52
  actions: /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Button, {
53
53
  onClick: onClose,
@@ -24,13 +24,13 @@ const rowNote = ({ method }, draft, { mail, effective, policy }) => {
24
24
  if (method === "password" && !mail && draft.password === "forbidden") return text("passwordStaysOn");
25
25
  if (method === "staffAccess" && !mail && draft.staffAccess === "notify") return text("staffNeedsMail");
26
26
  if (method === "platformSignIn" && draft.platformSignIn === "allowed" && (draft.passkey === "required" || draft.twoFactor === "required")) return text("platformOff");
27
- if (draft[method] === policy[method] && effective[method] !== policy[method]) return text("appliesAs", ruleLabel(method, effective[method]));
27
+ if (draft[method] === policy[method] && effective[method] !== policy[method]) return text("appliesAs", { rule: ruleLabel(method, effective[method]) });
28
28
  };
29
29
  const rowsFor = ({ operator, platformSignIn }) => policyRows().flatMap((row) => {
30
30
  if (row.method === "staffAccess" && !operator) return [];
31
31
  if (row.method === "platformSignIn") return platformSignIn ? [{
32
32
  ...row,
33
- label: text("platformSignInWith", platformSignIn)
33
+ label: text("platformSignInWith", { provider: platformSignIn })
34
34
  }] : [];
35
35
  return [row];
36
36
  });
@@ -97,7 +97,10 @@ const SignInPolicyForm = ({ state, onSave, busy, error, notice }) => {
97
97
  className: "flex flex-wrap items-center justify-between gap-3",
98
98
  children: [/* @__PURE__ */ jsx("p", {
99
99
  className: "text-xs text-muted-foreground",
100
- children: state.savedAt ? state.savedBy ? text("lastSavedBy", state.savedBy, formatDateTime(Date.parse(state.savedAt))) : text("lastSaved", formatDateTime(Date.parse(state.savedAt))) : text("neverChanged")
100
+ children: state.savedAt ? state.savedBy ? text("lastSavedBy", {
101
+ name: state.savedBy,
102
+ time: formatDateTime(Date.parse(state.savedAt))
103
+ }) : text("lastSaved", { time: formatDateTime(Date.parse(state.savedAt)) }) : text("neverChanged")
101
104
  }), /* @__PURE__ */ jsxs("div", {
102
105
  className: "flex gap-2",
103
106
  children: [changed && /* @__PURE__ */ jsx(Button, {
@@ -44,7 +44,7 @@ const SignInProvidersSection = ({ providers, linked, onConnect, error: returned,
44
44
  loading: busy === provider.id,
45
45
  disabled: busy !== void 0,
46
46
  onClick: () => void connect(provider.id),
47
- children: text("connect", provider.name)
47
+ children: text("connect", { name: provider.name })
48
48
  })
49
49
  ]
50
50
  }, provider.id))
@@ -1,23 +1,23 @@
1
1
  import { text } from "./messages.js";
2
- import { formatDateTime } from "../format/date.js";
3
2
  import { Badge } from "../primitives/badge.js";
3
+ import { formatDateTime } from "../format/date.js";
4
4
  import { AccountSection, SectionError } from "./account-section.js";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  //#region src/account/staff-sign-in-log.tsx
7
7
  const stateOf = (entry, now) => entry.endedAt ? /* @__PURE__ */ jsx(Badge, {
8
8
  tone: "neutral",
9
- children: text("stopped", formatDateTime(Date.parse(entry.endedAt)))
9
+ children: text("stopped", { time: formatDateTime(Date.parse(entry.endedAt)) })
10
10
  }) : Date.parse(entry.expiresAt) <= now ? /* @__PURE__ */ jsx(Badge, {
11
11
  tone: "neutral",
12
- children: text("ended", formatDateTime(Date.parse(entry.expiresAt)))
12
+ children: text("ended", { time: formatDateTime(Date.parse(entry.expiresAt)) })
13
13
  }) : /* @__PURE__ */ jsx(Badge, {
14
14
  tone: "amber",
15
- children: text("signedInUntil", formatDateTime(Date.parse(entry.expiresAt)))
15
+ children: text("signedInUntil", { time: formatDateTime(Date.parse(entry.expiresAt)) })
16
16
  });
17
17
  /** The app's log of staff sign-ins, for admins: who signed in as whom, why, and when. */
18
18
  const StaffSignInLog = ({ signIns, operator, error, now = Date.now() }) => /* @__PURE__ */ jsxs(AccountSection, {
19
19
  title: text("staffSignIns"),
20
- description: text("staffSignInsDescription", operator),
20
+ description: text("staffSignInsDescription", { operator }),
21
21
  children: [
22
22
  /* @__PURE__ */ jsx(SectionError, { message: error }),
23
23
  signIns && signIns.length === 0 && /* @__PURE__ */ jsx("p", {
@@ -1,8 +1,5 @@
1
- import { defineMessages } from "../locale/messages.js";
1
+ import { messages } from "../locale/messages.js";
2
2
  //#region src/action-card/messages.ts
3
- const text = defineMessages({
4
- en: { cancel: "Cancel" },
5
- nl: { cancel: "Annuleren" }
6
- });
3
+ const text = messages("action-card");
7
4
  //#endregion
8
5
  export { text };
@@ -1,8 +1,7 @@
1
1
  import { cn } from "../lib/cn.js";
2
2
  import { useMediaQuery } from "../lib/use-media-query.js";
3
- import { formatInt } from "../format/number.js";
4
3
  import { formatDayShort } from "../format/date.js";
5
- import { activitySeries } from "../mocks/activity.js";
4
+ import { formatInt } from "../format/number.js";
6
5
  import { Segmented } from "../primitives/segmented.js";
7
6
  import { halfOverHalfDelta, totalCount } from "./activity-math.js";
8
7
  import { ActivityTooltip } from "./activity-tooltip.js";
@@ -15,13 +14,12 @@ const axisTick = {
15
14
  fontSize: 11,
16
15
  fill: "var(--muted-foreground)"
17
16
  };
18
- const ActivityChart = ({ title = "Orders created", noun = "orders", defaultGranularity = "day", data, granularity: controlled, onGranularityChange, periodLabel, className }) => {
17
+ const ActivityChart = ({ title, noun, defaultGranularity = "day", data, granularity: controlled, onGranularityChange, periodLabel, className }) => {
19
18
  const [local, setLocal] = useState(defaultGranularity);
20
19
  const granularity = controlled ?? local;
21
20
  const setGranularity = onGranularityChange ?? setLocal;
22
- const series = data ?? activitySeries(granularity);
23
21
  const wide = useMediaQuery("(min-width: 640px)");
24
- const delta = halfOverHalfDelta(series);
22
+ const delta = halfOverHalfDelta(data);
25
23
  return /* @__PURE__ */ jsxs("section", {
26
24
  className: cn("rounded-lg border bg-background px-4 pb-2 pt-3", className),
27
25
  children: [/* @__PURE__ */ jsxs("header", {
@@ -35,7 +33,7 @@ const ActivityChart = ({ title = "Orders created", noun = "orders", defaultGranu
35
33
  }),
36
34
  /* @__PURE__ */ jsx("span", {
37
35
  className: "font-semibold tabular-nums",
38
- children: formatInt(totalCount(series))
36
+ children: formatInt(totalCount(data))
39
37
  }),
40
38
  /* @__PURE__ */ jsxs("span", {
41
39
  className: cn("text-xs font-medium tabular-nums", delta >= 0 ? "text-success-text" : "text-danger-text"),
@@ -67,7 +65,7 @@ const ActivityChart = ({ title = "Orders created", noun = "orders", defaultGranu
67
65
  width: "100%",
68
66
  height: "100%",
69
67
  children: /* @__PURE__ */ jsxs(BarChart, {
70
- data: series,
68
+ data,
71
69
  margin: {
72
70
  top: 4,
73
71
  right: 0,
@@ -1,5 +1,5 @@
1
- import { formatInt } from "../format/number.js";
2
1
  import { formatDate } from "../format/date.js";
2
+ import { formatInt } from "../format/number.js";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  //#region src/activity-chart/activity-tooltip.tsx
5
5
  const ActivityTooltip = ({ active, payload, noun }) => {
@@ -1,14 +1,5 @@
1
- import { defineMessages } from "../locale/messages.js";
1
+ import { messages } from "../locale/messages.js";
2
2
  //#region src/activity-chart/messages.ts
3
- const text = defineMessages({
4
- en: {
5
- day: "Day",
6
- week: "Week"
7
- },
8
- nl: {
9
- day: "Dag",
10
- week: "Week"
11
- }
12
- });
3
+ const text = messages("activity-chart");
13
4
  //#endregion
14
5
  export { text };
package/dist/app/app.js CHANGED
@@ -5,7 +5,6 @@ import { ApiProvider } from "../data/api-provider.js";
5
5
  import { sourceStatusOf } from "../data/with-sources.js";
6
6
  import { MetaGate, Notice, useAdminMeta } from "./meta-gate.js";
7
7
  import { pageTabs, shownPageTab } from "./pages/page-tabs.js";
8
- import { ToastProvider } from "../toasts/toast-provider.js";
9
8
  import { humanize } from "../live/naming.js";
10
9
  import { text } from "./messages.js";
11
10
  import { Router, useRouter } from "./router.js";
@@ -15,8 +14,8 @@ import { ProjectUiContext, useProjectUi } from "./pages/project-ui.js";
15
14
  import { RecordTitles, useRecordTitle } from "./titles/record-titles.js";
16
15
  import { isAdmin, userToShell } from "../auth/user-to-shell.js";
17
16
  import { startErrorReporting } from "./error-reporting.js";
18
- import { slotted } from "../locale/slotted.js";
19
17
  import { CustomBoundary } from "./pages/custom-boundary.js";
18
+ import { ToastProvider } from "../toasts/toast-provider.js";
20
19
  import { useSidebarNoticeShown } from "../app-shell/sidebar-notice.js";
21
20
  import { AppShell } from "../app-shell/app-shell.js";
22
21
  import { useSignInAddress } from "../auth/use-sign-in-address.js";
@@ -215,7 +214,7 @@ const Routes = ({ workspace, sidebarMode, assistant, runtime }) => {
215
214
  ...address.tab && { tab: address.tab }
216
215
  }, page.name) : /* @__PURE__ */ jsx(Notice, {
217
216
  title: text("notFound"),
218
- children: slotted(text("noPage"), address.page)
217
+ children: text.rich("noPage", { page: address.page })
219
218
  }) : drawnFrom && drawnFrom.state !== "ready" ? /* @__PURE__ */ jsx(SourceNotice, { status: drawnFrom }) : address.kind === "create" ? /* @__PURE__ */ jsx(CreateRoute, {
220
219
  resource: address.resource,
221
220
  values: address.values