@bud.sh/app 0.3.0 → 0.4.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 (77) hide show
  1. package/dist/client/assets/bud/design.js +1 -1
  2. package/dist/client/assets/canvas-C8hyPWoT.js +1 -0
  3. package/dist/client/assets/difference-worker-BfF4_N3e.js +8 -0
  4. package/dist/client/assets/files-D_Tm7gCK.js +1 -0
  5. package/dist/client/assets/i18n-BtfXum8P.js +1 -0
  6. package/dist/client/assets/index-Dpxjiok1.js +2 -0
  7. package/dist/client/assets/pages-B-_CKvDS.js +1 -0
  8. package/dist/client/assets/project-branches-DzXdaT9L.js +1 -0
  9. package/dist/client/assets/project-comments-CQkB2jbE.js +1 -0
  10. package/dist/client/assets/project-thread-links-BN7zL0AX.js +1 -0
  11. package/dist/client/assets/{project-threads-DezXiVK6.js → project-threads-CHGG-6fo.js} +104 -104
  12. package/dist/client/assets/{project-work-CB1JHqGW.js → project-work-L5fYMSOu.js} +1 -1
  13. package/dist/client/assets/task-design-DYqcqq1b.js +23 -0
  14. package/dist/client/assets/tasks-A2FKo3_h.js +1 -0
  15. package/dist/client/assets/tasks-request-DGigNdyK.js +1 -0
  16. package/dist/client/assets/workspace-CvWmU2RK.js +2 -0
  17. package/dist/client/index.html +2 -1
  18. package/dist/hosted/assets/{canvas-C69-96GR.js → canvas-MWtOwaWm.js} +69 -41
  19. package/dist/hosted/assets/{comment-data-CiDuvXi2.js → comment-data-DsgJWq4n.js} +7195 -1067
  20. package/dist/hosted/assets/{files-DQL5hzs3.js → files-Wvo11G2A.js} +92 -89
  21. package/dist/hosted/assets/{pages-DFs7jB6M.js → pages-BAmRFVtU.js} +31 -22
  22. package/dist/hosted/assets/{project-branches-CffV4IS1.js → project-branches-BNloVosX.js} +5 -5
  23. package/dist/hosted/assets/{project-thread-links-B1Y2bDUx.js → project-thread-links-BmY8HQXt.js} +12 -12
  24. package/dist/hosted/assets/{screen-BroBb1Z_.js → screen-QmqmI2Aq.js} +18 -18
  25. package/dist/hosted/assets/{tasks-mzmNhe2d.js → tasks-C8iWPrWg.js} +29 -29
  26. package/dist/hosted/assets/{tasks-request-Dcrpd2_8.js → tasks-request-C89fN1dK.js} +7 -7
  27. package/dist/hosted/hosted.js +48 -29
  28. package/dist/node/design.js +6235 -139
  29. package/dist/node/index.js +4 -2
  30. package/dist/node-host/assets/{canvas-BZhzizzt.js → canvas-D_F8SIlm.js} +70 -42
  31. package/dist/node-host/assets/{comment-data-nUlI0szN.js → comment-data-q_8INiZz.js} +7221 -1093
  32. package/dist/node-host/assets/{files-CTzcWGjb.js → files-xazOrNCX.js} +92 -89
  33. package/dist/node-host/assets/{pages-0aWH7z1j.js → pages-D6VkmdfQ.js} +31 -22
  34. package/dist/node-host/assets/{project-branches-1zs_0J_y.js → project-branches-C26hwmo3.js} +5 -5
  35. package/dist/node-host/assets/{project-thread-links-LpUAGcDr.js → project-thread-links-BOzjws5W.js} +12 -12
  36. package/dist/node-host/assets/{screen-DQoTOWYR.js → screen-Dog-YByu.js} +18 -18
  37. package/dist/node-host/assets/{tasks-C0WqnM7Q.js → tasks-A1_bpb3_.js} +30 -30
  38. package/dist/node-host/assets/{tasks-request-Bwky5ORf.js → tasks-request-Bie1PpQP.js} +7 -7
  39. package/dist/node-host/node-host.js +48 -29
  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-Dn4RYoU2.js} +70 -42
  42. package/dist/server/assets/{comment-data-BuArfgcc.js → comment-data-B0OLHBGp.js} +7219 -1091
  43. package/dist/server/assets/{files-DkrEB48U.js → files-C5Vilfe4.js} +92 -89
  44. package/dist/server/assets/{listener-oKd5ETMj.js → listener-o1STuLju.js} +43 -29
  45. package/dist/server/assets/{pages-iEdmK_o2.js → pages-BNa0MHEc.js} +31 -22
  46. package/dist/server/assets/{project-branches-B7rtrvMl.js → project-branches-GtQYyOH5.js} +5 -5
  47. package/dist/server/assets/{project-thread-links-ue_ad9IX.js → project-thread-links-Nfz9NIny.js} +12 -12
  48. package/dist/server/assets/{project-work-6aOyja4v.js → project-work-Cy_BpHwR.js} +2 -2
  49. package/dist/server/assets/{screen-DMUB9a-K.js → screen-BtcJmZwj.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-B82tHwyQ.js} +31 -31
  53. package/dist/server/assets/{tasks-request-Bk5EoY_p.js → tasks-request-BtJBlkxV.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
@@ -1,4 +1,4 @@
1
- import { $ as publishAll, $n as forkUnsafe, $t as provideContext, An as uninterruptible, At as catch_, Bn as effectDiscard, Bt as forever, Cn as tap, Ct as as$1, D as as, Dn as tryPromise, E as FileSystem, Fn as currentTimeMillis, Ft as fail$1, G as make$3, Gn as mergeAll, Gt as map, H as runForEach, Hn as isLayer, Ht as forkScoped, I as fromPubSub, In as build, It as filterOrFail, J as offerUnsafe, Jn as succeed$1, Jt as option, Kn as provide$1, Kt as mapError, L as ignore$1, Ln as buildWithMemoMap, Lt as flatMap, Mn as void_$1, N as empty$1, Nn as withFiber, Nt as die, O as callback, On as try_, Ot as catchIf, P as filter, Pn as yieldNow, Pt as ensuring, Q as publish, Qn as close, R as make$2, Rn as effect, Rt as flatten, S as writeTextAtomic, Sn as sync, St as andThen, T as Path, Tn as timeoutOption, Tt as asVoid, U as tap$1, Un as makeMemoMapUnsafe, Ut as gen, V as merge, Vn as empty, Vt as forkIn, W as unwrap$1, Wt as ignore, X as sliding$1, Xn as sync$1, Xt as orElseSucceed, Y as shutdown$1, Yt as orDie, Z as take, Zn as unwrap, Zt as promise, _n as serviceOption, _t as bytes$1, an as runFork, ar as void_, at as runIn, bn as succeedNone, bt as addFinalizer, cn as runPromiseExit, cr as add, dn as runSync, dr as getOrNull, en as provideService, er as makeUnsafe, et as shutdown, fn as runSyncExit, fr as getOrUndefined, gn as scoped, gr as TaggedError, hn as scope, hr as some, in as runCallbackWith, ir as succeed$2, it as interrupt, j as debounce, jn as uninterruptibleMask, jt as clockWith, kn as undefined_$1, kt as catchTag, ln as runPromiseExitWith, lr as getOption, m as projectModuleFile, mn as runSyncWith, mr as none, nr as doneUnsafe, nt as unbounded, on as runForkWith, or as scopeRemoveFinalizerUnsafe, pn as runSyncExitWith, pr as isNone, q as offer, rn as runCallback, rr as make$4, rt as await_, sn as runPromise, sr as Service, tn as result, tr as _await, tt as sliding, u as Git, un as runPromiseWith, ur as make$1, vn as sleep, vt as acquireRelease, w as RuntimePolicy, wn as tapError, wt as asSome, xn as suspend, xt as all, yn as succeed, zn as effectContext, zt as forEach } from "./branch-previews-BryeA_kA.js";
1
+ import { $ as publishAll, $n as forkUnsafe, $t as provideContext, An as uninterruptible, At as catch_, Bn as effectDiscard, Bt as forever, Cn as tap, Ct as as$1, D as as, Dn as tryPromise, E as FileSystem, Fn as currentTimeMillis, Ft as fail$1, G as make$3, Gn as mergeAll, Gt as map, H as runForEach, Hn as isLayer, Ht as forkScoped, I as fromPubSub, In as build, It as filterOrFail, J as offerUnsafe, Jn as succeed$1, Jt as option, Kn as provide$1, Kt as mapError, L as ignore$1, Ln as buildWithMemoMap, Lt as flatMap, Mn as void_$1, N as empty$1, Nn as withFiber, Nt as die, O as callback, On as try_, Ot as catchIf, P as filter, Pn as yieldNow, Pt as ensuring, Q as publish, Qn as close, R as make$2, Rn as effect, Rt as flatten, S as writeTextAtomic, Sn as sync, St as andThen, T as Path, Tn as timeoutOption, Tt as asVoid, U as tap$1, Un as makeMemoMapUnsafe, Ut as gen, V as merge, Vn as empty, Vt as forkIn, W as unwrap$1, Wt as ignore, X as sliding$1, Xn as sync$1, Xt as orElseSucceed, Y as shutdown$1, Yt as orDie, Z as take, Zn as unwrap, Zt as promise, _n as serviceOption, _t as bytes$1, an as runFork, ar as void_, at as runIn, bn as succeedNone, bt as addFinalizer, cn as runPromiseExit, cr as add, dn as runSync, dr as getOrNull, en as provideService, er as makeUnsafe, et as shutdown, fn as runSyncExit, fr as getOrUndefined, gn as scoped, gr as TaggedError, hn as scope, hr as some, in as runCallbackWith, ir as succeed$2, it as interrupt, j as debounce, jn as uninterruptibleMask, jt as clockWith, kn as undefined_$1, kt as catchTag, ln as runPromiseExitWith, lr as getOption, m as projectModuleFile, mn as runSyncWith, mr as none, nr as doneUnsafe, nt as unbounded, on as runForkWith, or as scopeRemoveFinalizerUnsafe, pn as runSyncExitWith, pr as isNone, q as offer, rn as runCallback, rr as make$4, rt as await_, sn as runPromise, sr as Service, tn as result, tr as _await, tt as sliding, u as Git, un as runPromiseWith, ur as make$1, vn as sleep, vt as acquireRelease, w as RuntimePolicy, wn as tapError, wt as asSome, xn as suspend, xt as all, yn as succeed, zn as effectContext, zt as forEach } from "./branch-previews-ClkoJ0lM.js";
2
2
  import { $ as parseReviewActionRecovery, A as parseThreadReplyInput, An as iconNames, At as filterFileEntries, Bt as isWithinDirectory, Cn as WorkValidationError, Ct as compileSearchPattern, Dn as record$1, Dt as parseFileSearchQuery, E as parseThreadFilter, En as parseWork, Et as searchPathMatches, Gt as list, Ht as parseFilePath, Jt as strict$1, Kt as parseContract, L as applyReviewSelection, N as parseThreadStatusInput, O as parseThreadInput, On as strict, Rt as parseFileIndexQuery, Sn as statusCategory, St as parseReviewSourceQuery, T as parseThreadCapabilities, Tn as nonempty, Ut as pathHierarchy, Vt as parentPath, Wt as integer, X as parseReviewActionIntent, Y as parseReviewActionApply, Zt as parseWorkWorkspace, _n as parseMessage, _t as parseReviewHistoryQuery, an as parseWorkDetail, at as parseMutationIntent, b as MAX_THREADS, bn as fieldByRole, cn as parseWorkMutationResult, dn as parseWorkSnapshot, dt as validateMutationSelection, en as parseSectionData, gn as valueByRole, hn as parseWorkValue, ht as parseReviewDiffQuery, i as routes, in as parseWorkCreate, it as parseMutationApply, j as parseThreadSnapshot, jt as orderFileEntries, k as parseThreadLinkInput, kt as classifyText, lt as parseRecovery, mn as parseWorkUpdate, on as parseWorkItem, pt as parseReviewComparison, qt as revision, r as parseLiveId, rn as parseWorkConnection, sn as parseWorkItemRef, t as RESYNC, tn as parseWorkActionInput, tt as parseFileSaveRequest, un as parseWorkQuery, ut as pathCollisionKey, vn as parseMessageAuthor, w as parseThread, wn as identifier, wt as matchFileText, xn as parseWorkSchema, zt as isProtectedPath } from "./events-6z5v7Uca.js";
3
3
  import { pathToFileURL } from "node:url";
4
4
  import { createHash, randomBytes, randomUUID } from "node:crypto";
@@ -1,5 +1,5 @@
1
- import { A as concat, At as catch_, B as mapError$1, Bn as effectDiscard, C as ProcessRunner, Cn as tap, Ct as as, D as as$1, E as FileSystem, En as timeoutOrElse, Et as cached, F as fromEffect, Fn as currentTimeMillis, Ft as fail, Gn as mergeAll, Gt as map, H as runForEach, Ht as forkScoped, It as filterOrFail, Jn as succeed$1, K as makeUnsafe, Kn as provide, Kt as mapError, Lt as flatMap, M as drop, Mn as void_, Mt as context, N as empty, Nt as die, On as try_, Ot as catchIf, Pt as ensuring, R as make, Rn as effect, Sn as sync, St as andThen, T as Path, Tt as asVoid, Ut as gen, W as unwrap, Wn as merge, Wt as ignore, Xt as orElseSucceed, Yn as succeedContext, Zn as unwrap$1, _n as serviceOption, b as nodeLayer, c as previewsLayer, cr as add, ct as String$1, d as gitLayer, dt as Union, f as Project, fr as getOrUndefined, ft as decodeEffect, gn as scoped, gr as TaggedError, gt as optional, ht as isPattern, i as projectFlows, j as debounce, k as changes, kt as catchTag, lt as Struct, mt as isNonEmpty, nn as retry, ot as ArraySchema, pt as isMaxLength, qn as provideMerge, r as branchPreviewsLayer, s as Previews, sr as Service, st as Record, t as BranchPreviews, tn as result, u as Git, ur as make$1, ut as Undefined, w as RuntimePolicy, xn as suspend, xt as all, yn as succeed, yt as acquireUseRelease, z as mapEffect, zn as effectContext, zt as forEach } from "./branch-previews-BryeA_kA.js";
2
- import { A as adapterRegistryLayer, D as publishChanges, E as liveChannelLayer, F as WorkAdapter, I as WorkError, M as memoryAdapterLayer, N as parseThreadImport, O as AdapterRegistry, P as ThreadAdapter, R as bundledScreensLayer, T as LiveChannel, _ as storeActivityLayer, c as FileReview, d as fileSearchLayer, f as Files, g as StoreActivity, i as fileSavesLayer, j as defineAdapter, k as adapterModuleLoaderLayer, l as fileReviewLayer, n as fileReviewActionsLayer, o as fileMutationsLayer, p as filesLayer, s as fileWriteLockLayer, v as storeLiveLayer, z as sourceScreensLayer } from "./server-DN5uwE4k.js";
1
+ import { A as concat, At as catch_, B as mapError$1, Bn as effectDiscard, C as ProcessRunner, Cn as tap, Ct as as, D as as$1, E as FileSystem, En as timeoutOrElse, Et as cached, F as fromEffect, Fn as currentTimeMillis, Ft as fail, Gn as mergeAll, Gt as map, H as runForEach, Ht as forkScoped, It as filterOrFail, Jn as succeed$1, K as makeUnsafe, Kn as provide, Kt as mapError, Lt as flatMap, M as drop, Mn as void_, Mt as context, N as empty, Nt as die, On as try_, Ot as catchIf, Pt as ensuring, R as make, Rn as effect, Sn as sync, St as andThen, T as Path, Tt as asVoid, Ut as gen, W as unwrap, Wn as merge, Wt as ignore, Xt as orElseSucceed, Yn as succeedContext, Zn as unwrap$1, _n as serviceOption, b as nodeLayer, c as previewsLayer, cr as add, ct as String$1, d as gitLayer, dt as Union, f as Project, fr as getOrUndefined, ft as decodeEffect, gn as scoped, gr as TaggedError, gt as optional, ht as isPattern, i as projectFlows, j as debounce, k as changes, kt as catchTag, lt as Struct, mt as isNonEmpty, nn as retry, ot as ArraySchema, pt as isMaxLength, qn as provideMerge, r as branchPreviewsLayer, s as Previews, sr as Service, st as Record, t as BranchPreviews, tn as result, u as Git, ur as make$1, ut as Undefined, w as RuntimePolicy, xn as suspend, xt as all, yn as succeed, yt as acquireUseRelease, z as mapEffect, zn as effectContext, zt as forEach } from "./branch-previews-ClkoJ0lM.js";
2
+ import { A as adapterRegistryLayer, D as publishChanges, E as liveChannelLayer, F as WorkAdapter, I as WorkError, M as memoryAdapterLayer, N as parseThreadImport, O as AdapterRegistry, P as ThreadAdapter, R as bundledScreensLayer, T as LiveChannel, _ as storeActivityLayer, c as FileReview, d as fileSearchLayer, f as Files, g as StoreActivity, i as fileSavesLayer, j as defineAdapter, k as adapterModuleLoaderLayer, l as fileReviewLayer, n as fileReviewActionsLayer, o as fileMutationsLayer, p as filesLayer, s as fileWriteLockLayer, v as storeLiveLayer, z as sourceScreensLayer } from "./server-CYvuOSBA.js";
3
3
  import { A as parseThreadReplyInput, C as parseAnchor, Cn as WorkValidationError, E as parseThreadFilter, M as parseThreadStatus, N as parseThreadStatusInput, O as parseThreadInput, _n as parseMessage, a as CommentMergeError, an as parseWorkDetail, b as MAX_THREADS, c as parseCommentInput, cn as parseWorkMutationResult, d as parseCommentThread, dn as parseWorkSnapshot, en as parseSectionData, f as revision, fn as parseWorkSync, in as parseWorkCreate, j as parseThreadSnapshot, k as parseThreadLinkInput, l as conversationId, mn as parseWorkUpdate, nn as parseWorkActivity, o as mergeThreads, on as parseWorkItem, p as text$2, pn as parseWorkSyncResult, rn as parseWorkConnection, s as stableJson, tn as parseWorkActionInput, u as object$1, un as parseWorkQuery, vn as parseMessageAuthor, w as parseThread, xn as parseWorkSchema } from "./events-6z5v7Uca.js";
4
4
  import { n as PICKER_MODULE_URL, t as pickerPageScript } from "./bridge-B_Blt55E.js";
5
5
  import { createHash, randomUUID } from "node:crypto";
@@ -1,9 +1,9 @@
1
1
  import { _ as taskRoutes, an as parseWorkDetail, cn as parseWorkMutationResult, en as parseSectionData, i as routes, pn as parseWorkSyncResult } from "./events-6z5v7Uca.js";
2
- import { Bt as Button, Cn as Text, Ft as CommentThreadDetail, It as CommentThreadItem, K as CommentThreadHeading, Lt as CommentComposer, S as ThreadTaskLinks, _t as taskHref, b as writeOptimistically, bn as toast, dt as conversationLabel, gt as selectedTask, h as storedWorkspace, ht as readConversationLocation, l as projectStore, t as commentsUnavailable, vt as taskRole, w as ItemDiscussion, x as writeRows, y as plainRow, z as TaskWorkspace } from "./comment-data-BuArfgcc.js";
3
- import { a as predictWorkAction, i as loadItemComments, n as createProjectComments, o as predictWorkCreate, s as predictWorkUpdate, t as defineScreen } from "./screen-DMUB9a-K.js";
4
- import { n as requestTasks, t as TaskRequestError } from "./tasks-request-Bk5EoY_p.js";
5
- import { t as projectWork } from "./project-work-6aOyja4v.js";
6
- import { n as ProjectTaskPicker, t as ProjectThreadLinks } from "./project-thread-links-ue_ad9IX.js";
2
+ import { Bt as Button, Dn as Text, Ft as CommentThreadDetail, It as CommentThreadItem, K as CommentThreadHeading, Lt as CommentComposer, S as ThreadTaskLinks, Tn as t, _t as taskHref, b as writeOptimistically, bn as toast, dt as conversationLabel, gt as selectedTask, h as storedWorkspace, ht as readConversationLocation, l as projectStore, vt as taskRole, w as ItemDiscussion, x as writeRows, y as plainRow, z as TaskWorkspace } from "./comment-data-B0OLHBGp.js";
3
+ import { a as predictWorkAction, i as loadItemComments, n as createProjectComments, o as predictWorkCreate, s as predictWorkUpdate, t as defineScreen } from "./screen-BtcJmZwj.js";
4
+ import { n as requestTasks, t as TaskRequestError } from "./tasks-request-BtJBlkxV.js";
5
+ import { t as projectWork } from "./project-work-Cy_BpHwR.js";
6
+ import { n as ProjectTaskPicker, t as ProjectThreadLinks } from "./project-thread-links-Nfz9NIny.js";
7
7
  import { on, ref } from "remix/component";
8
8
  import { Fragment, jsx, jsxs } from "remix/component/jsx-runtime";
9
9
  //#region app/client/task-discussion.tsx
@@ -73,13 +73,13 @@ function TaskDiscussion(handle) {
73
73
  creating = false;
74
74
  handle.update();
75
75
  }),
76
- children: "Reply"
76
+ children: t("app.client.taskDiscussion.reply")
77
77
  }) : null]
78
78
  });
79
79
  }
80
80
  function heading(thread) {
81
81
  return /* @__PURE__ */ jsx(CommentThreadHeading, {
82
- location: thread.anchor ? conversationLabel(thread) : "Discussion",
82
+ location: thread.anchor ? conversationLabel(thread) : t("app.client.taskDiscussion.discussion"),
83
83
  actions: handle.props.renderThreadLinks ? void 0 : /* @__PURE__ */ jsx(ProjectThreadLinks, {
84
84
  part: "action",
85
85
  ...threadLinks(thread)
@@ -113,7 +113,7 @@ function TaskDiscussion(handle) {
113
113
  let count = threads.reduce((sum, thread) => sum + thread.messageCount, 0);
114
114
  return /* @__PURE__ */ jsxs("section", {
115
115
  class: "flex min-w-0 flex-col gap-3",
116
- "aria-label": "Task discussion",
116
+ "aria-label": t("app.client.taskDiscussion.taskDiscussion"),
117
117
  mix: mount,
118
118
  children: [
119
119
  /* @__PURE__ */ jsxs("div", {
@@ -123,7 +123,7 @@ function TaskDiscussion(handle) {
123
123
  as: "h3",
124
124
  variant: "ui",
125
125
  weight: "medium",
126
- children: "Discussion"
126
+ children: t("app.client.taskDiscussion.discussion")
127
127
  }),
128
128
  count ? /* @__PURE__ */ jsx(Text, {
129
129
  variant: "ui-caption",
@@ -139,7 +139,7 @@ function TaskDiscussion(handle) {
139
139
  creating = true;
140
140
  handle.update();
141
141
  }),
142
- children: "New discussion"
142
+ children: t("app.client.taskDiscussion.newDiscussion")
143
143
  }) : null
144
144
  ]
145
145
  }),
@@ -155,18 +155,18 @@ function TaskDiscussion(handle) {
155
155
  mix: on("click", () => {
156
156
  comments.load().then(() => selected ? comments.loadThread(selected, true) : void 0);
157
157
  }),
158
- children: "Reload comments"
158
+ children: t("app.client.taskDiscussion.reloadComments")
159
159
  })]
160
160
  }) : null,
161
161
  !comments.loaded ? /* @__PURE__ */ jsx(Text, {
162
162
  variant: "ui-caption",
163
163
  tone: "muted",
164
164
  role: "status",
165
- children: "Loading discussion…"
165
+ children: t("app.client.taskDiscussion.loadingDiscussion")
166
166
  }) : !comments.ready ? /* @__PURE__ */ jsx(Text, {
167
167
  variant: "ui-caption",
168
168
  tone: "muted",
169
- children: commentsUnavailable
169
+ children: t("app.client.taskDiscussion.commentsUnavailable")
170
170
  }) : /* @__PURE__ */ jsxs(Fragment, { children: [threads.length ? threads.map((thread) => !thread.anchor ? /* @__PURE__ */ jsx(ItemDiscussion, {
171
171
  thread,
172
172
  links: links(thread)
@@ -201,12 +201,12 @@ function TaskDiscussion(handle) {
201
201
  }, thread.id)) : /* @__PURE__ */ jsx(Text, {
202
202
  variant: "ui-caption",
203
203
  tone: "muted",
204
- children: "No discussion yet."
204
+ children: t("app.client.taskDiscussion.noDiscussionYet")
205
205
  }), capabilities.create || capabilities.reply && (explicit || threads.some((thread) => !thread.anchor)) ? /* @__PURE__ */ jsxs("div", {
206
206
  class: "flex min-w-0 flex-col gap-2",
207
207
  children: [capabilities.create && (creating || !explicit && !threads.length) ? /* @__PURE__ */ jsxs("div", {
208
208
  class: "flex items-start justify-between gap-2",
209
- "aria-label": "New discussion tasks",
209
+ "aria-label": t("app.client.taskDiscussion.newDiscussionTasks"),
210
210
  children: [/* @__PURE__ */ jsx(ThreadTaskLinks, {
211
211
  itemIds: draftItemIds,
212
212
  items: handle.props.items ?? [],
@@ -224,19 +224,19 @@ function TaskDiscussion(handle) {
224
224
  creating = false;
225
225
  handle.update();
226
226
  }),
227
- children: "Cancel"
227
+ children: t("app.client.taskDiscussion.cancel")
228
228
  }) : null]
229
- }) : threads.length > 1 ? /* @__PURE__ */ jsxs(Text, {
229
+ }) : threads.length > 1 ? /* @__PURE__ */ jsx(Text, {
230
230
  variant: "ui-caption",
231
231
  tone: "muted",
232
- children: ["Replying to ", reply?.messages[0]?.author.name ?? "the discussion"]
232
+ children: t("app.client.taskDiscussion.replyingTo", { name: reply?.messages[0]?.author.name ?? t("app.client.taskDiscussion.theDiscussion") })
233
233
  }) : null, /* @__PURE__ */ jsx(CommentComposer, {
234
- label: "Add task comment",
235
- placeholder: "Add context for your team…",
234
+ label: t("app.client.taskDiscussion.addTaskComment"),
235
+ placeholder: t("app.client.taskDiscussion.addContextPlaceholder"),
236
236
  busy: comments.busy || replyPending,
237
237
  class: "w-full",
238
238
  onSubmit: async (body) => {
239
- if (replyPending) throw new Error("Load the selected discussion before replying.");
239
+ if (replyPending) throw new Error(t("app.client.taskDiscussion.loadBeforeReplying"));
240
240
  if (reply && capabilities.reply) {
241
241
  await write({
242
242
  id: reply.id,
@@ -286,7 +286,7 @@ async function loadTask(token, id, schema, signal, conversationId) {
286
286
  schema
287
287
  ]);
288
288
  let detail = parseWorkDetail(value, resolved);
289
- if (detail.item.id !== id) throw new Error("The task service returned a different task. Refresh and try again.");
289
+ if (detail.item.id !== id) throw new Error(t("app.client.projectTasks.differentTaskRefresh"));
290
290
  return {
291
291
  detail,
292
292
  discussion
@@ -313,7 +313,7 @@ async function loadTasks(project, signal, href, conversationId) {
313
313
  if (!stored || cause instanceof TaskRequestError) throw cause;
314
314
  return open(projectWork(project).refresh(signal).then((value) => value.schema));
315
315
  }).catch((cause) => {
316
- taskError = cause instanceof Error ? cause.message : "Could not load this task.";
316
+ taskError = cause instanceof Error ? cause.message : t("app.client.projectTasks.couldNotLoadTask");
317
317
  return null;
318
318
  }) : null;
319
319
  try {
@@ -331,7 +331,7 @@ async function loadTasks(project, signal, href, conversationId) {
331
331
  return {
332
332
  store,
333
333
  stored: false,
334
- error: cause instanceof Error ? cause.message : "Could not load tasks."
334
+ error: cause instanceof Error ? cause.message : t("app.client.projectTasks.couldNotLoadTasks")
335
335
  };
336
336
  }
337
337
  }
@@ -385,7 +385,7 @@ function ProjectTasks(handle) {
385
385
  };
386
386
  }
387
387
  function currentSchema() {
388
- if (!workspace) throw new Error("Refresh tasks before making changes.");
388
+ if (!workspace) throw new Error(t("app.client.projectTasks.refreshBeforeChanges"));
389
389
  return workspace.schema;
390
390
  }
391
391
  async function write(url, body, parse) {
@@ -422,7 +422,7 @@ function ProjectTasks(handle) {
422
422
  ...body,
423
423
  expectedRevision: prior.to
424
424
  } : body, (value) => parseWorkMutationResult(value, currentSchema()));
425
- if (id && result.item.id !== id) throw new Error("The task service returned a different task. Refresh before retrying.");
425
+ if (id && result.item.id !== id) throw new Error(t("app.client.projectTasks.differentTaskRefreshRetry"));
426
426
  await accepted(result.item);
427
427
  settled.resolve(from ? {
428
428
  from,
@@ -434,7 +434,7 @@ function ProjectTasks(handle) {
434
434
  return item;
435
435
  } catch (cause) {
436
436
  settled.resolve(null);
437
- if (!handle.signal.aborted) toast.error("Bud undid a task change", { description: cause instanceof Error ? cause.message : "The write was not confirmed." });
437
+ if (!handle.signal.aborted) toast.error(t("app.client.projectTasks.undidTaskChange"), { description: cause instanceof Error ? cause.message : t("app.client.projectTasks.writeNotConfirmed") });
438
438
  refreshAfterWrite();
439
439
  throw cause;
440
440
  } finally {
@@ -459,7 +459,7 @@ function ProjectTasks(handle) {
459
459
  act: (id, action) => save(routes.tasksApi.mutate.href({ id }), action, predicted(id, (item) => predictWorkAction(currentSchema(), item, action)), id),
460
460
  get: async (id) => {
461
461
  let next = await requestTasks(routes.tasksApi.show.href({ id }), project.token, handle.signal, (value) => parseWorkDetail(value, currentSchema()));
462
- if (next.item.id !== id) throw new Error("The task service returned a different task. Refresh and try again.");
462
+ if (next.item.id !== id) throw new Error(t("app.client.projectTasks.differentTaskRefresh"));
463
463
  return next.item;
464
464
  },
465
465
  section: (id, section, signal = handle.signal) => requestTasks(routes.tasksApi.section.href({
@@ -490,7 +490,7 @@ function ProjectTasks(handle) {
490
490
  try {
491
491
  await work.refresh(AbortSignal.any([handle.signal, controller.signal]));
492
492
  } catch (cause) {
493
- if (!controller.signal.aborted && !handle.signal.aborted) error = cause instanceof Error ? cause.message : "Could not load tasks.";
493
+ if (!controller.signal.aborted && !handle.signal.aborted) error = cause instanceof Error ? cause.message : t("app.client.projectTasks.couldNotLoadTasks");
494
494
  } finally {
495
495
  if (listRequest === controller) {
496
496
  loading = false;
@@ -526,10 +526,10 @@ function ProjectTasks(handle) {
526
526
  }
527
527
  let next = await requestTasks(routes.tasksApi.show.href({ id }), project.token, signal, (value) => parseWorkDetail(value, currentSchema()));
528
528
  if (controller.signal.aborted || id !== selectedId) return;
529
- if (next.item.id !== id) throw new Error("The task service returned a different task. Refresh and try again.");
529
+ if (next.item.id !== id) throw new Error(t("app.client.projectTasks.differentTaskRefresh"));
530
530
  detail = next;
531
531
  } catch (cause) {
532
- if (!controller.signal.aborted && !handle.signal.aborted && id === selectedId) detailError = cause instanceof Error ? cause.message : "Could not load this task.";
532
+ if (!controller.signal.aborted && !handle.signal.aborted && id === selectedId) detailError = cause instanceof Error ? cause.message : t("app.client.projectTasks.couldNotLoadTask");
533
533
  } finally {
534
534
  if (detailRequest === controller) {
535
535
  detailLoading = false;
@@ -1,4 +1,5 @@
1
1
  import { i as routes, sn as parseWorkItemRef, un as parseWorkQuery } from "./events-6z5v7Uca.js";
2
+ import { Tn as t } from "./comment-data-B0OLHBGp.js";
2
3
  import { createMultiMatcher } from "remix/route-pattern/match";
3
4
  //#region app/client/tasks-request.ts
4
5
  var reads = createMultiMatcher();
@@ -38,7 +39,7 @@ function validEndpoint(url, write) {
38
39
  * @returns A validated DTO; error responses never become an empty successful view.
39
40
  */
40
41
  async function requestTasks(url, token, signal, parse, fetcher = fetch, write) {
41
- if (!validEndpoint(url, Boolean(write))) throw new Error("Invalid task endpoint.");
42
+ if (!validEndpoint(url, Boolean(write))) throw new Error(t("app.client.tasksRequest.invalidEndpoint"));
42
43
  signal.throwIfAborted();
43
44
  let response = await fetcher(url, {
44
45
  method: write ? "POST" : "GET",
@@ -53,7 +54,7 @@ async function requestTasks(url, token, signal, parse, fetcher = fetch, write) {
53
54
  signal
54
55
  });
55
56
  let reader = response.body?.getReader();
56
- if (!reader) throw new Error("The task service returned an empty response.");
57
+ if (!reader) throw new Error(t("app.client.tasksRequest.emptyResponse"));
57
58
  let chunks = [];
58
59
  let size = 0;
59
60
  try {
@@ -62,7 +63,7 @@ async function requestTasks(url, token, signal, parse, fetcher = fetch, write) {
62
63
  let part = await reader.read();
63
64
  if (part.done) break;
64
65
  size += part.value.byteLength;
65
- if (size > 4194304) throw new Error("The task response is too large to display. Narrow the results and try again.");
66
+ if (size > 4194304) throw new Error(t("app.client.tasksRequest.responseTooLarge"));
66
67
  chunks.push(part.value);
67
68
  }
68
69
  } catch (cause) {
@@ -81,15 +82,15 @@ async function requestTasks(url, token, signal, parse, fetcher = fetch, write) {
81
82
  try {
82
83
  value = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
83
84
  } catch {
84
- throw new Error("The task service returned an invalid response. Refresh and try again.");
85
+ throw new Error(t("app.client.tasksRequest.invalidResponse"));
85
86
  }
86
87
  if (!response.ok) {
87
- let error = value && typeof value === "object" && "error" in value && typeof value.error === "string" ? value.error.slice(0, 1e3) : "Could not load tasks. Try again.";
88
+ let error = value && typeof value === "object" && "error" in value && typeof value.error === "string" ? value.error.slice(0, 1e3) : t("app.client.tasksRequest.loadFailed");
88
89
  let code = value && typeof value === "object" && "code" in value && typeof value.code === "string" && /^[a-z][a-z-]{0,63}$/.test(value.code) ? value.code : "request";
89
90
  let currentRevision;
90
91
  if (value && typeof value === "object" && "currentRevision" in value) {
91
92
  let revision = value.currentRevision;
92
- if (revision !== null && (typeof revision !== "string" || !revision.trim() || revision.length > 256 || revision.includes("\0"))) throw new Error("The task service returned an invalid conflict response.");
93
+ if (revision !== null && (typeof revision !== "string" || !revision.trim() || revision.length > 256 || revision.includes("\0"))) throw new Error(t("app.client.tasksRequest.invalidConflictResponse"));
93
94
  currentRevision = revision;
94
95
  }
95
96
  throw new TaskRequestError(error, code, currentRevision);
@@ -1,4 +1,4 @@
1
- import { Qt as provide, Sn as sync, Ut as gen, Zt as promise, a as followCapture, b as nodeLayer, bt as addFinalizer, d as gitLayer, gn as scoped, i as projectFlows, l as PreviewSession, n as branchIndexName, o as startBranchBuild, p as createProjectContext, qn as provideMerge, sn as runPromise } from "./assets/branch-previews-BryeA_kA.js";
1
+ import { Qt as provide, Sn as sync, Ut as gen, Zt as promise, a as followCapture, b as nodeLayer, bt as addFinalizer, d as gitLayer, gn as scoped, i as projectFlows, l as PreviewSession, n as branchIndexName, o as startBranchBuild, p as createProjectContext, qn as provideMerge, sn as runPromise } from "./assets/branch-previews-ClkoJ0lM.js";
2
2
  import { t as pickerPageScript } from "./assets/bridge-B_Blt55E.js";
3
3
  //#region ../previews/src/server/storage.ts
4
4
  /**
@@ -1,7 +1,7 @@
1
- import { Kt as mapError, Lt as flatMap, On as try_, Ut as gen, _ as resolveStorage, f as Project, p as createProjectContext, sn as runPromise, u as Git } from "./assets/branch-previews-BryeA_kA.js";
2
- import { H as make, I as WorkError, O as AdapterRegistry } from "./assets/server-DN5uwE4k.js";
1
+ import { Kt as mapError, Lt as flatMap, On as try_, Ut as gen, _ as resolveStorage, f as Project, p as createProjectContext, sn as runPromise, u as Git } from "./assets/branch-previews-ClkoJ0lM.js";
2
+ import { H as make, I as WorkError, O as AdapterRegistry } from "./assets/server-CYvuOSBA.js";
3
3
  import { j as parseThreadSnapshot, w as parseThread } from "./assets/events-6z5v7Uca.js";
4
- import { n as storageLayer, r as readGitThreadImports } from "./assets/services-Ber8opFE.js";
4
+ import { n as storageLayer, r as readGitThreadImports } from "./assets/services-DK4fqrlF.js";
5
5
  //#region app/server/comment-migration.ts
6
6
  function identity(metadata) {
7
7
  if (!metadata || typeof metadata !== "object" || Array.isArray(metadata)) return null;
@@ -1,7 +1,7 @@
1
- import { An as uninterruptible, Dn as tryPromise, Kt as mapError, Rn as effect, Ut as gen, Zt as promise, p as createProjectContext, qn as provideMerge, sn as runPromise, sr as Service, vt as acquireRelease, x as readText } from "./assets/branch-previews-BryeA_kA.js";
2
- import { B as sharedModules, H as make } from "./assets/server-DN5uwE4k.js";
3
- import { n as listen, r as createApp, t as ServerError } from "./assets/listener-oKd5ETMj.js";
4
- import { t as applicationLayer } from "./assets/services-Ber8opFE.js";
1
+ import { An as uninterruptible, Dn as tryPromise, Kt as mapError, Rn as effect, Ut as gen, Zt as promise, p as createProjectContext, qn as provideMerge, sn as runPromise, sr as Service, vt as acquireRelease, x as readText } from "./assets/branch-previews-ClkoJ0lM.js";
2
+ import { B as sharedModules, H as make } from "./assets/server-CYvuOSBA.js";
3
+ import { n as listen, r as createApp, t as ServerError } from "./assets/listener-o1STuLju.js";
4
+ import { t as applicationLayer } from "./assets/services-DK4fqrlF.js";
5
5
  import { fileURLToPath } from "node:url";
6
6
  //#region app/server/runtime.ts
7
7
  var BudListener = class extends Service()("bud/Listener") {};
@@ -1,6 +1,6 @@
1
- import { Kn as provide, Rn as effect, Ut as gen, b as nodeLayer, sr as Service, x as readText } from "./assets/branch-previews-BryeA_kA.js";
2
- import { H as make } from "./assets/server-DN5uwE4k.js";
3
- import { n as listen, r as createApp } from "./assets/listener-oKd5ETMj.js";
1
+ import { Kn as provide, Rn as effect, Ut as gen, b as nodeLayer, sr as Service, x as readText } from "./assets/branch-previews-ClkoJ0lM.js";
2
+ import { H as make } from "./assets/server-CYvuOSBA.js";
3
+ import { n as listen, r as createApp } from "./assets/listener-o1STuLju.js";
4
4
  import { fileURLToPath } from "node:url";
5
5
  //#region server.ts
6
6
  var Listener = class extends Service()("bud/StandaloneListener") {};
@@ -347,6 +347,8 @@ interface BudConfig {
347
347
  * `{ light: { primary: '#f5b700' } }`. Anything left out keeps Bud's own.
348
348
  */
349
349
  theme?: BudTheme;
350
+ /** The language of Bud's interface: `en` (the default) or `de`. */
351
+ locale?: "en" | "de";
350
352
  /**
351
353
  * What finds the element under a comment: `bud:dom` (the default), `bud:react-grab` for React
352
354
  * projects with React Grab installed, or a ./ module in your project exporting a picker adapter.
@@ -407,6 +409,7 @@ interface ResolvedBudConfig {
407
409
  files: ResolvedFiles;
408
410
  logo: ResolvedLogo | null;
409
411
  theme: ResolvedTheme;
412
+ locale: "en" | "de";
410
413
  picker: ResolvedPicker;
411
414
  branches: ResolvedBranches;
412
415
  }
@@ -1,4 +1,4 @@
1
- import { i as ResolvedBudConfig } from "./config-Cuauq8xY.js";
1
+ import { i as ResolvedBudConfig } from "./config-DIC2cf_S.js";
2
2
  //#region app/server/hosted/contract.d.ts
3
3
  /** How a hosted Bud's captures stand, as its host reports them. */
4
4
  interface RemoteBranchState {
@@ -92,6 +92,8 @@ interface HostedRequestContext {
92
92
  * browser never chooses one.
93
93
  */
94
94
  author?: HostedAuthor;
95
+ /** The person's language for Bud's interface, `en` or `de`; the project's when absent. */
96
+ locale?: string;
95
97
  }
96
98
  /** A running hosted Bud. */
97
99
  interface HostedApp {
@@ -1,4 +1,4 @@
1
- import { i as ResolvedBudConfig } from "./assets/config-Cuauq8xY.js";
1
+ import { i as ResolvedBudConfig } from "./assets/config-DIC2cf_S.js";
2
2
  //#region src/companion.d.ts
3
3
  /**
4
4
  * The contract between a host, such as `@bud.sh/app-vite-plugin` and its CLI, and the companion
@@ -1,5 +1,5 @@
1
- import { i as ResolvedBudConfig } from "./assets/config-Cuauq8xY.js";
2
- import { a as HostedAuthor, c as HostedStorage, i as HostedAppOptions, l as RemoteBranchState, n as CreateHostedApp, o as HostedDatabase, r as HostedApp, s as HostedRequestContext, t as BranchRemote, u as hostedScreenModules } from "./assets/contract-BsCQbbxD.js";
1
+ import { i as ResolvedBudConfig } from "./assets/config-DIC2cf_S.js";
2
+ import { a as HostedAuthor, c as HostedStorage, i as HostedAppOptions, l as RemoteBranchState, n as CreateHostedApp, o as HostedDatabase, r as HostedApp, s as HostedRequestContext, t as BranchRemote, u as hostedScreenModules } from "./assets/contract-CAT-XFNq.js";
3
3
  //#region src/hosted.server.d.ts
4
4
  /**
5
5
  * Creates a hosted Bud: Bud's own routes for the canvas and tasks on the host's stores.
@@ -1,5 +1,5 @@
1
1
  import { n as ElementSource } from "./assets/canvas-anchor-CYU3qBPx.js";
2
- import { a as defineConfig, c as files, l as pages, n as BudRoute, o as BudScreen, s as canvas, t as BudConfig, u as tasks } from "./assets/config-Cuauq8xY.js";
2
+ import { a as defineConfig, c as files, l as pages, n as BudRoute, o as BudScreen, s as canvas, t as BudConfig, u as tasks } from "./assets/config-DIC2cf_S.js";
3
3
  //#region ../picker/src/lib/types.d.ts
4
4
  /** What a framework adds about an element, beyond what the page's DOM shows. */
5
5
  interface PickerDescription {
@@ -1,5 +1,5 @@
1
- import { d as BudTheme } from "./assets/config-Cuauq8xY.js";
2
- import { a as HostedAuthor, s as HostedRequestContext } from "./assets/contract-BsCQbbxD.js";
1
+ import { d as BudTheme } from "./assets/config-DIC2cf_S.js";
2
+ import { a as HostedAuthor, s as HostedRequestContext } from "./assets/contract-CAT-XFNq.js";
3
3
  //#region src/node-host.server.d.ts
4
4
  /** Where the project's Bud on Cloudflare is, and the secret its remote API takes. */
5
5
  export interface NodeHostOptions {
@@ -1,4 +1,4 @@
1
- import { r as ProjectInfo } from "./assets/config-Cuauq8xY.js";
1
+ import { r as ProjectInfo } from "./assets/config-DIC2cf_S.js";
2
2
  import { i as TaskDesign } from "./assets/task-design-xJOhRNWh.js";
3
3
  import { RequestMethod, Route, RouteMap } from "remix/routes";
4
4
  import { Handle, Props, RemixNode } from "remix/component";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bud.sh/app",
3
3
  "description": "The app, its config, screen and design APIs",
4
- "version": "0.3.0",
4
+ "version": "0.4.0",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
7
7
  "publishConfig": {
@@ -1 +0,0 @@
1
- import{t as e}from"./jsx-B4XNFIzB.js";import{t}from"./component-DWct-Tq6.js";import{n}from"./on-mixin-iWnqUzq5.js";import{n as r}from"./attrs-mixin-CmlG_FtV.js";import{c as i,l as a,t as o}from"./loader-Q6-HPKft.js";import{t as s}from"./screen-Dfvzj6n2.js";import{A as c,L as l,R as u,j as d,u as f,xt as p}from"./task-design-bktfn_Ok.js";import{At as m,G as h,H as g,U as _,jt as v,s as y,st as b}from"./project-threads-DezXiVK6.js";import{i as x,n as S,t as C}from"./project-comments-D897aU5O.js";import{i as w,n as T,t as E}from"./project-branches-DpxQx-T4.js";import{t as D}from"./project-thread-links-Bp_TseD0.js";var O=760,k=n(`pointerdown`,e=>e.stopPropagation());function A(e,t,n){let r=e.capture.width*t,i=e.capture.thumbnails.map(e=>e.width),a=e=>{let t=i.findIndex(t=>r<=t*e);return t<0?`slices`:t},o=e=>e===`slices`?i.length:e,s=a(1);return n===void 0||o(s)>=o(n)||o(a(.85))<o(n)?s:n}function j(e,t){return e?.get(t)??{visible:!0,top:0,bottom:1/0,density:1}}function M(e,t){let n=0;return e.capture.tiles.map((r,i)=>{let a={tile:r,index:i,top:n,src:e.srcs[i]};return n+=r.height,{...a,shownTo:Math.min(n,t)}})}function N(t){let{route:r,previews:s}=t.props,c=r.pageId??r.id,l=()=>w(t.props.theme,t.props.size),u=``,d,f,m=``;function h(e){return t.props.topOnly?e.capture.tiles[0]?.height??e.capture.height:e.capture.height}function g(){let{preview:e,images:n}=s.get(c),r=n[l()]??f,i=r?h(r):e?.captures[0]?.height??(e?.state===`failed`?O:0);if(!e||!i)return;let a=`${i}:${e.path}:${r?.capture.hash??``}`;u!==a&&(u=a,t.props.onLayout({height:i,path:e.path,pins:r?.capture.pins}))}function v(e){let n=j(t.props.viewport,r.id);if(!n.visible||d===void 0)return{thumbnail:void 0,slices:[]};if(d===`slices`&&e.srcs.length){let t=Math.min(n.bottom,h(e));return{thumbnail:e.thumbnails.at(-1),slices:M(e,t).filter(({src:e,top:t,shownTo:r})=>e&&t<r&&r>n.top)}}let i=d===`slices`?e.thumbnails.length-1:d;return{thumbnail:e.thumbnails[i]??e.thumbnails.at(-1),slices:[]}}function y(){let e=s.get(c).images[l()];if(!e||e===f)return;if(!f||f.capture.hash===e.capture.hash){f=e;return}if(d===`slices`&&!e.srcs.length){s.slices(c,t.props.theme,t.props.size);return}let n=`${e.capture.hash}:${d}`;if(m===n)return;m=n;let r=e,{thumbnail:i,slices:a}=v(r);Promise.all([i,...a.map(({src:e})=>e)].flatMap(e=>{if(!e)return[];let t=new Image;return t.src=e,[t.decode().catch(()=>{})]})).then(()=>{m!==n||t.signal.aborted||(m=``,f=s.get(c).images[l()]??r,g(),t.update())})}let b=s.watch(c,()=>{y(),g(),t.update()}),x=t.props.viewport?.watch(r.id,()=>void t.update());return t.signal.addEventListener(`abort`,()=>{b(),x?.()},{once:!0}),()=>{let{mode:l,origin:u,theme:m,viewport:b,size:x}=t.props,{preview:S,images:C,refreshing:T,error:E}=s.get(c);t.queueTask(()=>{s.show(c,m,x),g()});let D=C[w(m,x)]??C[w(m===`dark`?`light`:`dark`,x)];D&&(!f||f.capture.theme!==D.capture.theme)?f=D:y();let O=f,M=E||(S?.captures.length?null:S?.error),N=new URL(r.path,u).href;if(O){let i=j(b,r.id);if(d=A(O,i.density,d),i.visible&&d===`slices`&&!O.srcs.length){let{theme:e}=O.capture;t.queueTask(()=>s.slices(c,e,x))}let a=h(O),{width:o}=O.capture,{thumbnail:u,slices:f}=v(O);return e(`div`,{role:`img`,"aria-label":`${r.title} preview`,"data-detail":i.visible?f.length?`slices`:u?`thumbnail`:`pending`:`hidden`,class:`relative select-none overflow-hidden ${l===`comment`?`cursor-crosshair`:``}`,style:{height:a},mix:[n(`pointerdown`,e=>{l!==`pan`&&e.stopPropagation()}),n(`click`,e=>{if(l!==`comment`||S?.path!==r.path)return;e.stopPropagation();let n=e.currentTarget.getBoundingClientRect(),i={x:(e.clientX-n.left)*o/n.width,y:(e.clientY-n.top)*a/n.height};t.props.onPick({element:null,path:r.path,..._(i,o),found:s.describe(c,O.capture,i.x,i.y)})})],children:[u?e(`img`,{src:u,alt:``,decoding:`async`,draggable:!1,class:`absolute inset-x-0 top-0 block w-full max-w-none`,style:{height:O.capture.height}}):null,f.map(({tile:t,index:n,top:r,src:i})=>e(`img`,{src:i,alt:``,decoding:`async`,draggable:!1,class:`absolute inset-x-0 block w-full max-w-none`,style:{top:r,height:t.height+ +(n<O.capture.tiles.length-1)}},t.hash))]})}return S?.state===`failed`||M&&!T?e(`div`,{class:`absolute inset-0 flex flex-col items-center justify-center gap-3 p-12 text-center`,role:`status`,children:[e(p,{name:`circle-alert`,size:24,class:`text-muted`}),e(a,{variant:`title`,weight:`semibold`,class:`text-ink`,children:[r.title,` couldn't be captured`]}),M?e(a,{variant:`ui`,class:`max-w-md text-muted`,children:M}):null,e(`div`,{class:`mt-2 flex gap-2`,children:[e(i,{variant:`secondary`,disabled:T,mix:[k,n(`click`,()=>void s.refresh(c))],children:e(a,{variant:`ui`,children:`Try again`})}),e(`a`,{href:N,target:`_blank`,rel:`noreferrer`,class:`bud-interaction bud-control flex h-control items-center rounded-lg px-3 text-ink`,mix:k,children:e(a,{variant:`ui`,children:`Open page`})})]})]}):e(`div`,{class:`absolute inset-0 flex items-center justify-center`,children:e(o,{label:`Capturing ${r.title}…`})})}}function ee(r){let{route:i,previews:a}=r.props,o=i.pageId??i.id,s=a.watch(o,()=>void r.update());return r.signal.addEventListener(`abort`,s,{once:!0}),()=>{let{preview:r,refreshing:s}=a.get(o),c=s||!!r?.updating,d=r?.state===`ready`?r.error:null;return e(t,{children:[d?e(u,{label:d,children:e(`span`,{tabIndex:0,role:`img`,"aria-label":d,class:`pointer-events-auto ms-1 inline-flex text-amber-500`,mix:k,children:e(p,{name:`circle-alert`,size:13})})}):null,e(l,{icon:`sync`,label:`Refresh ${i.title}`,tooltip:!0,size:`small`,iconSize:13,disabled:s,"aria-busy":c?`true`:void 0,class:`pointer-events-auto ms-0.5 text-muted hover:text-ink ${c?`[&_svg]:animate-spin`:``}`,mix:[k,n(`click`,()=>void a.refresh(o))]})]})}}var P=new Map;function F(){return new Worker(new URL(`/assets/difference-worker-BpqPBs5g.js`,``+import.meta.url),{type:`module`})}function I(e){let{routes:t,before:n,after:r,theme:i,signal:a}=e,o=new Map,s={get:e=>o.get(e)??{state:`pending`,regions:[]},progress:{compared:0,total:t.length},done:t.length===0},c,l=0,u=new Map;function d(e){c??=F(),c.onmessage=e=>{u.get(e.data.id)?.(e.data),u.delete(e.data.id)};let t=l++;return new Promise(n=>{u.set(t,n),c.postMessage({...e,id:t})})}a.addEventListener(`abort`,()=>c?.terminate(),{once:!0});async function f(e,t){let[a,o]=await Promise.all([n.picture(e,i,t),r.picture(e,i,t)]);if(!a||!o)return{state:`missing`,regions:[],before:a?.capture,after:o?.capture};let s={before:a.capture,after:o.capture};if(a.capture.hash===o.capture.hash)return{state:`same`,regions:[],...s};let c=`${a.capture.hash}\0${o.capture.hash}`,l=P.get(c);if(!l){let e=e=>({images:e.images,heights:e.capture.tiles.map(e=>e.height),scale:e.capture.scale}),t=await d({width:a.capture.width,before:e(a),after:e(o)});if(`error`in t)return{state:`failed`,regions:[],error:t.error,...s};l=t.regions,P.set(c,l)}return{state:l.length?`different`:`same`,regions:l,...s}}return(async()=>{for(let n of t){if(a.aborted)return;let r=await f(n.page,n.size).catch(e=>({state:`failed`,regions:[],error:e instanceof Error?e.message:`The pictures could not be compared.`}));if(a.aborted)return;o.set(n.id,r),s.progress={compared:s.progress.compared+1,total:t.length},e.onChange(n.id)}s.done=!0,c?.terminate(),c=void 0,e.onChange(null)})(),s}var L=40,R=48;function z(e){let t=0;return{slots:e.map(e=>{let n={top:t,height:L+Math.max(e.before.height,e.after.height,1)};return t+=n.height+R,n}),height:Math.max(1,t-R)}}var B={changed:`Changed`,added:`Added`,removed:`Removed`};function V(e){let t=new Map;return e.addEventListener(`abort`,()=>{for(let e of t.values())URL.revokeObjectURL(e)},{once:!0}),e=>{let n=t.get(e);return n||t.set(e,n=URL.createObjectURL(e)),n}}function te(t){let n=V(t.signal),r=0;return()=>{let{route:i,side:o,label:s,regions:c,viewport:l}=t.props,{slots:u,height:d}=z(c);r!==d&&(r=d,t.queueTask(()=>t.props.onLayout({height:d,path:i.path})));let f=l?.get(i.id)?.visible??!0;return e(`div`,{role:`img`,"aria-label":`${i.title}, ${s}`,"data-difference":o,"data-changes":c.length,class:`relative select-none bg-[var(--bud-main)]`,style:{height:`${d}px`},children:c.map((t,r)=>{let i=t[o],c=t.crops[o],l=u[r];return e(`div`,{"data-kind":t.kind,"data-span":`${i.y} ${i.height}`,class:`absolute inset-x-0`,style:{top:`${l.top}px`,height:`${l.height}px`},children:[e(`div`,{class:`flex items-center gap-2 px-1`,style:{height:`${L}px`},children:[e(a,{variant:`ui`,weight:`medium`,children:`Change ${r+1}`}),e(a,{variant:`ui`,tone:`muted`,children:B[t.kind]})]}),c&&i.height>0?e(`div`,{class:`relative overflow-hidden`,style:{height:`${i.height}px`},children:[f?e(`img`,{alt:``,src:n(c),draggable:!1,class:`block h-full w-full`}):null,t.kind===`changed`?e(`div`,{"aria-hidden":`true`,class:`pointer-events-none absolute inset-y-0 rounded-sm outline-2 outline-red-500/70`,style:{left:`${t.x}px`,width:`${Math.max(2,t.width)}px`}}):null]}):e(`div`,{class:`grid h-24 place-items-center rounded-lg border border-dashed border-line`,children:e(a,{variant:`ui`,tone:`muted`,children:`Not in ${s}`})})]},r)})})}}function ne(t){let i=V(t.signal),o=e=>{let{slides:n,index:r}=t.props;n.length&&t.props.onIndex((r+e+n.length)%n.length)};return()=>{let{slides:s,index:c,beforeLabel:u,afterLabel:d}=t.props,f=s[Math.min(c,s.length-1)],p=(t,n)=>{let r=f?.region.crops[t];return e(`figure`,{class:`m-0 flex min-w-0 flex-col gap-2`,children:[e(`figcaption`,{children:e(a,{variant:`ui`,tone:`muted`,children:n})}),r&&f.region[t].height>0?e(`div`,{class:`relative`,children:[e(`img`,{alt:`${f.route.title}, ${n}`,src:i(r),class:`block w-full rounded-lg ring-1 ring-line`}),f.region.kind===`changed`?e(`div`,{"aria-hidden":`true`,class:`pointer-events-none absolute inset-y-0 rounded-sm outline-2 outline-red-500/70`,style:{left:`${f.region.x/f.width*100}%`,width:`max(2px, ${f.region.width/f.width*100}%)`}}):null]}):e(`div`,{class:`grid h-32 place-items-center rounded-lg border border-dashed border-line`,children:e(a,{variant:`ui`,tone:`muted`,children:`Not in ${n}`})})]})};return e(`section`,{role:`dialog`,"aria-label":`Differences slideshow`,class:`bud-surface absolute inset-0 z-40 flex flex-col bg-[var(--bud-main)]`,mix:r((e,n)=>{e.focus(),e.ownerDocument.addEventListener(`keydown`,e=>{if(e.key===`ArrowRight`)o(1);else if(e.key===`ArrowLeft`)o(-1);else if(e.key===`Escape`)t.props.onClose();else return;e.preventDefault()},{signal:n})}),tabindex:-1,children:[e(`header`,{class:`flex h-12 shrink-0 items-center gap-2 border-b border-line ps-4 pe-2`,children:[e(`div`,{class:`flex min-w-0 flex-1 items-baseline gap-2`,children:[e(a,{variant:`ui`,weight:`medium`,class:`truncate`,children:f?.route.title??`No differences`}),f?e(a,{variant:`ui`,tone:`muted`,class:`shrink-0 tabular-nums`,role:`status`,children:`${B[f.region.kind]} · change ${f.index+1} of ${f.count} · ${c+1} / ${s.length}`}):null]}),e(l,{tooltip:!0,icon:`chevron-left`,label:`Previous change`,disabled:s.length<2,mix:n(`click`,()=>o(-1))}),e(l,{tooltip:!0,icon:`chevron-right`,label:`Next change`,disabled:s.length<2,mix:n(`click`,()=>o(1))}),e(l,{tooltip:!0,icon:`close`,label:`Close slideshow`,shortcut:`escape`,mix:n(`click`,()=>t.props.onClose())})]}),e(`div`,{class:`min-h-0 flex-1 overflow-auto p-4`,children:f?e(`div`,{class:`grid gap-4 md:grid-cols-2`,children:[p(`before`,u),p(`after`,d)]}):null})]})}}function H(e){return!(!e.anchor||`type`in e.anchor)}function U(e,t){let{themes:n}=e.previews,r=m(t),i=document.documentElement.dataset.theme;return n.find(e=>e===r)??n.find(e=>e===i)??n[0]}function W(r){let i=r.props.project,a,s=C({store:y(i),token:i.token,signal:r.signal,initial:r.props.comments,onChange:()=>{r.update()}});r.props.comments.stored&&s.load();let u=i.workingTree?null:i.main??`main`,p=`bud:canvas-branch:${i.id}`,_=m(p),S=typeof _==`string`?_:u,w=!0,O=!1,k=E({project:i,signal:r.signal,onChange:()=>{S&&S!==u&&k.loaded&&!k.list.branches.some(e=>e.name===S&&e.active)?M(u):r.update()}}),A=new AbortController;r.signal.addEventListener(`abort`,()=>A.abort(),{once:!0});let j=T({project:i,signal:A.signal,branch:S});function M(e){if(O=!1,e===S)return void r.update();S=e,v(p,e),A.abort(),A=new AbortController,j=T({project:i,signal:A.signal,branch:e}),r.update()}let P=`bud:preview-theme:${i.id}`,F=U(i,P),L=`bud:preview-top-only:${i.id}`,R=m(L)===!0,z=i.previews.viewports,B=z.length>1,V=`bud:canvas-viewport:${i.id}`,W=m(V),G=B&&typeof W==`string`&&(W===`all`||z.some(e=>e.id===W))?W:B?`all`:z[0].id;function K(e){e!==G&&(G=e,v(V,e),r.update())}function q(){let e=G===`all`?z:z.filter(e=>e.id===G);return i.routes.flatMap(t=>e.map(e=>({route:t,size:e,artboard:B?{...t,id:`${t.id}@${e.id}`,pageId:t.id,width:e.width,caption:String(e.width)}:t})))}let J=`bud:canvas-compare:${i.id}`,Y=null,X,Z;function Q(){let e=i.workingTree?[{value:``,label:`Working tree`}]:[];for(let t of k.list.branches)t.active&&t.captured&&e.push({value:t.name,label:t.name});return e.filter(e=>e.value!==(S??``))}function $(e){return e||`Working tree`}function re(){let e=Q(),t=m(J);Y=e.find(e=>e.value===t)?.value??e.find(e=>e.value===(k.list.main??`main`))?.value??e[0]?.value??null,Z=void 0,r.update()}function ie(){Y=null,Z=void 0,X?.controller.abort(),X=void 0,r.update()}function ae(e){if(Y===null||(Q().some(e=>e.value===Y)||(Y=Q()[0]?.value??null),Y===null))return;let t=`${Y}\0${S??``}\0${F}\0${G}`;if(X?.key===t)return X.result;X?.controller.abort();let n=new AbortController;r.signal.addEventListener(`abort`,()=>n.abort(),{once:!0});let a=T({project:i,signal:n.signal,branch:Y||null}),o=I({routes:q().map(({route:e,size:t,artboard:n})=>({id:n.id,page:e.id,size:t})),before:a,after:e,theme:F,signal:n.signal,onChange:()=>{r.update()}});return X={key:t,controller:n,result:o},o}function oe(e){return!B||G===`all`||(z.find(t=>t.width===e.anchor.viewport)??z[0]).id===G}function se(e){return e.filter(H).filter(e=>(e.anchor.branch??u)===S).filter(oe)}return()=>{if(a!==r.props.threadId){a=r.props.threadId;let e=a;e&&r.queueTask(()=>{s.loadThread(e)})}if(!k.loaded&&!k.error)return e(o,{label:`Loading branches…`});let u=`${i.id}:${i.targetOrigin}:${i.routes.map(e=>e.path).join(`|`)}`,p={...s.snapshot,threads:se(s.snapshot.threads)},m=q(),_=new Map(m.map(({artboard:e,size:t})=>[e.id,t])),y=ae(j),C=$(Y),T=$(S),E=y?m.map(({artboard:e})=>e).filter(e=>y.get(e.id).state===`different`):[],A=new Map,I=E.flatMap(e=>[`before`,`after`].map(t=>{let n=`${e.id}#${t}`;return A.set(n,{route:e,side:t}),{id:n,path:e.path,title:e.title,width:e.width,caption:e.caption,compare:{groupId:e.id,groupTitle:e.title,versionLabel:t===`before`?C:T}}})),V=E.flatMap(e=>{let{regions:t,after:n}=y.get(e.id),r=n?.width??e.width??z[0].width;return t.map((n,i)=>({route:e,region:n,index:i,count:t.length,width:r}))}),H=``;if(y){let{compared:e,total:t}=y.progress,n=m.filter(({artboard:e})=>y.get(e.id).state===`missing`).length;H=y.done?E.length?`${E.length} of ${t} pages differ from ${C}`:`No differences from ${C}`:`Comparing with ${C}… ${e} of ${t} pages`,y.done&&n&&(H+=` · ${n} without pictures on both sides`)}let U=Q(),W=e=>e.mobile||e.width<600?`mobile`:e.width<1100?`tablet`:`desktop`,oe=e(t,{children:[B?e(t,{children:[z.map(t=>e(l,{tooltip:!0,icon:W(t),label:`Show ${t.name} (${t.width})`,active:G===t.id,mix:n(`click`,()=>K(t.id))})),e(l,{tooltip:!0,icon:`columns`,label:`Show every viewport side by side`,active:G===`all`,mix:n(`click`,()=>K(`all`))}),e(c,{})]}):null,e(l,{tooltip:!0,icon:`compare`,label:y?`Stop comparing`:`Show differences with another branch`,active:!!y,disabled:!y&&!U.length,mix:n(`click`,()=>y?ie():re())}),y?e(t,{children:[e(f,{label:`Compare with`,value:Y??``,options:U,class:`max-w-48`,onChange:e=>{Y=e,Z=void 0,v(J,e),r.update()}}),e(l,{tooltip:!0,icon:`play`,label:`Step through the differences`,disabled:!V.length,mix:n(`click`,()=>{Z=0,r.update()})})]}):null]});return e(d,{class:`h-full min-h-0`,sidebarLabel:`Branches`,mainLabel:`Canvas`,drawerOpen:O,onDrawerOpenChange:e=>{O=e,r.update()},onWideChange:e=>{w!==e&&(w=e,r.update())},sidebar:e(h,{working:k.list.working,workingTree:i.workingTree,branches:k.list.branches,selected:S,busy:k.busy||!k.loaded,loaded:k.loaded,error:k.error,mobile:!w,onSelect:M,onActivate:(e,t)=>{k.activate(e,t)},onCapture:e=>{k.capture(e)},onClose:()=>{O=!1,r.update()}}),children:e(g,{artboards:y?I:m.map(({artboard:e})=>e),width:z[0].width,storageKey:y?`bud:camera:${u}:differences:${G}`:`bud:camera:${u}:${B?G:z[0].width}`,tools:oe,overlay:y&&Z!==void 0?e(ne,{slides:V,index:Z,beforeLabel:C,afterLabel:T,onIndex:e=>{Z=e,r.update()},onClose:()=>{Z=void 0,r.update()}}):null,snapshot:p,capabilities:s.snapshot.capabilities,commentsUnavailable:y?H:(s.loaded?!s.ready:i.storage.threads?.state!==`ready`)?x:void 0,onLoadThread:s.loadThread,renderThreadLinks:t=>e(D,{part:`links`,project:i,thread:t,canLink:s.snapshot.capabilities.link,busy:s.busy,onChange:async()=>{await s.load(),await s.loadThread(t.id,!0)}}),renderThreadActions:t=>e(D,{part:`action`,project:i,thread:t,canLink:s.snapshot.capabilities.link,busy:s.busy,onChange:async()=>{await s.load(),await s.loadThread(t.id,!0)}}),initialThreadId:a,loaded:s.loaded,busy:s.busy,error:s.error,now:s.now,onWrite:async e=>{let t=await s.write(e);return{...t,threads:se(t.threads)}},onSync:()=>s.sync().catch(()=>{}),onReload:s.load,onCopyThreadLink:e=>navigator.clipboard.writeText(new URL(b(e.id),window.location.origin).href),interactive:!1,branch:S,theme:F,onThemeChange:i.previews.themes.length>1?e=>{F=e,v(P,e),r.update()}:void 0,topOnly:R,onTopOnlyChange:y?void 0:e=>{R=e,v(L,e),r.update()},onShowSidebar:w?void 0:()=>{O=!0,r.update()},sidebarLabel:`Branches`,renderArtboard:(t,n)=>{let r=A.get(t.id);return r?e(te,{route:t,side:r.side,label:r.side===`before`?C:T,regions:y.get(r.route.id).regions,...n},`${X?.key??``}\0${t.id}`):e(N,{route:t,origin:i.targetOrigin,theme:F,size:_.get(t.id)??z[0],topOnly:R,previews:j,...n},`${S??``}\0${t.id}`)},renderArtboardActions:t=>S||y?null:e(ee,{route:t,previews:j})},`${y?`${u}:differences`:u}:${G}`)})}}var G=s({load:({project:e,signal:t})=>S(e,t),render:(t,{project:n,conversation:r})=>e(W,{project:n,comments:t,threadId:r?.id})});export{G as default};
@@ -1,8 +0,0 @@
1
- const e=/* @__PURE__ */ new WeakSet;function t(e){let t={"~standard":{version:1,vendor:`data-schema`,validate(r,i){return e(r,{path:[],options:i,mutablePath:n(t)})}},"~run"(t,n){return n.mutablePath?e(t,{path:[...n.path],options:n.options}):e(t,n)},pipe(...e){return e.length===0?t:i(t,function(n,r){let i=t[`~run`](n,r);if(i.issues)return i;for(let t of e)if(!t.check(i.value))return t.code?{issues:[d(r,{code:t.code,defaultMessage:t.message??`Check failed`,input:i.value,values:t.values})]}:{issues:[f(t.message??`Check failed`,[...r.path])]};return i})},refine(e,n){return i(t,function(r,i){let a=t[`~run`](r,i);return a.issues||e(a.value)?a:n===void 0?{issues:[d(i,{code:`refine.failed`,defaultMessage:`Refinement failed`,input:a.value})]}:{issues:[f(n,[...i.path])]}})},transform(e){return i(t,function(n,r){let i=t[`~run`](n,r);return i.issues?i:{value:e(i.value)}})}};return t}function n(t){return e.has(t)}function r(n){let r=t(n);return r[`~run`]=n,e.add(r),r}function i(e,i){return n(e)?r(i):t(i)}function a(e,t,n,r){if(n.mutablePath!==!0||!Array.isArray(n.path)){let i={path:s(n.path,r),options:n.options,mutablePath:!1};return e[`~run`](t,i)}n.path.push(r);try{return e[`~run`](t,n)}finally{n.path.pop()}}function o(e){let t=e?.libraryOptions?.abortEarly;return!!(e?.abortEarly??t)}function s(e,t){return e.length===0?[t]:[...e,t]}function c(e){let t=e?.libraryOptions?.errorMap;if(typeof e?.errorMap==`function`)return e.errorMap;if(typeof t==`function`)return t}function l(e){let t=e?.libraryOptions?.locale;if(typeof e?.locale==`string`)return e.locale;if(typeof t==`string`)return t}function u(e,t){let n=c(e);return n?n(t)??t.defaultMessage:t.defaultMessage}function d(e,t){let n=[...t.path??e.path];return f(u(e.options,{code:t.code,defaultMessage:t.defaultMessage,path:n,values:t.values,input:t.input,locale:l(e.options)}),n)}function f(e,t){return!t||t.length===0?{message:e}:{message:e,path:t}}function p(e,t,n){return n?.code?(t&&=[...t],{issues:[f(u(n.parseOptions,{code:n.code,defaultMessage:e,path:t,values:n.values,input:n.input,locale:l(n.parseOptions)}),t)]}):{issues:[f(e,t)]}}function m(e){return r(function(t,n){if(!Array.isArray(t))return p(`Expected array`,n.path,{code:`type.array`,input:t,parseOptions:n.options});let r=o(n.options),i=[],s=Array(t.length),c=0;for(let o of t){let t=a(e,o,n,c);if(t.issues){if(r)return t;i.push(...t.issues)}else s[c]=t.value;c+=1}return i.length>0?{issues:i}:(s.length=c,{value:s})})}function h(){return r(function(e,t){return typeof e==`boolean`?{value:e}:p(`Expected boolean`,t.path,{code:`type.boolean`,input:e,parseOptions:t.options})})}function g(e){return r(function(t,n){for(let n of e)if(t===n)return{value:t};return p(`Expected one of: `+e.map(String).join(`, `),n.path,{code:`enum.invalid_value`,input:t,values:{values:[...e]},parseOptions:n.options})})}function _(e){return r(function(t,n){return t===null?{value:null}:e[`~run`](t,n)})}function v(){return r(function(e,t){return typeof e!=`number`||!Number.isFinite(e)?p(`Expected number`,t.path,{code:`type.number`,input:e,parseOptions:t.options}):{value:e}})}function y(e,t){return r(function(n,r){if(typeof n!=`object`||!n||Array.isArray(n))return p(`Expected object`,r.path,{code:`type.object`,input:n,parseOptions:r.options});let i=o(r.options),c=[],l={},u=n,f=t?.unknownKeys??`strip`;for(let t of Object.keys(e)){let n=a(e[t],u[t],r,t);if(n.issues){if(i)return n;c.push(...n.issues)}else(Object.prototype.hasOwnProperty.call(u,t)||n.value!==void 0)&&(l[t]=n.value)}if(f===`passthrough`||f===`error`){for(let t in u)if(Object.prototype.hasOwnProperty.call(u,t)&&!Object.prototype.hasOwnProperty.call(e,t)){if(f===`passthrough`)l[t]=u[t];else{let e=d(r,{code:`object.unknown_key`,defaultMessage:`Unknown key`,input:u[t],path:s(r.path,t),values:{key:t}});if(i)return{issues:[e]};c.push(e)}}}return c.length>0?{issues:c}:{value:l}})}function b(e){return r(function(t,n){return t===void 0?{value:void 0}:e[`~run`](t,n)})}function x(){return r(function(e,t){return typeof e==`string`?{value:e}:p(`Expected string`,t.path,{code:`type.string`,input:e,parseOptions:t.options})})}function S(e){return{check(t){return t.length<=e},code:`string.max_length`,values:{max:e},message:`Expected at most `+String(e)+` characters`}}function C(e){return{check(t){return t>=e},code:`number.min`,values:{min:e},message:`Expected number greater than or equal to `+String(e)}}function w(e){return{check(t){return t<=e},code:`number.max`,values:{max:e},message:`Expected number less than or equal to `+String(e)}}const T=1e5,ee=[120,480],E=`Expected a bounded integer.`,D=`Expected bounded text.`,O={"type.object":`Expected an object.`,"object.unknown_key":`Unexpected field.`,"type.number":E,"number.min":E,"number.max":E,"type.string":D,"string.max_length":D},k={check:e=>!e.includes(`\0`),message:D},A={check:e=>Number.isSafeInteger(e),message:E};function j(e,n){return t((t,r)=>{let i=e[`~run`](t,r);return i.issues?p(n,r.path):i})}function M(e,n,r){let i=m(e);return t((e,t)=>!Array.isArray(e)||e.length>n?p(r,t.path):i[`~run`](e,t))}function N(e){return x().pipe(S(e),k)}function P(e=2**53-1,t=0){return v().pipe(A,C(t),w(e))}function F(e){let n=y(e);return t((t,r)=>{if(t&&typeof t==`object`&&!Array.isArray(t)){for(let n of Object.keys(t))if(!Object.hasOwn(e,n))return p(O[`object.unknown_key`],[...r.path,n])}let i=n[`~run`](t,r);if(!i.issues)for(let e of Object.keys(i.value))i.value[e]===void 0&&delete i.value[e];return i})}const te=N(512).refine(e=>e!==``,`Expected a preview identity.`),ne=j(g([`light`,`dark`]),`Unsupported preview theme.`),I=j(x().refine(e=>/^[a-f0-9]{64}$/.test(e)),`Expected a content hash.`),re=F({hash:I,height:P(4096,1)}),ie=F({hash:I,width:P(ee.at(-1),1)}),ae=`Expected slices that make up the capture.`,oe=e=>_(v().refine(t=>Number.isFinite(t)&&t>=0&&t<=e)),se=F({id:N(512).refine(e=>e.length>0),match:j(g([`element`,`block`,`missing`]),`Unsupported pin match.`),x:oe(1e4),y:oe(T)}),ce=F({theme:ne,viewport:b(j(x().refine(e=>/^[a-z0-9][a-z0-9-]{0,31}$/.test(e)),`Expected a viewport identity.`)),revision:P(2**53-1,1),hash:I,width:P(1e4,1),height:P(T,1),scale:P(3,1),tiles:M(re,25,ae),thumbnails:M(ie,ee.length,`Expected a capture's thumbnails.`),pins:b(M(se,1e3,`Expected pins.`)),map:b(I)}).refine(e=>e.tiles.length>0&&e.tiles.reduce((e,t)=>e+t.height,0)===e.height,ae),le=`Expected at most one capture per theme and viewport.`,ue=e=>`${e.theme}\0${e.viewport??e.width}`,de=j(N(255).refine(e=>/^[A-Za-z0-9._/-]+$/.test(e)&&!e.startsWith(`-`)&&!e.startsWith(`/`)&&!e.endsWith(`/`)&&!e.endsWith(`.lock`)&&!e.includes(`..`)&&!e.includes(`//`)),`Expected a branch name.`);F({id:te,path:N(4096),state:j(g([`pending`,`ready`,`failed`]),`Unsupported preview state.`),error:_(N(2048)),captures:M(ce,8,le).refine(e=>new Set(e.map(ue)).size===e.length,le),updating:h(),sequence:P(),branch:b(de)});var L=class{diff(e,t,n={}){let r;typeof n==`function`?(r=n,n={}):`callback`in n&&(r=n.callback);let i=this.castInput(e,n),a=this.castInput(t,n),o=this.removeEmpty(this.tokenize(i,n)),s=this.removeEmpty(this.tokenize(a,n));return this.diffWithOptionsObj(o,s,n,r)}diffWithOptionsObj(e,t,n,r){let i=e=>{if(e=this.postProcess(e,n),r)setTimeout(function(){r(e)},0);else return e},a=t.length,o=e.length,s=1,c=a+o;n.maxEditLength!=null&&(c=Math.min(c,n.maxEditLength));let l=n.timeout??1/0,u=Date.now()+l,d=[{oldPos:-1,lastComponent:void 0}],f=this.extractCommon(d[0],t,e,0,n);if(d[0].oldPos+1>=o&&f+1>=a)return i(this.buildValues(d[0].lastComponent,t,e));let p=-1/0,m=1/0,h=()=>{for(let r=Math.max(p,-s);r<=Math.min(m,s);r+=2){let s,c=d[r-1],l=d[r+1];c&&(d[r-1]=void 0);let u=!1;if(l){let e=l.oldPos-r;u=l&&0<=e&&e<a}let h=c&&c.oldPos+1<o;if(!u&&!h)d[r]=void 0;else{if(s=!h||u&&c.oldPos<l.oldPos?this.addToPath(l,!0,!1,0,n):this.addToPath(c,!1,!0,1,n),f=this.extractCommon(s,t,e,r,n),s.oldPos+1>=o&&f+1>=a)return i(this.buildValues(s.lastComponent,t,e))||!0;d[r]=s,s.oldPos+1>=o&&(m=Math.min(m,r-1)),f+1>=a&&(p=Math.max(p,r+1))}}s++};if(r)(function e(){setTimeout(function(){if(s>c||Date.now()>u)return r(void 0);h()||e()},0)})();else for(;s<=c&&Date.now()<=u;){let e=h();if(e)return e}}addToPath(e,t,n,r,i){let a=e.lastComponent;return a&&!i.oneChangePerToken&&a.added===t&&a.removed===n?{oldPos:e.oldPos+r,lastComponent:{count:a.count+1,added:t,removed:n,previousComponent:a.previousComponent}}:{oldPos:e.oldPos+r,lastComponent:{count:1,added:t,removed:n,previousComponent:a}}}extractCommon(e,t,n,r,i){let a=t.length,o=n.length,s=e.oldPos,c=s-r,l=0;for(;c+1<a&&s+1<o&&this.equals(n[s+1],t[c+1],i);)c++,s++,l++,i.oneChangePerToken&&(e.lastComponent={count:1,previousComponent:e.lastComponent,added:!1,removed:!1});return l&&!i.oneChangePerToken&&(e.lastComponent={count:l,previousComponent:e.lastComponent,added:!1,removed:!1}),e.oldPos=s,c}equals(e,t,n){return n.comparator?n.comparator(e,t):e===t||!!n.ignoreCase&&e.toLowerCase()===t.toLowerCase()}removeEmpty(e){let t=[];for(let n=0;n<e.length;n++)e[n]&&t.push(e[n]);return t}castInput(e,t){return e}tokenize(e,t){return Array.from(e)}join(e){return e.join(``)}postProcess(e,t){return e}get useLongestToken(){return!1}buildValues(e,t,n){let r=[],i;for(;e;)r.push(e),i=e.previousComponent,delete e.previousComponent,e=i;r.reverse();let a=r.length,o=0,s=0,c=0;for(;o<a;o++){let e=r[o];if(e.removed)e.value=this.join(n.slice(c,c+e.count)),c+=e.count;else{if(!e.added&&this.useLongestToken){let r=t.slice(s,s+e.count);r=r.map(function(e,t){let r=n[c+t];return r.length>e.length?r:e}),e.value=this.join(r)}else e.value=this.join(t.slice(s,s+e.count));s+=e.count,e.added||(c+=e.count)}}return r}};new class extends L{};function fe(e,t){let n=0;for(;n<e.length&&n<t.length;n++)if(e[n]!=t[n])return e.slice(0,n);return e.slice(0,n)}function pe(e,t){let n;if(!e||!t||e[e.length-1]!=t[t.length-1])return``;for(n=0;n<e.length&&n<t.length;n++)if(e[e.length-(n+1)]!=t[t.length-(n+1)])return e.slice(-n);return e.slice(-n)}function R(e,t,n){if(e.slice(0,t.length)!=t)throw Error(`string ${JSON.stringify(e)} doesn't start with prefix ${JSON.stringify(t)}; this is a bug`);return n+e.slice(t.length)}function me(e,t,n){if(!t)return e+n;if(e.slice(-t.length)!=t)throw Error(`string ${JSON.stringify(e)} doesn't end with suffix ${JSON.stringify(t)}; this is a bug`);return e.slice(0,-t.length)+n}function z(e,t){return R(e,t,``)}function B(e,t){return me(e,t,``)}function he(e,t){return t.slice(0,ge(e,t))}function ge(e,t){let n=0;e.length>t.length&&(n=e.length-t.length);let r=t.length;e.length<t.length&&(r=e.length);let i=Array(r),a=0;i[0]=0;for(let e=1;e<r;e++){for(t[e]==t[a]?i[e]=i[a]:i[e]=a;a>0&&t[e]!=t[a];)a=i[a];t[e]==t[a]&&a++}a=0;for(let r=n;r<e.length;r++){for(;a>0&&e[r]!=t[a];)a=i[a];e[r]==t[a]&&a++}return a}function _e(e,t){let n=[];for(let r of Array.from(t.segment(e))){let e=r.segment;n.length&&/\s/.test(n[n.length-1])&&/\s/.test(e)?n[n.length-1]+=e:n.push(e)}return n}function ve(e,t){if(t)return H(e,t)[1];let n;for(n=e.length-1;n>=0&&e[n].match(/\s/);n--);return e.substring(n+1)}function V(e,t){if(t)return H(e,t)[0];let n=e.match(/^\s*/);return n?n[0]:``}function H(e,t){if(!t)return[V(e),ve(e)];if(t.resolvedOptions().granularity!=`word`)throw Error(`The segmenter passed must have a granularity of "word"`);let n=_e(e,t),r=n[0],i=n[n.length-1];return[/\s/.test(r)?r:``,/\s/.test(i)?i:``]}const U=`a-zA-Z0-9_\\u{AD}\\u{C0}-\\u{D6}\\u{D8}-\\u{F6}\\u{F8}-\\u{2C6}\\u{2C8}-\\u{2D7}\\u{2DE}-\\u{2FF}\\u{1E00}-\\u{1EFF}`,ye=RegExp(`[${U}]+|\\s+|[^${U}]`,`ug`);new class extends L{equals(e,t,n){return n.ignoreCase&&(e=e.toLowerCase(),t=t.toLowerCase()),e.trim()===t.trim()}tokenize(e,t={}){let n;if(t.intlSegmenter){let r=t.intlSegmenter;if(r.resolvedOptions().granularity!=`word`)throw Error(`The segmenter passed must have a granularity of "word"`);n=_e(e,r)}else n=e.match(ye)||[];let r=[],i=null;return n.forEach(e=>{/\s/.test(e)?i==null?r.push(e):r.push(r.pop()+e):i!=null&&/\s/.test(i)?r[r.length-1]==i?r.push(r.pop()+e):r.push(i+e):r.push(e),i=e}),r}join(e){return e.map((e,t)=>t==0?e:e.replace(/^\s+/,``)).join(``)}postProcess(e,t){if(!e||t.oneChangePerToken)return e;let n=null,r=null,i=null;return e.forEach(e=>{e.added?r=e:e.removed?i=e:((r||i)&&be(n,i,r,e,t.intlSegmenter),n=e,r=null,i=null)}),(r||i)&&be(n,i,r,null,t.intlSegmenter),e}};function be(e,t,n,r,i){if(t&&n){let[a,o]=H(t.value,i),[s,c]=H(n.value,i);if(e){let r=fe(a,s);e.value=me(e.value,s,r),t.value=z(t.value,r),n.value=z(n.value,r)}if(r){let e=pe(o,c);r.value=R(r.value,c,e),t.value=B(t.value,e),n.value=B(n.value,e)}}else if(n){if(e){let e=V(n.value,i);n.value=n.value.substring(e.length)}if(r){let e=V(r.value,i);r.value=r.value.substring(e.length)}}else if(e&&r){let n=V(r.value,i),[a,o]=H(t.value,i),s=fe(n,a);t.value=z(t.value,s);let c=pe(z(n,s),o);t.value=B(t.value,c),r.value=R(r.value,n,c),e.value=me(e.value,n,n.slice(0,n.length-c.length))}else if(r){let e=V(r.value,i),n=he(ve(t.value,i),e);t.value=B(t.value,n)}else if(e){let n=he(ve(e.value,i),V(t.value,i));t.value=z(t.value,n)}}new class extends L{tokenize(e){let t=RegExp(`(\\r?\\n)|[${U}]+|[^\\S\\n\\r]+|[^${U}]`,`ug`);return e.match(t)||[]}},new class extends L{constructor(){super(...arguments),this.tokenize=xe}equals(e,t,n){return n.ignoreWhitespace?((!n.newlineIsToken||!e.includes(`
2
- `))&&(e=e.trim()),(!n.newlineIsToken||!t.includes(`
3
- `))&&(t=t.trim())):n.ignoreNewlineAtEof&&!n.newlineIsToken&&(e.endsWith(`
4
- `)&&(e=e.slice(0,-1)),t.endsWith(`
5
- `)&&(t=t.slice(0,-1))),super.equals(e,t,n)}};function xe(e,t){t.stripTrailingCr&&(e=e.replace(/\r\n/g,`
6
- `));let n=[],r=e.split(/(\n|\r\n)/);r[r.length-1]||r.pop();for(let e=0;e<r.length;e++){let i=r[e];e%2&&!t.newlineIsToken?n[n.length-1]+=i:n.push(i)}return n}function Se(e){return e==`.`||e==`!`||e==`?`}new class extends L{tokenize(e){let t=[],n=0;for(let r=0;r<e.length;r++){if(r==e.length-1){t.push(e.slice(n));break}if(Se(e[r])&&e[r+1].match(/\s/)){for(t.push(e.slice(n,r+1)),r=n=r+1;e[r+1]?.match(/\s/);)r++;t.push(e.slice(n,r+1)),n=r+1}}return t}},new class extends L{tokenize(e){return e.split(/([{}:;,]|\s+)/)}},new class extends L{constructor(){super(...arguments),this.tokenize=xe}get useLongestToken(){return!0}castInput(e,t){let{undefinedReplacement:n,stringifyReplacer:r=(e,t)=>t===void 0?n:t}=t;return typeof e==`string`?e:JSON.stringify(Ce(e,null,null,r),null,` `)}equals(e,t,n){return super.equals(e.replace(/,([\r\n])/g,`$1`),t.replace(/,([\r\n])/g,`$1`),n)}};function Ce(e,t,n,r,i){t||=[],n||=[],r&&(e=r(i===void 0?``:i,e));let a=0;for(;a<t.length;a+=1)if(t[a]===e)return n[a];let o;if(Object.prototype.toString.call(e)===`[object Array]`){for(t.push(e),o=Array(e.length),n.push(o),a=0;a<e.length;a+=1)o[a]=Ce(e[a],t,n,r,String(a));return t.pop(),n.pop(),o}if(e&&e.toJSON&&(e=e.toJSON()),typeof e==`object`&&e){t.push(e),o={},n.push(o);let i=[],s;for(s in e)
7
- /* istanbul ignore else */
8
- Object.prototype.hasOwnProperty.call(e,s)&&i.push(s);for(i.sort(),a=0;a<i.length;a+=1)s=i[a],o[s]=Ce(e[s],t,n,r,s);t.pop(),n.pop()}else o=e;return o}const we=new class extends L{tokenize(e){return e.slice()}join(e){return e}removeEmpty(e){return e}};function Te(e,t,n){return we.diff(e,t,n)}function Ee(e,t,n,r,i,a={}){let{threshold:o=.1,alpha:s=.1,aaColor:c=[255,255,0],diffColor:l=[255,0,0],checkerboard:u=!0,windowSize:d=1/0,includeAA:f,diffColorAlt:p,diffMask:m,ignoreMask:h}=a;if(!W(e)||!W(t)||n&&!W(n)||h&&!W(h))throw Error(`Image data: Uint8Array, Uint8ClampedArray or Buffer expected.`);if(e.length!==t.length||n&&n.length!==e.length)throw Error(`Image sizes do not match. Image 1 size: ${e.length}, image 2 size: ${t.length}`);let g=r*i;if(e.length!==g*4)throw Error(`Image data size does not match width/height. Expecting ${g*4}. Got ${e.length}`);if(h&&h.length!==g)throw Error(`Ignore mask size does not match image width/height. Expecting ${g}. Got ${h.length}`);let _=new Uint32Array(e.buffer,e.byteOffset,g),v=new Uint32Array(t.buffer,t.byteOffset,g),y=!0;for(let e=0;e<g;e++)if(_[e]!==v[e]&&(!h||!h[e])){y=!1;break}if(y){if(n&&!m)for(let t=0,r=0;t<g;t++,r+=4)Ge(n,r,e,s);return 0}let[b,x,S]=c,[C,w,T]=l,[ee,E,D]=p||l,O=0,k=Number.isFinite(d)?new Uint8Array(g):null,A=-1,j=0;for(let a=0,c=0;a<g;a++,c+=4){let l=_[a]===v[a]||h&&h[a]?0:Be(e,t,c,u,o);if(l){let o=a%r,s=a/r|0;!f&&(De(e,o,s,r,i,_,v)||De(t,o,s,r,i,v,_))?(n&&!m&&$(n,c,b,x,S),k&&(k[a]=2)):(n&&(l<0?$(n,c,ee,E,D):$(n,c,C,w,T)),k&&(k[a]=1,A<0&&(A=s),j=s),O++)}else n&&!m&&Ge(n,c,e,s)}if(!k||!O)return O;let M=Math.min(Math.max(Math.floor(d),1),r,i),N=new Uint16Array(r),P=0,F=0,te=Math.min(i-1,j+M-1);for(let e=A;e<=te;e++){let t=e*r,n=e-M;if(n>=0){let e=n*r;for(let n=0;n<r;n++){let r=(k[t+n]&1)-(k[e+n]&1);N[n]+=r,F+=r}}else{for(let e=0;e<r;e++){let n=k[t+e]&1;N[e]+=n,F+=n}if(e<M-1)continue}if(F<=P)continue;let i=0;for(let e=0;e<M-1;e++)i+=N[e];for(let e=M-1;e<r;e++)i+=N[e],i>P&&(P=i),i-=N[e-M+1]}return P}function W(e){return ArrayBuffer.isView(e)&&e.BYTES_PER_ELEMENT===1}function De(e,t,n,r,i,a,o){let s=t>0?t-1:0,c=n>0?n-1:0,l=t<r-1?t+1:r-1,u=n<i-1?n+1:i-1,d=(n*r+t)*4,f=e[d],p=e[d+1],m=e[d+2],h=e[d+3],g=+(t===s||t===l||n===c||n===u),_=0,v=0,y=0,b=0,x=0,S=0,C=r*4;for(let i=s;i<=l;i++){let a=(c*r+i)*4;for(let r=c;r<=u;r++,a+=C){if(i===t&&r===n)continue;let o=We(e,a,f,p,m,h);if(o===0){if(g++,g>2)return!1}else o<_?(_=o,y=i,b=r):o>v&&(v=o,x=i,S=r)}}return _===0||v===0?!1:G(a,y,b,r,i)&&G(o,y,b,r,i)||G(a,x,S,r,i)&&G(o,x,S,r,i)}function G(e,t,n,r,i){let a=n*r+t,o=e[a];if(t>0&&t<r-1&&n>0&&n<i-1)return+(o===e[a-r-1])+ +(o===e[a-1])+ +(o===e[a+r-1])+ +(o===e[a-r])+ +(o===e[a+r])+ +(o===e[a-r+1])+ +(o===e[a+1])+ +(o===e[a+r+1])>2;let s=t>0?t-1:0,c=n>0?n-1:0,l=t<r-1?t+1:r-1,u=n<i-1?n+1:i-1,d=+(t===s||t===l||n===c||n===u);for(let i=s;i<=l;i++){let a=c*r+i;for(let s=c;s<=u;s++,a+=r)if((i!==t||s!==n)&&(d+=+(o===e[a]),d>2))return!0}return!1}const K=/* @__PURE__ */ new Float64Array(257);for(let e=0;e<256;e++){let t=e/255;K[e]=t<=.04045?t/12.92:((t+.055)/1.055)**2.4}K[256]=K[255];const Oe=/* @__PURE__ */ new Float64Array(256),ke=/* @__PURE__ */ new Float64Array(256),Ae=/* @__PURE__ */ new Float64Array(256),je=/* @__PURE__ */ new Float64Array(256),Me=/* @__PURE__ */ new Float64Array(256),Ne=/* @__PURE__ */ new Float64Array(256),Pe=/* @__PURE__ */ new Float64Array(256),Fe=/* @__PURE__ */ new Float64Array(256),Ie=/* @__PURE__ */ new Float64Array(256);for(let e=0;e<256;e++){let t=K[e];Oe[e]=.4122214708*t,je[e]=.2119034982*t,Pe[e]=.0883024619*t,ke[e]=.5363325363*t,Me[e]=.6806995451*t,Fe[e]=.2817188376*t,Ae[e]=.0514459929*t,Ne[e]=.1073969566*t,Ie[e]=.6299787005*t}function q(e){let t=e|0;return K[t]+(K[t+1]-K[t])*(e-t)}const Le=4096,J=/* @__PURE__ */ new Float64Array(4098);for(let e=0;e<=4097;e++)J[e]=Math.cbrt(e/Le);function Y(e){let t=e*Le,n=t|0;return n<8?Math.cbrt(e):J[n]+(J[n+1]-J[n])*(t-n)}const Re=4096,X=new Uint32Array(Re),Z=new Float64Array(Re*4),ze=1.206/1.03;function Be(e,t,n,r,i){let a=e[n],o=e[n+1],s=e[n+2],c=e[n+3],l=t[n],u=t[n+1],d=t[n+2],f=t[n+3];return c===255&&f===255?Ve(a,o,s,l,u,d,i):He(a,o,s,c,l,u,d,f,n,r,i)}function Ve(e,t,n,r,i,a,o){let s=e<<16|t<<8|n,c=Math.imul(s,2654435761)>>>20,l=s+1,u=c*4,d,f,p,m;X[c]===l?(d=Z[u],f=Z[u+1],p=Z[u+2],m=Z[u+3]):(d=Y(Oe[e]+ke[t]+Ae[n]),f=Y(je[e]+Me[t]+Ne[n]),p=Y(Pe[e]+Fe[t]+Ie[n]),m=Q(d,f,p),X[c]=l,Z[u]=d,Z[u+1]=f,Z[u+2]=p,Z[u+3]=m);let h=r<<16|i<<8|a,g=Math.imul(h,2654435761)>>>20,_=h+1,v=g*4,y,b,x,S;return X[g]===_?(y=Z[v],b=Z[v+1],x=Z[v+2],S=Z[v+3]):(y=Y(Oe[r]+ke[i]+Ae[a]),b=Y(je[r]+Me[i]+Ne[a]),x=Y(Pe[r]+Fe[i]+Ie[a]),S=Q(y,b,x),X[g]=_,Z[v]=y,Z[v+1]=b,Z[v+2]=x,Z[v+3]=S),Ue(m-S,d-y,f-b,p-x,o)}function He(e,t,n,r,i,a,o,s,c,l,u){let d=255,f=255,p=255;if(l){let e=Math.imul(c>>2,2654435761);d=48+159*(e>>>31),f=48+159*(e>>>30&1),p=48+159*(e>>>29&1)}e=(e*r+d*(255-r))/255,t=(t*r+f*(255-r))/255,n=(n*r+p*(255-r))/255,i=(i*s+d*(255-s))/255,a=(a*s+f*(255-s))/255,o=(o*s+p*(255-s))/255;let m=q(e),h=q(t),g=q(n),_=q(i),v=q(a),y=q(o),b=Y(.4122214708*m+.5363325363*h+.0514459929*g),x=Y(.2119034982*m+.6806995451*h+.1073969566*g),S=Y(.0883024619*m+.2817188376*h+.6299787005*g),C=Y(.4122214708*_+.5363325363*v+.0514459929*y),w=Y(.2119034982*_+.6806995451*v+.1073969566*y),T=Y(.0883024619*_+.2817188376*v+.6299787005*y);return Ue(Q(b,x,S)-Q(C,w,T),b-C,x-w,S-T,u)}function Ue(e,t,n,r,i){let a=i-Math.abs(e);if(a>=0){let e=1.9779984951*t-2.428592205*n+.4505937099*r,i=.0259040371*t+.7827717662*n-.808675766*r;if(e*e+i*i<=a*a)return 0}return e>0?-1:1}function Q(e,t,n){let r=.2104542553*e+.793617785*t-.0040720468*n,i=ze*r-.206;return .5*(i+Math.sqrt(i*i+.12*ze*r))}function We(e,t,n,r,i,a){let o=e[t],s=e[t+1],c=e[t+2],l=e[t+3],u=n-o,d=r-s,f=i-c,p=a-l;if(!u&&!d&&!f&&!p)return 0;if(a<255||l<255){u=(n*a-o*l-255*p)/255,d=(r*a-s*l-255*p)/255,f=(i*a-c*l-255*p)/255;let e=u*.29889531+d*.58662247+f*.11448223;return e===0&&p?p/2:e}return u*.29889531+d*.58662247+f*.11448223}function $(e,t,n,r,i){e[t]=n,e[t+1]=r,e[t+2]=i,e[t+3]=255}function Ge(e,t,n,r){let i=255+(n[t]*.29889531+n[t+1]*.58662247+n[t+2]*.11448223-255)*r*n[t+3]/255;$(e,t,i,i,i)}function Ke(e){let{width:t,height:n,data:r}=e,i=Math.min(48,t),a=[];for(let e=0;e<n;e++){let n=new Uint8Array(i);for(let a=0;a<i;a++){let o=Math.floor(a*t/i),s=Math.floor((a+1)*t/i),c=0;for(let n=o;n<s;n++){let i=(e*t+n)*4;c+=r[i]*.299+r[i+1]*.587+r[i+2]*.114}n[a]=Math.round(c/(s-o))}a.push(n)}return a}function qe(e,t,n,r){let i=Te(e,t,{comparator:(e,t)=>{for(let r=0;r<e.length;r++)if(Math.abs(e[r]-t[r])>n)return!1;return!0},maxEditLength:r});if(i)return i.map(e=>({added:e.added,removed:e.removed,count:e.count}));let a=Math.min(e.length,t.length);return[{added:!1,removed:!1,count:a},...e.length>a?[{added:!1,removed:!0,count:e.length-a}]:[],...t.length>a?[{added:!0,removed:!1,count:t.length-a}]:[]]}function Je(e,t,n,r,i,a,o){let{width:s}=e,c=new Uint8Array(s*Math.min(256,i)*4);for(let l=0;l<i;l+=256){let u=Math.min(256,i-l),d=s*u*4,f=e.data.subarray((n+l)*s*4,(n+l)*s*4+d),p=t.data.subarray((r+l)*s*4,(r+l)*s*4+d),m=c.subarray(0,d);if(m.fill(0),Ee(f,p,m,s,u,{threshold:a,diffMask:!0}))for(let e=0;e<u;e++){let t=0,i=s,a=0;for(let n=0;n<s;n++)m[(e*s+n)*4+3]===255&&(t++,i=Math.min(i,n),a=n+1);t&&o.push({b0:n+l+e,b1:n+l+e+1,a0:r+l+e,a1:r+l+e+1,x0:i,x1:a,changed:t,removed:0,added:0})}}}function Ye(e,t,n={}){let{threshold:r=.1,context:i=24,gap:a=32,minPixels:o=12,maxEdit:s=2e3,tolerance:c=2}=n;if(e.width!==t.width)return[{kind:`changed`,before:{y:0,height:e.height},after:{y:0,height:t.height},x:0,width:Math.max(e.width,t.width),pixels:e.width*e.height}];let{width:l}=e,u=[],d=0,f=0,p=qe(Ke(e),Ke(t),c,s),m=e=>{let t={changed:0,removed:e,added:0};u.push({b0:d,b1:d+e,a0:f,a1:f,x0:0,x1:l,...t}),d+=e},h=e=>{let t={changed:0,removed:0,added:e};u.push({b0:d,b1:d,a0:f,a1:f+e,x0:0,x1:l,...t}),f+=e};for(let n=0;n<p.length;n++){let i=p[n],a=p[n+1];if(i.removed&&a?.added||i.added&&a?.removed){let o=i.removed?i.count:a.count,s=i.added?i.count:a.count,c=Math.min(o,s);Je(e,t,d,f,c,r,u),d+=c,f+=c,o>c&&m(o-c),s>c&&h(s-c),n++}else i.removed?m(i.count):i.added?h(i.count):(Je(e,t,d,f,i.count,r,u),d+=i.count,f+=i.count)}let g=(e,t)=>{let n=[];for(let r of e){let e=n.at(-1);e&&r.a0-e.a1<=t&&r.b0-e.b1<=t?(e.b1=Math.max(e.b1,r.b1),e.a1=Math.max(e.a1,r.a1),e.x0=Math.min(e.x0,r.x0),e.x1=Math.max(e.x1,r.x1),e.changed+=r.changed,e.removed+=r.removed,e.added+=r.added):n.push({...r})}return n};return g(g(u,a).filter(e=>e.removed||e.added||e.changed>=o).map(n=>({...n,b0:Math.max(0,n.b0-i),b1:Math.min(e.height,n.b1+i),a0:Math.max(0,n.a0-i),a1:Math.min(t.height,n.a1+i)})),0).map(e=>({kind:e.removed&&!e.added&&!e.changed?`removed`:e.added&&!e.removed&&!e.changed?`added`:`changed`,before:{y:e.b0,height:e.b1-e.b0},after:{y:e.a0,height:e.a1-e.a0},x:e.x0,width:e.x1-e.x0,pixels:e.changed+(e.removed+e.added)*l}))}const Xe=16e6;async function Ze(e,t,n){let r=Math.max(1,Math.round(e.heights.reduce((e,t)=>e+t,0)*n)),i=new Uint8ClampedArray(t*r*4),a=0;for(let[o,s]of e.images.entries()){let c=Math.min(r-a,Math.round(e.heights[o]*n));if(c<=0)break;let l=await createImageBitmap(s,{resizeWidth:t,resizeHeight:c,resizeQuality:`medium`}),u=new OffscreenCanvas(t,c).getContext(`2d`,{willReadFrequently:!0});u.drawImage(l,0,0),l.close(),i.set(u.getImageData(0,0,t,c).data,a*t*4),a+=c}return{width:t,height:r,data:i}}async function Qe(e){let t=Math.max(...[e.before,e.after].map(e=>e.heights.reduce((e,t)=>e+t,0))),n=Math.max(180,Math.min(Math.round(e.width/2),Math.floor(Xe/t))),r=Math.min(1,Xe/(n*t)),[i,a]=await Promise.all([Ze(e.before,n,r),Ze(e.after,n,r)]),o=e.width/n,s=e=>({y:Math.round(e.y/r),height:Math.round(e.height/r)}),c=Ye(i,a).map(e=>({...e,before:s(e.before),after:s(e.after),x:e.x*o,width:e.width*o})),l=[];for(let t of c)l.push({...t,crops:{before:await $e(e.before,t.before,e.width),after:await $e(e.after,t.after,e.width)}});return l}async function $e(e,t,n){let{scale:r}=e;if(t.height<=0)return null;let i=Math.min(r,Math.max(.25,8192/t.height)),a=new OffscreenCanvas(Math.round(n*i),Math.round(t.height*i)),o=a.getContext(`2d`),s=0;for(let[c,l]of e.images.entries()){let u=e.heights[c],d=Math.max(t.y,s),f=Math.min(t.y+t.height,s+u);if(s+=u,f<=d)continue;let p=await createImageBitmap(l,0,Math.round((d-(s-u))*r),Math.round(n*r),Math.max(1,Math.round((f-d)*r)),{resizeWidth:a.width,resizeHeight:Math.max(1,Math.round((f-d)*i)),resizeQuality:`high`});o.drawImage(p,0,Math.round((d-t.y)*i)),p.close()}return a.convertToBlob({type:`image/jpeg`,quality:.88})}self.addEventListener(`message`,e=>{let t=e.data;Qe(t).then(e=>self.postMessage({id:t.id,regions:e}),e=>self.postMessage({id:t.id,error:e instanceof Error?e.message:`The pictures could not be compared.`}))});