@bud.sh/app 0.3.0 → 0.4.1

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 (77) hide show
  1. package/dist/client/assets/bud/design.js +1 -1
  2. package/dist/client/assets/canvas-DIKX_HCJ.js +1 -0
  3. package/dist/client/assets/difference-worker-CwQNxTJL.js +8 -0
  4. package/dist/client/assets/files-BQ9O3Z8-.js +1 -0
  5. package/dist/client/assets/i18n-CL0jBP7Y.js +1 -0
  6. package/dist/client/assets/index-COvyj5zV.js +2 -0
  7. package/dist/client/assets/pages-BGl2Yuza.js +1 -0
  8. package/dist/client/assets/project-branches-DwKjCwZv.js +1 -0
  9. package/dist/client/assets/project-comments-Cdip2Y10.js +1 -0
  10. package/dist/client/assets/project-thread-links-BGIkGQeU.js +1 -0
  11. package/dist/client/assets/{project-threads-DezXiVK6.js → project-threads-DeKXNqeP.js} +104 -104
  12. package/dist/client/assets/{project-work-CB1JHqGW.js → project-work-B7PGQtV9.js} +1 -1
  13. package/dist/client/assets/task-design-DJp5yho1.js +23 -0
  14. package/dist/client/assets/tasks-BHXj727C.js +1 -0
  15. package/dist/client/assets/tasks-request-CsUB5__X.js +1 -0
  16. package/dist/client/assets/workspace-CbO7RsI2.js +2 -0
  17. package/dist/client/index.html +2 -1
  18. package/dist/hosted/assets/{canvas-C69-96GR.js → canvas-gWj_ocKK.js} +69 -41
  19. package/dist/hosted/assets/{comment-data-CiDuvXi2.js → comment-data-C-rNCB1n.js} +7323 -1068
  20. package/dist/hosted/assets/{files-DQL5hzs3.js → files-CAPvbavY.js} +92 -89
  21. package/dist/hosted/assets/{pages-DFs7jB6M.js → pages-DJiOvT-l.js} +31 -22
  22. package/dist/hosted/assets/{project-branches-CffV4IS1.js → project-branches-BgrfdvtL.js} +5 -5
  23. package/dist/hosted/assets/{project-thread-links-B1Y2bDUx.js → project-thread-links-B7uzThL9.js} +12 -12
  24. package/dist/hosted/assets/{screen-BroBb1Z_.js → screen-D4D9nh4V.js} +18 -18
  25. package/dist/hosted/assets/{tasks-mzmNhe2d.js → tasks-C7aGLzBw.js} +29 -29
  26. package/dist/hosted/assets/{tasks-request-Dcrpd2_8.js → tasks-request-CikFdCgP.js} +7 -7
  27. package/dist/hosted/hosted.js +58 -31
  28. package/dist/node/design.js +6355 -139
  29. package/dist/node/index.js +4 -2
  30. package/dist/node-host/assets/{canvas-BZhzizzt.js → canvas-kXzp80a5.js} +70 -42
  31. package/dist/node-host/assets/{comment-data-nUlI0szN.js → comment-data-CeuJbJKJ.js} +7349 -1094
  32. package/dist/node-host/assets/{files-CTzcWGjb.js → files-0YIuvKzb.js} +92 -89
  33. package/dist/node-host/assets/{pages-0aWH7z1j.js → pages-DOF22SyG.js} +31 -22
  34. package/dist/node-host/assets/{project-branches-1zs_0J_y.js → project-branches-BeEwMBIw.js} +5 -5
  35. package/dist/node-host/assets/{project-thread-links-LpUAGcDr.js → project-thread-links-Bs_MtfBC.js} +12 -12
  36. package/dist/node-host/assets/{screen-DQoTOWYR.js → screen-DRTAKkn3.js} +18 -18
  37. package/dist/node-host/assets/{tasks-C0WqnM7Q.js → tasks-BA_hcbj5.js} +30 -30
  38. package/dist/node-host/assets/{tasks-request-Bwky5ORf.js → tasks-request-Doc9y_20.js} +7 -7
  39. package/dist/node-host/node-host.js +58 -31
  40. package/dist/server/assets/{branch-previews-BryeA_kA.js → branch-previews-ClkoJ0lM.js} +4 -2
  41. package/dist/server/assets/{canvas-D6tIkONI.js → canvas-CiN6jNIZ.js} +70 -42
  42. package/dist/server/assets/{comment-data-BuArfgcc.js → comment-data-9SqALQjT.js} +7347 -1092
  43. package/dist/server/assets/{files-DkrEB48U.js → files-DBVqeLdL.js} +92 -89
  44. package/dist/server/assets/{listener-oKd5ETMj.js → listener-DGWKUc2o.js} +53 -31
  45. package/dist/server/assets/{pages-iEdmK_o2.js → pages-DJMLr6j9.js} +31 -22
  46. package/dist/server/assets/{project-branches-B7rtrvMl.js → project-branches-DbKEmiQT.js} +5 -5
  47. package/dist/server/assets/{project-thread-links-ue_ad9IX.js → project-thread-links-C0kV_Pcl.js} +12 -12
  48. package/dist/server/assets/{project-work-6aOyja4v.js → project-work-C0FN3w5Y.js} +2 -2
  49. package/dist/server/assets/{screen-DMUB9a-K.js → screen-BtvzEiIa.js} +18 -18
  50. package/dist/server/assets/{server-DN5uwE4k.js → server-CYvuOSBA.js} +1 -1
  51. package/dist/server/assets/{services-Ber8opFE.js → services-DK4fqrlF.js} +2 -2
  52. package/dist/server/assets/{tasks-C2oa2wSC.js → tasks-DX71x8f9.js} +31 -31
  53. package/dist/server/assets/{tasks-request-Bk5EoY_p.js → tasks-request-C3jk9Jyu.js} +7 -6
  54. package/dist/server/capture.js +1 -1
  55. package/dist/server/migration.js +3 -3
  56. package/dist/server/runtime.js +4 -4
  57. package/dist/server/server.js +3 -3
  58. package/dist/types/assets/{config-Cuauq8xY.d.ts → config-DIC2cf_S.d.ts} +3 -0
  59. package/dist/types/assets/{contract-BsCQbbxD.d.ts → contract-CAT-XFNq.d.ts} +3 -1
  60. package/dist/types/companion.d.ts +1 -1
  61. package/dist/types/hosted.d.ts +2 -2
  62. package/dist/types/index.d.ts +1 -1
  63. package/dist/types/node-host.d.ts +2 -2
  64. package/dist/types/screen.d.ts +1 -1
  65. package/package.json +1 -1
  66. package/dist/client/assets/canvas-DxaIItAs.js +0 -1
  67. package/dist/client/assets/difference-worker-BpqPBs5g.js +0 -8
  68. package/dist/client/assets/files-C-7xoSt4.js +0 -1
  69. package/dist/client/assets/index-GPPa1XPO.js +0 -2
  70. package/dist/client/assets/pages-BVrTX_Eq.js +0 -1
  71. package/dist/client/assets/project-branches-DpxQx-T4.js +0 -1
  72. package/dist/client/assets/project-comments-D897aU5O.js +0 -1
  73. package/dist/client/assets/project-thread-links-Bp_TseD0.js +0 -1
  74. package/dist/client/assets/task-design-bktfn_Ok.js +0 -23
  75. package/dist/client/assets/tasks-Cqfj4fQN.js +0 -1
  76. package/dist/client/assets/tasks-request-mWMk9pBo.js +0 -1
  77. package/dist/client/assets/workspace-CznMN7F6.js +0 -2
@@ -644,6 +644,7 @@ var ConfigFields = check(section("Bud config must export an object.", {
644
644
  files: any(),
645
645
  logo: any(),
646
646
  theme: any(),
647
+ locale: any(),
647
648
  picker: any(),
648
649
  branches: any(),
649
650
  flows: any()
@@ -683,7 +684,7 @@ function routePath(path) {
683
684
  var BudRoutesSchema = check(list(RouteSchema, "bud.config must define at least one route.", 1), (routes) => new Set(routes.map((route) => route.id)).size !== routes.length || new Set(routes.map((route) => route.path)).size !== routes.length ? "Canvas route IDs and paths must be unique." : void 0);
684
685
  var port = (value) => value === void 0 || Number.isInteger(value) && value >= 0 && value <= 65535;
685
686
  var remote = (value) => typeof value === "string" && /^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(value);
686
- delegate(check(delegate(check(delegate(check(delegate(ConfigFields, (config) => ({
687
+ delegate(check(delegate(check(check(delegate(check(delegate(ConfigFields, (config) => ({
687
688
  ...config,
688
689
  routes: parseConfig(BudRoutesSchema, config.routes)
689
690
  })), ({ port: companion, target }) => port(companion ?? 0) && port(target?.port) ? void 0 : "Ports must be integers between 0 and 65535."), ({ target, ...config }) => {
@@ -692,7 +693,7 @@ delegate(check(delegate(check(delegate(check(delegate(ConfigFields, (config) =>
692
693
  ...config,
693
694
  targetOrigin: origin ? normalizeOrigin(origin, "target.origin must be an HTTP(S) origin without a path or credentials.") : origin
694
695
  };
695
- }), ({ comments }) => remote(comments?.remote ?? "origin") ? void 0 : "comments.remote must be a Git remote name."), (config) => {
696
+ }), ({ locale }) => locale === void 0 || locale === "en" || locale === "de" ? void 0 : "locale must be \"en\" or \"de\"."), ({ comments }) => remote(comments?.remote ?? "origin") ? void 0 : "comments.remote must be a Git remote name."), (config) => {
696
697
  let flows = parseConfig(BudFlowsSchema, config.flows);
697
698
  let steps = flows.flatMap((flow) => flow.steps.map((step) => flowStepRoute(flow, step)));
698
699
  let home = config.routes.findIndex((route) => route.path === "/") + 1;
@@ -719,6 +720,7 @@ delegate(check(delegate(check(delegate(check(delegate(ConfigFields, (config) =>
719
720
  files: parseConfig(BudFilesSchema, config.files),
720
721
  logo: parseConfig(BudLogoSchema, config.logo),
721
722
  theme: parseConfig(BudThemeSchema, config.theme),
723
+ locale: config.locale === void 0 ? "en" : config.locale,
722
724
  picker: parseConfig(BudPickerSchema, config.picker),
723
725
  branches: parseConfig(BudBranchesSchema, config.branches)
724
726
  }));
@@ -1,7 +1,7 @@
1
- import { $t as Button, H as CanvasWorkspace, U as captureCanvasPoint, Zt as Loader, bt as conversationHref, dn as Text, en as ToolbarSeparator, et as BranchSidebar, fn as Icon, in as IconButton, l as projectStore, ln as readPreference, on as Tooltip, rn as Select, t as commentsUnavailable, tn as WorkspaceLayout, un as writePreference } from "./comment-data-nUlI0szN.js";
2
- import { n as createProjectComments, r as loadComments, t as defineScreen } from "./screen-DQoTOWYR.js";
3
- import { i as pictureKey, n as createProjectPreviews, t as createProjectBranches } from "./project-branches-1zs_0J_y.js";
4
- import { t as ProjectThreadLinks } from "./project-thread-links-LpUAGcDr.js";
1
+ import { $t as Button, H as CanvasWorkspace, U as captureCanvasPoint, Zt as Loader, _n as Icon, bt as conversationHref, en as ToolbarSeparator, et as BranchSidebar, gn as Text, in as IconButton, l as projectStore, ln as readPreference, mn as t, on as Tooltip, rn as Select, t as commentsUnavailable, tn as WorkspaceLayout, un as writePreference } from "./comment-data-CeuJbJKJ.js";
2
+ import { n as createProjectComments, r as loadComments, t as defineScreen } from "./screen-DRTAKkn3.js";
3
+ import { i as pictureKey, n as createProjectPreviews, t as createProjectBranches } from "./project-branches-BeEwMBIw.js";
4
+ import { t as ProjectThreadLinks } from "./project-thread-links-Bs_MtfBC.js";
5
5
  import { on, ref } from "remix/component";
6
6
  import { Fragment, jsx, jsxs } from "remix/component/jsx-runtime";
7
7
  //#region app/client/preview-image.tsx
@@ -159,7 +159,7 @@ function PreviewImage(handle) {
159
159
  let { thumbnail, slices } = drawn(picture);
160
160
  return /* @__PURE__ */ jsxs("div", {
161
161
  role: "img",
162
- "aria-label": `${route.title} preview`,
162
+ "aria-label": t("app.client.previewImage.preview", { title: route.title }),
163
163
  "data-detail": !view.visible ? "hidden" : slices.length ? "slices" : thumbnail ? "thumbnail" : "pending",
164
164
  class: `relative select-none overflow-hidden ${mode === "comment" ? "cursor-crosshair" : ""}`,
165
165
  style: { height },
@@ -209,11 +209,11 @@ function PreviewImage(handle) {
209
209
  size: 24,
210
210
  class: "text-muted"
211
211
  }),
212
- /* @__PURE__ */ jsxs(Text, {
212
+ /* @__PURE__ */ jsx(Text, {
213
213
  variant: "title",
214
214
  weight: "semibold",
215
215
  class: "text-ink",
216
- children: [route.title, " couldn't be captured"]
216
+ children: t("app.client.previewImage.captureFailed", { title: route.title })
217
217
  }),
218
218
  failure ? /* @__PURE__ */ jsx(Text, {
219
219
  variant: "ui",
@@ -228,7 +228,7 @@ function PreviewImage(handle) {
228
228
  mix: [stopPan, on("click", () => void previews.refresh(page))],
229
229
  children: /* @__PURE__ */ jsx(Text, {
230
230
  variant: "ui",
231
- children: "Try again"
231
+ children: t("app.client.previewImage.tryAgain")
232
232
  })
233
233
  }), /* @__PURE__ */ jsx("a", {
234
234
  href: pageUrl,
@@ -238,7 +238,7 @@ function PreviewImage(handle) {
238
238
  mix: stopPan,
239
239
  children: /* @__PURE__ */ jsx(Text, {
240
240
  variant: "ui",
241
- children: "Open page"
241
+ children: t("app.client.previewImage.openPage")
242
242
  })
243
243
  })]
244
244
  })
@@ -246,7 +246,7 @@ function PreviewImage(handle) {
246
246
  });
247
247
  return /* @__PURE__ */ jsx("div", {
248
248
  class: "absolute inset-0 flex items-center justify-center",
249
- children: /* @__PURE__ */ jsx(Loader, { label: `Capturing ${route.title}…` })
249
+ children: /* @__PURE__ */ jsx(Loader, { label: t("app.client.previewImage.capturing", { title: route.title }) })
250
250
  });
251
251
  };
252
252
  }
@@ -279,7 +279,7 @@ function PreviewRefresh(handle) {
279
279
  })
280
280
  }) : null, /* @__PURE__ */ jsx(IconButton, {
281
281
  icon: "sync",
282
- label: `Refresh ${route.title}`,
282
+ label: t("app.client.previewImage.refresh", { title: route.title }),
283
283
  tooltip: true,
284
284
  size: "small",
285
285
  iconSize: 13,
@@ -388,7 +388,7 @@ function compareProjectPictures(options) {
388
388
  let result = await compare(route.page, route.size).catch((cause) => ({
389
389
  state: "failed",
390
390
  regions: [],
391
- error: cause instanceof Error ? cause.message : "The pictures could not be compared."
391
+ error: cause instanceof Error ? cause.message : t("app.client.projectDifferences.comparisonFailed")
392
392
  }));
393
393
  if (signal.aborted) return;
394
394
  states.set(route.id, result);
@@ -428,11 +428,9 @@ function differenceSlots(regions) {
428
428
  height: Math.max(1, top - gap)
429
429
  };
430
430
  }
431
- var kinds = {
432
- changed: "Changed",
433
- added: "Added",
434
- removed: "Removed"
435
- };
431
+ function kindLabel(kind) {
432
+ return kind === "changed" ? t("app.client.differenceView.changed") : kind === "added" ? t("app.client.differenceView.added") : t("app.client.differenceView.removed");
433
+ }
436
434
  function crops(signal) {
437
435
  let urls = /* @__PURE__ */ new Map();
438
436
  signal.addEventListener("abort", () => {
@@ -467,7 +465,10 @@ function DifferenceArtboard(handle) {
467
465
  let visible = viewport?.get(route.id)?.visible ?? true;
468
466
  return /* @__PURE__ */ jsx("div", {
469
467
  role: "img",
470
- "aria-label": `${route.title}, ${label}`,
468
+ "aria-label": t("app.client.differenceView.artboardLabel", {
469
+ title: route.title,
470
+ label
471
+ }),
471
472
  "data-difference": side,
472
473
  "data-changes": regions.length,
473
474
  class: "relative select-none bg-[var(--bud-main)]",
@@ -490,11 +491,11 @@ function DifferenceArtboard(handle) {
490
491
  children: [/* @__PURE__ */ jsx(Text, {
491
492
  variant: "ui",
492
493
  weight: "medium",
493
- children: `Change ${index + 1}`
494
+ children: t("app.client.differenceView.changeNumber", { count: index + 1 })
494
495
  }), /* @__PURE__ */ jsx(Text, {
495
496
  variant: "ui",
496
497
  tone: "muted",
497
- children: kinds[region.kind]
498
+ children: kindLabel(region.kind)
498
499
  })]
499
500
  }), crop && span.height > 0 ? /* @__PURE__ */ jsxs("div", {
500
501
  class: "relative overflow-hidden",
@@ -517,7 +518,7 @@ function DifferenceArtboard(handle) {
517
518
  children: /* @__PURE__ */ jsx(Text, {
518
519
  variant: "ui",
519
520
  tone: "muted",
520
- children: `Not in ${label}`
521
+ children: t("app.client.differenceView.notIn", { label })
521
522
  })
522
523
  })]
523
524
  }, index);
@@ -551,7 +552,10 @@ function DifferenceSlideshow(handle) {
551
552
  }) }), crop && slide.region[which].height > 0 ? /* @__PURE__ */ jsxs("div", {
552
553
  class: "relative",
553
554
  children: [/* @__PURE__ */ jsx("img", {
554
- alt: `${slide.route.title}, ${label}`,
555
+ alt: t("app.client.differenceView.artboardLabel", {
556
+ title: slide.route.title,
557
+ label
558
+ }),
555
559
  src: url(crop),
556
560
  class: "block w-full rounded-lg ring-1 ring-line"
557
561
  }), slide.region.kind === "changed" ? /* @__PURE__ */ jsx("div", {
@@ -567,14 +571,14 @@ function DifferenceSlideshow(handle) {
567
571
  children: /* @__PURE__ */ jsx(Text, {
568
572
  variant: "ui",
569
573
  tone: "muted",
570
- children: `Not in ${label}`
574
+ children: t("app.client.differenceView.notIn", { label })
571
575
  })
572
576
  })]
573
577
  });
574
578
  };
575
579
  return /* @__PURE__ */ jsxs("section", {
576
580
  role: "dialog",
577
- "aria-label": "Differences slideshow",
581
+ "aria-label": t("app.client.differenceView.slideshowLabel"),
578
582
  class: "bud-surface absolute inset-0 z-40 flex flex-col bg-[var(--bud-main)]",
579
583
  mix: ref((node, signal) => {
580
584
  node.focus();
@@ -596,33 +600,39 @@ function DifferenceSlideshow(handle) {
596
600
  variant: "ui",
597
601
  weight: "medium",
598
602
  class: "truncate",
599
- children: slide?.route.title ?? "No differences"
603
+ children: slide?.route.title ?? t("app.client.differenceView.noDifferences")
600
604
  }), slide ? /* @__PURE__ */ jsx(Text, {
601
605
  variant: "ui",
602
606
  tone: "muted",
603
607
  class: "shrink-0 tabular-nums",
604
608
  role: "status",
605
- children: `${kinds[slide.region.kind]} · change ${slide.index + 1} of ${slide.count} · ${index + 1} / ${slides.length}`
609
+ children: t("app.client.differenceView.slideStatus", {
610
+ kind: kindLabel(slide.region.kind),
611
+ change: slide.index + 1,
612
+ count: slide.count,
613
+ index: index + 1,
614
+ total: slides.length
615
+ })
606
616
  }) : null]
607
617
  }),
608
618
  /* @__PURE__ */ jsx(IconButton, {
609
619
  tooltip: true,
610
620
  icon: "chevron-left",
611
- label: "Previous change",
621
+ label: t("app.client.differenceView.previousChange"),
612
622
  disabled: slides.length < 2,
613
623
  mix: on("click", () => step(-1))
614
624
  }),
615
625
  /* @__PURE__ */ jsx(IconButton, {
616
626
  tooltip: true,
617
627
  icon: "chevron-right",
618
- label: "Next change",
628
+ label: t("app.client.differenceView.nextChange"),
619
629
  disabled: slides.length < 2,
620
630
  mix: on("click", () => step(1))
621
631
  }),
622
632
  /* @__PURE__ */ jsx(IconButton, {
623
633
  tooltip: true,
624
634
  icon: "close",
625
- label: "Close slideshow",
635
+ label: t("app.client.differenceView.closeSlideshow"),
626
636
  shortcut: "escape",
627
637
  mix: on("click", () => handle.props.onClose())
628
638
  })
@@ -736,7 +746,7 @@ function ProjectCanvas(handle) {
736
746
  function others() {
737
747
  let sets = project.workingTree ? [{
738
748
  value: "",
739
- label: "Working tree"
749
+ label: t("app.client.projectCanvas.workingTree")
740
750
  }] : [];
741
751
  for (let branch of branches.list.branches) if (branch.active && branch.captured) sets.push({
742
752
  value: branch.name,
@@ -745,7 +755,7 @@ function ProjectCanvas(handle) {
745
755
  return sets.filter((set) => set.value !== (selected ?? ""));
746
756
  }
747
757
  function label(set) {
748
- return set ? set : "Working tree";
758
+ return set ? set : t("app.client.projectCanvas.workingTree");
749
759
  }
750
760
  function startComparing() {
751
761
  let sets = others();
@@ -811,7 +821,7 @@ function ProjectCanvas(handle) {
811
821
  comments.loadThread(id);
812
822
  });
813
823
  }
814
- if (!branches.loaded && !branches.error) return /* @__PURE__ */ jsx(Loader, { label: "Loading branches…" });
824
+ if (!branches.loaded && !branches.error) return /* @__PURE__ */ jsx(Loader, { label: t("app.client.projectCanvas.loadingBranches") });
815
825
  let projectKey = `${project.id}:${project.targetOrigin}:${project.routes.map((route) => route.path).join("|")}`;
816
826
  let snapshot = {
817
827
  ...comments.snapshot,
@@ -858,8 +868,23 @@ function ProjectCanvas(handle) {
858
868
  if (differences) {
859
869
  let { compared: done, total } = differences.progress;
860
870
  let missing = artboards.filter(({ artboard }) => differences.get(artboard.id).state === "missing").length;
861
- status = !differences.done ? `Comparing with ${beforeLabel}… ${done} of ${total} pages` : changed.length ? `${changed.length} of ${total} pages differ from ${beforeLabel}` : `No differences from ${beforeLabel}`;
862
- if (differences.done && missing) status += ` · ${missing} without pictures on both sides`;
871
+ status = !differences.done ? t("app.client.projectCanvas.comparingPages", {
872
+ name: beforeLabel,
873
+ done,
874
+ count: total
875
+ }) : changed.length ? missing ? t("app.client.projectCanvas.differentPagesWithMissing", {
876
+ changed: changed.length,
877
+ count: total,
878
+ name: beforeLabel,
879
+ missing
880
+ }) : t("app.client.projectCanvas.differentPages", {
881
+ changed: changed.length,
882
+ count: total,
883
+ name: beforeLabel
884
+ }) : missing ? t("app.client.projectCanvas.noDifferencesWithMissing", {
885
+ name: beforeLabel,
886
+ count: missing
887
+ }) : t("app.client.projectCanvas.noDifferences", { name: beforeLabel });
863
888
  }
864
889
  let sets = others();
865
890
  let icon = (size) => size.mobile || size.width < 600 ? "mobile" : size.width < 1100 ? "tablet" : "desktop";
@@ -868,14 +893,17 @@ function ProjectCanvas(handle) {
868
893
  sizes.map((size) => /* @__PURE__ */ jsx(IconButton, {
869
894
  tooltip: true,
870
895
  icon: icon(size),
871
- label: `Show ${size.name} (${size.width})`,
896
+ label: t("app.client.projectCanvas.showViewport", {
897
+ name: size.name,
898
+ width: size.width
899
+ }),
872
900
  active: viewport === size.id,
873
901
  mix: on("click", () => show(size.id))
874
902
  })),
875
903
  /* @__PURE__ */ jsx(IconButton, {
876
904
  tooltip: true,
877
905
  icon: "columns",
878
- label: "Show every viewport side by side",
906
+ label: t("app.client.projectCanvas.showEveryViewport"),
879
907
  active: viewport === "all",
880
908
  mix: on("click", () => show("all"))
881
909
  }),
@@ -884,13 +912,13 @@ function ProjectCanvas(handle) {
884
912
  /* @__PURE__ */ jsx(IconButton, {
885
913
  tooltip: true,
886
914
  icon: "compare",
887
- label: differences ? "Stop comparing" : "Show differences with another branch",
915
+ label: differences ? t("app.client.projectCanvas.stopComparing") : t("app.client.projectCanvas.showDifferences"),
888
916
  active: Boolean(differences),
889
917
  disabled: !differences && !sets.length,
890
918
  mix: on("click", () => differences ? stopComparing() : startComparing())
891
919
  }),
892
920
  differences ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Select, {
893
- label: "Compare with",
921
+ label: t("app.client.projectCanvas.compareWith"),
894
922
  value: comparing ?? "",
895
923
  options: sets,
896
924
  class: "max-w-48",
@@ -903,7 +931,7 @@ function ProjectCanvas(handle) {
903
931
  }), /* @__PURE__ */ jsx(IconButton, {
904
932
  tooltip: true,
905
933
  icon: "play",
906
- label: "Step through the differences",
934
+ label: t("app.client.projectCanvas.stepThroughDifferences"),
907
935
  disabled: !slides.length,
908
936
  mix: on("click", () => {
909
937
  slide = 0;
@@ -913,8 +941,8 @@ function ProjectCanvas(handle) {
913
941
  ] });
914
942
  return /* @__PURE__ */ jsx(WorkspaceLayout, {
915
943
  class: "h-full min-h-0",
916
- sidebarLabel: "Branches",
917
- mainLabel: "Canvas",
944
+ sidebarLabel: t("app.client.projectCanvas.branches"),
945
+ mainLabel: t("app.client.projectCanvas.canvas"),
918
946
  drawerOpen: drawer,
919
947
  onDrawerOpenChange: (open) => {
920
948
  drawer = open;
@@ -1024,7 +1052,7 @@ function ProjectCanvas(handle) {
1024
1052
  drawer = true;
1025
1053
  handle.update();
1026
1054
  },
1027
- sidebarLabel: "Branches",
1055
+ sidebarLabel: t("app.client.projectCanvas.branches"),
1028
1056
  renderArtboard: (route, state) => {
1029
1057
  let side = sides.get(route.id);
1030
1058
  if (side) return /* @__PURE__ */ jsx(DifferenceArtboard, {