@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
@@ -1,7 +1,6 @@
1
1
  import { text } from "./messages.js";
2
2
  import { Button } from "../primitives/button.js";
3
3
  import { Input } from "../primitives/input.js";
4
- import { slotted } from "../locale/slotted.js";
5
4
  import { AuthLayout } from "./auth-layout.js";
6
5
  import { useId, useState } from "react";
7
6
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -18,10 +17,10 @@ const SignUpDetailsForm = ({ email, onSubmit, onBack, methods, busy, error }) =>
18
17
  description: text("detailsDescription"),
19
18
  children: [/* @__PURE__ */ jsx("p", {
20
19
  className: "mb-4 text-muted-foreground",
21
- children: slotted(text("codeWasRight"), /* @__PURE__ */ jsx("span", {
20
+ children: text.rich("codeWasRight", { email: /* @__PURE__ */ jsx("span", {
22
21
  className: "font-medium text-foreground",
23
22
  children: email
24
- }))
23
+ }) })
25
24
  }), /* @__PURE__ */ jsxs("form", {
26
25
  className: "flex flex-col gap-4",
27
26
  onSubmit: (event) => {
@@ -64,7 +63,7 @@ const SignUpDetailsForm = ({ email, onSubmit, onBack, methods, busy, error }) =>
64
63
  }), /* @__PURE__ */ jsxs("p", {
65
64
  id: passwordHint,
66
65
  className: "text-xs text-muted-foreground",
67
- children: [text("atLeast", 12), passwordOptional && text("withoutPassword")]
66
+ children: [text("atLeast", { length: 12 }), passwordOptional && text("withoutPassword")]
68
67
  })]
69
68
  }),
70
69
  error && /* @__PURE__ */ jsx("p", {
@@ -27,7 +27,7 @@ const StaffSignInForm = ({ operator, email: givenEmail = "", reason: givenReason
27
27
  });
28
28
  return /* @__PURE__ */ jsx(AuthLayout, {
29
29
  title: text("signInAsPerson"),
30
- description: text("forStaffOf", operator),
30
+ description: text("forStaffOf", { operator }),
31
31
  children: /* @__PURE__ */ jsxs("form", {
32
32
  className: "flex flex-col gap-4",
33
33
  onSubmit: (event) => {
@@ -62,7 +62,7 @@ const StaffSignInForm = ({ operator, email: givenEmail = "", reason: givenReason
62
62
  }),
63
63
  /* @__PURE__ */ jsx("p", {
64
64
  className: "text-xs text-muted-foreground",
65
- children: text("staffExplanation", operator)
65
+ children: text("staffExplanation", { operator })
66
66
  }),
67
67
  error && /* @__PURE__ */ jsx("p", {
68
68
  role: "alert",
@@ -74,7 +74,7 @@ const StaffSignInForm = ({ operator, email: givenEmail = "", reason: givenReason
74
74
  type: "submit",
75
75
  loading: busy,
76
76
  className: "min-h-10",
77
- children: text("continueWith", operator)
77
+ children: text("continueWith", { name: operator })
78
78
  }),
79
79
  /* @__PURE__ */ jsx(Button, {
80
80
  variant: "ghost",
@@ -1,7 +1,7 @@
1
1
  import { Button } from "../primitives/button.js";
2
2
  import { ResponsiveDialog } from "../primitives/responsive-dialog.js";
3
- import { Input } from "../primitives/input.js";
4
3
  import { Segmented } from "../primitives/segmented.js";
4
+ import { Input } from "../primitives/input.js";
5
5
  import { text } from "./messages.js";
6
6
  import { useGuestRequest } from "./use-guest-request.js";
7
7
  import { useState } from "react";
@@ -136,7 +136,7 @@ const CallGuestsPanel = ({ lobby, inCall, guests, linkOf, open, onClose }) => {
136
136
  })
137
137
  }), /* @__PURE__ */ jsxs("span", {
138
138
  className: "flex items-center justify-between gap-2 text-xs text-muted-foreground",
139
- children: [link.expires_at ? text("linkUntil", new Date(link.expires_at).toLocaleString()) : text("linkUntilEnd"), /* @__PURE__ */ jsx(Button, {
139
+ children: [link.expires_at ? text("linkUntil", { until: new Date(link.expires_at).toLocaleString() }) : text("linkUntilEnd"), /* @__PURE__ */ jsx(Button, {
140
140
  size: "sm",
141
141
  onClick: () => run(() => guests.revoke(link.id)),
142
142
  children: text("revoke")
@@ -14,7 +14,7 @@ const CallLobbyNotice = ({ waiting, guests }) => {
14
14
  children: [
15
15
  /* @__PURE__ */ jsx("span", {
16
16
  className: "min-w-0 flex-1 truncate",
17
- children: refused ? text("guestRefused") : text("waitingGuest", first.name)
17
+ children: refused ? text("guestRefused") : text("waitingGuest", { name: first.name })
18
18
  }),
19
19
  /* @__PURE__ */ jsx(Button, {
20
20
  size: "sm",
@@ -36,7 +36,7 @@ const CallMark = ({ resource, recordKey, className }) => {
36
36
  children: "·"
37
37
  }),
38
38
  /* @__PURE__ */ jsx("span", {
39
- "aria-label": text("people", count),
39
+ "aria-label": text("people", { count }),
40
40
  children: count
41
41
  }),
42
42
  !joining && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
@@ -10,7 +10,7 @@ const callPeople = ({ members, self, tracks, own, nameOf, speaker, connections,
10
10
  }, ...members]).map(({ member, name }) => {
11
11
  const shared = {
12
12
  member,
13
- name: member.startsWith("guest:") ? text("guestName", name ?? "") : name ?? nameOf(member),
13
+ name: member.startsWith("guest:") ? text("guestName", { name: name ?? "" }) : name ?? nameOf(member),
14
14
  ...speaker === member && { speaking: true }
15
15
  };
16
16
  if (member === self) return {
@@ -1,5 +1,5 @@
1
- import { useToast } from "../toasts/toast-provider.js";
2
1
  import { useAppAddress } from "../app/use-app-address.js";
2
+ import { useToast } from "../toasts/toast-provider.js";
3
3
  import { text } from "./messages.js";
4
4
  import { useRingTone } from "./ring-tone.js";
5
5
  import { useRings } from "./use-rings.js";
@@ -13,7 +13,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
13
13
  */
14
14
  const CallTile = ({ person, screen = false, className }) => {
15
15
  const track = screen ? person.screen : person.cameraOff ? void 0 : person.camera;
16
- const label = screen ? person.self ? text("youAreSharing") : text("sharing", person.name) : person.self ? `${person.name} (${text("you")})` : person.name;
16
+ const label = screen ? person.self ? text("youAreSharing") : text("sharing", { name: person.name }) : person.self ? `${person.name} (${text("you")})` : person.name;
17
17
  return /* @__PURE__ */ jsxs("figure", {
18
18
  "data-member": person.member,
19
19
  "data-speaking": person.speaking ? "true" : void 0,
@@ -32,7 +32,7 @@ const CallTile = ({ person, screen = false, className }) => {
32
32
  person.connection === "failed" && !person.self && /* @__PURE__ */ jsx("p", {
33
33
  role: "status",
34
34
  className: "absolute inset-x-1 top-1 truncate rounded bg-black/70 px-2 py-1 text-center text-xs text-white",
35
- children: text("cannotConnect", person.name)
35
+ children: text("cannotConnect", { name: person.name })
36
36
  }),
37
37
  /* @__PURE__ */ jsxs("figcaption", {
38
38
  className: "absolute bottom-1.5 left-1.5 flex max-w-[calc(100%-0.75rem)] items-center gap-1 rounded bg-black/60 px-1.5 py-0.5 text-xs text-white",
@@ -1,142 +1,5 @@
1
- import { defineMessages } from "../locale/messages.js";
1
+ import { messages } from "../locale/messages.js";
2
2
  //#region src/calls/messages.ts
3
- const text = defineMessages({
4
- en: {
5
- accept: "Accept",
6
- decline: "Decline",
7
- startCall: "Start call",
8
- join: "Join",
9
- inProgress: "Call in progress",
10
- people: (count) => count === 1 ? "1 person" : `${count} people`,
11
- joinCall: "Join call",
12
- leave: "Leave",
13
- microphone: "Microphone",
14
- camera: "Camera",
15
- shareScreen: "Share screen",
16
- stopSharing: "Stop sharing",
17
- muted: "Muted",
18
- you: "You",
19
- alone: "You are the only one here",
20
- connecting: "Joining…",
21
- reconnecting: "Reconnecting…",
22
- full: "This call is full",
23
- removed: "You were removed from this call",
24
- ended: "The call ended",
25
- refused: "You cannot join this call",
26
- unavailable: "The call cannot be reached now. Try again in a moment.",
27
- callAgain: "Join again",
28
- noMicrophone: "Your microphone is blocked: allow it in the browser to be heard.",
29
- noCamera: "Your camera is blocked: allow it in the browser to be seen.",
30
- noDevices: "No camera or microphone was found.",
31
- cannotConnect: (name) => `Cannot connect to ${name}`,
32
- poorConnection: "Poor connection",
33
- goodConnection: "Good connection",
34
- sharing: (name) => `${name} is sharing their screen`,
35
- youAreSharing: "You are sharing your screen",
36
- speaking: "Speaking",
37
- preview: "Your camera before you join",
38
- guestName: (name) => `${name} (guest)`,
39
- denied: "Nobody in the call let you in",
40
- waiting: "Waiting for someone in the call to let you in…",
41
- askToJoin: "Ask to join",
42
- someone: "Someone in the call",
43
- guests: "Guests",
44
- waitingGuest: (name) => `${name} is waiting to join`,
45
- admit: "Let in",
46
- deny: "Turn away",
47
- remove: "Remove",
48
- revoke: "Revoke",
49
- newLink: "Create guest link",
50
- copyLink: "Copy link",
51
- copied: "Copied",
52
- guestLinks: "Guest links",
53
- noLinks: "No guest link yet. Anyone with a link waits here until someone in the call lets them in.",
54
- inLobby: "Waiting to join",
55
- guestsInCall: "Guests in the call",
56
- guestsMaySend: "Guests may send",
57
- sendAll: "Everything",
58
- sendCamera: "Camera and mic",
59
- sendMicrophone: "Mic only",
60
- linkUntil: (until) => `Until ${until}`,
61
- linkUntilEnd: "Until the call ends",
62
- linkLasts: "The link works",
63
- forAnHour: "For an hour",
64
- addressesVisible: "In a call between browsers, a guest and the people in the call can see each other’s network addresses.",
65
- guestRefused: "This could not be done: the guest or link is gone, the call is full, or guest links are off.",
66
- close: "Close",
67
- yourName: "Your name",
68
- guestIntro: "You are invited to a call. Give your name, check your microphone and camera, and someone in the call lets you in.",
69
- continue: "Continue",
70
- youLeft: "You left the call"
71
- },
72
- nl: {
73
- accept: "Opnemen",
74
- decline: "Weigeren",
75
- startCall: "Gesprek starten",
76
- join: "Deelnemen",
77
- inProgress: "Gesprek bezig",
78
- people: (count) => count === 1 ? "1 persoon" : `${count} personen`,
79
- joinCall: "Deelnemen aan gesprek",
80
- leave: "Verlaten",
81
- microphone: "Microfoon",
82
- camera: "Camera",
83
- shareScreen: "Scherm delen",
84
- stopSharing: "Stoppen met delen",
85
- muted: "Gedempt",
86
- you: "Jij",
87
- alone: "Je bent de enige hier",
88
- connecting: "Deelnemen…",
89
- reconnecting: "Opnieuw verbinden…",
90
- full: "Dit gesprek is vol",
91
- removed: "Je bent uit dit gesprek gehaald",
92
- ended: "Het gesprek is afgelopen",
93
- refused: "Je kunt niet aan dit gesprek deelnemen",
94
- unavailable: "Het gesprek is nu niet bereikbaar. Probeer het zo opnieuw.",
95
- callAgain: "Opnieuw deelnemen",
96
- noMicrophone: "Je microfoon is geblokkeerd: sta hem toe in de browser om gehoord te worden.",
97
- noCamera: "Je camera is geblokkeerd: sta hem toe in de browser om gezien te worden.",
98
- noDevices: "Er is geen camera of microfoon gevonden.",
99
- cannotConnect: (name) => `Kan geen verbinding maken met ${name}`,
100
- poorConnection: "Slechte verbinding",
101
- goodConnection: "Goede verbinding",
102
- sharing: (name) => `${name} deelt het scherm`,
103
- youAreSharing: "Je deelt je scherm",
104
- speaking: "Spreekt",
105
- preview: "Je camera voordat je deelneemt",
106
- guestName: (name) => `${name} (gast)`,
107
- denied: "Niemand in het gesprek heeft je binnengelaten",
108
- waiting: "Wachten tot iemand in het gesprek je binnenlaat…",
109
- askToJoin: "Vragen om deel te nemen",
110
- someone: "Iemand in het gesprek",
111
- guests: "Gasten",
112
- waitingGuest: (name) => `${name} wacht om deel te nemen`,
113
- admit: "Binnenlaten",
114
- deny: "Weigeren",
115
- remove: "Verwijderen",
116
- revoke: "Intrekken",
117
- newLink: "Gastlink maken",
118
- copyLink: "Link kopiëren",
119
- copied: "Gekopieerd",
120
- guestLinks: "Gastlinks",
121
- noLinks: "Nog geen gastlink. Wie een link heeft, wacht hier tot iemand in het gesprek hem binnenlaat.",
122
- inLobby: "Wacht om deel te nemen",
123
- guestsInCall: "Gasten in het gesprek",
124
- guestsMaySend: "Gasten mogen sturen",
125
- sendAll: "Alles",
126
- sendCamera: "Camera en microfoon",
127
- sendMicrophone: "Alleen geluid",
128
- linkUntil: (until) => `Tot ${until}`,
129
- linkUntilEnd: "Tot het gesprek afloopt",
130
- linkLasts: "De link werkt",
131
- forAnHour: "Een uur lang",
132
- addressesVisible: "In een gesprek tussen browsers zien een gast en de mensen in het gesprek elkaars netwerkadressen.",
133
- guestRefused: "Dit lukte niet: de gast of link is weg, het gesprek is vol, of gastlinks staan uit.",
134
- close: "Sluiten",
135
- yourName: "Je naam",
136
- guestIntro: "Je bent uitgenodigd voor een gesprek. Geef je naam, controleer je microfoon en camera, en iemand in het gesprek laat je binnen.",
137
- continue: "Verder",
138
- youLeft: "Je hebt het gesprek verlaten"
139
- }
140
- });
3
+ const text = messages("calls");
141
4
  //#endregion
142
5
  export { text };
@@ -40,7 +40,10 @@ const CarouselControls = ({ carousel, count, swipe, reveal, className }) => {
40
40
  "aria-live": "polite",
41
41
  children: [/* @__PURE__ */ jsx("span", {
42
42
  className: "sr-only",
43
- children: text("photoOf", index + 1, count)
43
+ children: text("photoOf", {
44
+ index: index + 1,
45
+ count
46
+ })
44
47
  }), /* @__PURE__ */ jsx("span", {
45
48
  className: "flex items-center gap-1 rounded-full bg-background/70 px-1.5 py-1 leading-none",
46
49
  "aria-hidden": true,
@@ -1,16 +1,5 @@
1
- import { defineMessages } from "../locale/messages.js";
1
+ import { messages } from "../locale/messages.js";
2
2
  //#region src/carousel/messages.ts
3
- const text = defineMessages({
4
- en: {
5
- photoOf: (index, count) => `Photo ${index} of ${count}`,
6
- previousPhoto: "Previous photo",
7
- nextPhoto: "Next photo"
8
- },
9
- nl: {
10
- photoOf: (index, count) => `Foto ${index} van ${count}`,
11
- previousPhoto: "Vorige foto",
12
- nextPhoto: "Volgende foto"
13
- }
14
- });
3
+ const text = messages("carousel");
15
4
  //#endregion
16
5
  export { text };
@@ -1,6 +1,6 @@
1
1
  import { cn } from "../lib/cn.js";
2
- import { formatDateTime, formatTime } from "../format/date.js";
3
2
  import { Avatar } from "../primitives/avatar.js";
3
+ import { formatDateTime, formatTime } from "../format/date.js";
4
4
  import { hueOf, initialsOf } from "../auth/user-to-shell.js";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  //#region src/chat/chat-message.tsx
@@ -1,22 +1,5 @@
1
- import { defineMessages } from "../locale/messages.js";
1
+ import { messages } from "../locale/messages.js";
2
2
  //#region src/chat/messages.ts
3
- const text = defineMessages({
4
- en: {
5
- message: "Message",
6
- send: "Send",
7
- today: "Today",
8
- yesterday: "Yesterday",
9
- newMessages: "New messages",
10
- loadEarlier: "Load earlier messages"
11
- },
12
- nl: {
13
- message: "Bericht",
14
- send: "Versturen",
15
- today: "Vandaag",
16
- yesterday: "Gisteren",
17
- newMessages: "Nieuwe berichten",
18
- loadEarlier: "Eerdere berichten laden"
19
- }
20
- });
3
+ const text = messages("chat");
21
4
  //#endregion
22
5
  export { text };
@@ -37,7 +37,7 @@ const CompactTable = ({ columns, rows, caption, truncated, className }) => /* @_
37
37
  }),
38
38
  /* @__PURE__ */ jsxs("footer", {
39
39
  className: "border-t border-border px-3 py-1.5 text-[11px] text-muted-foreground",
40
- children: [text("rows", rows.length), truncated && text("cutOff")]
40
+ children: [text("rows", { count: rows.length }), truncated && text("cutOff")]
41
41
  })
42
42
  ]
43
43
  });
@@ -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
- import { formatMoney } from "../format/money.js";
2
- import { formatInt, formatPercent, formatSigned } from "../format/number.js";
3
1
  import { formatDate, formatDateTime, formatRelativeTime } from "../format/date.js";
4
- import { userById } from "../mocks/users.js";
2
+ import { formatInt, formatPercent, formatSigned } from "../format/number.js";
3
+ import { formatMoney } from "../format/money.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
@@ -1,15 +1,14 @@
1
1
  import { cn } from "../lib/cn.js";
2
+ import { Badge } from "../primitives/badge.js";
3
+ import { Avatar } from "../primitives/avatar.js";
2
4
  import { viewerZone, zoneLabel } from "../format/zone.js";
3
5
  import { formatDateTime } from "../format/date.js";
4
- import { userById } from "../mocks/users.js";
5
- import { Avatar } from "../primitives/avatar.js";
6
- import { Badge } from "../primitives/badge.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",
@@ -1,7 +1,7 @@
1
1
  import { cn } from "../lib/cn.js";
2
2
  import { formatInt } from "../format/number.js";
3
- import { Skeleton } from "../primitives/skeleton.js";
4
3
  import { text } from "./messages.js";
4
+ import { Skeleton } from "../primitives/skeleton.js";
5
5
  import { gridTemplate } from "./grid-template.js";
6
6
  import { Checkbox } from "../primitives/checkbox.js";
7
7
  import { isRightAligned } from "./column-spec.js";
@@ -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
  }),