@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
@@ -3,7 +3,6 @@ import { text } from "./messages.js";
3
3
  import { boardCard, boardColumns, boardRank } from "./board-columns.js";
4
4
  import { useProjectUi } from "../pages/project-ui.js";
5
5
  import { Problem } from "../pages/problem.js";
6
- import { slotted } from "../../locale/slotted.js";
7
6
  import { can } from "../permissions.js";
8
7
  import { RecordCard } from "./record-card.js";
9
8
  import { listHandOrder } from "../hand-order/hand-order.js";
@@ -77,7 +76,7 @@ const BoardDisplay = ({ model, view, display, fields, filter, orderBy, limit })
77
76
  },
78
77
  coordinateGetter: cardCoordinates
79
78
  }));
80
- if (dropName !== void 0 && !drop) return /* @__PURE__ */ jsx(Problem, { children: slotted(text("noDrop"), dropName) });
79
+ if (dropName !== void 0 && !drop) return /* @__PURE__ */ jsx(Problem, { children: text.rich("noDrop", { drop: dropName }) });
81
80
  const columnOf = (id) => columns.find((column) => columnId(column.value) === id);
82
81
  const valueOf = (row) => row.record[display.by] ?? null;
83
82
  const crosses = (row, to) => takes(valueOf(row)) && takes(to.value);
@@ -87,8 +86,15 @@ const BoardDisplay = ({ model, view, display, fields, filter, orderBy, limit })
87
86
  if (!place) return { over: columnOf(over.id)?.label ?? text("noColumn") };
88
87
  const count = place.rows.some((entry) => entry.key === row.key) ? place.rows.length : place.rows.length + 1;
89
88
  return {
90
- over: text("placeOf", place.column.label, place.index + 1, count),
91
- place: text("place", place.column.label, place.index + 1)
89
+ over: text("placeOf", {
90
+ column: place.column.label,
91
+ place: place.index + 1,
92
+ count
93
+ }),
94
+ place: text("place", {
95
+ column: place.column.label,
96
+ place: place.index + 1
97
+ })
92
98
  };
93
99
  };
94
100
  const refused = (row, over) => {
@@ -96,15 +102,21 @@ const BoardDisplay = ({ model, view, display, fields, filter, orderBy, limit })
96
102
  return target !== void 0 && target.value !== valueOf(row) && !crosses(row, target);
97
103
  };
98
104
  const announcements = {
99
- onDragStart: ({ active: picked }) => text("pickedUp", title(picked.data.current.row)),
100
- onDragOver: ({ active: picked, over }) => text("isOver", title(picked.data.current.row), announced(picked.data.current.row, over).over),
105
+ onDragStart: ({ active: picked }) => text("pickedUp", { title: title(picked.data.current.row) }),
106
+ onDragOver: ({ active: picked, over }) => text("isOver", {
107
+ title: title(picked.data.current.row),
108
+ over: announced(picked.data.current.row, over).over
109
+ }),
101
110
  onDragEnd: ({ active: picked, over }) => {
102
111
  const row = picked.data.current.row;
103
- if (!over || refused(row, over)) return text("putBack", title(row));
112
+ if (!over || refused(row, over)) return text("putBack", { title: title(row) });
104
113
  const said = announced(row, over);
105
- return text("wasMovedTo", title(row), said.place ?? said.over);
114
+ return text("wasMovedTo", {
115
+ title: title(row),
116
+ to: said.place ?? said.over
117
+ });
106
118
  },
107
- onDragCancel: ({ active: picked }) => text("cancelled", title(picked.data.current.row))
119
+ onDragCancel: ({ active: picked }) => text("cancelled", { title: title(picked.data.current.row) })
108
120
  };
109
121
  const start = ({ active: picked }) => {
110
122
  dragged.current = true;
@@ -2,8 +2,8 @@ import { cn } from "../../lib/cn.js";
2
2
  import { usePermissions } from "../meta-gate.js";
3
3
  import { dayIn, viewerZone } from "../../format/zone.js";
4
4
  import { formatDate, formatWeekday } from "../../format/date.js";
5
- import { Skeleton } from "../../primitives/skeleton.js";
6
5
  import { text } from "./messages.js";
6
+ import { Skeleton } from "../../primitives/skeleton.js";
7
7
  import { AppLink } from "../use-app-address.js";
8
8
  import { ErrorBanner } from "../error-banner.js";
9
9
  import { can, rowAllows } from "../permissions.js";
@@ -58,10 +58,16 @@ const CalendarDisplay = ({ model, view, display, fields, filter, at, linkTo, now
58
58
  const dayText = (id) => formatDate(Date.parse(`${String(id).slice(dayId("").length)}T00:00:00Z`));
59
59
  const title = (picked) => eventTitle(model, view, display, picked.row);
60
60
  const announcements = {
61
- onDragStart: ({ active: picked }) => text("pickedUp", title(picked.data.current)),
62
- onDragOver: ({ active: picked, over }) => text("isOver", title(picked.data.current), over ? dayText(over.id) : text("noDay")),
63
- onDragEnd: ({ active: picked, over }) => over ? text("wasMovedTo", title(picked.data.current), dayText(over.id)) : text("putBack", title(picked.data.current)),
64
- onDragCancel: ({ active: picked }) => text("cancelled", title(picked.data.current))
61
+ onDragStart: ({ active: picked }) => text("pickedUp", { title: title(picked.data.current) }),
62
+ onDragOver: ({ active: picked, over }) => text("isOver", {
63
+ title: title(picked.data.current),
64
+ over: over ? dayText(over.id) : text("noDay")
65
+ }),
66
+ onDragEnd: ({ active: picked, over }) => over ? text("wasMovedTo", {
67
+ title: title(picked.data.current),
68
+ to: dayText(over.id)
69
+ }) : text("putBack", { title: title(picked.data.current) }),
70
+ onDragCancel: ({ active: picked }) => text("cancelled", { title: title(picked.data.current) })
65
71
  };
66
72
  const release = () => {
67
73
  setActive(void 0);
@@ -82,7 +88,7 @@ const CalendarDisplay = ({ model, view, display, fields, filter, at, linkTo, now
82
88
  scale: "week",
83
89
  day
84
90
  }, now);
85
- const label = text("moreHidden", hidden);
91
+ const label = text("moreHidden", { count: hidden });
86
92
  const className = "self-start rounded px-1 text-xs text-muted-foreground hover:text-foreground focus-visible:outline-2 focus-visible:outline-primary";
87
93
  return linkTo ? /* @__PURE__ */ jsx(AppLink, {
88
94
  to: linkTo(to),
@@ -110,7 +116,10 @@ const CalendarDisplay = ({ model, view, display, fields, filter, at, linkTo, now
110
116
  }),
111
117
  list.capped && /* @__PURE__ */ jsx("p", {
112
118
  className: "text-xs text-muted-foreground",
113
- children: text("capped", 500, shown.scale)
119
+ children: text("capped", {
120
+ limit: 500,
121
+ unit: shown.scale
122
+ })
114
123
  }),
115
124
  /* @__PURE__ */ jsxs(DndContext, {
116
125
  sensors,
@@ -1,7 +1,7 @@
1
1
  import { cn } from "../../lib/cn.js";
2
- import { Skeleton } from "../../primitives/skeleton.js";
3
2
  import { humanize } from "../../live/naming.js";
4
3
  import { text } from "./messages.js";
4
+ import { Skeleton } from "../../primitives/skeleton.js";
5
5
  import { RecordCard } from "./record-card.js";
6
6
  import { DisplayFooter, DisplayState } from "./display-frame.js";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -13,7 +13,7 @@ const CardsDisplay = ({ model, view, display, list, row = false, footer = true }
13
13
  const plural = (view?.names?.plural ?? humanize(model.name)).toLowerCase();
14
14
  return /* @__PURE__ */ jsxs(DisplayState, {
15
15
  list,
16
- empty: text("noneMatch", plural),
16
+ empty: text("noneMatch", { plural }),
17
17
  loading: /* @__PURE__ */ jsx("div", {
18
18
  className: grid,
19
19
  children: Array.from({ length: 6 }, (_, index) => /* @__PURE__ */ jsx(Skeleton, { className: "h-24" }, index))
@@ -1,7 +1,6 @@
1
1
  import { text } from "./messages.js";
2
2
  import { useProjectUi } from "../pages/project-ui.js";
3
3
  import { Problem } from "../pages/problem.js";
4
- import { slotted } from "../../locale/slotted.js";
5
4
  import { CustomBoundary } from "../pages/custom-boundary.js";
6
5
  import { ListDisplayProvider } from "./display-context.js";
7
6
  import { unmarkFieldRefs } from "@protobase/schema/internal";
@@ -14,7 +13,7 @@ import { jsx } from "react/jsx-runtime";
14
13
  const CustomDisplay = ({ display, list }) => {
15
14
  const { components } = useProjectUi();
16
15
  const Component = components?.[display.component];
17
- if (!Component) return /* @__PURE__ */ jsx(Problem, { children: slotted(text("noComponent"), display.component) });
16
+ if (!Component) return /* @__PURE__ */ jsx(Problem, { children: text.rich("noComponent", { component: display.component }) });
18
17
  return /* @__PURE__ */ jsx(ListDisplayProvider, {
19
18
  value: list,
20
19
  children: /* @__PURE__ */ jsx("div", {
@@ -1,7 +1,7 @@
1
- import { Skeleton } from "../../primitives/skeleton.js";
2
1
  import { humanize } from "../../live/naming.js";
3
2
  import { text } from "./messages.js";
4
3
  import { displayRow } from "./list-displays.js";
4
+ import { Skeleton } from "../../primitives/skeleton.js";
5
5
  import { ErrorBanner } from "../error-banner.js";
6
6
  import { RecordCard } from "./record-card.js";
7
7
  import { VirtualCards } from "./virtual-cards.js";
@@ -27,7 +27,7 @@ const ListCards = ({ model, view, display, list, empty }) => {
27
27
  });
28
28
  if (!list.source || list.source.total === 0) return empty ?? /* @__PURE__ */ jsx("p", {
29
29
  className: "py-8 text-center text-muted-foreground",
30
- children: text("noneMatch", plural.toLowerCase())
30
+ children: text("noneMatch", { plural: plural.toLowerCase() })
31
31
  });
32
32
  return /* @__PURE__ */ jsx(VirtualCards, {
33
33
  source: list.source,
@@ -55,11 +55,24 @@ const MapDisplay = ({ model, view, display, filter, orderBy, fields, at, onMove,
55
55
  const approximate = new Set(points.filter((point) => point.approximate).map((point) => point.key));
56
56
  const markerLabel = (keys) => {
57
57
  const near = keys.filter((key) => approximate.has(key)).length;
58
- if (keys.length === 1) return near === 1 ? text("showOneApproximate", singular) : text("showOne", singular);
59
- if (near === 0) return text("showMany", keys.length, plural);
60
- return near === keys.length ? text("showManyApproximate", keys.length, plural) : text("showManySomeApproximate", keys.length, plural, near);
58
+ if (keys.length === 1) return near === 1 ? text("showOneApproximate", { singular }) : text("showOne", { singular });
59
+ if (near === 0) return text("showMany", {
60
+ count: keys.length,
61
+ plural
62
+ });
63
+ return near === keys.length ? text("showManyApproximate", {
64
+ count: keys.length,
65
+ plural
66
+ }) : text("showManySomeApproximate", {
67
+ count: keys.length,
68
+ plural,
69
+ near
70
+ });
61
71
  };
62
- const bucketLabel = (count) => text("zoomIn", count.toLocaleString(formatTag()), count === 1 ? singular : plural);
72
+ const bucketLabel = (count) => text("zoomIn", {
73
+ count: count.toLocaleString(formatTag()),
74
+ noun: count === 1 ? singular : plural
75
+ });
63
76
  const overlay = useRef(null);
64
77
  const [covered, setCovered] = useState(0);
65
78
  useLayoutEffect(() => setCovered(overlay.current?.offsetHeight ?? 0), [row?.key]);
@@ -107,7 +120,7 @@ const MapDisplay = ({ model, view, display, filter, orderBy, fields, at, onMove,
107
120
  children: /* @__PURE__ */ jsxs("p", {
108
121
  className: "pointer-events-auto flex items-center gap-3 rounded-full border border-border bg-background px-4 py-1.5 text-muted-foreground shadow",
109
122
  role: "status",
110
- children: [fitting ? text("noneMatch", plural) : text("noneHere", plural), !fitting && /* @__PURE__ */ jsx(Button, {
123
+ children: [fitting ? text("noneMatch", { plural }) : text("noneHere", { plural }), !fitting && /* @__PURE__ */ jsx(Button, {
111
124
  size: "sm",
112
125
  onClick: () => setFitting(true),
113
126
  children: text("showAll")
@@ -120,7 +133,7 @@ const MapDisplay = ({ model, view, display, filter, orderBy, fields, at, onMove,
120
133
  children: /* @__PURE__ */ jsxs("div", {
121
134
  className: "pointer-events-auto flex w-full max-w-[16rem] flex-col gap-2 sm:max-w-xs",
122
135
  role: "group",
123
- "aria-label": text("chosen", singular),
136
+ "aria-label": text("chosen", { singular }),
124
137
  children: [/* @__PURE__ */ jsxs("div", {
125
138
  className: "flex items-center justify-end gap-1.5",
126
139
  children: [
@@ -1,150 +1,5 @@
1
- import { defineMessages } from "../../locale/messages.js";
1
+ import { messages } from "../../locale/messages.js";
2
2
  //#region src/app/displays/messages.ts
3
- const text = defineMessages({
4
- en: {
5
- table: "Table",
6
- display: "Display",
7
- sort: "Sort",
8
- ascending: "ascending",
9
- descending: "descending",
10
- movedTo: (column) => `Moved to ${column}`,
11
- orderChanged: "Order changed",
12
- stayedIn: (column) => `Saved, still in ${column}`,
13
- undo: "Undo",
14
- couldNotUndo: "Could not undo",
15
- couldNotLoadRows: "Could not load rows",
16
- noPlural: (plural) => `No ${plural}`,
17
- noValue: (label) => `No ${label.toLowerCase()}`,
18
- somethingWrong: "Something went wrong",
19
- showMore: "Show more",
20
- noDrop: "No board drop is registered as {}. Give it in boardDrops in protobase.ui.tsx, or load the plugin that provides it.",
21
- noComponent: "No component is registered as {}. Export it from protobase.ui.tsx, or load the plugin that provides it.",
22
- pickedUp: (title) => `Picked up ${title}.`,
23
- isOver: (title, over) => `${title} is over ${over}.`,
24
- putBack: (title) => `${title} was put back.`,
25
- wasMovedTo: (title, to) => `${title} was moved to ${to}.`,
26
- cancelled: (title) => `Moving ${title} was cancelled.`,
27
- startsOn: (title, day) => `${title} starts on ${day}.`,
28
- noColumn: "no column",
29
- noDay: "no day",
30
- placeOf: (column, place, count) => `${column}, place ${place} of ${count}`,
31
- place: (column, place) => `${column}, place ${place}`,
32
- boardAcross: "To move a card to another column, press Space, move it with the left and right arrow keys, and press Space again to drop it there. Escape puts it back.",
33
- boardAnywhere: "To move a card, press Space, move it with the up and down arrow keys within its column and the left and right arrow keys to another column, and press Space again to drop it there. Escape puts it back.",
34
- boardWithin: "To move a card, press Space, move it with the up and down arrow keys within its column, and press Space again to drop it there. Escape puts it back.",
35
- calendarInstructions: "To move an event to another day, press Space, move it a day with the left and right arrow keys or a week with the up and down arrow keys, and press Space again to drop it there. Escape puts it back.",
36
- timelineInstructions: "To move a bar to other days, press Space, move it a day with the left and right arrow keys, and press Space again to drop it there. Escape puts it back.",
37
- week: "Week",
38
- month: "Month",
39
- quarter: "Quarter",
40
- calendarScale: "Calendar scale",
41
- timelineScale: "Timeline scale",
42
- previousPeriod: (unit) => `Previous ${unit}`,
43
- nextPeriod: (unit) => `Next ${unit}`,
44
- today: "Today",
45
- capped: (limit, unit) => `Showing the first ${limit} records of this ${unit}. Narrow the filter to see the rest.`,
46
- nothingIn: (unit) => `Nothing in this ${unit}.`,
47
- noneMatch: (plural) => `No ${plural} match.`,
48
- list: "List",
49
- showOneApproximate: (singular) => `Show the ${singular}, at an approximate position`,
50
- showOne: (singular) => `Show the ${singular}`,
51
- showMany: (count, plural) => `Show ${count} ${plural}`,
52
- showManyApproximate: (count, plural) => `Show ${count} ${plural}, at approximate positions`,
53
- showManySomeApproximate: (count, plural, near) => `Show ${count} ${plural}, ${near} at approximate positions`,
54
- zoomIn: (count, noun) => `Zoom in on ${count} ${noun}`,
55
- needsStyle: "The map display needs a map style: set PROTOBASE_MAP_STYLE_URL.",
56
- noneHere: (plural) => `No ${plural} in this part of the map.`,
57
- showAll: "Show all",
58
- chosen: (singular) => `Chosen ${singular}`,
59
- approximatePosition: "Approximate position",
60
- previous: "Previous",
61
- next: "Next",
62
- close: "Close",
63
- features: "Features",
64
- couldNotReorder: "Could not change the order",
65
- couldNotMoveTo: (to) => `Could not move it to ${to}`,
66
- moreHidden: (count) => `+${count} more`
67
- },
68
- nl: {
69
- table: "Tabel",
70
- display: "Weergave",
71
- sort: "Sorteren",
72
- ascending: "oplopend",
73
- descending: "aflopend",
74
- movedTo: (column) => `Verplaatst naar ${column}`,
75
- orderChanged: "Volgorde gewijzigd",
76
- stayedIn: (column) => `Opgeslagen, nog in ${column}`,
77
- undo: "Ongedaan maken",
78
- couldNotUndo: "Kon niet ongedaan maken",
79
- couldNotLoadRows: "Kon de rijen niet laden",
80
- noPlural: (plural) => `Geen ${plural}`,
81
- noValue: (label) => `Geen ${label.toLowerCase()}`,
82
- somethingWrong: "Er ging iets mis",
83
- showMore: "Meer tonen",
84
- noDrop: "Er is geen bordactie geregistreerd als {}. Geef die in boardDrops in protobase.ui.tsx, of laad de plug-in die haar levert.",
85
- noComponent: "Er is geen component geregistreerd als {}. Exporteer die uit protobase.ui.tsx, of laad de plug-in die haar levert.",
86
- pickedUp: (title) => `${title} opgepakt.`,
87
- isOver: (title, over) => `${title} is boven ${over}.`,
88
- putBack: (title) => `${title} is teruggezet.`,
89
- wasMovedTo: (title, to) => `${title} is verplaatst naar ${to}.`,
90
- cancelled: (title) => `Verplaatsen van ${title} is geannuleerd.`,
91
- startsOn: (title, day) => `${title} begint op ${day}.`,
92
- noColumn: "geen kolom",
93
- noDay: "geen dag",
94
- placeOf: (column, place, count) => `${column}, plaats ${place} van ${count}`,
95
- place: (column, place) => `${column}, plaats ${place}`,
96
- boardAcross: "Druk op Spatie om een kaart naar een andere kolom te verplaatsen, verplaats haar met de pijltjestoetsen links en rechts, en druk nogmaals op Spatie om haar daar neer te zetten. Escape zet haar terug.",
97
- boardAnywhere: "Druk op Spatie om een kaart te verplaatsen, verplaats haar met de pijltjestoetsen omhoog en omlaag binnen haar kolom en met links en rechts naar een andere kolom, en druk nogmaals op Spatie om haar daar neer te zetten. Escape zet haar terug.",
98
- boardWithin: "Druk op Spatie om een kaart te verplaatsen, verplaats haar met de pijltjestoetsen omhoog en omlaag binnen haar kolom, en druk nogmaals op Spatie om haar daar neer te zetten. Escape zet haar terug.",
99
- calendarInstructions: "Druk op Spatie om een gebeurtenis naar een andere dag te verplaatsen, verplaats haar een dag met de pijltjestoetsen links en rechts of een week met omhoog en omlaag, en druk nogmaals op Spatie om haar daar neer te zetten. Escape zet haar terug.",
100
- timelineInstructions: "Druk op Spatie om een balk naar andere dagen te verplaatsen, verplaats hem een dag met de pijltjestoetsen links en rechts, en druk nogmaals op Spatie om hem daar neer te zetten. Escape zet hem terug.",
101
- week: "Week",
102
- month: "Maand",
103
- quarter: "Kwartaal",
104
- calendarScale: "Schaal van de kalender",
105
- timelineScale: "Schaal van de tijdlijn",
106
- previousPeriod: (unit) => ({
107
- week: "Vorige week",
108
- month: "Vorige maand",
109
- quarter: "Vorig kwartaal"
110
- })[unit],
111
- nextPeriod: (unit) => ({
112
- week: "Volgende week",
113
- month: "Volgende maand",
114
- quarter: "Volgend kwartaal"
115
- })[unit],
116
- today: "Vandaag",
117
- capped: (limit, unit) => `De eerste ${limit} records van ${{
118
- week: "deze week",
119
- month: "deze maand",
120
- quarter: "dit kwartaal"
121
- }[unit]} worden getoond. Verfijn het filter om de rest te zien.`,
122
- nothingIn: (unit) => `Niets in ${{
123
- week: "deze week",
124
- month: "deze maand",
125
- quarter: "dit kwartaal"
126
- }[unit]}.`,
127
- noneMatch: (plural) => `Geen ${plural} gevonden.`,
128
- list: "Lijst",
129
- showOneApproximate: (singular) => `${singular} tonen, op een geschatte plek`,
130
- showOne: (singular) => `${singular} tonen`,
131
- showMany: (count, plural) => `${count} ${plural} tonen`,
132
- showManyApproximate: (count, plural) => `${count} ${plural} tonen, op geschatte plekken`,
133
- showManySomeApproximate: (count, plural, near) => `${count} ${plural} tonen, ${near} op geschatte plekken`,
134
- zoomIn: (count, noun) => `Inzoomen op ${count} ${noun}`,
135
- needsStyle: "De kaartweergave heeft een kaartstijl nodig: stel PROTOBASE_MAP_STYLE_URL in.",
136
- noneHere: (plural) => `Geen ${plural} in dit deel van de kaart.`,
137
- showAll: "Alles tonen",
138
- chosen: (singular) => `Gekozen ${singular}`,
139
- approximatePosition: "Geschatte plek",
140
- previous: "Vorige",
141
- next: "Volgende",
142
- close: "Sluiten",
143
- features: "Kenmerken",
144
- couldNotReorder: "Kon de volgorde niet wijzigen",
145
- couldNotMoveTo: (to) => `Kon het niet naar ${to} verplaatsen`,
146
- moreHidden: (count) => `+${count} meer`
147
- }
148
- });
3
+ const text = messages("app/displays");
149
4
  //#endregion
150
5
  export { text };
@@ -39,9 +39,9 @@ const PeriodControls = ({ heading, unit, previous, today, next, scales, scalesLa
39
39
  children: [/* @__PURE__ */ jsxs("div", {
40
40
  className: "flex items-center gap-1",
41
41
  children: [
42
- control(previous, square, text("previousPeriod", unit), /* @__PURE__ */ jsx(ChevronLeft, { className: "size-3.5" })),
42
+ control(previous, square, text("previousPeriod", { unit }), /* @__PURE__ */ jsx(ChevronLeft, { className: "size-3.5" })),
43
43
  control(today, square, text("today"), text("today")),
44
- control(next, square, text("nextPeriod", unit), /* @__PURE__ */ jsx(ChevronRight, { className: "size-3.5" }))
44
+ control(next, square, text("nextPeriod", { unit }), /* @__PURE__ */ jsx(ChevronRight, { className: "size-3.5" }))
45
45
  ]
46
46
  }), /* @__PURE__ */ jsx("span", {
47
47
  role: "group",
@@ -1,9 +1,9 @@
1
1
  import { usePermissions } from "../meta-gate.js";
2
2
  import { dayIn, viewerZone } from "../../format/zone.js";
3
3
  import { formatDate } from "../../format/date.js";
4
- import { Skeleton } from "../../primitives/skeleton.js";
5
4
  import { humanize } from "../../live/naming.js";
6
5
  import { text } from "./messages.js";
6
+ import { Skeleton } from "../../primitives/skeleton.js";
7
7
  import { ErrorBanner } from "../error-banner.js";
8
8
  import { can, rowAllows } from "../permissions.js";
9
9
  import { addDays, inStartOrder, recordDays } from "./calendar-range.js";
@@ -91,11 +91,17 @@ const TimelineDisplay = ({ model, view, display, fields, filter, at, linkTo, now
91
91
  const title = (picked) => eventTitle(model, view, display, picked.row);
92
92
  const startText = (picked) => formatDate(Date.parse(`${addDays(picked.day, shift.current)}T00:00:00Z`));
93
93
  const announcements = {
94
- onDragStart: ({ active: picked }) => text("pickedUp", title(picked.data.current)),
95
- onDragMove: ({ active: picked }) => text("startsOn", title(picked.data.current), startText(picked.data.current)),
94
+ onDragStart: ({ active: picked }) => text("pickedUp", { title: title(picked.data.current) }),
95
+ onDragMove: ({ active: picked }) => text("startsOn", {
96
+ title: title(picked.data.current),
97
+ day: startText(picked.data.current)
98
+ }),
96
99
  onDragOver: () => void 0,
97
- onDragEnd: ({ active: picked }) => shift.current === 0 ? text("putBack", title(picked.data.current)) : text("wasMovedTo", title(picked.data.current), startText(picked.data.current)),
98
- onDragCancel: ({ active: picked }) => text("cancelled", title(picked.data.current))
100
+ onDragEnd: ({ active: picked }) => shift.current === 0 ? text("putBack", { title: title(picked.data.current) }) : text("wasMovedTo", {
101
+ title: title(picked.data.current),
102
+ to: startText(picked.data.current)
103
+ }),
104
+ onDragCancel: ({ active: picked }) => text("cancelled", { title: title(picked.data.current) })
99
105
  };
100
106
  const release = () => {
101
107
  setActive(void 0);
@@ -143,7 +149,10 @@ const TimelineDisplay = ({ model, view, display, fields, filter, at, linkTo, now
143
149
  }),
144
150
  list.capped && /* @__PURE__ */ jsx("p", {
145
151
  className: "text-xs text-muted-foreground",
146
- children: text("capped", 500, shown.scale)
152
+ children: text("capped", {
153
+ limit: 500,
154
+ unit: shown.scale
155
+ })
147
156
  }),
148
157
  /* @__PURE__ */ jsxs(DndContext, {
149
158
  sensors,
@@ -178,7 +187,7 @@ const TimelineDisplay = ({ model, view, display, fields, filter, at, linkTo, now
178
187
  }),
179
188
  empty && /* @__PURE__ */ jsx("p", {
180
189
  className: "relative px-2 py-3 text-xs text-muted-foreground",
181
- children: text("nothingIn", shown.scale)
190
+ children: text("nothingIn", { unit: shown.scale })
182
191
  }),
183
192
  !list.loading && lanes.map((lane) => /* @__PURE__ */ jsxs("section", {
184
193
  "aria-label": lane.label,
@@ -115,7 +115,7 @@ const timelineLanes = (rows, model, view, display) => {
115
115
  const value = row.record[group];
116
116
  const empty = value === null || value === void 0 || value === "";
117
117
  const key = empty ? noValue : `value:${String(value)}`;
118
- const label = empty ? text("noValue", hints?.label ?? humanize(group)) : row.labels[group] ?? displayValue(field, value, hints);
118
+ const label = empty ? text("noValue", { label: hints?.label ?? humanize(group) }) : row.labels[group] ?? displayValue(field, value, hints);
119
119
  const known = lanes.get(key) ?? {
120
120
  value: empty ? void 0 : value,
121
121
  lane: {
@@ -1,8 +1,8 @@
1
1
  import { useClient } from "../../data/api-provider.js";
2
- import { useToast } from "../../toasts/toast-provider.js";
3
2
  import { recordKey } from "../../live/model-helpers.js";
4
3
  import { text } from "./messages.js";
5
4
  import { refusalReason } from "./board-columns.js";
5
+ import { useToast } from "../../toasts/toast-provider.js";
6
6
  import { useRefreshResource } from "../pages/use-layout-data.js";
7
7
  import { dropWrite } from "./board-drop.js";
8
8
  import { text as text$1 } from "../hand-order/messages.js";
@@ -93,7 +93,7 @@ const useBoardMove = ({ model, view, by, rank, drop, labelOf, titleOf }) => {
93
93
  const stays = !ranked.place || ranked.place.bump === void 0 && ranked.place.index === place.rows.findIndex((entry) => entry.key === row.key);
94
94
  if (ranked.reason !== void 0) toast.show({
95
95
  state: "warning",
96
- title: stays ? text$1("notMoved") : text$1("movedToPlace", ranked.place.index + 1),
96
+ title: stays ? text$1("notMoved") : text$1("movedToPlace", { place: ranked.place.index + 1 }),
97
97
  description: ranked.reason
98
98
  });
99
99
  if (stays) return void 0;
@@ -127,7 +127,7 @@ const useBoardMove = ({ model, view, by, rank, drop, labelOf, titleOf }) => {
127
127
  if (undoToast.current !== void 0) toast.dismiss(undoToast.current);
128
128
  undoToast.current = void 0;
129
129
  const from = row.record[by] ?? null;
130
- const title = landed !== from ? text("movedTo", labelOf(landed)) : from === to.value ? text("orderChanged") : text("stayedIn", labelOf(landed));
130
+ const title = landed !== from ? text("movedTo", { column: labelOf(landed) }) : from === to.value ? text("orderChanged") : text("stayedIn", { column: labelOf(landed) });
131
131
  if (!undoing) {
132
132
  toast.show({
133
133
  state: "success",
@@ -151,7 +151,7 @@ const useBoardMove = ({ model, view, by, rank, drop, labelOf, titleOf }) => {
151
151
  },
152
152
  onError: (error, { row, to }) => {
153
153
  settle(row.key);
154
- const title = (row.record[by] ?? null) === to.value ? text("couldNotReorder") : text("couldNotMoveTo", to.label);
154
+ const title = (row.record[by] ?? null) === to.value ? text("couldNotReorder") : text("couldNotMoveTo", { to: to.label });
155
155
  toast.show({
156
156
  state: "error",
157
157
  title,
@@ -1,9 +1,9 @@
1
1
  import { useClient } from "../../data/api-provider.js";
2
2
  import { formatDate } from "../../format/date.js";
3
- import { useToast } from "../../toasts/toast-provider.js";
4
3
  import { recordKey } from "../../live/model-helpers.js";
5
4
  import { text } from "./messages.js";
6
5
  import { refusalReason } from "./board-columns.js";
6
+ import { useToast } from "../../toasts/toast-provider.js";
7
7
  import { useRefreshResource } from "../pages/use-layout-data.js";
8
8
  import { movedPatch } from "./calendar-range.js";
9
9
  import { useState } from "react";
@@ -45,7 +45,7 @@ const useCalendarMove = (model, display) => {
45
45
  settle(row.key);
46
46
  toast.show({
47
47
  state: "error",
48
- title: text("couldNotMoveTo", formatDate(Date.parse(`${to}T00:00:00Z`))),
48
+ title: text("couldNotMoveTo", { to: formatDate(Date.parse(`${to}T00:00:00Z`)) }),
49
49
  description: refusalReason(error)
50
50
  });
51
51
  },
@@ -8,7 +8,7 @@ const titleParts = ({ address, page, accountPage, resourceLabel, singular, recor
8
8
  if (!address || address.kind === "page") return [];
9
9
  const list = resourceLabel ? [resourceLabel] : [];
10
10
  if (address.kind === "list") return list;
11
- if (address.kind === "create") return [...singular ? [text("title", singular)] : [], ...list];
11
+ if (address.kind === "create") return [...singular ? [text("title", { noun: singular })] : [], ...list];
12
12
  const record = recordTitle ?? (recordLoading ? void 0 : address.key);
13
13
  return [...record ? [record] : [], ...list];
14
14
  };
@@ -7,7 +7,13 @@ import { text } from "./messages.js";
7
7
  */
8
8
  const cutOffNote = (shown, total, estimated) => {
9
9
  if (shown >= total) return void 0;
10
- return estimated ? text("firstOfAbout", shown, total.toLocaleString(formatTag())) : text("firstOf", shown, total.toLocaleString(formatTag()));
10
+ return estimated ? text("firstOfAbout", {
11
+ shown,
12
+ total: total.toLocaleString(formatTag())
13
+ }) : text("firstOf", {
14
+ shown,
15
+ total: total.toLocaleString(formatTag())
16
+ });
11
17
  };
12
18
  //#endregion
13
19
  export { cutOffNote };
@@ -1,10 +1,10 @@
1
1
  import { useAdminMeta, usePermissions } from "../meta-gate.js";
2
2
  import { useIsDesktop, useIsXs } from "../../lib/use-media-query.js";
3
- import { Skeleton } from "../../primitives/skeleton.js";
4
3
  import { humanize } from "../../live/naming.js";
5
4
  import { listColumnNames } from "../../live/columns-from-model.js";
6
5
  import { displayRow, loadedFields, shownDisplay } from "../displays/list-displays.js";
7
6
  import { defaultOrderBy, parseSort, sortToOrderBy } from "../list-order.js";
7
+ import { Skeleton } from "../../primitives/skeleton.js";
8
8
  import { AppLink, useAppAddress } from "../use-app-address.js";
9
9
  import { ErrorBanner } from "../error-banner.js";
10
10
  import { useProjectUi } from "../pages/project-ui.js";
@@ -30,19 +30,19 @@ const embeddedRowTargets = ({ model, view, opens, resources, views, canUpdate })
30
30
  const singular = singularOf(model, view);
31
31
  const actions = (linkTo) => {
32
32
  const openOwn = {
33
- label: text("open", singular),
33
+ label: text("open", { singular }),
34
34
  link: (row) => linkTo(own(row))
35
35
  };
36
36
  if (!far) return [openOwn];
37
37
  const editable = (row) => canUpdate && rowAllows(row, "update");
38
38
  return [
39
39
  {
40
- label: text("open", singularOf(far, views[far.name])),
40
+ label: text("open", { singular: singularOf(far, views[far.name]) }),
41
41
  available: (row) => other(row) !== void 0,
42
42
  link: (row) => linkTo(other(row))
43
43
  },
44
44
  {
45
- label: text("edit", singular),
45
+ label: text("edit", { singular }),
46
46
  available: editable,
47
47
  link: (row) => linkTo({
48
48
  kind: "record",
@@ -1,24 +1,5 @@
1
- import { defineMessages } from "../../locale/messages.js";
1
+ import { messages } from "../../locale/messages.js";
2
2
  //#region src/app/embedded-list/messages.ts
3
- const text = defineMessages({
4
- en: {
5
- firstOf: (shown, total) => `The first ${shown} of ${total}.`,
6
- firstOfAbout: (shown, total) => `The first ${shown} of about ${total}.`,
7
- open: (singular) => `Open ${singular}`,
8
- edit: (singular) => `Edit ${singular}`,
9
- viewAll: "View all",
10
- couldNotLoad: "Could not load",
11
- nothingYet: "Nothing here yet."
12
- },
13
- nl: {
14
- firstOf: (shown, total) => `De eerste ${shown} van ${total}.`,
15
- firstOfAbout: (shown, total) => `De eerste ${shown} van ongeveer ${total}.`,
16
- open: (singular) => `${singular} openen`,
17
- edit: (singular) => `${singular} bewerken`,
18
- viewAll: "Alles bekijken",
19
- couldNotLoad: "Kon niet laden",
20
- nothingYet: "Hier staat nog niets."
21
- }
22
- });
3
+ const text = messages("app/embedded-list");
23
4
  //#endregion
24
5
  export { text };
@@ -37,7 +37,7 @@ const createWorkerPort = () => {
37
37
  worker.onmessage = (event) => waiting.shift()?.resolve(event.data.bytes);
38
38
  worker.onerror = (event) => {
39
39
  event.preventDefault();
40
- const error = new Error(text("couldNotBuild", event.message));
40
+ const error = new Error(text("couldNotBuild", { message: event.message }));
41
41
  for (const entry of waiting.splice(0)) entry.reject(error);
42
42
  };
43
43
  return {