@bud.sh/app 0.2.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.
- package/dist/client/assets/bud/design.js +1 -1
- package/dist/client/assets/canvas-C8hyPWoT.js +1 -0
- package/dist/client/assets/difference-worker-BfF4_N3e.js +8 -0
- package/dist/client/assets/files-D_Tm7gCK.js +1 -0
- package/dist/client/assets/i18n-BtfXum8P.js +1 -0
- package/dist/client/assets/index-Dpxjiok1.js +2 -0
- package/dist/client/assets/pages-B-_CKvDS.js +1 -0
- package/dist/client/assets/project-branches-DzXdaT9L.js +1 -0
- package/dist/client/assets/project-comments-CQkB2jbE.js +1 -0
- package/dist/client/assets/project-thread-links-BN7zL0AX.js +1 -0
- package/dist/client/assets/{project-threads-DezXiVK6.js → project-threads-CHGG-6fo.js} +104 -104
- package/dist/client/assets/{project-work-CB1JHqGW.js → project-work-L5fYMSOu.js} +1 -1
- package/dist/client/assets/task-design-DYqcqq1b.js +23 -0
- package/dist/client/assets/tasks-A2FKo3_h.js +1 -0
- package/dist/client/assets/tasks-request-DGigNdyK.js +1 -0
- package/dist/client/assets/workspace-CvWmU2RK.js +2 -0
- package/dist/client/index.html +2 -1
- package/dist/hosted/assets/{canvas-C69-96GR.js → canvas-MWtOwaWm.js} +69 -41
- package/dist/hosted/assets/{comment-data-CiDuvXi2.js → comment-data-DsgJWq4n.js} +7195 -1067
- package/dist/hosted/assets/{files-DQL5hzs3.js → files-Wvo11G2A.js} +92 -89
- package/dist/hosted/assets/{pages-DFs7jB6M.js → pages-BAmRFVtU.js} +31 -22
- package/dist/hosted/assets/{project-branches-CffV4IS1.js → project-branches-BNloVosX.js} +5 -5
- package/dist/hosted/assets/{project-thread-links-B1Y2bDUx.js → project-thread-links-BmY8HQXt.js} +12 -12
- package/dist/hosted/assets/{screen-BroBb1Z_.js → screen-QmqmI2Aq.js} +18 -18
- package/dist/hosted/assets/{tasks-mzmNhe2d.js → tasks-C8iWPrWg.js} +29 -29
- package/dist/hosted/assets/{tasks-request-Dcrpd2_8.js → tasks-request-C89fN1dK.js} +7 -7
- package/dist/hosted/hosted.js +159 -31
- package/dist/node/design.js +6235 -139
- package/dist/node/index.js +99 -2
- package/dist/node-host/assets/{canvas-BZhzizzt.js → canvas-D_F8SIlm.js} +70 -42
- package/dist/node-host/assets/{comment-data-nUlI0szN.js → comment-data-q_8INiZz.js} +7221 -1093
- package/dist/node-host/assets/{files-CTzcWGjb.js → files-xazOrNCX.js} +92 -89
- package/dist/node-host/assets/{pages-0aWH7z1j.js → pages-D6VkmdfQ.js} +31 -22
- package/dist/node-host/assets/{project-branches-1zs_0J_y.js → project-branches-C26hwmo3.js} +5 -5
- package/dist/node-host/assets/{project-thread-links-LpUAGcDr.js → project-thread-links-BOzjws5W.js} +12 -12
- package/dist/node-host/assets/{screen-DQoTOWYR.js → screen-Dog-YByu.js} +18 -18
- package/dist/node-host/assets/{tasks-C0WqnM7Q.js → tasks-A1_bpb3_.js} +30 -30
- package/dist/node-host/assets/{tasks-request-Bwky5ORf.js → tasks-request-Bie1PpQP.js} +7 -7
- package/dist/node-host/node-host.js +1765 -1630
- package/dist/server/assets/{branch-previews-C_TVt_HQ.js → branch-previews-ClkoJ0lM.js} +116 -5
- package/dist/server/assets/{canvas-D6tIkONI.js → canvas-Dn4RYoU2.js} +70 -42
- package/dist/server/assets/{comment-data-BuArfgcc.js → comment-data-B0OLHBGp.js} +7219 -1091
- package/dist/server/assets/{files-DkrEB48U.js → files-C5Vilfe4.js} +92 -89
- package/dist/server/assets/{listener-BVbFsnmX.js → listener-o1STuLju.js} +43 -29
- package/dist/server/assets/{pages-iEdmK_o2.js → pages-BNa0MHEc.js} +31 -22
- package/dist/server/assets/{project-branches-B7rtrvMl.js → project-branches-GtQYyOH5.js} +5 -5
- package/dist/server/assets/{project-thread-links-ue_ad9IX.js → project-thread-links-Nfz9NIny.js} +12 -12
- package/dist/server/assets/{project-work-6aOyja4v.js → project-work-Cy_BpHwR.js} +2 -2
- package/dist/server/assets/{screen-DMUB9a-K.js → screen-BtcJmZwj.js} +18 -18
- package/dist/server/assets/{server-DUBjmaBw.js → server-CYvuOSBA.js} +1 -1
- package/dist/server/assets/{services-Og5rcF50.js → services-DK4fqrlF.js} +2 -2
- package/dist/server/assets/{tasks-C2oa2wSC.js → tasks-B82tHwyQ.js} +31 -31
- package/dist/server/assets/{tasks-request-Bk5EoY_p.js → tasks-request-BtJBlkxV.js} +7 -6
- package/dist/server/capture.js +1 -1
- package/dist/server/migration.js +3 -3
- package/dist/server/runtime.js +4 -4
- package/dist/server/server.js +3 -3
- package/dist/types/assets/{config-BzzRLcL-.d.ts → config-DIC2cf_S.d.ts} +27 -1
- package/dist/types/assets/{contract-jA5pqK6h.d.ts → contract-CAT-XFNq.d.ts} +3 -1
- package/dist/types/companion.d.ts +1 -1
- package/dist/types/hosted.d.ts +2 -2
- package/dist/types/index.d.ts +1 -1
- package/dist/types/node-host.d.ts +7 -1
- package/dist/types/screen.d.ts +1 -1
- package/package.json +1 -1
- package/dist/client/assets/canvas-DxaIItAs.js +0 -1
- package/dist/client/assets/difference-worker-BpqPBs5g.js +0 -8
- package/dist/client/assets/files-C-7xoSt4.js +0 -1
- package/dist/client/assets/index-sj6mWw9-.js +0 -2
- package/dist/client/assets/pages-BVrTX_Eq.js +0 -1
- package/dist/client/assets/project-branches-DpxQx-T4.js +0 -1
- package/dist/client/assets/project-comments-D897aU5O.js +0 -1
- package/dist/client/assets/project-thread-links-Bp_TseD0.js +0 -1
- package/dist/client/assets/task-design-bktfn_Ok.js +0 -23
- package/dist/client/assets/tasks-Cqfj4fQN.js +0 -1
- package/dist/client/assets/tasks-request-mWMk9pBo.js +0 -1
- package/dist/client/assets/workspace-9KxFcfyV.js +0 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as
|
|
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
|
|
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-
|
|
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,
|
|
3
|
-
import { a as predictWorkAction, i as loadItemComments, n as createProjectComments, o as predictWorkCreate, s as predictWorkUpdate, t as defineScreen } from "./screen-
|
|
4
|
-
import { n as requestTasks, t as TaskRequestError } from "./tasks-request-
|
|
5
|
-
import { t as projectWork } from "./project-work-
|
|
6
|
-
import { n as ProjectTaskPicker, t as ProjectThreadLinks } from "./project-thread-links-
|
|
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: "
|
|
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) : "
|
|
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": "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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": "
|
|
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: "
|
|
227
|
+
children: t("app.client.taskDiscussion.cancel")
|
|
228
228
|
}) : null]
|
|
229
|
-
}) : threads.length > 1 ? /* @__PURE__ */
|
|
229
|
+
}) : threads.length > 1 ? /* @__PURE__ */ jsx(Text, {
|
|
230
230
|
variant: "ui-caption",
|
|
231
231
|
tone: "muted",
|
|
232
|
-
children:
|
|
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: "
|
|
235
|
-
placeholder: "
|
|
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("
|
|
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("
|
|
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 : "
|
|
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 : "
|
|
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("
|
|
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("
|
|
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("
|
|
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("
|
|
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 : "
|
|
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("
|
|
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 : "
|
|
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("
|
|
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("
|
|
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("
|
|
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("
|
|
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) : "
|
|
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("
|
|
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);
|
package/dist/server/capture.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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
|
/**
|
package/dist/server/migration.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { H as make, I as WorkError, O as AdapterRegistry } from "./assets/server-
|
|
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-
|
|
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;
|
package/dist/server/runtime.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { B as sharedModules, H as make } from "./assets/server-
|
|
3
|
-
import { n as listen, r as createApp, t as ServerError } from "./assets/listener-
|
|
4
|
-
import { t as applicationLayer } from "./assets/services-
|
|
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") {};
|
package/dist/server/server.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { H as make } from "./assets/server-
|
|
3
|
-
import { n as listen, r as createApp } from "./assets/listener-
|
|
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") {};
|
|
@@ -55,6 +55,23 @@ interface ResolvedFiles {
|
|
|
55
55
|
edit: boolean;
|
|
56
56
|
}
|
|
57
57
|
//#endregion
|
|
58
|
+
//#region ../project/src/lib/theme.d.ts
|
|
59
|
+
/** Token values by name, such as `{ primary: '#f5b700' }`. */
|
|
60
|
+
type BudThemeColors = Readonly<Record<string, string>>;
|
|
61
|
+
/**
|
|
62
|
+
* Bud's colors in your project's or platform's palette: token values for the light theme, the
|
|
63
|
+
* dark one, or both; anything left out keeps Bud's own.
|
|
64
|
+
*/
|
|
65
|
+
interface BudTheme {
|
|
66
|
+
light?: BudThemeColors;
|
|
67
|
+
dark?: BudThemeColors;
|
|
68
|
+
}
|
|
69
|
+
/** A theme's token values, checked, for each color scheme. */
|
|
70
|
+
interface ResolvedTheme {
|
|
71
|
+
light: BudThemeColors;
|
|
72
|
+
dark: BudThemeColors;
|
|
73
|
+
}
|
|
74
|
+
//#endregion
|
|
58
75
|
//#region ../project/src/lib/branches.d.ts
|
|
59
76
|
/**
|
|
60
77
|
* Branches the canvas captures beside the working tree: main always, others once activated in its
|
|
@@ -325,6 +342,13 @@ interface BudConfig {
|
|
|
325
342
|
* relative to the project, or `{ light, dark }`.
|
|
326
343
|
*/
|
|
327
344
|
logo?: BudLogo;
|
|
345
|
+
/**
|
|
346
|
+
* Bud's colors in your palette: `--bud-*` token values for `light`, `dark` or both, such as
|
|
347
|
+
* `{ light: { primary: '#f5b700' } }`. Anything left out keeps Bud's own.
|
|
348
|
+
*/
|
|
349
|
+
theme?: BudTheme;
|
|
350
|
+
/** The language of Bud's interface: `en` (the default) or `de`. */
|
|
351
|
+
locale?: "en" | "de";
|
|
328
352
|
/**
|
|
329
353
|
* What finds the element under a comment: `bud:dom` (the default), `bud:react-grab` for React
|
|
330
354
|
* projects with React Grab installed, or a ./ module in your project exporting a picker adapter.
|
|
@@ -384,8 +408,10 @@ interface ResolvedBudConfig {
|
|
|
384
408
|
previews: ResolvedPreviews;
|
|
385
409
|
files: ResolvedFiles;
|
|
386
410
|
logo: ResolvedLogo | null;
|
|
411
|
+
theme: ResolvedTheme;
|
|
412
|
+
locale: "en" | "de";
|
|
387
413
|
picker: ResolvedPicker;
|
|
388
414
|
branches: ResolvedBranches;
|
|
389
415
|
}
|
|
390
416
|
//#endregion
|
|
391
|
-
export { defineConfig as a, files as c, ResolvedBudConfig as i, pages as l, BudRoute as n, BudScreen as o, ProjectInfo as r, canvas as s, BudConfig as t, tasks as u };
|
|
417
|
+
export { defineConfig as a, files as c, BudTheme as d, ResolvedBudConfig as i, pages as l, BudRoute as n, BudScreen as o, ProjectInfo as r, canvas as s, BudConfig as t, tasks as u };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as ResolvedBudConfig } from "./config-
|
|
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-
|
|
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
|
package/dist/types/hosted.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { i as ResolvedBudConfig } from "./assets/config-
|
|
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-
|
|
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.
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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-
|
|
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,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
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";
|
|
2
3
|
//#region src/node-host.server.d.ts
|
|
3
4
|
/** Where the project's Bud on Cloudflare is, and the secret its remote API takes. */
|
|
4
5
|
export interface NodeHostOptions {
|
|
@@ -13,6 +14,11 @@ export interface NodeHostOptions {
|
|
|
13
14
|
* before a restart reload once.
|
|
14
15
|
*/
|
|
15
16
|
capability?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Bud's colors in the platform's palette, replacing the project's: `--bud-*` token values for
|
|
19
|
+
* `light` and `dark`.
|
|
20
|
+
*/
|
|
21
|
+
theme?: BudTheme;
|
|
16
22
|
/** Bud's built interface, `dist/client`; this package's own when absent. */
|
|
17
23
|
client?: string;
|
|
18
24
|
fetch?: typeof globalThis.fetch;
|
package/dist/types/screen.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as ProjectInfo } from "./assets/config-
|
|
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 +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.`}))});
|