@protobase/ui 0.63.5 → 0.65.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. package/dist/account/change-email-dialog.js +1 -1
  2. package/dist/account/devices-section.js +11 -5
  3. package/dist/account/messages.js +2 -333
  4. package/dist/account/passkeys-section.js +2 -2
  5. package/dist/account/password-change-dialog.js +3 -3
  6. package/dist/account/sign-in-policy-form.js +6 -3
  7. package/dist/account/sign-in-providers-section.js +1 -1
  8. package/dist/account/staff-sign-in-log.js +4 -4
  9. package/dist/action-card/messages.js +2 -5
  10. package/dist/activity-chart/activity-chart.js +4 -6
  11. package/dist/activity-chart/messages.js +2 -11
  12. package/dist/app/app.js +1 -2
  13. package/dist/app/batch-failure.js +5 -1
  14. package/dist/app/bottom-bar-from-meta.js +2 -3
  15. package/dist/app/change-confirm/messages.js +2 -13
  16. package/dist/app/change-confirm/use-change-confirm.js +1 -1
  17. package/dist/app/charts/chart-groups.js +3 -1
  18. package/dist/app/charts/group-bars.js +1 -1
  19. package/dist/app/charts/messages.js +2 -23
  20. package/dist/app/charts/period-chart.js +1 -1
  21. package/dist/app/comments/messages.js +2 -19
  22. package/dist/app/confirm-sign-in-messages.js +2 -19
  23. package/dist/app/confirm-sign-in.js +1 -1
  24. package/dist/app/create/create-page.js +3 -3
  25. package/dist/app/create/create-record-form.js +2 -2
  26. package/dist/app/create/create-route.js +1 -1
  27. package/dist/app/create/messages.js +2 -29
  28. package/dist/app/custom-section.js +1 -2
  29. package/dist/app/delete/blocked-delete.js +5 -2
  30. package/dist/app/delete/dialogs.js +21 -8
  31. package/dist/app/delete/messages.js +2 -63
  32. package/dist/app/delete/use-delete-flow.js +5 -4
  33. package/dist/app/displays/board-column.js +1 -1
  34. package/dist/app/displays/board-columns.js +1 -1
  35. package/dist/app/displays/board-display.js +21 -9
  36. package/dist/app/displays/calendar-display.js +15 -6
  37. package/dist/app/displays/cards-display.js +1 -1
  38. package/dist/app/displays/custom-display.js +1 -2
  39. package/dist/app/displays/list-cards.js +1 -1
  40. package/dist/app/displays/map-display.js +19 -6
  41. package/dist/app/displays/messages.js +2 -147
  42. package/dist/app/displays/period-controls.js +2 -2
  43. package/dist/app/displays/timeline-display.js +15 -6
  44. package/dist/app/displays/timeline-range.js +1 -1
  45. package/dist/app/displays/use-board-move.js +3 -3
  46. package/dist/app/displays/use-calendar-move.js +1 -1
  47. package/dist/app/document-title.js +1 -1
  48. package/dist/app/embedded-list/cut-off-note.js +7 -1
  49. package/dist/app/embedded-list/embedded-row-targets.js +3 -3
  50. package/dist/app/embedded-list/messages.js +2 -21
  51. package/dist/app/export/builder-port.js +1 -1
  52. package/dist/app/export/export-dialog.js +14 -8
  53. package/dist/app/export/messages.js +2 -75
  54. package/dist/app/export/use-export-flow.js +9 -3
  55. package/dist/app/field-editor.js +2 -2
  56. package/dist/app/field-errors.js +18 -7
  57. package/dist/app/field-messages.js +2 -45
  58. package/dist/app/field-types/members/messages.js +2 -15
  59. package/dist/app/field-types/messages.js +2 -5
  60. package/dist/app/field-types/widget-part.js +1 -1
  61. package/dist/app/file-field.js +3 -3
  62. package/dist/app/gallery/gallery-section.js +5 -2
  63. package/dist/app/gallery/messages.js +2 -27
  64. package/dist/app/gallery/photo-details.js +2 -2
  65. package/dist/app/hand-order/hand-sorted-list.js +1 -2
  66. package/dist/app/hand-order/messages.js +2 -29
  67. package/dist/app/hand-order/use-hand-order.js +1 -1
  68. package/dist/app/history/describe-change.js +1 -1
  69. package/dist/app/history/messages.js +2 -29
  70. package/dist/app/import/convert.js +19 -10
  71. package/dist/app/import/import-check-step.js +5 -5
  72. package/dist/app/import/import-dialog.js +5 -2
  73. package/dist/app/import/import-file-step.js +1 -1
  74. package/dist/app/import/import-mapping-step.js +3 -3
  75. package/dist/app/import/messages.js +2 -197
  76. package/dist/app/import/prepare-rows.js +11 -4
  77. package/dist/app/import/sheet-cell.js +1 -1
  78. package/dist/app/import/xlsx-reader.js +2 -2
  79. package/dist/app/import/zip-reader.js +4 -1
  80. package/dist/app/list-actions/use-list-actions.js +4 -1
  81. package/dist/app/list-edit/messages.js +2 -11
  82. package/dist/app/list-empty-state.js +7 -4
  83. package/dist/app/list-group-chart.js +1 -1
  84. package/dist/app/list-messages.js +2 -53
  85. package/dist/app/list-page.js +9 -9
  86. package/dist/app/live-update/messages.js +2 -11
  87. package/dist/app/map/messages.js +2 -11
  88. package/dist/app/menu-icons.js +10 -3
  89. package/dist/app/messages.js +2 -139
  90. package/dist/app/meta-gate-messages.js +2 -13
  91. package/dist/app/nav-from-meta.js +8 -9
  92. package/dist/app/new-version/messages.js +2 -21
  93. package/dist/app/new-version/new-version-banner.js +1 -2
  94. package/dist/app/pages/action-inputs/action-inputs-dialog.js +1 -1
  95. package/dist/app/pages/action-inputs/input-answers.js +1 -1
  96. package/dist/app/pages/blocks/modal-form.js +1 -1
  97. package/dist/app/pages/blocks/settings.js +1 -1
  98. package/dist/app/pages/blocks/tabs.js +1 -1
  99. package/dist/app/pages/composed-page.js +1 -2
  100. package/dist/app/pages/custom-boundary.js +1 -2
  101. package/dist/app/pages/messages.js +2 -79
  102. package/dist/app/pages/render-node.js +2 -3
  103. package/dist/app/pages/use-run-action.js +14 -6
  104. package/dist/app/rank-after/dependency-rule.js +8 -2
  105. package/dist/app/rank-after/messages.js +2 -5
  106. package/dist/app/rank-after/ranked-place.js +7 -1
  107. package/dist/app/record-chart/messages.js +2 -25
  108. package/dist/app/record-lines-cell.js +4 -1
  109. package/dist/app/record-lines.js +2 -2
  110. package/dist/app/record-messages.js +2 -83
  111. package/dist/app/record-page.js +3 -3
  112. package/dist/app/record-row/messages.js +2 -23
  113. package/dist/app/record-row/record-row-body.js +1 -1
  114. package/dist/app/record-row/record-row.js +2 -2
  115. package/dist/app/record-row/saved-record-row.js +2 -2
  116. package/dist/app/related-cards/messages.js +2 -15
  117. package/dist/app/related-dots/dots-summary.js +1 -1
  118. package/dist/app/related-dots/messages.js +2 -5
  119. package/dist/app/related-dots/related-dots.js +2 -3
  120. package/dist/app/relation-picker.js +1 -1
  121. package/dist/app/runtime/messages.js +2 -55
  122. package/dist/app/runtime/runtime-status.js +12 -3
  123. package/dist/app/saved/messages.js +2 -19
  124. package/dist/app/saved/saved-list.js +2 -2
  125. package/dist/app/search/messages.js +2 -19
  126. package/dist/app/search/navigation-hits.js +1 -1
  127. package/dist/app/search/search-model.js +9 -3
  128. package/dist/app/searches/messages.js +2 -93
  129. package/dist/app/searches/save-search-button.js +3 -3
  130. package/dist/app/searches/saved-search-rows.js +2 -2
  131. package/dist/app/searches/saved-search-section.js +3 -3
  132. package/dist/app/searches/saved-searches.js +13 -11
  133. package/dist/app/searches/search-controls.js +1 -1
  134. package/dist/app/searches/search-diff.js +8 -2
  135. package/dist/app/searches/update-search-dialog.js +9 -3
  136. package/dist/app/searches/use-save-search.js +1 -1
  137. package/dist/app/searches/use-search-row.js +2 -2
  138. package/dist/app/sensitive-field.js +3 -3
  139. package/dist/app/source-notice.js +3 -3
  140. package/dist/app/staff-banner.js +12 -8
  141. package/dist/app/use-live-save.js +2 -2
  142. package/dist/app/user-menu-from-meta.js +2 -3
  143. package/dist/app/value-badge.js +3 -4
  144. package/dist/app-shell/global-search.js +2 -2
  145. package/dist/app-shell/messages.js +2 -63
  146. package/dist/app-shell/sidebar-group.js +2 -2
  147. package/dist/app-shell/sidebar.js +1 -2
  148. package/dist/app-shell/top-bar.js +1 -1
  149. package/dist/assistant-dock/messages.js +2 -23
  150. package/dist/auth/auth-gate.js +1 -1
  151. package/dist/auth/auth-messages.js +9 -88
  152. package/dist/auth/email-code-form.js +2 -3
  153. package/dist/auth/forgot-password-form.js +2 -3
  154. package/dist/auth/messages.js +2 -203
  155. package/dist/auth/provider-sign-in-page.js +3 -3
  156. package/dist/auth/resend-code-button.js +1 -1
  157. package/dist/auth/reset-password-form.js +1 -1
  158. package/dist/auth/reset-password-page.js +1 -1
  159. package/dist/auth/sign-in-form.js +2 -2
  160. package/dist/auth/sign-up-code-form.js +2 -3
  161. package/dist/auth/sign-up-details-form.js +3 -4
  162. package/dist/auth/staff-sign-in-form.js +3 -3
  163. package/dist/calls/call-guests-panel.js +1 -1
  164. package/dist/calls/call-lobby-notice.js +1 -1
  165. package/dist/calls/call-mark.js +1 -1
  166. package/dist/calls/call-people.js +1 -1
  167. package/dist/calls/call-tile.js +2 -2
  168. package/dist/calls/messages.js +2 -139
  169. package/dist/carousel/carousel-controls.js +4 -1
  170. package/dist/carousel/messages.js +2 -13
  171. package/dist/chat/messages.js +2 -19
  172. package/dist/compact-table/compact-table.js +1 -1
  173. package/dist/compact-table/messages.js +2 -15
  174. package/dist/data-grid/cell-text.js +6 -5
  175. package/dist/data-grid/cells.js +7 -4
  176. package/dist/data-grid/grid-footer.js +1 -1
  177. package/dist/data-grid/grid-row.js +1 -1
  178. package/dist/data-grid/header-menu.js +1 -1
  179. package/dist/data-grid/messages.js +2 -49
  180. package/dist/data-grid/resize-handle.js +1 -1
  181. package/dist/data-grid/row-reorder.js +20 -5
  182. package/dist/filter-panel/active-filter-chips.js +1 -1
  183. package/dist/filter-panel/date-presets.js +2 -2
  184. package/dist/filter-panel/facet-combobox.js +1 -1
  185. package/dist/filter-panel/facet-group.js +1 -1
  186. package/dist/filter-panel/messages.js +2 -49
  187. package/dist/filter-panel/range-filter.js +1 -1
  188. package/dist/format/date.js +4 -4
  189. package/dist/format/messages.js +2 -21
  190. package/dist/format/money.js +1 -1
  191. package/dist/format/number.js +5 -2
  192. package/dist/forms/messages.js +2 -21
  193. package/dist/inline-child-table/inline-child-table.js +19 -4
  194. package/dist/inline-child-table/line-row.js +2 -2
  195. package/dist/inline-child-table/messages.js +2 -35
  196. package/dist/invitations/link-notice.js +2 -3
  197. package/dist/invitations/messages.js +2 -21
  198. package/dist/invitations/pending-invitation-row.js +1 -1
  199. package/dist/lists/messages.js +2 -5
  200. package/dist/live/columns-from-model.js +14 -31
  201. package/dist/live/display-value.js +1 -1
  202. package/dist/live/messages.js +2 -15
  203. package/dist/live/value-color.js +13 -3
  204. package/dist/live/view-fields.js +4 -2
  205. package/dist/locale/en.js +1399 -0
  206. package/dist/locale/messages.js +38 -7
  207. package/dist/locale/nl.js +1399 -0
  208. package/dist/markdown/messages.js +2 -13
  209. package/dist/mentions/messages.js +2 -13
  210. package/dist/notifications/bell/messages.js +2 -35
  211. package/dist/notifications/bell/unread-label.js +1 -1
  212. package/dist/organizations/invitation-page.js +31 -13
  213. package/dist/organizations/invitations-page.js +1 -1
  214. package/dist/organizations/members-page.js +2 -2
  215. package/dist/organizations/messages.js +2 -187
  216. package/dist/organizations/organization-page.js +4 -4
  217. package/dist/organizations/organizations-page.js +1 -1
  218. package/dist/package.js +1 -1
  219. package/dist/plugins/load-plugin.js +2 -2
  220. package/dist/plugins/messages.js +2 -33
  221. package/dist/plugins/plugin-notice.js +7 -5
  222. package/dist/primitives/badge.d.ts +2 -1
  223. package/dist/primitives/messages.js +2 -13
  224. package/dist/primitives/token.js +1 -1
  225. package/dist/record-view/field.js +2 -2
  226. package/dist/record-view/messages.js +2 -33
  227. package/dist/record-view/record-header.js +2 -2
  228. package/dist/roles/messages.js +2 -11
  229. package/dist/shell/assets/app-BOuBCV1m.js +8 -0
  230. package/dist/shell/assets/{calls-CPiQcC70.js → calls-C22bYKio.js} +2 -2
  231. package/dist/shell/assets/export-worker-ClXdfeuq.js +15 -0
  232. package/dist/shell/assets/{index-_ZpZ2ro0.js → index-G0fdUd70.js} +2 -2
  233. package/dist/shell/assets/{maplibre-CjNYwEqW.js → maplibre-CRmpQfDl.js} +3 -3
  234. package/dist/shell/assets/parse-worker-DxsmAjef.js +18 -0
  235. package/dist/shell/assets/preload-helper-BgLOXTzV.js +2 -0
  236. package/dist/shell/assets/{record-map-DjqQGqZ2.js → record-map-DsP4sXes.js} +2 -2
  237. package/dist/shell/assets/{records-map-DU29d6QK.js → records-map-BtWK38Kn.js} +2 -2
  238. package/dist/shell/assets/shared-protobase-ui-xqMMtr7u.js +2 -0
  239. package/dist/shell/assets/vendor-Kvdo8Jrw.js +73 -0
  240. package/dist/shell/index.html +5 -5
  241. package/dist/shell/protobase.shell.json +2 -2
  242. package/dist/shell/protobase.sw.js +2 -2
  243. package/dist/shell-source-maps/assets/app-BOuBCV1m.js.map +1 -0
  244. package/dist/shell-source-maps/assets/{calls-CPiQcC70.js.map → calls-C22bYKio.js.map} +1 -1
  245. package/dist/shell-source-maps/assets/export-worker-ClXdfeuq.js.map +1 -0
  246. package/dist/shell-source-maps/assets/{index-_ZpZ2ro0.js.map → index-G0fdUd70.js.map} +1 -1
  247. package/dist/shell-source-maps/assets/{maplibre-CjNYwEqW.js.map → maplibre-CRmpQfDl.js.map} +1 -1
  248. package/dist/shell-source-maps/assets/parse-worker-DxsmAjef.js.map +1 -0
  249. package/dist/shell-source-maps/assets/preload-helper-BgLOXTzV.js.map +1 -0
  250. package/dist/shell-source-maps/assets/{record-map-DjqQGqZ2.js.map → record-map-DsP4sXes.js.map} +1 -1
  251. package/dist/shell-source-maps/assets/{records-map-DU29d6QK.js.map → records-map-BtWK38Kn.js.map} +1 -1
  252. package/dist/shell-source-maps/assets/shared-protobase-ui-xqMMtr7u.js.map +1 -0
  253. package/dist/shell-source-maps/assets/vendor-Kvdo8Jrw.js.map +1 -0
  254. package/dist/side-panel/messages.js +2 -5
  255. package/dist/status/messages.js +2 -59
  256. package/dist/toasts/messages.js +2 -5
  257. package/dist/users/create-user-form.js +1 -1
  258. package/dist/users/messages.js +2 -49
  259. package/package.json +5 -4
  260. package/dist/app/icons.js +0 -27
  261. package/dist/app-shell/nav.js +0 -85
  262. package/dist/locale/slotted.js +0 -14
  263. package/dist/mocks/activity.js +0 -24
  264. package/dist/mocks/rng.js +0 -20
  265. package/dist/mocks/users.js +0 -63
  266. package/dist/shell/assets/app-BPv_SjnU.js +0 -9
  267. package/dist/shell/assets/export-worker-3e4Zsv0a.js +0 -3
  268. package/dist/shell/assets/parse-worker-UhbwEjS0.js +0 -6
  269. package/dist/shell/assets/preload-helper-SYSsmQ2O.js +0 -2
  270. package/dist/shell/assets/shared-protobase-ui-Cab5nqST.js +0 -2
  271. package/dist/shell/assets/vendor-iwLB0x-s.js +0 -63
  272. package/dist/shell-source-maps/assets/app-BPv_SjnU.js.map +0 -1
  273. package/dist/shell-source-maps/assets/export-worker-3e4Zsv0a.js.map +0 -1
  274. package/dist/shell-source-maps/assets/parse-worker-UhbwEjS0.js.map +0 -1
  275. package/dist/shell-source-maps/assets/preload-helper-SYSsmQ2O.js.map +0 -1
  276. package/dist/shell-source-maps/assets/shared-protobase-ui-Cab5nqST.js.map +0 -1
  277. package/dist/shell-source-maps/assets/vendor-iwLB0x-s.js.map +0 -1
@@ -4,7 +4,6 @@ import { recordKey } from "../../live/model-helpers.js";
4
4
  import { Skeleton } from "../../primitives/skeleton.js";
5
5
  import { AppLink } from "../use-app-address.js";
6
6
  import { ErrorBanner } from "../error-banner.js";
7
- import { slotted } from "../../locale/slotted.js";
8
7
  import { can } from "../permissions.js";
9
8
  import { PageHeader } from "../../app-shell/page-header.js";
10
9
  import { text } from "./messages.js";
@@ -43,10 +42,10 @@ const SavedSearches = ({ model, view }) => {
43
42
  });
44
43
  if (!target) return frame(/* @__PURE__ */ jsx(Notice, {
45
44
  title: text("notFound"),
46
- children: slotted(text("noResource"), of.resource)
45
+ children: text.rich("noResource", { resource: of.resource })
47
46
  }));
48
47
  if (saved.error) return frame(/* @__PURE__ */ jsx(ErrorBanner, {
49
- title: text("couldNotLoadYour", plural.toLowerCase()),
48
+ title: text("couldNotLoadYour", { plural: plural.toLowerCase() }),
50
49
  error: saved.error
51
50
  }));
52
51
  if (!saved.data) return frame(/* @__PURE__ */ jsx("div", {
@@ -57,14 +56,17 @@ const SavedSearches = ({ model, view }) => {
57
56
  const searched = (targetView?.names?.plural ?? humanize(target.name)).toLowerCase();
58
57
  return frame(/* @__PURE__ */ jsx("p", {
59
58
  className: "py-8 text-center text-muted-foreground",
60
- children: slotted(text("noSavedYet", plural.toLowerCase()), /* @__PURE__ */ jsx(AppLink, {
61
- to: {
62
- kind: "list",
63
- resource: target.name
64
- },
65
- className: "font-medium text-primary-text hover:underline",
66
- children: searched
67
- }))
59
+ children: text.rich("noSavedYet", {
60
+ plural: plural.toLowerCase(),
61
+ list: /* @__PURE__ */ jsx(AppLink, {
62
+ to: {
63
+ kind: "list",
64
+ resource: target.name
65
+ },
66
+ className: "font-medium text-primary-text hover:underline",
67
+ children: searched
68
+ })
69
+ })
68
70
  }));
69
71
  }
70
72
  return frame(/* @__PURE__ */ jsx("div", {
@@ -51,7 +51,7 @@ const SearchControls = ({ model, view, recordKey, title, row, fields }) => {
51
51
  mutationFn: (patch) => client.update(model.name, recordKey, patch, row.etag ?? "*"),
52
52
  onSuccess: (_, patch) => toast.show({
53
53
  state: "success",
54
- title: text("saved", title),
54
+ title: text("saved", { title }),
55
55
  description: changed(model, view, patch)
56
56
  }),
57
57
  onError: (error) => toast.show({
@@ -91,9 +91,15 @@ const filterChanges = (before, after) => {
91
91
  /** The net change in the records a search finds: "5 more homes", "1 fewer home" or "As many homes". */
92
92
  const netChange = (added, removed, singular, plural) => {
93
93
  const net = added - removed;
94
- if (net === 0) return text("asMany", plural);
94
+ if (net === 0) return text("asMany", { plural });
95
95
  const noun = Math.abs(net) === 1 ? singular : plural;
96
- return net > 0 ? text("more", net, noun) : text("fewer", -net, noun);
96
+ return net > 0 ? text("more", {
97
+ count: net,
98
+ noun
99
+ }) : text("fewer", {
100
+ count: -net,
101
+ noun
102
+ });
97
103
  };
98
104
  //#endregion
99
105
  export { addedFilter, filterChanges, netChange, removedFilter };
@@ -87,11 +87,14 @@ const RecordsSide = ({ model, view, title, filter, total, plural }) => {
87
87
  }),
88
88
  total !== void 0 && total > shownLimit && /* @__PURE__ */ jsx("p", {
89
89
  className: "text-xs text-muted-foreground",
90
- children: text("firstOf", shownLimit, total)
90
+ children: text("firstOf", {
91
+ limit: shownLimit,
92
+ total
93
+ })
91
94
  }),
92
95
  filter === null || total === 0 ? /* @__PURE__ */ jsx("p", {
93
96
  className: "text-muted-foreground",
94
- children: text("noPlural", plural)
97
+ children: text("noPlural", { plural })
95
98
  }) : /* @__PURE__ */ jsx(EmbeddedList, {
96
99
  model,
97
100
  view,
@@ -152,7 +155,10 @@ const UpdateSearchDialog = ({ model, view, title, before, after, saveNewLabel, u
152
155
  children: netChange(addedCount, removedCount, singular, plural)
153
156
  }), /* @__PURE__ */ jsxs("span", {
154
157
  className: "text-muted-foreground",
155
- children: [": ", text("addedRemoved", count(addedCount, singular, plural), removedCount)]
158
+ children: [": ", text("addedRemoved", {
159
+ added: count(addedCount, singular, plural),
160
+ removed: removedCount
161
+ })]
156
162
  })] }) : /* @__PURE__ */ jsx(Skeleton, { className: "h-4 w-48" }),
157
163
  /* @__PURE__ */ jsx(RecordsSide, {
158
164
  model,
@@ -51,7 +51,7 @@ const useSaveSearch = (search, filter) => {
51
51
  state: "success",
52
52
  title: text("searchSaved"),
53
53
  action: {
54
- label: text("openPlural", plural),
54
+ label: text("openPlural", { plural }),
55
55
  href: href({
56
56
  kind: "list",
57
57
  resource
@@ -37,8 +37,8 @@ const useSearchRow = ({ model, of, target, targetView, row, recordKey }) => {
37
37
  sort: unseen ? `${unseen.field} desc` : void 0,
38
38
  limit: of.limit,
39
39
  chips: name !== void 0,
40
- empty: text("noneMatch", plural),
41
- note: unseen && newCount.data === 0 && text("noNew", plural),
40
+ empty: text("noneMatch", { plural }),
41
+ note: unseen && newCount.data === 0 && text("noNew", { plural }),
42
42
  isNew: unseen && ((record) => isUnseen(record.record[unseen.field], row[unseen.seenAt])),
43
43
  viewAll: {
44
44
  label: text("viewAll"),
@@ -3,9 +3,9 @@ import { Button } from "../primitives/button.js";
3
3
  import { humanize } from "../live/naming.js";
4
4
  import { displayValue } from "../live/display-value.js";
5
5
  import { text } from "./messages.js";
6
- import { Input } from "../primitives/input.js";
7
6
  import { toDraft } from "../live/field-values.js";
8
7
  import { ErrorBanner } from "./error-banner.js";
8
+ import { Input } from "../primitives/input.js";
9
9
  import { ConfirmSignIn } from "./confirm-sign-in.js";
10
10
  import { useState } from "react";
11
11
  import { Eye, EyeOff } from "lucide-react";
@@ -36,7 +36,7 @@ const SensitiveField = ({ field, hints, value, reveal, locked, invalid, placehol
36
36
  variant: "ghost",
37
37
  size: "sm",
38
38
  className: "-mr-1.5 px-1.5",
39
- "aria-label": shown ? text("hide", label) : text("show", label),
39
+ "aria-label": shown ? text("hide", { label }) : text("show", { label }),
40
40
  "aria-pressed": shown,
41
41
  loading: stored.isPending,
42
42
  onClick: toggle,
@@ -49,7 +49,7 @@ const SensitiveField = ({ field, hints, value, reveal, locked, invalid, placehol
49
49
  }) : stored.error && /* @__PURE__ */ jsx("div", {
50
50
  className: "mt-2",
51
51
  children: /* @__PURE__ */ jsx(ErrorBanner, {
52
- title: text("couldNotShow", label),
52
+ title: text("couldNotShow", { label }),
53
53
  error: stored.error
54
54
  })
55
55
  });
@@ -8,7 +8,7 @@ import { useQueryClient } from "@tanstack/react-query";
8
8
  //#region src/app/source-notice.tsx
9
9
  const reason = (error) => {
10
10
  if (!isApiError(error)) return text("noAnswer");
11
- if (error.status === 401 || error.status === 403) return text("signInRefused", error.message);
11
+ if (error.status === 401 || error.status === 403) return text("signInRefused", { message: error.message });
12
12
  return error.message;
13
13
  };
14
14
  /** Where a resource drawn from another API would be while that API's `/meta` loads, or when it cannot be read. */
@@ -19,7 +19,7 @@ const SourceNotice = ({ status }) => {
19
19
  children: [
20
20
  /* @__PURE__ */ jsx(Spinner, {}),
21
21
  " ",
22
- text("loadingFrom", status.source.label)
22
+ text("loadingFrom", { label: status.source.label })
23
23
  ]
24
24
  });
25
25
  return /* @__PURE__ */ jsx("div", {
@@ -29,7 +29,7 @@ const SourceNotice = ({ status }) => {
29
29
  children: [
30
30
  /* @__PURE__ */ jsx("h1", {
31
31
  className: "text-[16px] font-semibold",
32
- children: text("cannotReach", status.source.label)
32
+ children: text("cannotReach", { label: status.source.label })
33
33
  }),
34
34
  /* @__PURE__ */ jsxs("p", {
35
35
  className: "mt-1 text-muted-foreground",
@@ -1,7 +1,6 @@
1
1
  import { Button } from "../primitives/button.js";
2
2
  import { formatDateTime } from "../format/date.js";
3
3
  import { text } from "./messages.js";
4
- import { slotted } from "../locale/slotted.js";
5
4
  import { authMessage } from "../auth/auth-messages.js";
6
5
  import { useState } from "react";
7
6
  import { UserRoundCog } from "lucide-react";
@@ -34,13 +33,18 @@ const StaffBanner = ({ signIn, onStop }) => {
34
33
  }),
35
34
  /* @__PURE__ */ jsx("p", {
36
35
  className: "min-w-64 flex-1 break-words",
37
- children: slotted(text("staffSignedIn"), /* @__PURE__ */ jsx("span", {
38
- className: "font-semibold",
39
- children: signIn.staffName ?? signIn.staff
40
- }), /* @__PURE__ */ jsx("span", {
41
- className: "font-semibold",
42
- children: signIn.user
43
- }), formatDateTime(Date.parse(signIn.expiresAt)), signIn.reason)
36
+ children: text.rich("staffSignedIn", {
37
+ staff: /* @__PURE__ */ jsx("span", {
38
+ className: "font-semibold",
39
+ children: signIn.staffName ?? signIn.staff
40
+ }),
41
+ user: /* @__PURE__ */ jsx("span", {
42
+ className: "font-semibold",
43
+ children: signIn.user
44
+ }),
45
+ until: formatDateTime(Date.parse(signIn.expiresAt)),
46
+ reason: signIn.reason
47
+ })
44
48
  }),
45
49
  error && /* @__PURE__ */ jsx("p", {
46
50
  role: "alert",
@@ -22,7 +22,7 @@ const useLiveSave = (mode, subject) => {
22
22
  const run = async (action) => {
23
23
  const id = mode === "toast" ? toast.show({
24
24
  state: "loading",
25
- title: text("savingSubject", subject)
25
+ title: text("savingSubject", { subject })
26
26
  }) : void 0;
27
27
  setMessage(void 0);
28
28
  if (mode === "button") setPhase("saving");
@@ -34,7 +34,7 @@ const useLiveSave = (mode, subject) => {
34
34
  }
35
35
  if (id !== void 0) toast.update(id, {
36
36
  state: "success",
37
- title: text("subjectSaved", subject)
37
+ title: text("subjectSaved", { subject })
38
38
  });
39
39
  if (mode === "button") {
40
40
  setPhase("saved");
@@ -1,6 +1,5 @@
1
1
  import { humanize } from "../live/naming.js";
2
- import { iconFor } from "./icons.js";
3
- import { menuIcon } from "./menu-icons.js";
2
+ import { menuIcon, resourceIcon } from "./menu-icons.js";
4
3
  import { ExternalLink, LayoutDashboard } from "lucide-react";
5
4
  import { appPath } from "@protobase/schema";
6
5
  //#region src/app/user-menu-from-meta.ts
@@ -31,7 +30,7 @@ const userMenuFromMeta = (meta, basePath, activeResource) => (meta.userMenu?.ite
31
30
  return {
32
31
  id: item.resource,
33
32
  label: item.label ?? meta.views[item.resource]?.names?.plural ?? humanize(item.resource),
34
- icon: menuIcon(item.icon, iconFor(item.resource)),
33
+ icon: menuIcon(item.icon, resourceIcon(meta, item.resource)),
35
34
  href: appPath({
36
35
  kind: "list",
37
36
  resource: item.resource
@@ -1,11 +1,10 @@
1
1
  import { Badge } from "../primitives/badge.js";
2
- import { toneFor } from "../live/columns-from-model.js";
3
- import { valueColor } from "../live/value-color.js";
2
+ import { valueColor, valueTone } from "../live/value-color.js";
4
3
  import { jsx } from "react/jsx-runtime";
5
4
  //#region src/app/value-badge.tsx
6
- /** A stored value as a badge: filled with the colour the view gives it and in its badge shape, else in its tone. */
5
+ /** A stored value as a badge: in its badge shape, filled with the colour the view gives it or in the tone it gives it. */
7
6
  const ValueBadge = ({ value, hints, children }) => /* @__PURE__ */ jsx(Badge, {
8
- tone: toneFor(String(value)),
7
+ tone: valueTone(hints?.valueColors, value),
9
8
  color: valueColor(hints?.valueColors, value),
10
9
  shape: hints?.badgeShape,
11
10
  children
@@ -98,7 +98,7 @@ const GlobalSearch = ({ search, className = "w-96", autoFocus, showShortcut = tr
98
98
  className: "absolute right-0 top-full z-40 mt-1 max-h-96 w-full min-w-72 overflow-y-auto rounded-lg border bg-background py-1 shadow-pop",
99
99
  children: [search.groups.length === 0 && /* @__PURE__ */ jsx("p", {
100
100
  className: "px-3 py-2 text-muted-foreground",
101
- children: search.loading ? text("searching") : text("noMatches", search.query)
101
+ children: search.loading ? text("searching") : text("noMatches", { query: search.query })
102
102
  }), search.groups.map((group) => /* @__PURE__ */ jsxs("div", {
103
103
  role: "group",
104
104
  "aria-label": group.label,
@@ -109,7 +109,7 @@ const GlobalSearch = ({ search, className = "w-96", autoFocus, showShortcut = tr
109
109
  }),
110
110
  group.failed && /* @__PURE__ */ jsx("p", {
111
111
  className: "px-3 py-1.5 text-danger-text",
112
- children: text("couldNotSearch", group.label)
112
+ children: text("couldNotSearch", { label: group.label })
113
113
  }),
114
114
  group.hits.map((hit) => {
115
115
  position += 1;
@@ -1,66 +1,5 @@
1
- import { defineMessages } from "../locale/messages.js";
1
+ import { messages } from "../locale/messages.js";
2
2
  //#region src/app-shell/messages.ts
3
- const text = defineMessages({
4
- en: {
5
- navigation: "Navigation",
6
- resources: "Resources",
7
- breadcrumb: "Breadcrumb",
8
- tabs: "Tabs",
9
- more: "More",
10
- openNavigation: "Open navigation",
11
- backTo: (label) => `Back to ${label}`,
12
- search: "Search",
13
- closeSearch: "Close search",
14
- clearSearch: "Clear search",
15
- globalSearch: "Global search",
16
- searchResults: "Search results",
17
- searching: "Searching",
18
- noMatches: (query) => `No matches for “${query}”`,
19
- profileMenu: "Profile menu",
20
- organizations: "Organizations",
21
- roles: "Roles",
22
- signIn: "Sign in",
23
- signOut: "Sign out",
24
- theme: "Theme",
25
- light: "Light",
26
- dark: "Dark",
27
- system: "System",
28
- recent: (plural) => `Recent ${plural}`,
29
- loading: "Loading...",
30
- couldNotLoad: "Could not load",
31
- viewAll: "View all",
32
- couldNotSearch: (label) => `Could not search ${label.toLowerCase()}`
33
- },
34
- nl: {
35
- navigation: "Navigatie",
36
- resources: "Onderdelen",
37
- breadcrumb: "Kruimelpad",
38
- tabs: "Tabbladen",
39
- more: "Meer",
40
- openNavigation: "Navigatie openen",
41
- backTo: (label) => `Terug naar ${label}`,
42
- search: "Zoeken",
43
- closeSearch: "Zoeken sluiten",
44
- clearSearch: "Zoekopdracht wissen",
45
- globalSearch: "Overal zoeken",
46
- searchResults: "Zoekresultaten",
47
- searching: "Zoeken",
48
- noMatches: (query) => `Niets gevonden voor “${query}”`,
49
- profileMenu: "Profielmenu",
50
- organizations: "Organisaties",
51
- roles: "Rollen",
52
- signIn: "Inloggen",
53
- signOut: "Uitloggen",
54
- theme: "Thema",
55
- light: "Licht",
56
- dark: "Donker",
57
- system: "Systeem",
58
- recent: (plural) => `Recente ${plural}`,
59
- loading: "Laden...",
60
- couldNotLoad: "Kon niet laden",
61
- viewAll: "Alles bekijken",
62
- couldNotSearch: (label) => `Kon niet zoeken in ${label.toLowerCase()}`
63
- }
64
- });
3
+ const text = messages("app-shell");
65
4
  //#endregion
66
5
  export { text };
@@ -43,14 +43,14 @@ const SidebarGroup = ({ item, recent, mode, active, onNavigate }) => {
43
43
  type: "button",
44
44
  "aria-expanded": open,
45
45
  "aria-controls": listId,
46
- "aria-label": text("recent", item.label.toLowerCase()),
46
+ "aria-label": text("recent", { plural: item.label.toLowerCase() }),
47
47
  onClick: toggle,
48
48
  className: "absolute right-1 top-1/2 inline-flex size-6 -translate-y-1/2 items-center justify-center rounded text-faint-foreground hover:bg-muted hover:text-foreground",
49
49
  children: /* @__PURE__ */ jsx(ChevronRight, { className: cn("size-3.5 transition-transform", open && "rotate-90") })
50
50
  })]
51
51
  }), open && /* @__PURE__ */ jsxs("ul", {
52
52
  id: listId,
53
- "aria-label": text("recent", item.label.toLowerCase()),
53
+ "aria-label": text("recent", { plural: item.label.toLowerCase() }),
54
54
  className: cn("flex flex-col gap-0.5 border-l pl-1.5", subRowIndent[mode]),
55
55
  children: [
56
56
  recent.state === "loading" && /* @__PURE__ */ jsx("li", {
@@ -2,7 +2,6 @@ import { cn } from "../lib/cn.js";
2
2
  import { text } from "./messages.js";
3
3
  import { RouteLink } from "../primitives/route-link.js";
4
4
  import { Logo } from "./logo.js";
5
- import { navGroups } from "./nav.js";
6
5
  import { ThemeSwitch } from "./theme-switch.js";
7
6
  import { ProfileMenu } from "./profile-menu.js";
8
7
  import { SidebarCreateLink } from "./sidebar-create-link.js";
@@ -13,7 +12,7 @@ import { Fragment } from "react";
13
12
  import { LogIn } from "lucide-react";
14
13
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
15
14
  //#region src/app-shell/sidebar.tsx
16
- const Sidebar = ({ mode, activeItem, user, workspace, appName, appIcon, forceExpanded, profileMenuOpen, groups = navGroups, userMenu, account, onNavigate, onSignOut, signIn, organizations, roles, theme, status, sticky, logo: SidebarLogo = Logo, notice }) => {
15
+ const Sidebar = ({ mode, activeItem, user, workspace, appName, appIcon, forceExpanded, profileMenuOpen, groups = [], userMenu, account, onNavigate, onSignOut, signIn, organizations, roles, theme, status, sticky, logo: SidebarLogo = Logo, notice }) => {
17
16
  const expanding = mode === "icon-expand";
18
17
  const expanded = expanding && forceExpanded;
19
18
  const inline = isTextMode(mode) || expanding;
@@ -40,7 +40,7 @@ const TopBar = ({ breadcrumb, onNavigate, onBack, actions, onMenu, menuOpen, men
40
40
  }),
41
41
  back && /* @__PURE__ */ jsx("a", {
42
42
  href: back.href,
43
- "aria-label": text("backTo", back.label),
43
+ "aria-label": text("backTo", { label: back.label }),
44
44
  onClick: (event) => {
45
45
  const follow = onBack ?? onNavigate;
46
46
  if (!follow || !inApp(event)) return;
@@ -1,26 +1,5 @@
1
- import { defineMessages } from "../locale/messages.js";
1
+ import { messages } from "../locale/messages.js";
2
2
  //#region src/assistant-dock/messages.ts
3
- const text = defineMessages({
4
- en: {
5
- askQuestion: "Ask a question...",
6
- assistant: "Assistant",
7
- reconnecting: "Reconnecting...",
8
- empty: "Ask a question about this app or its data.",
9
- noAnswer: "The assistant did not answer",
10
- backendNoAnswer: "The assistant backend did not answer",
11
- couldNotDraw: "It could not be drawn.",
12
- cannotShowLive: "This version of the app cannot show it live."
13
- },
14
- nl: {
15
- askQuestion: "Stel een vraag...",
16
- assistant: "Assistent",
17
- reconnecting: "Opnieuw verbinden...",
18
- empty: "Stel een vraag over deze app of de gegevens ervan.",
19
- noAnswer: "De assistent antwoordde niet",
20
- backendNoAnswer: "De backend van de assistent antwoordde niet",
21
- couldNotDraw: "Dit kon niet worden getekend.",
22
- cannotShowLive: "Deze versie van de app kan dit niet live tonen."
23
- }
24
- });
3
+ const text = messages("assistant-dock");
25
4
  //#endregion
26
5
  export { text };
@@ -142,7 +142,7 @@ const useAuthPage = (workspace, children) => {
142
142
  className: "flex h-full min-h-48 flex-col items-center justify-center gap-3 p-8 text-center",
143
143
  children: [/* @__PURE__ */ jsx("p", {
144
144
  className: "text-muted-foreground",
145
- children: text("cannotReach", state.message)
145
+ children: text("cannotReach", { message: state.message })
146
146
  }), /* @__PURE__ */ jsx(Button, {
147
147
  onClick: recheck,
148
148
  children: text("tryAgain")
@@ -1,85 +1,6 @@
1
- import { defineMessages } from "../locale/messages.js";
1
+ import { messages as messages$1 } from "../locale/messages.js";
2
2
  //#region src/auth/auth-messages.ts
3
- const text = defineMessages({
4
- en: {
5
- tooManyRequests: "Too many attempts. Wait a minute and try again.",
6
- passkeyClosed: "The passkey prompt closed before it finished. Try again.",
7
- wrongEmailOrPassword: "The email or password is not right.",
8
- wrongPassword: "The password is not right.",
9
- wrongCode: "The code is not right.",
10
- wrongOrExpiredCode: "The code is not right, or has expired. Ask for a new one.",
11
- codeExpired: "The code has expired. Ask for a new one.",
12
- tooManyCodes: "Too many wrong codes. Ask for a new one.",
13
- wrongBackupCode: "The backup code is not right, or was used before.",
14
- tooManyCodesSignIn: "Too many wrong codes. Sign in again.",
15
- locked: "Too many wrong codes. Wait 15 minutes and try again.",
16
- tooSlow: "This sign-in took too long. Sign in again.",
17
- passkeyNotFound: "This passkey is not registered for an account here.",
18
- passkeyFailed: "The passkey could not be checked. Try again.",
19
- passkeyAdded: "This passkey is added already.",
20
- notFresh: "For this change, sign out and sign in again first.",
21
- staffPermissionMissing: "Your staff account has no permission to sign in as people here.",
22
- staffNotStrong: "Sign in to your staff account with a passkey or a second step, then try again.",
23
- staffStale: "Your staff sign-in is too old. Sign in to your staff account again.",
24
- staffExpired: "This staff sign-in took too long or was used already. Start again.",
25
- staffProviderFailed: "The staff sign-in did not go through at the provider. Try again.",
26
- staffUserUnavailable: "There is no account with this address, or it is disabled.",
27
- staffReasonRequired: "Say why you sign in as this person, in at least 10 characters.",
28
- staffForbidden: "Staff sign-in is turned off for this app.",
29
- untrustedCallback: "This page is not on an address the server trusts.",
30
- staffFailed: "The staff sign-in did not go through. Try again.",
31
- passwordLeaked: "This password appears in a known data breach. Choose a different one."
32
- },
33
- nl: {
34
- tooManyRequests: "Te veel pogingen. Wacht een minuut en probeer het opnieuw.",
35
- passkeyClosed: "De passkey-vraag sloot voordat die klaar was. Probeer het opnieuw.",
36
- wrongEmailOrPassword: "Het e-mailadres of wachtwoord klopt niet.",
37
- wrongPassword: "Het wachtwoord klopt niet.",
38
- wrongCode: "De code klopt niet.",
39
- wrongOrExpiredCode: "De code klopt niet, of is verlopen. Vraag een nieuwe aan.",
40
- codeExpired: "De code is verlopen. Vraag een nieuwe aan.",
41
- tooManyCodes: "Te veel verkeerde codes. Vraag een nieuwe aan.",
42
- wrongBackupCode: "De back-upcode klopt niet, of is al eerder gebruikt.",
43
- tooManyCodesSignIn: "Te veel verkeerde codes. Log opnieuw in.",
44
- locked: "Te veel verkeerde codes. Wacht 15 minuten en probeer het opnieuw.",
45
- tooSlow: "Deze inlogpoging duurde te lang. Log opnieuw in.",
46
- passkeyNotFound: "Deze passkey hoort hier bij geen enkel account.",
47
- passkeyFailed: "De passkey kon niet worden gecontroleerd. Probeer het opnieuw.",
48
- passkeyAdded: "Deze passkey is al toegevoegd.",
49
- notFresh: "Log voor deze wijziging eerst uit en opnieuw in.",
50
- staffPermissionMissing: "Je medewerkersaccount mag hier niet als iemand anders inloggen.",
51
- staffNotStrong: "Log in op je medewerkersaccount met een passkey of een tweede stap, en probeer het dan opnieuw.",
52
- staffStale: "Je inlog als medewerker is te oud. Log opnieuw in op je medewerkersaccount.",
53
- staffExpired: "Deze inlog als medewerker duurde te lang of is al gebruikt. Begin opnieuw.",
54
- staffProviderFailed: "De inlog als medewerker lukte niet bij de provider. Probeer het opnieuw.",
55
- staffUserUnavailable: "Er is geen account met dit adres, of het is uitgeschakeld.",
56
- staffReasonRequired: "Zeg in minstens 10 tekens waarom je als deze persoon inlogt.",
57
- staffForbidden: "Inloggen als medewerker staat uit voor deze app.",
58
- untrustedCallback: "Deze pagina staat niet op een adres dat de server vertrouwt.",
59
- staffFailed: "De inlog als medewerker lukte niet. Probeer het opnieuw.",
60
- passwordLeaked: "Dit wachtwoord komt voor in een bekend datalek. Kies een ander wachtwoord."
61
- }
62
- });
63
- const providerText = defineMessages({
64
- en: {
65
- signupDisabled: (name) => `No account here belongs to this ${name} account. Ask an admin to add you, or sign in another way.`,
66
- notLinked: (name) => `Your ${name} account is not linked to your account here. Sign in another way, then connect ${name} on your account page.`,
67
- linkedToOther: (name) => `This ${name} account is linked to someone else here already.`,
68
- couldNotLink: (name) => `Your ${name} account could not be linked. Try again.`,
69
- accessDenied: (name) => `${name} did not let you in, or you cancelled.`,
70
- domainNotAllowed: (name) => `${name} signed you in with an address this app does not accept from it. Sign in another way.`,
71
- providerFailed: (name) => `Signing in with ${name} did not go through. Try again.`
72
- },
73
- nl: {
74
- signupDisabled: (name) => `Geen account hier hoort bij dit ${name}-account. Vraag een beheerder om je toe te voegen, of log op een andere manier in.`,
75
- notLinked: (name) => `Je ${name}-account is niet gekoppeld aan je account hier. Log op een andere manier in en koppel ${name} dan op je accountpagina.`,
76
- linkedToOther: (name) => `Dit ${name}-account is hier al aan iemand anders gekoppeld.`,
77
- couldNotLink: (name) => `Je ${name}-account kon niet worden gekoppeld. Probeer het opnieuw.`,
78
- accessDenied: (name) => `${name} liet je niet binnen, of je hebt geannuleerd.`,
79
- domainNotAllowed: (name) => `${name} logde je in met een adres dat deze app daarvan niet accepteert. Log op een andere manier in.`,
80
- providerFailed: (name) => `Inloggen met ${name} lukte niet. Probeer het opnieuw.`
81
- }
82
- });
3
+ const text = messages$1("auth/errors");
83
4
  const messages = {
84
5
  INVALID_EMAIL_OR_PASSWORD: "wrongEmailOrPassword",
85
6
  INVALID_PASSWORD: "wrongPassword",
@@ -131,14 +52,14 @@ const staffSignInMessage = (failure) => {
131
52
  return failure.status === 429 ? text("tooManyRequests") : failure.message;
132
53
  };
133
54
  const providerMessages = {
134
- signup_disabled: (name) => providerText("signupDisabled", name),
135
- account_not_linked: (name) => providerText("notLinked", name),
136
- account_already_linked_to_different_user: (name) => providerText("linkedToOther", name),
137
- unable_to_link_account: (name) => providerText("couldNotLink", name),
138
- access_denied: (name) => providerText("accessDenied", name),
139
- EMAIL_DOMAIN_NOT_ALLOWED: (name) => providerText("domainNotAllowed", name)
55
+ signup_disabled: (name) => text("signupDisabled", { name }),
56
+ account_not_linked: (name) => text("notLinked", { name }),
57
+ account_already_linked_to_different_user: (name) => text("linkedToOther", { name }),
58
+ unable_to_link_account: (name) => text("couldNotLink", { name }),
59
+ access_denied: (name) => text("accessDenied", { name }),
60
+ EMAIL_DOMAIN_NOT_ALLOWED: (name) => text("domainNotAllowed", { name })
140
61
  };
141
62
  /** Why signing in or linking with the provider `name` did not go through, from the code it came back with. */
142
- const providerMessage = (code, name) => providerMessages[code]?.(name) ?? providerText("providerFailed", name);
63
+ const providerMessage = (code, name) => providerMessages[code]?.(name) ?? text("providerFailed", { name });
143
64
  //#endregion
144
65
  export { authMessage, providerMessage, signInMessage, staffSignInMessage };
@@ -1,5 +1,4 @@
1
1
  import { text } from "./messages.js";
2
- import { slotted } from "../locale/slotted.js";
3
2
  import { CodeForm } from "./code-form.js";
4
3
  import { Fragment, jsx } from "react/jsx-runtime";
5
4
  //#region src/auth/email-code-form.tsx
@@ -7,10 +6,10 @@ import { Fragment, jsx } from "react/jsx-runtime";
7
6
  const EmailCodeForm = ({ email, onBack, ...rest }) => /* @__PURE__ */ jsx(CodeForm, {
8
7
  title: text("checkEmail"),
9
8
  description: text("signInCodeDescription"),
10
- explanation: /* @__PURE__ */ jsx(Fragment, { children: slotted(text("signInCodeSent"), /* @__PURE__ */ jsx("span", {
9
+ explanation: /* @__PURE__ */ jsx(Fragment, { children: text.rich("signInCodeSent", { email: /* @__PURE__ */ jsx("span", {
11
10
  className: "font-medium text-foreground",
12
11
  children: email
13
- })) }),
12
+ }) }) }),
14
13
  submitLabel: text("signIn"),
15
14
  onChangeAddress: onBack,
16
15
  changeAddressLabel: text("backToSignIn"),
@@ -3,7 +3,6 @@ import { cn } from "../lib/cn.js";
3
3
  import { Button, buttonClass } from "../primitives/button.js";
4
4
  import { RouteLink } from "../primitives/route-link.js";
5
5
  import { Input } from "../primitives/input.js";
6
- import { slotted } from "../locale/slotted.js";
7
6
  import { AuthLayout } from "./auth-layout.js";
8
7
  import { useState } from "react";
9
8
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -14,10 +13,10 @@ const ForgotPasswordForm = ({ onSubmit, back, busy, error, sentTo }) => {
14
13
  title: text("checkEmail"),
15
14
  children: [/* @__PURE__ */ jsx("p", {
16
15
  className: "text-muted-foreground",
17
- children: slotted(text("resetSent"), /* @__PURE__ */ jsx("span", {
16
+ children: text.rich("resetSent", { email: /* @__PURE__ */ jsx("span", {
18
17
  className: "font-medium text-foreground",
19
18
  children: sentTo
20
- }))
19
+ }) })
21
20
  }), /* @__PURE__ */ jsx(RouteLink, {
22
21
  to: back,
23
22
  className: cn(buttonClass({ variant: "primary" }), "mt-4 min-h-10 w-full"),