@protobase/ui 0.63.5 → 0.65.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 (277) hide show
  1. package/dist/account/change-email-dialog.js +1 -1
  2. package/dist/account/devices-section.js +11 -5
  3. package/dist/account/messages.js +2 -333
  4. package/dist/account/passkeys-section.js +2 -2
  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 +4 -4
  9. package/dist/action-card/messages.js +2 -5
  10. package/dist/activity-chart/activity-chart.js +4 -6
  11. package/dist/activity-chart/messages.js +2 -11
  12. package/dist/app/app.js +1 -2
  13. package/dist/app/batch-failure.js +5 -1
  14. package/dist/app/bottom-bar-from-meta.js +2 -3
  15. package/dist/app/change-confirm/messages.js +2 -13
  16. package/dist/app/change-confirm/use-change-confirm.js +1 -1
  17. package/dist/app/charts/chart-groups.js +3 -1
  18. package/dist/app/charts/group-bars.js +1 -1
  19. package/dist/app/charts/messages.js +2 -23
  20. package/dist/app/charts/period-chart.js +1 -1
  21. package/dist/app/comments/messages.js +2 -19
  22. package/dist/app/confirm-sign-in-messages.js +2 -19
  23. package/dist/app/confirm-sign-in.js +1 -1
  24. package/dist/app/create/create-page.js +3 -3
  25. package/dist/app/create/create-record-form.js +2 -2
  26. package/dist/app/create/create-route.js +1 -1
  27. package/dist/app/create/messages.js +2 -29
  28. package/dist/app/custom-section.js +1 -2
  29. package/dist/app/delete/blocked-delete.js +5 -2
  30. package/dist/app/delete/dialogs.js +21 -8
  31. package/dist/app/delete/messages.js +2 -63
  32. package/dist/app/delete/use-delete-flow.js +5 -4
  33. package/dist/app/displays/board-column.js +1 -1
  34. package/dist/app/displays/board-columns.js +1 -1
  35. package/dist/app/displays/board-display.js +21 -9
  36. package/dist/app/displays/calendar-display.js +15 -6
  37. package/dist/app/displays/cards-display.js +1 -1
  38. package/dist/app/displays/custom-display.js +1 -2
  39. package/dist/app/displays/list-cards.js +1 -1
  40. package/dist/app/displays/map-display.js +19 -6
  41. package/dist/app/displays/messages.js +2 -147
  42. package/dist/app/displays/period-controls.js +2 -2
  43. package/dist/app/displays/timeline-display.js +15 -6
  44. package/dist/app/displays/timeline-range.js +1 -1
  45. package/dist/app/displays/use-board-move.js +3 -3
  46. package/dist/app/displays/use-calendar-move.js +1 -1
  47. package/dist/app/document-title.js +1 -1
  48. package/dist/app/embedded-list/cut-off-note.js +7 -1
  49. package/dist/app/embedded-list/embedded-row-targets.js +3 -3
  50. package/dist/app/embedded-list/messages.js +2 -21
  51. package/dist/app/export/builder-port.js +1 -1
  52. package/dist/app/export/export-dialog.js +14 -8
  53. package/dist/app/export/messages.js +2 -75
  54. package/dist/app/export/use-export-flow.js +9 -3
  55. package/dist/app/field-editor.js +2 -2
  56. package/dist/app/field-errors.js +18 -7
  57. package/dist/app/field-messages.js +2 -45
  58. package/dist/app/field-types/members/messages.js +2 -15
  59. package/dist/app/field-types/messages.js +2 -5
  60. package/dist/app/field-types/widget-part.js +1 -1
  61. package/dist/app/file-field.js +3 -3
  62. package/dist/app/gallery/gallery-section.js +5 -2
  63. package/dist/app/gallery/messages.js +2 -27
  64. package/dist/app/gallery/photo-details.js +2 -2
  65. package/dist/app/hand-order/hand-sorted-list.js +1 -2
  66. package/dist/app/hand-order/messages.js +2 -29
  67. package/dist/app/hand-order/use-hand-order.js +1 -1
  68. package/dist/app/history/describe-change.js +1 -1
  69. package/dist/app/history/messages.js +2 -29
  70. package/dist/app/import/convert.js +19 -10
  71. package/dist/app/import/import-check-step.js +5 -5
  72. package/dist/app/import/import-dialog.js +5 -2
  73. package/dist/app/import/import-file-step.js +1 -1
  74. package/dist/app/import/import-mapping-step.js +3 -3
  75. package/dist/app/import/messages.js +2 -197
  76. package/dist/app/import/prepare-rows.js +11 -4
  77. package/dist/app/import/sheet-cell.js +1 -1
  78. package/dist/app/import/xlsx-reader.js +2 -2
  79. package/dist/app/import/zip-reader.js +4 -1
  80. package/dist/app/list-actions/use-list-actions.js +4 -1
  81. package/dist/app/list-edit/messages.js +2 -11
  82. package/dist/app/list-empty-state.js +7 -4
  83. package/dist/app/list-group-chart.js +1 -1
  84. package/dist/app/list-messages.js +2 -53
  85. package/dist/app/list-page.js +9 -9
  86. package/dist/app/live-update/messages.js +2 -11
  87. package/dist/app/map/messages.js +2 -11
  88. package/dist/app/menu-icons.js +10 -3
  89. package/dist/app/messages.js +2 -139
  90. package/dist/app/meta-gate-messages.js +2 -13
  91. package/dist/app/nav-from-meta.js +8 -9
  92. package/dist/app/new-version/messages.js +2 -21
  93. package/dist/app/new-version/new-version-banner.js +1 -2
  94. package/dist/app/pages/action-inputs/action-inputs-dialog.js +1 -1
  95. package/dist/app/pages/action-inputs/input-answers.js +1 -1
  96. package/dist/app/pages/blocks/modal-form.js +1 -1
  97. package/dist/app/pages/blocks/settings.js +1 -1
  98. package/dist/app/pages/blocks/tabs.js +1 -1
  99. package/dist/app/pages/composed-page.js +1 -2
  100. package/dist/app/pages/custom-boundary.js +1 -2
  101. package/dist/app/pages/messages.js +2 -79
  102. package/dist/app/pages/render-node.js +2 -3
  103. package/dist/app/pages/use-run-action.js +14 -6
  104. package/dist/app/rank-after/dependency-rule.js +8 -2
  105. package/dist/app/rank-after/messages.js +2 -5
  106. package/dist/app/rank-after/ranked-place.js +7 -1
  107. package/dist/app/record-chart/messages.js +2 -25
  108. package/dist/app/record-lines-cell.js +4 -1
  109. package/dist/app/record-lines.js +2 -2
  110. package/dist/app/record-messages.js +2 -83
  111. package/dist/app/record-page.js +3 -3
  112. package/dist/app/record-row/messages.js +2 -23
  113. package/dist/app/record-row/record-row-body.js +1 -1
  114. package/dist/app/record-row/record-row.js +2 -2
  115. package/dist/app/record-row/saved-record-row.js +2 -2
  116. package/dist/app/related-cards/messages.js +2 -15
  117. package/dist/app/related-dots/dots-summary.js +1 -1
  118. package/dist/app/related-dots/messages.js +2 -5
  119. package/dist/app/related-dots/related-dots.js +2 -3
  120. package/dist/app/relation-picker.js +1 -1
  121. package/dist/app/runtime/messages.js +2 -55
  122. package/dist/app/runtime/runtime-status.js +12 -3
  123. package/dist/app/saved/messages.js +2 -19
  124. package/dist/app/saved/saved-list.js +2 -2
  125. package/dist/app/search/messages.js +2 -19
  126. package/dist/app/search/navigation-hits.js +1 -1
  127. package/dist/app/search/search-model.js +9 -3
  128. package/dist/app/searches/messages.js +2 -93
  129. package/dist/app/searches/save-search-button.js +3 -3
  130. package/dist/app/searches/saved-search-rows.js +2 -2
  131. package/dist/app/searches/saved-search-section.js +3 -3
  132. package/dist/app/searches/saved-searches.js +13 -11
  133. package/dist/app/searches/search-controls.js +1 -1
  134. package/dist/app/searches/search-diff.js +8 -2
  135. package/dist/app/searches/update-search-dialog.js +9 -3
  136. package/dist/app/searches/use-save-search.js +1 -1
  137. package/dist/app/searches/use-search-row.js +2 -2
  138. package/dist/app/sensitive-field.js +3 -3
  139. package/dist/app/source-notice.js +3 -3
  140. package/dist/app/staff-banner.js +12 -8
  141. package/dist/app/use-live-save.js +2 -2
  142. package/dist/app/user-menu-from-meta.js +2 -3
  143. package/dist/app/value-badge.js +3 -4
  144. package/dist/app-shell/global-search.js +2 -2
  145. package/dist/app-shell/messages.js +2 -63
  146. package/dist/app-shell/sidebar-group.js +2 -2
  147. package/dist/app-shell/sidebar.js +1 -2
  148. package/dist/app-shell/top-bar.js +1 -1
  149. package/dist/assistant-dock/messages.js +2 -23
  150. package/dist/auth/auth-gate.js +1 -1
  151. package/dist/auth/auth-messages.js +9 -88
  152. package/dist/auth/email-code-form.js +2 -3
  153. package/dist/auth/forgot-password-form.js +2 -3
  154. package/dist/auth/messages.js +2 -203
  155. package/dist/auth/provider-sign-in-page.js +3 -3
  156. package/dist/auth/resend-code-button.js +1 -1
  157. package/dist/auth/reset-password-form.js +1 -1
  158. package/dist/auth/reset-password-page.js +1 -1
  159. package/dist/auth/sign-in-form.js +2 -2
  160. package/dist/auth/sign-up-code-form.js +2 -3
  161. package/dist/auth/sign-up-details-form.js +3 -4
  162. package/dist/auth/staff-sign-in-form.js +3 -3
  163. package/dist/calls/call-guests-panel.js +1 -1
  164. package/dist/calls/call-lobby-notice.js +1 -1
  165. package/dist/calls/call-mark.js +1 -1
  166. package/dist/calls/call-people.js +1 -1
  167. package/dist/calls/call-tile.js +2 -2
  168. package/dist/calls/messages.js +2 -139
  169. package/dist/carousel/carousel-controls.js +4 -1
  170. package/dist/carousel/messages.js +2 -13
  171. package/dist/chat/messages.js +2 -19
  172. package/dist/compact-table/compact-table.js +1 -1
  173. package/dist/compact-table/messages.js +2 -15
  174. package/dist/data-grid/cell-text.js +6 -5
  175. package/dist/data-grid/cells.js +7 -4
  176. package/dist/data-grid/grid-footer.js +1 -1
  177. package/dist/data-grid/grid-row.js +1 -1
  178. package/dist/data-grid/header-menu.js +1 -1
  179. package/dist/data-grid/messages.js +2 -49
  180. package/dist/data-grid/resize-handle.js +1 -1
  181. package/dist/data-grid/row-reorder.js +20 -5
  182. package/dist/filter-panel/active-filter-chips.js +1 -1
  183. package/dist/filter-panel/date-presets.js +2 -2
  184. package/dist/filter-panel/facet-combobox.js +1 -1
  185. package/dist/filter-panel/facet-group.js +1 -1
  186. package/dist/filter-panel/messages.js +2 -49
  187. package/dist/filter-panel/range-filter.js +1 -1
  188. package/dist/format/date.js +4 -4
  189. package/dist/format/messages.js +2 -21
  190. package/dist/format/money.js +1 -1
  191. package/dist/format/number.js +5 -2
  192. package/dist/forms/messages.js +2 -21
  193. package/dist/inline-child-table/inline-child-table.js +19 -4
  194. package/dist/inline-child-table/line-row.js +2 -2
  195. package/dist/inline-child-table/messages.js +2 -35
  196. package/dist/invitations/link-notice.js +2 -3
  197. package/dist/invitations/messages.js +2 -21
  198. package/dist/invitations/pending-invitation-row.js +1 -1
  199. package/dist/lists/messages.js +2 -5
  200. package/dist/live/columns-from-model.js +14 -31
  201. package/dist/live/display-value.js +1 -1
  202. package/dist/live/messages.js +2 -15
  203. package/dist/live/value-color.js +13 -3
  204. package/dist/live/view-fields.js +4 -2
  205. package/dist/locale/en.js +1399 -0
  206. package/dist/locale/messages.js +38 -7
  207. package/dist/locale/nl.js +1399 -0
  208. package/dist/markdown/messages.js +2 -13
  209. package/dist/mentions/messages.js +2 -13
  210. package/dist/notifications/bell/messages.js +2 -35
  211. package/dist/notifications/bell/unread-label.js +1 -1
  212. package/dist/organizations/invitation-page.js +31 -13
  213. package/dist/organizations/invitations-page.js +1 -1
  214. package/dist/organizations/members-page.js +2 -2
  215. package/dist/organizations/messages.js +2 -187
  216. package/dist/organizations/organization-page.js +4 -4
  217. package/dist/organizations/organizations-page.js +1 -1
  218. package/dist/package.js +1 -1
  219. package/dist/plugins/load-plugin.js +2 -2
  220. package/dist/plugins/messages.js +2 -33
  221. package/dist/plugins/plugin-notice.js +7 -5
  222. package/dist/primitives/badge.d.ts +2 -1
  223. package/dist/primitives/messages.js +2 -13
  224. package/dist/primitives/token.js +1 -1
  225. package/dist/record-view/field.js +2 -2
  226. package/dist/record-view/messages.js +2 -33
  227. package/dist/record-view/record-header.js +2 -2
  228. package/dist/roles/messages.js +2 -11
  229. package/dist/shell/assets/app-BOuBCV1m.js +8 -0
  230. package/dist/shell/assets/{calls-CPiQcC70.js → calls-C22bYKio.js} +2 -2
  231. package/dist/shell/assets/export-worker-ClXdfeuq.js +15 -0
  232. package/dist/shell/assets/{index-_ZpZ2ro0.js → index-G0fdUd70.js} +2 -2
  233. package/dist/shell/assets/{maplibre-CjNYwEqW.js → maplibre-CRmpQfDl.js} +3 -3
  234. package/dist/shell/assets/parse-worker-DxsmAjef.js +18 -0
  235. package/dist/shell/assets/preload-helper-BgLOXTzV.js +2 -0
  236. package/dist/shell/assets/{record-map-DjqQGqZ2.js → record-map-DsP4sXes.js} +2 -2
  237. package/dist/shell/assets/{records-map-DU29d6QK.js → records-map-BtWK38Kn.js} +2 -2
  238. package/dist/shell/assets/shared-protobase-ui-xqMMtr7u.js +2 -0
  239. package/dist/shell/assets/vendor-Kvdo8Jrw.js +73 -0
  240. package/dist/shell/index.html +5 -5
  241. package/dist/shell/protobase.shell.json +2 -2
  242. package/dist/shell/protobase.sw.js +2 -2
  243. package/dist/shell-source-maps/assets/app-BOuBCV1m.js.map +1 -0
  244. package/dist/shell-source-maps/assets/{calls-CPiQcC70.js.map → calls-C22bYKio.js.map} +1 -1
  245. package/dist/shell-source-maps/assets/export-worker-ClXdfeuq.js.map +1 -0
  246. package/dist/shell-source-maps/assets/{index-_ZpZ2ro0.js.map → index-G0fdUd70.js.map} +1 -1
  247. package/dist/shell-source-maps/assets/{maplibre-CjNYwEqW.js.map → maplibre-CRmpQfDl.js.map} +1 -1
  248. package/dist/shell-source-maps/assets/parse-worker-DxsmAjef.js.map +1 -0
  249. package/dist/shell-source-maps/assets/preload-helper-BgLOXTzV.js.map +1 -0
  250. package/dist/shell-source-maps/assets/{record-map-DjqQGqZ2.js.map → record-map-DsP4sXes.js.map} +1 -1
  251. package/dist/shell-source-maps/assets/{records-map-DU29d6QK.js.map → records-map-BtWK38Kn.js.map} +1 -1
  252. package/dist/shell-source-maps/assets/shared-protobase-ui-xqMMtr7u.js.map +1 -0
  253. package/dist/shell-source-maps/assets/vendor-Kvdo8Jrw.js.map +1 -0
  254. package/dist/side-panel/messages.js +2 -5
  255. package/dist/status/messages.js +2 -59
  256. package/dist/toasts/messages.js +2 -5
  257. package/dist/users/create-user-form.js +1 -1
  258. package/dist/users/messages.js +2 -49
  259. package/package.json +5 -4
  260. package/dist/app/icons.js +0 -27
  261. package/dist/app-shell/nav.js +0 -85
  262. package/dist/locale/slotted.js +0 -14
  263. package/dist/mocks/activity.js +0 -24
  264. package/dist/mocks/rng.js +0 -20
  265. package/dist/mocks/users.js +0 -63
  266. package/dist/shell/assets/app-BPv_SjnU.js +0 -9
  267. package/dist/shell/assets/export-worker-3e4Zsv0a.js +0 -3
  268. package/dist/shell/assets/parse-worker-UhbwEjS0.js +0 -6
  269. package/dist/shell/assets/preload-helper-SYSsmQ2O.js +0 -2
  270. package/dist/shell/assets/shared-protobase-ui-Cab5nqST.js +0 -2
  271. package/dist/shell/assets/vendor-iwLB0x-s.js +0 -63
  272. package/dist/shell-source-maps/assets/app-BPv_SjnU.js.map +0 -1
  273. package/dist/shell-source-maps/assets/export-worker-3e4Zsv0a.js.map +0 -1
  274. package/dist/shell-source-maps/assets/parse-worker-UhbwEjS0.js.map +0 -1
  275. package/dist/shell-source-maps/assets/preload-helper-SYSsmQ2O.js.map +0 -1
  276. package/dist/shell-source-maps/assets/shared-protobase-ui-Cab5nqST.js.map +0 -1
  277. package/dist/shell-source-maps/assets/vendor-iwLB0x-s.js.map +0 -1
@@ -1,18 +1,5 @@
1
- import { defineMessages } from "../locale/messages.js";
1
+ import { messages } from "../locale/messages.js";
2
2
  //#region src/compact-table/messages.ts
3
- const text = defineMessages({
4
- en: {
5
- table: "Table",
6
- noRows: "No rows.",
7
- rows: (count) => `${count} ${count === 1 ? "row" : "rows"}`,
8
- cutOff: ", cut off at the limit"
9
- },
10
- nl: {
11
- table: "Tabel",
12
- noRows: "Geen rijen.",
13
- rows: (count) => `${count} ${count === 1 ? "rij" : "rijen"}`,
14
- cutOff: ", afgekapt bij de limiet"
15
- }
16
- });
3
+ const text = messages("compact-table");
17
4
  //#endregion
18
5
  export { text };
@@ -1,7 +1,6 @@
1
1
  import { formatDate, formatDateTime, formatRelativeTime } from "../format/date.js";
2
2
  import { formatInt, formatPercent, formatSigned } from "../format/number.js";
3
3
  import { formatMoney } from "../format/money.js";
4
- import { userById } from "../mocks/users.js";
5
4
  import { fileShown } from "../live/file-values.js";
6
5
  import { text } from "./messages.js";
7
6
  import { enumLabel } from "@protobase/schema";
@@ -14,17 +13,19 @@ const cellText = (spec, value) => {
14
13
  switch (spec.kind) {
15
14
  case "text":
16
15
  case "id": return String(value);
17
- case "money": return `${formatMoney(Number(value), spec.currency, spec.decimals)}${spec.suffix ?? ""}`;
16
+ case "money":
17
+ if (spec.currency === void 0) throw new Error(`Money column "${spec.id}" has no currency`);
18
+ return `${formatMoney(Number(value), spec.currency, spec.decimals)}${spec.suffix ?? ""}`;
18
19
  case "date": return formatDate(Number(value));
19
20
  case "datetime": return spec.relative ? formatRelativeTime(Math.round((Date.now() - Number(value)) / 1e3)) : formatDateTime(Number(value));
20
- case "number": return `${formatInt(Number(value))}${spec.suffix ?? ""}`;
21
- case "signed": return `${formatSigned(Number(value))}${spec.suffix ?? ""}`;
21
+ case "number": return `${spec.prefix ?? ""}${formatInt(Number(value))}${spec.suffix ?? ""}`;
22
+ case "signed": return `${spec.prefix ?? ""}${formatSigned(Number(value))}${spec.suffix ?? ""}`;
22
23
  case "percent": return Number(value) === 0 ? "—" : formatPercent(Number(value));
23
24
  case "status": return enumLabel(String(value), spec.labels);
24
25
  case "relation": return relationLabel(value);
25
26
  case "boolean": return value ? void 0 : text("no");
26
27
  case "file": return fileShown(value)?.name ?? "—";
27
- case "user": return userById(String(value)).name;
28
+ case "user": return spec.users?.(String(value))?.name ?? String(value);
28
29
  }
29
30
  };
30
31
  //#endregion
@@ -3,13 +3,12 @@ import { Badge } from "../primitives/badge.js";
3
3
  import { Avatar } from "../primitives/avatar.js";
4
4
  import { viewerZone, zoneLabel } from "../format/zone.js";
5
5
  import { formatDateTime } from "../format/date.js";
6
- import { userById } from "../mocks/users.js";
7
6
  import { fileShown, shownImage } from "../live/file-values.js";
8
7
  import { text } from "./messages.js";
9
8
  import { cellText } from "./cell-text.js";
9
+ import { valueColor } from "../live/value-color.js";
10
10
  import { FileImage } from "../live/file-image.js";
11
11
  import { ContactLink } from "../live/contact-link.js";
12
- import { valueColor } from "../live/value-color.js";
13
12
  import { TruncatedText } from "./truncated-text.js";
14
13
  import { Check, Paperclip } from "lucide-react";
15
14
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -41,7 +40,7 @@ const renderCell = (spec, value) => {
41
40
  });
42
41
  case "datetime": return /* @__PURE__ */ jsx("span", {
43
42
  className: "tabular-nums text-muted-foreground",
44
- title: spec.relative ? formatDateTime(Number(value)) : text("shownIn", zoneLabel(Number(value), viewerZone())),
43
+ title: spec.relative ? formatDateTime(Number(value)) : text("shownIn", { zone: zoneLabel(Number(value), viewerZone()) }),
45
44
  children: text$1
46
45
  });
47
46
  case "number": return /* @__PURE__ */ jsx("span", {
@@ -93,7 +92,11 @@ const renderCell = (spec, value) => {
93
92
  });
94
93
  }
95
94
  case "user": {
96
- const user = userById(String(value));
95
+ const user = spec.users?.(String(value));
96
+ if (!user) return /* @__PURE__ */ jsx(TruncatedText, {
97
+ text: text$1,
98
+ className: "text-muted-foreground"
99
+ });
97
100
  return /* @__PURE__ */ jsxs("span", {
98
101
  className: "inline-flex items-center gap-2 truncate",
99
102
  children: [/* @__PURE__ */ jsx(Avatar, {
@@ -12,7 +12,7 @@ const GridFooter = ({ total, selectedCount, bulkActions = [], className }) => /*
12
12
  formatApproxRows(total),
13
13
  selectedCount > 0 && /* @__PURE__ */ jsx("span", {
14
14
  className: "ml-3 font-medium text-primary-text",
15
- children: text("selected", formatInt(selectedCount))
15
+ children: text("selected", { count: formatInt(selectedCount) })
16
16
  }),
17
17
  selectedCount > 0 && bulkActions.map((action) => /* @__PURE__ */ jsx("button", {
18
18
  type: "button",
@@ -28,7 +28,7 @@ const Gutter = ({ width, index, selectable, selected, onToggle, edge }) => /* @_
28
28
  style: { width },
29
29
  children: [selectable && /* @__PURE__ */ jsx(Checkbox, {
30
30
  checked: Boolean(selected),
31
- label: text("selectRow", index + 1)
31
+ label: text("selectRow", { row: index + 1 })
32
32
  }), width > 40 && /* @__PURE__ */ jsx("span", {
33
33
  className: "min-w-6 text-right text-[11px] tabular-nums text-faint-foreground",
34
34
  children: formatInt(index + 1)
@@ -18,7 +18,7 @@ const HeaderMenu = ({ header, pinned, sortable, onTogglePin }) => {
18
18
  children: [/* @__PURE__ */ jsx("button", {
19
19
  ref: button,
20
20
  type: "button",
21
- "aria-label": text("columnMenu", header),
21
+ "aria-label": text("columnMenu", { header }),
22
22
  "aria-haspopup": "menu",
23
23
  "aria-expanded": open,
24
24
  onClick: () => setOpen(!open),
@@ -1,52 +1,5 @@
1
- import { defineMessages } from "../locale/messages.js";
1
+ import { messages } from "../locale/messages.js";
2
2
  //#region src/data-grid/messages.ts
3
- const text = defineMessages({
4
- en: {
5
- unsortable: "This column can't be sorted",
6
- columnMenu: (header) => `${header} column menu`,
7
- unpin: "Unpin",
8
- pinToLeft: "Pin to left",
9
- resizeColumn: (header) => `Resize ${header} column`,
10
- selected: (count) => `${count} selected`,
11
- no: "No",
12
- shownIn: (zone) => `Shown in ${zone}`,
13
- new: "New",
14
- clearSelection: "Clear selection",
15
- noRowsSelected: "No rows selected",
16
- selectRow: (row) => `Select row ${row}`,
17
- rowActions: "Row actions",
18
- row: "row",
19
- move: (label) => `Move ${label}`,
20
- reorderInstructions: "To move a row, press Space on its handle, move it with the up and down arrow keys, and press Space again to drop it there. Escape puts it back.",
21
- pickedUp: (name, row, rows) => `Picked up ${name}, row ${row} of ${rows}.`,
22
- isOver: (name, row, rows) => `${name} is over row ${row} of ${rows}.`,
23
- droppedAt: (name, row, rows) => `${name} was dropped at row ${row} of ${rows}.`,
24
- putBack: (name) => `${name} was put back.`,
25
- cancelled: (name, row) => `Moving ${name} was cancelled. It is back at row ${row}.`
26
- },
27
- nl: {
28
- unsortable: "Op deze kolom kan niet worden gesorteerd",
29
- columnMenu: (header) => `Kolommenu ${header}`,
30
- unpin: "Losmaken",
31
- pinToLeft: "Links vastzetten",
32
- resizeColumn: (header) => `Breedte kolom ${header}`,
33
- selected: (count) => `${count} geselecteerd`,
34
- no: "Nee",
35
- shownIn: (zone) => `Getoond in ${zone}`,
36
- new: "Nieuw",
37
- clearSelection: "Selectie wissen",
38
- noRowsSelected: "Geen rijen geselecteerd",
39
- selectRow: (row) => `Rij ${row} selecteren`,
40
- rowActions: "Rijacties",
41
- row: "rij",
42
- move: (label) => `${label} verplaatsen`,
43
- reorderInstructions: "Om een rij te verplaatsen, druk op Spatie op de greep, verplaats hem met de pijltjestoetsen omhoog en omlaag, en druk nogmaals op Spatie om hem daar neer te zetten. Escape zet hem terug.",
44
- pickedUp: (name, row, rows) => `${name} opgepakt, rij ${row} van ${rows}.`,
45
- isOver: (name, row, rows) => `${name} is boven rij ${row} van ${rows}.`,
46
- droppedAt: (name, row, rows) => `${name} is neergezet op rij ${row} van ${rows}.`,
47
- putBack: (name) => `${name} is teruggezet.`,
48
- cancelled: (name, row) => `Verplaatsen van ${name} is geannuleerd. Hij staat weer op rij ${row}.`
49
- }
50
- });
3
+ const text = messages("data-grid");
51
4
  //#endregion
52
5
  export { text };
@@ -8,7 +8,7 @@ import { jsx } from "react/jsx-runtime";
8
8
  const ResizeHandle = ({ id, header, width, resize }) => /* @__PURE__ */ jsx("div", {
9
9
  role: "separator",
10
10
  "aria-orientation": "vertical",
11
- "aria-label": text("resizeColumn", header),
11
+ "aria-label": text("resizeColumn", { header }),
12
12
  "aria-valuemin": 64,
13
13
  "aria-valuenow": width,
14
14
  tabIndex: 0,
@@ -17,10 +17,25 @@ const ReorderRows = ({ ids, rowAt, reorder, children }) => {
17
17
  return row ? reorder.label(row) : text("row");
18
18
  };
19
19
  const announcements = {
20
- onDragStart: ({ active }) => text("pickedUp", name(active.id), place(active.id) + 1, ids.length),
21
- onDragOver: ({ active, over }) => over ? text("isOver", name(active.id), place(over.id) + 1, ids.length) : void 0,
22
- onDragEnd: ({ active, over }) => over ? text("droppedAt", name(active.id), place(over.id) + 1, ids.length) : text("putBack", name(active.id)),
23
- onDragCancel: ({ active }) => text("cancelled", name(active.id), place(active.id) + 1)
20
+ onDragStart: ({ active }) => text("pickedUp", {
21
+ name: name(active.id),
22
+ row: place(active.id) + 1,
23
+ rows: ids.length
24
+ }),
25
+ onDragOver: ({ active, over }) => over ? text("isOver", {
26
+ name: name(active.id),
27
+ row: place(over.id) + 1,
28
+ rows: ids.length
29
+ }) : void 0,
30
+ onDragEnd: ({ active, over }) => over ? text("droppedAt", {
31
+ name: name(active.id),
32
+ row: place(over.id) + 1,
33
+ rows: ids.length
34
+ }) : text("putBack", { name: name(active.id) }),
35
+ onDragCancel: ({ active }) => text("cancelled", {
36
+ name: name(active.id),
37
+ row: place(active.id) + 1
38
+ })
24
39
  };
25
40
  const end = ({ active, over }) => {
26
41
  if (!over || active.id === over.id) return;
@@ -47,7 +62,7 @@ const SortableRow = ({ row, label, ...props }) => {
47
62
  const handle = /* @__PURE__ */ jsx("button", {
48
63
  ref: setActivatorNodeRef,
49
64
  type: "button",
50
- "aria-label": text("move", label),
65
+ "aria-label": text("move", { label }),
51
66
  ...attributes,
52
67
  ...listeners,
53
68
  onClick: (event) => event.stopPropagation(),
@@ -16,7 +16,7 @@ const ActiveFilterChips = ({ chips, lockedLabels = [], onRemove, onClear, scroll
16
16
  className: chipClass,
17
17
  children: [chip.label, /* @__PURE__ */ jsx("button", {
18
18
  type: "button",
19
- "aria-label": text("remove", chip.label),
19
+ "aria-label": text("remove", { label: chip.label }),
20
20
  onClick: () => onRemove(chip.key),
21
21
  className: "rounded-full p-0.5 hover:bg-primary-border/60",
22
22
  children: /* @__PURE__ */ jsx(X, { className: "size-3" })
@@ -10,10 +10,10 @@ const DatePresets = ({ value, presets = defaultDatePresets, onChange }) => /* @_
10
10
  return /* @__PURE__ */ jsx("button", {
11
11
  type: "button",
12
12
  disabled: !label,
13
- title: label ? void 0 : text("unknownPreset", id),
13
+ title: label ? void 0 : text("unknownPreset", { id }),
14
14
  onClick: () => onChange(value === id ? void 0 : id),
15
15
  className: cn("h-7 rounded-md border px-2.5 text-body font-medium transition-colors", !label && "border-dashed text-danger-text", value === id ? "border-primary-border bg-primary-soft text-primary-text" : "border-border-strong bg-background text-muted-foreground hover:bg-muted"),
16
- children: label ?? text("unsupported", id)
16
+ children: label ?? text("unsupported", { id })
17
17
  }, id);
18
18
  })
19
19
  });
@@ -65,7 +65,7 @@ const FacetCombobox = ({ config, selected, onToggle, inline = false }) => {
65
65
  "aria-controls": `${id}-options`,
66
66
  "aria-autocomplete": "list",
67
67
  "aria-activedescendant": options[active] ? `${id}-${active}` : void 0,
68
- placeholder: selected.length > 0 ? "" : text("searchIn", config.label),
68
+ placeholder: selected.length > 0 ? "" : text("searchIn", { label: config.label }),
69
69
  className: "h-6 min-w-16 flex-1 bg-transparent text-foreground outline-none placeholder:text-faint-foreground",
70
70
  value: query,
71
71
  onChange: (event) => search(event.target.value),
@@ -16,7 +16,7 @@ const FacetGroup = ({ config, selected, onToggle }) => {
16
16
  config.searchable && /* @__PURE__ */ jsx(Input, {
17
17
  wrapperClassName: "mb-1 h-7",
18
18
  leading: /* @__PURE__ */ jsx(Search, { className: "size-3.5" }),
19
- placeholder: text("searchIn", config.label),
19
+ placeholder: text("searchIn", { label: config.label }),
20
20
  value: query,
21
21
  onChange: (event) => setQuery(event.target.value)
22
22
  }),
@@ -1,52 +1,5 @@
1
- import { defineMessages } from "../locale/messages.js";
1
+ import { messages } from "../locale/messages.js";
2
2
  //#region src/filter-panel/messages.ts
3
- const text = defineMessages({
4
- en: {
5
- today: "Today",
6
- yesterday: "Yesterday",
7
- "24h": "Last 24 hours",
8
- "7d": "Last 7 days",
9
- "30d": "Last 30 days",
10
- "90d": "Last 90 days",
11
- month: "This month",
12
- quarter: "This quarter",
13
- year: "This year",
14
- unknownPreset: (id) => `The server offers the preset "${id}", which this UI does not know`,
15
- unsupported: (id) => `${id} (unsupported)`,
16
- remove: (label) => `Remove ${label}`,
17
- clearAll: "Clear all",
18
- searchIn: (label) => `Search ${label.toLowerCase()}`,
19
- noMatches: "No matches",
20
- moreFilters: "More filters",
21
- filters: "Filters",
22
- date: "Date",
23
- showOnly: "Show only",
24
- minimum: (label) => `${label} minimum`,
25
- maximum: (label) => `${label} maximum`
26
- },
27
- nl: {
28
- today: "Vandaag",
29
- yesterday: "Gisteren",
30
- "24h": "Afgelopen 24 uur",
31
- "7d": "Afgelopen 7 dagen",
32
- "30d": "Afgelopen 30 dagen",
33
- "90d": "Afgelopen 90 dagen",
34
- month: "Deze maand",
35
- quarter: "Dit kwartaal",
36
- year: "Dit jaar",
37
- unknownPreset: (id) => `De server biedt de periode "${id}", die deze UI niet kent`,
38
- unsupported: (id) => `${id} (niet ondersteund)`,
39
- remove: (label) => `${label} verwijderen`,
40
- clearAll: "Alles wissen",
41
- searchIn: (label) => `Zoeken in ${label.toLowerCase()}`,
42
- noMatches: "Niets gevonden",
43
- moreFilters: "Meer filters",
44
- filters: "Filters",
45
- date: "Datum",
46
- showOnly: "Alleen tonen",
47
- minimum: (label) => `${label} minimum`,
48
- maximum: (label) => `${label} maximum`
49
- }
50
- });
3
+ const text = messages("filter-panel");
51
4
  //#endregion
52
5
  export { text };
@@ -49,7 +49,7 @@ const RangeFilter = ({ config, value, onChange }) => {
49
49
  children: [0, 1].map((thumb) => /* @__PURE__ */ jsx("input", {
50
50
  type: "range",
51
51
  className: "pb-range",
52
- "aria-label": thumb === 0 ? text("minimum", config.label) : text("maximum", config.label),
52
+ "aria-label": thumb === 0 ? text("minimum", { label: config.label }) : text("maximum", { label: config.label }),
53
53
  min,
54
54
  max,
55
55
  step,
@@ -63,10 +63,10 @@ const formatDayRange = (from, to) => day().formatRange(from, to);
63
63
  /** "09:30": an instant's time on the clock of `zone`, the viewer's unless given. */
64
64
  const formatTime = (ms, zone = viewerZone()) => zonedFormats(zone).time.format(ms);
65
65
  const formatAgo = (seconds) => {
66
- if (seconds < 60) return text("secondsAgo", seconds);
67
- if (seconds < 3600) return text("minutesAgo", Math.floor(seconds / 60));
68
- if (seconds < 86400) return text("hoursAgo", Math.floor(seconds / 3600));
69
- return text("daysAgo", Math.floor(seconds / 86400));
66
+ if (seconds < 60) return text("secondsAgo", { count: seconds });
67
+ if (seconds < 3600) return text("minutesAgo", { count: Math.floor(seconds / 60) });
68
+ if (seconds < 86400) return text("hoursAgo", { count: Math.floor(seconds / 3600) });
69
+ return text("daysAgo", { count: Math.floor(seconds / 86400) });
70
70
  };
71
71
  const relative = () => cachedFormat("relative", (tag) => new Intl.RelativeTimeFormat(tag, { numeric: "auto" }));
72
72
  const units = [
@@ -1,24 +1,5 @@
1
- import { defineMessages } from "../locale/messages.js";
1
+ import { messages } from "../locale/messages.js";
2
2
  //#region src/format/messages.ts
3
- const text = defineMessages({
4
- en: {
5
- rows: (count, one) => `${count} ${one ? "row" : "rows"}`,
6
- aboutRows: (count) => `about ${count} rows`,
7
- secondsAgo: (count) => `${count} s ago`,
8
- minutesAgo: (count) => `${count} min ago`,
9
- hoursAgo: (count) => `${count} h ago`,
10
- daysAgo: (count) => `${count} d ago`,
11
- justNow: "just now"
12
- },
13
- nl: {
14
- rows: (count, one) => `${count} ${one ? "rij" : "rijen"}`,
15
- aboutRows: (count) => `ongeveer ${count} rijen`,
16
- secondsAgo: (count) => `${count} s geleden`,
17
- minutesAgo: (count) => `${count} min geleden`,
18
- hoursAgo: (count) => `${count} u geleden`,
19
- daysAgo: (count) => `${count} d geleden`,
20
- justNow: "zojuist"
21
- }
22
- });
3
+ const text = messages("format");
23
4
  //#endregion
24
5
  export { text };
@@ -9,6 +9,6 @@ const formatterFor = (currency, decimals) => cachedFormat(`money:${currency}:${d
9
9
  }
10
10
  }));
11
11
  /** An amount in cents in the currency, with its usual decimals or `decimals` of them. */
12
- const formatMoney = (cents, currency = "EUR", decimals) => formatterFor(currency, decimals).format(cents / 100);
12
+ const formatMoney = (cents, currency, decimals) => formatterFor(currency, decimals).format(cents / 100);
13
13
  //#endregion
14
14
  export { formatMoney };
@@ -6,9 +6,12 @@ const formatInt = (value) => grouped().format(value);
6
6
  const formatSigned = (value) => value > 0 ? `+${grouped().format(value)}` : grouped().format(value).replace("-", "−");
7
7
  const formatPercent = (value) => `${value}%`;
8
8
  const formatApproxRows = (count) => {
9
- if (count < 1e4) return text("rows", formatInt(count), count === 1);
9
+ if (count < 1e4) return text("rows", {
10
+ count: formatInt(count),
11
+ n: count
12
+ });
10
13
  const magnitude = 10 ** (Math.floor(Math.log10(count)) - 3);
11
- return text("aboutRows", formatInt(Math.round(count / magnitude) * magnitude));
14
+ return text("aboutRows", { count: formatInt(Math.round(count / magnitude) * magnitude) });
12
15
  };
13
16
  //#endregion
14
17
  export { formatApproxRows, formatInt, formatPercent, formatSigned };
@@ -1,24 +1,5 @@
1
- import { defineMessages } from "../locale/messages.js";
1
+ import { messages } from "../locale/messages.js";
2
2
  //#region src/forms/messages.ts
3
- const text = defineMessages({
4
- en: {
5
- loading: "Loading",
6
- notFound: "Not found",
7
- noForm: "There is no form at this address.",
8
- setByDatabase: "Set by the database",
9
- notSent: "Not sent",
10
- send: "Send",
11
- checkTooLong: "The check that you are not a bot took too long; send the form again"
12
- },
13
- nl: {
14
- loading: "Laden",
15
- notFound: "Niet gevonden",
16
- noForm: "Er is geen formulier op dit adres.",
17
- setByDatabase: "Ingevuld door de database",
18
- notSent: "Niet verzonden",
19
- send: "Verzenden",
20
- checkTooLong: "De controle of je geen bot bent duurde te lang; verzend het formulier opnieuw"
21
- }
22
- });
3
+ const text = messages("forms");
23
4
  //#endregion
24
5
  export { text };
@@ -17,10 +17,25 @@ const announcementsFor = (lines, lineName) => {
17
17
  };
18
18
  const place = (id) => lines.findIndex((line) => line.id === id) + 1;
19
19
  return {
20
- onDragStart: ({ active }) => text("pickedUp", name(active.id), place(active.id), lines.length),
21
- onDragOver: ({ active, over }) => over ? text("over", name(active.id), place(over.id), lines.length) : void 0,
22
- onDragEnd: ({ active, over }) => over ? text("dropped", name(active.id), place(over.id), lines.length) : text("droppedAtStart", name(active.id)),
23
- onDragCancel: ({ active }) => text("cancelled", name(active.id), place(active.id))
20
+ onDragStart: ({ active }) => text("pickedUp", {
21
+ name: name(active.id),
22
+ place: place(active.id),
23
+ count: lines.length
24
+ }),
25
+ onDragOver: ({ active, over }) => over ? text("over", {
26
+ name: name(active.id),
27
+ place: place(over.id),
28
+ count: lines.length
29
+ }) : void 0,
30
+ onDragEnd: ({ active, over }) => over ? text("dropped", {
31
+ name: name(active.id),
32
+ place: place(over.id),
33
+ count: lines.length
34
+ }) : text("droppedAtStart", { name: name(active.id) }),
35
+ onDragCancel: ({ active }) => text("cancelled", {
36
+ name: name(active.id),
37
+ place: place(active.id)
38
+ })
24
39
  };
25
40
  };
26
41
  /** The lines of a record as rows of the given columns, put in order by dragging or from each row's menu. */
@@ -37,7 +37,7 @@ const LineRow = ({ line, name, columns, position, count, reorderable, onRemove,
37
37
  reorderable ? /* @__PURE__ */ jsx("button", {
38
38
  ref: setActivatorNodeRef,
39
39
  type: "button",
40
- "aria-label": text("dragToReorder", name),
40
+ "aria-label": text("dragToReorder", { name }),
41
41
  ...attributes,
42
42
  ...listeners,
43
43
  style: { touchAction: "none" },
@@ -49,7 +49,7 @@ const LineRow = ({ line, name, columns, position, count, reorderable, onRemove,
49
49
  children: column.cell(line)
50
50
  }, column.key)),
51
51
  menu.length > 0 ? /* @__PURE__ */ jsx(LineMenu, {
52
- label: text("actionsFor", name),
52
+ label: text("actionsFor", { name }),
53
53
  items: menu
54
54
  }) : /* @__PURE__ */ jsx("span", {}),
55
55
  error && /* @__PURE__ */ jsx("p", {
@@ -1,38 +1,5 @@
1
- import { defineMessages } from "../locale/messages.js";
1
+ import { messages } from "../locale/messages.js";
2
2
  //#region src/inline-child-table/messages.ts
3
- const text = defineMessages({
4
- en: {
5
- instructions: "To pick up a line, press space or enter on its drag handle. Use the up and down arrow keys to move it, space or enter to drop it, and escape to cancel. The row menu also has Move up and Move down.",
6
- line: "line",
7
- pickedUp: (name, place, count) => `Picked up ${name}, line ${place} of ${count}.`,
8
- over: (name, place, count) => `${name} is over line ${place} of ${count}.`,
9
- dropped: (name, place, count) => `${name} was dropped at line ${place} of ${count}.`,
10
- droppedAtStart: (name) => `${name} was dropped where it started.`,
11
- cancelled: (name, place) => `Moving ${name} was cancelled. It is back at line ${place}.`,
12
- addLine: "Add line",
13
- noLines: "No lines yet.",
14
- moveUp: "Move up",
15
- moveDown: "Move down",
16
- removeLine: "Remove line",
17
- dragToReorder: (name) => `Drag to reorder ${name}`,
18
- actionsFor: (name) => `Actions for ${name}`
19
- },
20
- nl: {
21
- instructions: "Druk op spatie of enter op de sleepgreep om een regel op te pakken. Verplaats hem met de pijltjestoetsen omhoog en omlaag, zet hem neer met spatie of enter, en annuleer met escape. Het regelmenu heeft ook Omhoog en Omlaag.",
22
- line: "regel",
23
- pickedUp: (name, place, count) => `${name} opgepakt, regel ${place} van ${count}.`,
24
- over: (name, place, count) => `${name} is boven regel ${place} van ${count}.`,
25
- dropped: (name, place, count) => `${name} is neergezet op regel ${place} van ${count}.`,
26
- droppedAtStart: (name) => `${name} is neergezet waar hij begon.`,
27
- cancelled: (name, place) => `Verplaatsen van ${name} is geannuleerd. Hij staat weer op regel ${place}.`,
28
- addLine: "Regel toevoegen",
29
- noLines: "Nog geen regels.",
30
- moveUp: "Omhoog",
31
- moveDown: "Omlaag",
32
- removeLine: "Regel verwijderen",
33
- dragToReorder: (name) => `Sleep om ${name} te verplaatsen`,
34
- actionsFor: (name) => `Acties voor ${name}`
35
- }
36
- });
3
+ const text = messages("inline-child-table");
37
4
  //#endregion
38
5
  export { text };
@@ -1,14 +1,13 @@
1
- import { slotted } from "../locale/slotted.js";
2
1
  import { text } from "./messages.js";
3
2
  import { jsx } from "react/jsx-runtime";
4
3
  //#region src/invitations/link-notice.tsx
5
4
  /** The invitation link to pass on, when the app cannot email it. */
6
5
  const LinkNotice = ({ link }) => link ? /* @__PURE__ */ jsx("p", {
7
6
  className: "mt-3 break-all rounded-md border bg-muted px-3 py-2 text-xs",
8
- children: slotted(text("passLinkOn"), /* @__PURE__ */ jsx("span", {
7
+ children: text.rich("passLinkOn", { link: /* @__PURE__ */ jsx("span", {
9
8
  className: "font-mono",
10
9
  children: link
11
- }))
10
+ }) })
12
11
  }) : null;
13
12
  //#endregion
14
13
  export { LinkNotice };
@@ -1,24 +1,5 @@
1
- import { defineMessages } from "../locale/messages.js";
1
+ import { messages } from "../locale/messages.js";
2
2
  //#region src/invitations/messages.ts
3
- const text = defineMessages({
4
- en: {
5
- email: "Email",
6
- invite: "Invite",
7
- expired: "Expired",
8
- until: (date) => `Until ${date}`,
9
- sendAgain: "Send again",
10
- revoke: "Revoke",
11
- passLinkOn: "This app cannot send email, so pass this link on yourself. It works once, until the invitation expires: {}"
12
- },
13
- nl: {
14
- email: "E-mailadres",
15
- invite: "Uitnodigen",
16
- expired: "Verlopen",
17
- until: (date) => `Tot ${date}`,
18
- sendAgain: "Opnieuw sturen",
19
- revoke: "Intrekken",
20
- passLinkOn: "Deze app kan geen e-mail sturen, dus geef deze link zelf door. Die werkt één keer, tot de uitnodiging verloopt: {}"
21
- }
22
- });
3
+ const text = messages("invitations");
23
4
  //#endregion
24
5
  export { text };
@@ -28,7 +28,7 @@ const PendingInvitationRow = ({ email, gives, expiresAt, onResend, onRevoke }) =
28
28
  children: [
29
29
  gives,
30
30
  " · ",
31
- expired ? text("expired") : text("until", new Date(expiresAt).toLocaleDateString(formatTag()))
31
+ expired ? text("expired") : text("until", { date: new Date(expiresAt).toLocaleDateString(formatTag()) })
32
32
  ]
33
33
  })]
34
34
  }),
@@ -1,8 +1,5 @@
1
- import { defineMessages } from "../locale/messages.js";
1
+ import { messages } from "../locale/messages.js";
2
2
  //#region src/lists/messages.ts
3
- const text = defineMessages({
4
- en: { showMore: "Show more" },
5
- nl: { showMore: "Meer tonen" }
6
- });
3
+ const text = messages("lists");
7
4
  //#endregion
8
5
  export { text };