epiq 1.2.2 → 1.2.3

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/gui/main.js CHANGED
@@ -24492,7 +24492,7 @@ function useViewTransitionState(to, { relative } = {}) {
24492
24492
  }
24493
24493
 
24494
24494
  // source/gui/client/App.tsx
24495
- var import_react7 = __toESM(require_react(), 1);
24495
+ var import_react8 = __toESM(require_react(), 1);
24496
24496
 
24497
24497
  // source/gui/client/components/Button.tsx
24498
24498
  var import_react = __toESM(require_react(), 1);
@@ -24911,7 +24911,7 @@ var User = ({
24911
24911
  );
24912
24912
 
24913
24913
  // source/version.ts
24914
- var EPIQ_VERSION = "1.2.2";
24914
+ var EPIQ_VERSION = "1.2.3";
24915
24915
 
24916
24916
  // source/gui/client/components/Header.tsx
24917
24917
  var import_jsx_runtime6 = __toESM(require_jsx_runtime(), 1);
@@ -25042,7 +25042,7 @@ var Header = ({ state, connected, syncStatus }) => {
25042
25042
  };
25043
25043
 
25044
25044
  // source/gui/client/components/IssueDetails.tsx
25045
- var import_react5 = __toESM(require_react(), 1);
25045
+ var import_react6 = __toESM(require_react(), 1);
25046
25046
 
25047
25047
  // source/gui/client/components/Aside.tsx
25048
25048
  var import_jsx_runtime7 = __toESM(require_jsx_runtime(), 1);
@@ -25062,9 +25062,60 @@ var Aside = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
25062
25062
  }
25063
25063
  );
25064
25064
 
25065
- // source/gui/client/components/FormHeader.tsx
25065
+ // source/gui/client/components/CopyRef.tsx
25066
+ var import_react4 = __toESM(require_react(), 1);
25066
25067
  var import_jsx_runtime8 = __toESM(require_jsx_runtime(), 1);
25067
- var FormHeader = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
25068
+ var copyToClipboard = async (value) => {
25069
+ try {
25070
+ await navigator.clipboard.writeText(value);
25071
+ return true;
25072
+ } catch {
25073
+ return false;
25074
+ }
25075
+ };
25076
+ var CopyRef = ({ refValue }) => {
25077
+ const [copied, setCopied] = (0, import_react4.useState)(false);
25078
+ const resetTimer = (0, import_react4.useRef)(
25079
+ void 0
25080
+ );
25081
+ (0, import_react4.useEffect)(() => () => clearTimeout(resetTimer.current), []);
25082
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
25083
+ "button",
25084
+ {
25085
+ type: "button",
25086
+ title: `Copy ${refValue}`,
25087
+ onClick: async (event) => {
25088
+ event.stopPropagation();
25089
+ if (await copyToClipboard(refValue)) {
25090
+ setCopied(true);
25091
+ clearTimeout(resetTimer.current);
25092
+ resetTimer.current = setTimeout(() => setCopied(false), 1200);
25093
+ }
25094
+ },
25095
+ style: {
25096
+ fontFamily: "monospace",
25097
+ fontSize: "inherit",
25098
+ color: copied ? GUI_THEME.green : GUI_THEME.dim,
25099
+ background: "transparent",
25100
+ border: "none",
25101
+ padding: 0,
25102
+ cursor: "pointer",
25103
+ transition: "color 120ms ease"
25104
+ },
25105
+ onMouseEnter: (event) => {
25106
+ if (!copied) event.currentTarget.style.color = GUI_THEME.accent;
25107
+ },
25108
+ onMouseLeave: (event) => {
25109
+ event.currentTarget.style.color = copied ? GUI_THEME.green : GUI_THEME.dim;
25110
+ },
25111
+ children: copied ? "copied!" : `#${refValue}`
25112
+ }
25113
+ );
25114
+ };
25115
+
25116
+ // source/gui/client/components/FormHeader.tsx
25117
+ var import_jsx_runtime9 = __toESM(require_jsx_runtime(), 1);
25118
+ var FormHeader = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
25068
25119
  "div",
25069
25120
  {
25070
25121
  style: {
@@ -25079,8 +25130,8 @@ var FormHeader = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
25079
25130
  );
25080
25131
 
25081
25132
  // source/gui/client/components/FormPrimitives.tsx
25082
- var import_jsx_runtime9 = __toESM(require_jsx_runtime(), 1);
25083
- var Input = (props) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
25133
+ var import_jsx_runtime10 = __toESM(require_jsx_runtime(), 1);
25134
+ var Input = (props) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
25084
25135
  "input",
25085
25136
  {
25086
25137
  ...props,
@@ -25098,7 +25149,7 @@ var Input = (props) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
25098
25149
  }
25099
25150
  }
25100
25151
  );
25101
- var Textarea = (props) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
25152
+ var Textarea = (props) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
25102
25153
  "textarea",
25103
25154
  {
25104
25155
  maxLength: props.maxLength ?? 1500,
@@ -25120,19 +25171,19 @@ var Textarea = (props) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
25120
25171
  }
25121
25172
  }
25122
25173
  );
25123
- var ActionRow = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
25174
+ var ActionRow = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
25124
25175
  "div",
25125
25176
  {
25126
25177
  style: { display: "flex", justifyContent: "flex-end", gap: 8, marginTop: 8 },
25127
25178
  children
25128
25179
  }
25129
25180
  );
25130
- var AddRow = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { display: "flex", gap: 8, marginTop: 10 }, children });
25131
- var ChipRow = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { style: { display: "flex", gap: 8, flexWrap: "wrap", marginTop: 10 }, children });
25132
- var Empty = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("span", { style: { display: "inline-block", marginTop: 8, color: GUI_THEME.dim }, children });
25181
+ var AddRow = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: { display: "flex", gap: 8, marginTop: 10 }, children });
25182
+ var ChipRow = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: { display: "flex", gap: 8, flexWrap: "wrap", marginTop: 10 }, children });
25183
+ var Empty = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { style: { display: "inline-block", marginTop: 8, color: GUI_THEME.dim }, children });
25133
25184
 
25134
25185
  // source/gui/client/components/IssueComments.tsx
25135
- var import_react4 = __toESM(require_react(), 1);
25186
+ var import_react5 = __toESM(require_react(), 1);
25136
25187
 
25137
25188
  // source/gui/client/lib/gui-format.helper.ts
25138
25189
  var timeAgo = (timestampMs) => {
@@ -25154,7 +25205,7 @@ var timeAgo = (timestampMs) => {
25154
25205
  };
25155
25206
 
25156
25207
  // source/gui/client/components/IssueComments.tsx
25157
- var import_jsx_runtime10 = __toESM(require_jsx_runtime(), 1);
25208
+ var import_jsx_runtime11 = __toESM(require_jsx_runtime(), 1);
25158
25209
  var IssueComments = ({
25159
25210
  whoAmI,
25160
25211
  issueId,
@@ -25163,15 +25214,15 @@ var IssueComments = ({
25163
25214
  onAddComment,
25164
25215
  onDeleteComment
25165
25216
  }) => {
25166
- const [body, setBody] = (0, import_react4.useState)("");
25217
+ const [body, setBody] = (0, import_react5.useState)("");
25167
25218
  const addComment = () => {
25168
25219
  const nextBody = body.trim();
25169
25220
  if (!nextBody) return;
25170
25221
  onAddComment?.(issueId, nextBody);
25171
25222
  setBody("");
25172
25223
  };
25173
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { children: [
25174
- comments.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Empty, { children: "No comments" }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: { display: "flex", flexDirection: "column", gap: 12 }, children: comments.map((comment) => /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
25224
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { children: [
25225
+ comments.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Empty, { children: "No comments" }) : /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { style: { display: "flex", flexDirection: "column", gap: 12 }, children: comments.map((comment) => /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
25175
25226
  "div",
25176
25227
  {
25177
25228
  style: {
@@ -25181,7 +25232,7 @@ var IssueComments = ({
25181
25232
  background: GUI_THEME.tertiary
25182
25233
  },
25183
25234
  children: [
25184
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
25235
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
25185
25236
  "div",
25186
25237
  {
25187
25238
  style: {
@@ -25191,15 +25242,15 @@ var IssueComments = ({
25191
25242
  marginBottom: 8
25192
25243
  },
25193
25244
  children: [
25194
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: { color: GUI_THEME.secondary, fontSize: 10 }, children: [
25245
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { style: { color: GUI_THEME.secondary, fontSize: 10 }, children: [
25195
25246
  comment.author.name ?? "unknown",
25196
- comment.createdAt && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("span", { style: { color: GUI_THEME.dim2 }, children: [
25247
+ comment.createdAt && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("span", { style: { color: GUI_THEME.dim2 }, children: [
25197
25248
  " ",
25198
25249
  "\xB7 ",
25199
25250
  timeAgo(comment.createdAt)
25200
25251
  ] })
25201
25252
  ] }),
25202
- comment.author.id === whoAmI.id && onDeleteComment && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
25253
+ comment.author.id === whoAmI.id && onDeleteComment && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
25203
25254
  Button,
25204
25255
  {
25205
25256
  variant: "ghost",
@@ -25214,7 +25265,7 @@ var IssueComments = ({
25214
25265
  ]
25215
25266
  }
25216
25267
  ),
25217
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
25268
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
25218
25269
  "div",
25219
25270
  {
25220
25271
  style: {
@@ -25229,8 +25280,8 @@ var IssueComments = ({
25229
25280
  },
25230
25281
  comment.id
25231
25282
  )) }),
25232
- !readonly && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: { marginTop: 18 }, children: [
25233
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
25283
+ !readonly && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { style: { marginTop: 18 }, children: [
25284
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
25234
25285
  Textarea,
25235
25286
  {
25236
25287
  maxLength: 120,
@@ -25245,19 +25296,19 @@ var IssueComments = ({
25245
25296
  style: { minHeight: 45 }
25246
25297
  }
25247
25298
  ),
25248
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ActionRow, { children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { onClick: addComment, children: "comment" }) })
25299
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(ActionRow, { children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Button, { onClick: addComment, children: "comment" }) })
25249
25300
  ] })
25250
25301
  ] });
25251
25302
  };
25252
25303
 
25253
25304
  // source/gui/client/components/Section.tsx
25254
- var import_jsx_runtime11 = __toESM(require_jsx_runtime(), 1);
25305
+ var import_jsx_runtime12 = __toESM(require_jsx_runtime(), 1);
25255
25306
  var Section = ({
25256
25307
  title,
25257
25308
  action,
25258
25309
  children,
25259
25310
  first = false
25260
- }) => /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
25311
+ }) => /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
25261
25312
  "section",
25262
25313
  {
25263
25314
  style: {
@@ -25265,7 +25316,7 @@ var Section = ({
25265
25316
  borderTop: first ? "none" : `1px solid ${GUI_THEME.line}`
25266
25317
  },
25267
25318
  children: [
25268
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
25319
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
25269
25320
  "div",
25270
25321
  {
25271
25322
  style: {
@@ -25275,7 +25326,7 @@ var Section = ({
25275
25326
  gap: 12
25276
25327
  },
25277
25328
  children: [
25278
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
25329
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
25279
25330
  "span",
25280
25331
  {
25281
25332
  style: {
@@ -25297,12 +25348,12 @@ var Section = ({
25297
25348
  );
25298
25349
 
25299
25350
  // source/gui/client/components/Tabs.tsx
25300
- var import_jsx_runtime12 = __toESM(require_jsx_runtime(), 1);
25351
+ var import_jsx_runtime13 = __toESM(require_jsx_runtime(), 1);
25301
25352
  var Tabs = ({
25302
25353
  activeTab,
25303
25354
  tabs,
25304
25355
  onChange
25305
- }) => /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
25356
+ }) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
25306
25357
  "div",
25307
25358
  {
25308
25359
  style: {
@@ -25313,7 +25364,7 @@ var Tabs = ({
25313
25364
  },
25314
25365
  children: tabs.map((tab) => {
25315
25366
  const active = tab.id === activeTab;
25316
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
25367
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
25317
25368
  "button",
25318
25369
  {
25319
25370
  type: "button",
@@ -25331,7 +25382,7 @@ var Tabs = ({
25331
25382
  },
25332
25383
  children: [
25333
25384
  tab.label,
25334
- typeof tab.count === "number" && /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
25385
+ typeof tab.count === "number" && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
25335
25386
  "span",
25336
25387
  {
25337
25388
  style: { color: tab.count ? GUI_THEME.secondary : GUI_THEME.dim },
@@ -25352,7 +25403,7 @@ var Tabs = ({
25352
25403
  );
25353
25404
 
25354
25405
  // source/gui/client/components/IssueDetails.tsx
25355
- var import_jsx_runtime13 = __toESM(require_jsx_runtime(), 1);
25406
+ var import_jsx_runtime14 = __toESM(require_jsx_runtime(), 1);
25356
25407
  var IssueDetails = ({
25357
25408
  whoAmI,
25358
25409
  comments,
@@ -25373,15 +25424,15 @@ var IssueDetails = ({
25373
25424
  knownTags: tags,
25374
25425
  knownAssignees: assignees
25375
25426
  }) => {
25376
- const [title, setTitle] = (0, import_react5.useState)("");
25377
- const [description, setDescription] = (0, import_react5.useState)("");
25378
- const [tagName, setTagName] = (0, import_react5.useState)("");
25379
- const [assigneeName, setAssigneeName] = (0, import_react5.useState)("");
25380
- const [editingTitle, setEditingTitle] = (0, import_react5.useState)(false);
25381
- const [editingDescription, setEditingDescription] = (0, import_react5.useState)(false);
25382
- const [addingTag, setAddingTag] = (0, import_react5.useState)(false);
25383
- const [addingAssignee, setAddingAssignee] = (0, import_react5.useState)(false);
25384
- (0, import_react5.useEffect)(() => {
25427
+ const [title, setTitle] = (0, import_react6.useState)("");
25428
+ const [description, setDescription] = (0, import_react6.useState)("");
25429
+ const [tagName, setTagName] = (0, import_react6.useState)("");
25430
+ const [assigneeName, setAssigneeName] = (0, import_react6.useState)("");
25431
+ const [editingTitle, setEditingTitle] = (0, import_react6.useState)(false);
25432
+ const [editingDescription, setEditingDescription] = (0, import_react6.useState)(false);
25433
+ const [addingTag, setAddingTag] = (0, import_react6.useState)(false);
25434
+ const [addingAssignee, setAddingAssignee] = (0, import_react6.useState)(false);
25435
+ (0, import_react6.useEffect)(() => {
25385
25436
  setTitle(issue?.title ?? "");
25386
25437
  setDescription(issue?.description ?? "");
25387
25438
  setTagName("");
@@ -25441,9 +25492,9 @@ var IssueDetails = ({
25441
25492
  const availableAssignees = assignees.filter(
25442
25493
  (assignee) => !issue?.assignees.some((issueAssignee) => issueAssignee.id === assignee.id)
25443
25494
  );
25444
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Aside, { children: issue ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
25445
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(FormHeader, { children: [
25446
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
25495
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Aside, { children: issue ? /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
25496
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(FormHeader, { children: [
25497
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
25447
25498
  "span",
25448
25499
  {
25449
25500
  style: {
@@ -25452,19 +25503,19 @@ var IssueDetails = ({
25452
25503
  textTransform: "uppercase",
25453
25504
  letterSpacing: "0.08em"
25454
25505
  },
25455
- children: issue.ref && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { style: { fontFamily: "monospace", color: GUI_THEME.dim }, children: "#" + issue.ref })
25506
+ children: issue.ref && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(CopyRef, { refValue: issue.ref })
25456
25507
  }
25457
25508
  ),
25458
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Button, { variant: "ghost", onClick: onClose, children: "\xD7" })
25509
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Button, { variant: "ghost", onClick: onClose, children: "\xD7" })
25459
25510
  ] }),
25460
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Tabs, { tabs, activeTab, onChange: onChangeTab }),
25461
- activeTab === "overview" && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
25462
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
25511
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Tabs, { tabs, activeTab, onChange: onChangeTab }),
25512
+ activeTab === "overview" && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
25513
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
25463
25514
  Section,
25464
25515
  {
25465
25516
  first: true,
25466
25517
  title: "Title",
25467
- action: !issue.readonly && !editingTitle && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
25518
+ action: !issue.readonly && !editingTitle && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
25468
25519
  Button,
25469
25520
  {
25470
25521
  variant: "ghost",
@@ -25472,8 +25523,8 @@ var IssueDetails = ({
25472
25523
  children: "edit"
25473
25524
  }
25474
25525
  ),
25475
- children: editingTitle ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
25476
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
25526
+ children: editingTitle ? /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
25527
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
25477
25528
  Input,
25478
25529
  {
25479
25530
  value: title,
@@ -25485,11 +25536,11 @@ var IssueDetails = ({
25485
25536
  }
25486
25537
  }
25487
25538
  ),
25488
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(ActionRow, { children: [
25489
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Button, { onClick: saveTitle, children: "save" }),
25490
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Button, { variant: "ghost", onClick: cancelTitle, children: "cancel" })
25539
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(ActionRow, { children: [
25540
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Button, { onClick: saveTitle, children: "save" }),
25541
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Button, { variant: "ghost", onClick: cancelTitle, children: "cancel" })
25491
25542
  ] })
25492
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
25543
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
25493
25544
  "div",
25494
25545
  {
25495
25546
  style: {
@@ -25504,11 +25555,11 @@ var IssueDetails = ({
25504
25555
  )
25505
25556
  }
25506
25557
  ),
25507
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
25558
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
25508
25559
  Section,
25509
25560
  {
25510
25561
  title: "Description",
25511
- action: !issue.readonly && !editingDescription && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
25562
+ action: !issue.readonly && !editingDescription && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
25512
25563
  Button,
25513
25564
  {
25514
25565
  variant: "ghost",
@@ -25516,8 +25567,8 @@ var IssueDetails = ({
25516
25567
  children: "edit"
25517
25568
  }
25518
25569
  ),
25519
- children: editingDescription ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
25520
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
25570
+ children: editingDescription ? /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
25571
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
25521
25572
  Textarea,
25522
25573
  {
25523
25574
  value: description,
@@ -25532,11 +25583,11 @@ var IssueDetails = ({
25532
25583
  }
25533
25584
  }
25534
25585
  ),
25535
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(ActionRow, { children: [
25536
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Button, { onClick: saveDescription, children: "save" }),
25537
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Button, { variant: "ghost", onClick: cancelDescription, children: "cancel" })
25586
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(ActionRow, { children: [
25587
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Button, { onClick: saveDescription, children: "save" }),
25588
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Button, { variant: "ghost", onClick: cancelDescription, children: "cancel" })
25538
25589
  ] })
25539
- ] }) : issue.description ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
25590
+ ] }) : issue.description ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
25540
25591
  "p",
25541
25592
  {
25542
25593
  style: {
@@ -25547,16 +25598,16 @@ var IssueDetails = ({
25547
25598
  },
25548
25599
  children: issue.description
25549
25600
  }
25550
- ) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Empty, { children: "No description" })
25601
+ ) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Empty, { children: "No description" })
25551
25602
  }
25552
25603
  ),
25553
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
25604
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
25554
25605
  Section,
25555
25606
  {
25556
25607
  title: "Tags",
25557
- action: !issue.readonly && !addingTag && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Button, { variant: "ghost", onClick: () => setAddingTag(true), children: "+" }) || addingTag && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Button, { variant: "ghost", onClick: () => setAddingTag(false), children: "-" }),
25608
+ action: !issue.readonly && !addingTag && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Button, { variant: "ghost", onClick: () => setAddingTag(true), children: "+" }) || addingTag && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Button, { variant: "ghost", onClick: () => setAddingTag(false), children: "-" }),
25558
25609
  children: [
25559
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(ChipRow, { children: issue.tags.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Empty, { children: "No tags" }) : issue.tags.map((tag) => /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
25610
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ChipRow, { children: issue.tags.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Empty, { children: "No tags" }) : issue.tags.map((tag) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
25560
25611
  Button,
25561
25612
  {
25562
25613
  variant: "chip",
@@ -25572,7 +25623,7 @@ var IssueDetails = ({
25572
25623
  },
25573
25624
  tag.id
25574
25625
  )) }),
25575
- addingTag && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(ChipRow, { children: availableTags.map((tag) => /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
25626
+ addingTag && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ChipRow, { children: availableTags.map((tag) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
25576
25627
  Button,
25577
25628
  {
25578
25629
  variant: "chip",
@@ -25587,8 +25638,8 @@ var IssueDetails = ({
25587
25638
  },
25588
25639
  tag.id
25589
25640
  )) }),
25590
- addingTag && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(AddRow, { children: [
25591
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
25641
+ addingTag && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(AddRow, { children: [
25642
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
25592
25643
  Input,
25593
25644
  {
25594
25645
  value: tagName,
@@ -25604,23 +25655,23 @@ var IssueDetails = ({
25604
25655
  }
25605
25656
  }
25606
25657
  ),
25607
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Button, { onClick: addTag, children: "add" })
25658
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Button, { onClick: addTag, children: "add" })
25608
25659
  ] })
25609
25660
  ]
25610
25661
  }
25611
25662
  ),
25612
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
25663
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
25613
25664
  Section,
25614
25665
  {
25615
25666
  title: "Assignees",
25616
- action: !issue.readonly && !addingAssignee && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
25667
+ action: !issue.readonly && !addingAssignee && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
25617
25668
  Button,
25618
25669
  {
25619
25670
  variant: "ghost",
25620
25671
  onClick: () => setAddingAssignee(true),
25621
25672
  children: "+"
25622
25673
  }
25623
- ) || addingAssignee && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
25674
+ ) || addingAssignee && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
25624
25675
  Button,
25625
25676
  {
25626
25677
  variant: "ghost",
@@ -25629,7 +25680,7 @@ var IssueDetails = ({
25629
25680
  }
25630
25681
  ),
25631
25682
  children: [
25632
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(ChipRow, { children: issue.assignees.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Empty, { children: "No assignees" }) : issue.assignees.map((assignee) => /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
25683
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ChipRow, { children: issue.assignees.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Empty, { children: "No assignees" }) : issue.assignees.map((assignee) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
25633
25684
  Button,
25634
25685
  {
25635
25686
  variant: "chip",
@@ -25646,7 +25697,7 @@ var IssueDetails = ({
25646
25697
  },
25647
25698
  assignee.id
25648
25699
  )) }),
25649
- addingAssignee && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(ChipRow, { children: availableAssignees.map((assignee) => /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
25700
+ addingAssignee && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ChipRow, { children: availableAssignees.map((assignee) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
25650
25701
  Button,
25651
25702
  {
25652
25703
  variant: "chip",
@@ -25661,8 +25712,8 @@ var IssueDetails = ({
25661
25712
  },
25662
25713
  assignee.id
25663
25714
  )) }),
25664
- addingAssignee && /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(AddRow, { children: [
25665
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
25715
+ addingAssignee && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(AddRow, { children: [
25716
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
25666
25717
  Input,
25667
25718
  {
25668
25719
  value: assigneeName,
@@ -25678,21 +25729,21 @@ var IssueDetails = ({
25678
25729
  }
25679
25730
  }
25680
25731
  ),
25681
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Button, { onClick: addAssignee, children: "add" })
25732
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Button, { onClick: addAssignee, children: "add" })
25682
25733
  ] })
25683
25734
  ]
25684
25735
  }
25685
25736
  ),
25686
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
25737
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
25687
25738
  Section,
25688
25739
  {
25689
25740
  title: "Actions",
25690
- action: issue.isClosed ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Button, { onClick: () => onReopenIssue(issue.id), children: "reopen issue" }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Button, { onClick: () => onCloseIssue(issue.id), children: "close issue" }),
25741
+ action: issue.isClosed ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Button, { onClick: () => onReopenIssue(issue.id), children: "reopen issue" }) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Button, { onClick: () => onCloseIssue(issue.id), children: "close issue" }),
25691
25742
  children: ""
25692
25743
  }
25693
25744
  )
25694
25745
  ] }),
25695
- activeTab === "comments" && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
25746
+ activeTab === "comments" && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
25696
25747
  IssueComments,
25697
25748
  {
25698
25749
  whoAmI,
@@ -25703,15 +25754,15 @@ var IssueDetails = ({
25703
25754
  onDeleteComment
25704
25755
  }
25705
25756
  )
25706
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Empty, { children: "Select an issue" }) });
25757
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Empty, { children: "Select an issue" }) });
25707
25758
  };
25708
25759
 
25709
25760
  // source/gui/client/components/SwimlaneColumn.tsx
25710
- var import_react6 = __toESM(require_react(), 1);
25761
+ var import_react7 = __toESM(require_react(), 1);
25711
25762
 
25712
25763
  // source/gui/client/components/IconComment.tsx
25713
- var import_jsx_runtime14 = __toESM(require_jsx_runtime(), 1);
25714
- var IconComment = ({ size = 16 }) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
25764
+ var import_jsx_runtime15 = __toESM(require_jsx_runtime(), 1);
25765
+ var IconComment = ({ size = 16 }) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
25715
25766
  "svg",
25716
25767
  {
25717
25768
  width: size,
@@ -25719,7 +25770,7 @@ var IconComment = ({ size = 16 }) => /* @__PURE__ */ (0, import_jsx_runtime14.js
25719
25770
  viewBox: "0 0 16 16",
25720
25771
  fill: "none",
25721
25772
  "aria-hidden": "true",
25722
- children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
25773
+ children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
25723
25774
  "path",
25724
25775
  {
25725
25776
  d: "M3.9 2.6h5.2a2.4 2.4 0 0 1 2.4 2.4v2.5a2.4 2.4 0 0 1-2.4 2.4H6.6l-1.8 2.1.2-2.1H3.9a2.4 2.4 0 0 1-2.4-2.4V5a2.4 2.4 0 0 1 2.4-2.4Z",
@@ -25734,7 +25785,7 @@ var IconComment = ({ size = 16 }) => /* @__PURE__ */ (0, import_jsx_runtime14.js
25734
25785
  );
25735
25786
 
25736
25787
  // source/gui/client/components/TicketCard.tsx
25737
- var import_jsx_runtime15 = __toESM(require_jsx_runtime(), 1);
25788
+ var import_jsx_runtime16 = __toESM(require_jsx_runtime(), 1);
25738
25789
  var TicketCard = ({
25739
25790
  ticket,
25740
25791
  index,
@@ -25747,7 +25798,7 @@ var TicketCard = ({
25747
25798
  onDropIssueAt
25748
25799
  }) => {
25749
25800
  const getVisualTargetIndex = (isAfterMiddle) => index + (isAfterMiddle ? 1 : 0);
25750
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
25801
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
25751
25802
  "div",
25752
25803
  {
25753
25804
  draggable: !ticket.readonly,
@@ -25788,7 +25839,7 @@ var TicketCard = ({
25788
25839
  border: `1px solid ${isSelected ? GUI_THEME.accent : "transparent"}`
25789
25840
  },
25790
25841
  children: [
25791
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
25842
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
25792
25843
  "div",
25793
25844
  {
25794
25845
  style: {
@@ -25801,7 +25852,7 @@ var TicketCard = ({
25801
25852
  children: isSelected ? "\u276F" : index + 1
25802
25853
  }
25803
25854
  ),
25804
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
25855
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
25805
25856
  "div",
25806
25857
  {
25807
25858
  style: {
@@ -25812,7 +25863,7 @@ var TicketCard = ({
25812
25863
  gap: 12
25813
25864
  },
25814
25865
  children: [
25815
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
25866
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
25816
25867
  "div",
25817
25868
  {
25818
25869
  style: {
@@ -25823,7 +25874,7 @@ var TicketCard = ({
25823
25874
  flex: 1
25824
25875
  },
25825
25876
  children: [
25826
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
25877
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
25827
25878
  "div",
25828
25879
  {
25829
25880
  style: {
@@ -25833,23 +25884,10 @@ var TicketCard = ({
25833
25884
  fontWeight: 500,
25834
25885
  fontSize: 12
25835
25886
  },
25836
- children: ticket.ref && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
25837
- "span",
25838
- {
25839
- style: {
25840
- fontFamily: "monospace",
25841
- marginRight: 6,
25842
- color: GUI_THEME.dim
25843
- },
25844
- children: [
25845
- "#",
25846
- ticket.ref
25847
- ]
25848
- }
25849
- )
25887
+ children: ticket.ref && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { style: { marginRight: 6 }, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(CopyRef, { refValue: ticket.ref }) })
25850
25888
  }
25851
25889
  ),
25852
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
25890
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
25853
25891
  "div",
25854
25892
  {
25855
25893
  style: {
@@ -25862,7 +25900,7 @@ var TicketCard = ({
25862
25900
  children: ticket.title
25863
25901
  }
25864
25902
  ),
25865
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
25903
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
25866
25904
  "div",
25867
25905
  {
25868
25906
  style: {
@@ -25871,7 +25909,7 @@ var TicketCard = ({
25871
25909
  gap: 6,
25872
25910
  alignItems: "center"
25873
25911
  },
25874
- children: ticket.tags.map((tag) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
25912
+ children: ticket.tags.map((tag) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
25875
25913
  "span",
25876
25914
  {
25877
25915
  style: {
@@ -25891,7 +25929,7 @@ var TicketCard = ({
25891
25929
  ]
25892
25930
  }
25893
25931
  ),
25894
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
25932
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
25895
25933
  "div",
25896
25934
  {
25897
25935
  style: {
@@ -25901,7 +25939,7 @@ var TicketCard = ({
25901
25939
  flexShrink: 0,
25902
25940
  paddingTop: 2
25903
25941
  },
25904
- children: commentCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
25942
+ children: commentCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
25905
25943
  "button",
25906
25944
  {
25907
25945
  type: "button",
@@ -25939,14 +25977,14 @@ var TicketCard = ({
25939
25977
  event.currentTarget.style.transform = "translateY(0)";
25940
25978
  },
25941
25979
  children: [
25942
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(IconComment, {}),
25943
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { children: commentCount })
25980
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(IconComment, {}),
25981
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { children: commentCount })
25944
25982
  ]
25945
25983
  }
25946
25984
  )
25947
25985
  }
25948
25986
  ),
25949
- ticket.assignees.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
25987
+ ticket.assignees.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
25950
25988
  "div",
25951
25989
  {
25952
25990
  style: {
@@ -25956,7 +25994,7 @@ var TicketCard = ({
25956
25994
  paddingTop: 2,
25957
25995
  marginTop: "-4px"
25958
25996
  },
25959
- children: ticket.assignees.map((assignee, idx) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(User, { user: assignee, index: idx, isFocus: isSelected }))
25997
+ children: ticket.assignees.map((assignee, idx) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(User, { user: assignee, index: idx, isFocus: isSelected }))
25960
25998
  }
25961
25999
  )
25962
26000
  ]
@@ -25968,7 +26006,7 @@ var TicketCard = ({
25968
26006
  };
25969
26007
 
25970
26008
  // source/gui/client/components/SwimlaneColumn.tsx
25971
- var import_jsx_runtime16 = __toESM(require_jsx_runtime(), 1);
26009
+ var import_jsx_runtime17 = __toESM(require_jsx_runtime(), 1);
25972
26010
  var SwimlaneColumn = ({
25973
26011
  swimlane,
25974
26012
  selected,
@@ -25984,7 +26022,7 @@ var SwimlaneColumn = ({
25984
26022
  onDragOverIssue,
25985
26023
  onDragLeave
25986
26024
  }) => {
25987
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
26025
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
25988
26026
  Panel,
25989
26027
  {
25990
26028
  as: "section",
@@ -26024,7 +26062,7 @@ var SwimlaneColumn = ({
26024
26062
  onDragLeave();
26025
26063
  },
26026
26064
  children: [
26027
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
26065
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
26028
26066
  "header",
26029
26067
  {
26030
26068
  style: {
@@ -26035,7 +26073,7 @@ var SwimlaneColumn = ({
26035
26073
  alignItems: "center"
26036
26074
  },
26037
26075
  children: [
26038
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
26076
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
26039
26077
  "div",
26040
26078
  {
26041
26079
  style: {
@@ -26044,30 +26082,30 @@ var SwimlaneColumn = ({
26044
26082
  gap: 8
26045
26083
  },
26046
26084
  children: [
26047
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
26085
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
26048
26086
  "span",
26049
26087
  {
26050
26088
  style: { color: selected ? GUI_THEME.accent : GUI_THEME.secondary },
26051
26089
  children: selected ? "\u276F" : " "
26052
26090
  }
26053
26091
  ),
26054
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
26092
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
26055
26093
  "strong",
26056
26094
  {
26057
26095
  style: { color: selected ? GUI_THEME.accent : GUI_THEME.primary },
26058
26096
  children: swimlane.title
26059
26097
  }
26060
26098
  ),
26061
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("span", { style: { color: GUI_THEME.dim }, children: [
26099
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { style: { color: GUI_THEME.dim }, children: [
26062
26100
  "(",
26063
26101
  swimlane.issues.length,
26064
26102
  ")"
26065
26103
  ] }),
26066
- swimlane.readonly && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { children: "\u{1F512}" })
26104
+ swimlane.readonly && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: "\u{1F512}" })
26067
26105
  ]
26068
26106
  }
26069
26107
  ),
26070
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
26108
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
26071
26109
  Button,
26072
26110
  {
26073
26111
  variant: "ghost",
@@ -26080,9 +26118,9 @@ var SwimlaneColumn = ({
26080
26118
  ]
26081
26119
  }
26082
26120
  ),
26083
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { style: { overflow: "auto", paddingTop: 4, flex: 1 }, children: swimlane.issues.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [
26084
- dropIndex === 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(DropIndicator, {}),
26085
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
26121
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: { overflow: "auto", paddingTop: 4, flex: 1 }, children: swimlane.issues.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_jsx_runtime17.Fragment, { children: [
26122
+ dropIndex === 0 && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(DropIndicator, {}),
26123
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
26086
26124
  "div",
26087
26125
  {
26088
26126
  style: {
@@ -26094,10 +26132,10 @@ var SwimlaneColumn = ({
26094
26132
  children: "Drop issue here"
26095
26133
  }
26096
26134
  )
26097
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [
26098
- swimlane.issues.map((ticket, index) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_react6.default.Fragment, { children: [
26099
- dropIndex === index && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(DropIndicator, {}),
26100
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
26135
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_jsx_runtime17.Fragment, { children: [
26136
+ swimlane.issues.map((ticket, index) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_react7.default.Fragment, { children: [
26137
+ dropIndex === index && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(DropIndicator, {}),
26138
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
26101
26139
  TicketCard,
26102
26140
  {
26103
26141
  ticket,
@@ -26115,7 +26153,7 @@ var SwimlaneColumn = ({
26115
26153
  }
26116
26154
  )
26117
26155
  ] }, ticket.id)),
26118
- dropIndex === swimlane.issues.length && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(DropIndicator, {})
26156
+ dropIndex === swimlane.issues.length && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(DropIndicator, {})
26119
26157
  ] }) })
26120
26158
  ]
26121
26159
  }
@@ -26254,8 +26292,8 @@ var updateIssueInGuiState = (state, issueId, updateIssue) => ({
26254
26292
  });
26255
26293
 
26256
26294
  // source/gui/client/App.tsx
26257
- var import_jsx_runtime17 = __toESM(require_jsx_runtime(), 1);
26258
- var DropIndicator = () => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
26295
+ var import_jsx_runtime18 = __toESM(require_jsx_runtime(), 1);
26296
+ var DropIndicator = () => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
26259
26297
  "div",
26260
26298
  {
26261
26299
  style: {
@@ -26270,20 +26308,20 @@ var DropIndicator = () => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
26270
26308
  var App = () => {
26271
26309
  const { boardId, issueId } = useParams();
26272
26310
  const [searchParams, setSearchParams] = useSearchParams();
26273
- const [connected, setConnected] = (0, import_react7.useState)(false);
26274
- const [syncStatus, setSyncStatus] = (0, import_react7.useState)({
26311
+ const [connected, setConnected] = (0, import_react8.useState)(false);
26312
+ const [syncStatus, setSyncStatus] = (0, import_react8.useState)({
26275
26313
  status: "synced",
26276
26314
  msg: "idle"
26277
26315
  });
26278
- const [state, setState] = (0, import_react7.useState)(null);
26279
- const [dragOverSwimlaneId, setDragOverSwimlaneId] = (0, import_react7.useState)(
26316
+ const [state, setState] = (0, import_react8.useState)(null);
26317
+ const [dragOverSwimlaneId, setDragOverSwimlaneId] = (0, import_react8.useState)(
26280
26318
  null
26281
26319
  );
26282
- const [dropTarget, setDropTarget] = (0, import_react7.useState)(null);
26283
- const [boardMenuOpen, setBoardMenuOpen] = (0, import_react7.useState)(false);
26284
- const [createIssueModal, setCreateIssueModal] = (0, import_react7.useState)(null);
26285
- const boardMenuRef = (0, import_react7.useRef)(null);
26286
- const socketRef = (0, import_react7.useRef)(null);
26320
+ const [dropTarget, setDropTarget] = (0, import_react8.useState)(null);
26321
+ const [boardMenuOpen, setBoardMenuOpen] = (0, import_react8.useState)(false);
26322
+ const [createIssueModal, setCreateIssueModal] = (0, import_react8.useState)(null);
26323
+ const boardMenuRef = (0, import_react8.useRef)(null);
26324
+ const socketRef = (0, import_react8.useRef)(null);
26287
26325
  const selectedTab = searchParams.get("tab") === "comments" ? "comments" : "overview";
26288
26326
  const navigate = useNavigate();
26289
26327
  const selectedBoard = (state && boardId ? findBoard(state, boardId) : null) ?? state?.boards[0] ?? null;
@@ -26297,7 +26335,7 @@ var App = () => {
26297
26335
  const requestState = () => {
26298
26336
  socketRef.current?.send(JSON.stringify({ type: "state:get" }));
26299
26337
  };
26300
- (0, import_react7.useEffect)(() => {
26338
+ (0, import_react8.useEffect)(() => {
26301
26339
  const socket = new WebSocket(
26302
26340
  `ws://${window.location.host}/ws${boardId ? `?boardId=${boardId}` : ""}`
26303
26341
  );
@@ -26341,12 +26379,12 @@ var App = () => {
26341
26379
  socket.close();
26342
26380
  };
26343
26381
  }, [boardId, navigate]);
26344
- (0, import_react7.useEffect)(() => {
26382
+ (0, import_react8.useEffect)(() => {
26345
26383
  if (!boardId && state?.boards[0]) {
26346
26384
  void navigate(`/board/${state.boards[0].ref}`, { replace: true });
26347
26385
  }
26348
26386
  }, [boardId, state, navigate]);
26349
- (0, import_react7.useEffect)(() => {
26387
+ (0, import_react8.useEffect)(() => {
26350
26388
  const close = (event) => {
26351
26389
  if (boardMenuRef.current && !boardMenuRef.current.contains(event.target)) {
26352
26390
  setBoardMenuOpen(false);
@@ -26548,7 +26586,7 @@ var App = () => {
26548
26586
  });
26549
26587
  send("issue:comment:delete", { commentId });
26550
26588
  };
26551
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
26589
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
26552
26590
  "div",
26553
26591
  {
26554
26592
  style: {
@@ -26560,8 +26598,8 @@ var App = () => {
26560
26598
  flexDirection: "column"
26561
26599
  },
26562
26600
  children: [
26563
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Header, { state, connected, syncStatus }),
26564
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
26601
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Header, { state, connected, syncStatus }),
26602
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
26565
26603
  "div",
26566
26604
  {
26567
26605
  style: {
@@ -26570,8 +26608,8 @@ var App = () => {
26570
26608
  overflow: "hidden"
26571
26609
  },
26572
26610
  children: [
26573
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("main", { style: { padding: "0 30px 30px 30px", overflow: "auto", flex: 1 }, children: [
26574
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: { padding: "20px 10px" }, children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
26611
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("main", { style: { padding: "0 30px 30px 30px", overflow: "auto", flex: 1 }, children: [
26612
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { style: { padding: "20px 10px" }, children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
26575
26613
  Dropdown,
26576
26614
  {
26577
26615
  label: "Board:",
@@ -26587,7 +26625,7 @@ var App = () => {
26587
26625
  onSelect: selectBoard
26588
26626
  }
26589
26627
  ) }),
26590
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { style: { display: "flex", gap: 8 }, children: selectedBoard?.swimlanes.map((swimlane) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
26628
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { style: { display: "flex", gap: 8 }, children: selectedBoard?.swimlanes.map((swimlane) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
26591
26629
  SwimlaneColumn,
26592
26630
  {
26593
26631
  swimlane,
@@ -26607,7 +26645,7 @@ var App = () => {
26607
26645
  swimlane.id
26608
26646
  )) })
26609
26647
  ] }),
26610
- selectedIssue && state?.user && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
26648
+ selectedIssue && state?.user && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
26611
26649
  IssueDetails,
26612
26650
  {
26613
26651
  whoAmI: state.user,
@@ -26633,7 +26671,7 @@ var App = () => {
26633
26671
  ]
26634
26672
  }
26635
26673
  ),
26636
- createIssueModal && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
26674
+ createIssueModal && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
26637
26675
  CreateIssueModal,
26638
26676
  {
26639
26677
  title: createIssueModal.title,
@@ -26648,14 +26686,14 @@ var App = () => {
26648
26686
  };
26649
26687
 
26650
26688
  // source/gui/client/main.tsx
26651
- var import_jsx_runtime18 = __toESM(require_jsx_runtime(), 1);
26689
+ var import_jsx_runtime19 = __toESM(require_jsx_runtime(), 1);
26652
26690
  (0, import_client.createRoot)(document.getElementById("root")).render(
26653
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(BrowserRouter, { children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(Routes, { children: [
26654
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Route, { path: "/", element: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(App, {}) }),
26655
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Route, { path: "/board/:boardId", element: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(App, {}) }),
26656
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Route, { path: "/board/:boardId/issue/:issueId", element: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(App, {}) }),
26657
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Route, { path: "/board/:boardId/:issueId", element: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(App, {}) }),
26658
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Route, { path: "*", element: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Navigate, { to: "/", replace: true }) })
26691
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(BrowserRouter, { children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(Routes, { children: [
26692
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Route, { path: "/", element: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(App, {}) }),
26693
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Route, { path: "/board/:boardId", element: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(App, {}) }),
26694
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Route, { path: "/board/:boardId/issue/:issueId", element: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(App, {}) }),
26695
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Route, { path: "/board/:boardId/:issueId", element: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(App, {}) }),
26696
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Route, { path: "*", element: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Navigate, { to: "/", replace: true }) })
26659
26697
  ] }) })
26660
26698
  );
26661
26699
  /*! Bundled license information: