paneltir 0.11.0 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE_MD_SNIPPET.md +26 -1
- package/INSTALL.md +2 -2
- package/README.md +1 -1
- package/bin/paneltir.mjs +18 -1
- package/dist/index.d.ts +143 -9
- package/dist/index.js +692 -553
- package/dist/style.css +234 -0
- package/fingerprint.json +5 -5
- package/package.json +47 -12
- package/template/.claude/skills/panel/SKILL.md +49 -0
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// src/version.ts
|
|
2
|
-
var PANELTIR_VERSION = "0.
|
|
3
|
-
var PANELTIR_FINGERPRINT = "sha256:
|
|
4
|
-
var PANELTIR_FILE_COUNT =
|
|
5
|
-
var PANELTIR_TEMPLATE_HASH = "sha256:
|
|
2
|
+
var PANELTIR_VERSION = "0.12.1";
|
|
3
|
+
var PANELTIR_FINGERPRINT = "sha256:3e958b3c4fa8a7c32fb49568d6189c9a0dea22e65263265177ba6d404ffa13ca";
|
|
4
|
+
var PANELTIR_FILE_COUNT = 166;
|
|
5
|
+
var PANELTIR_TEMPLATE_HASH = "sha256:9d9168001acb58c6ac0c7766515cb0fa95c4fc6d16e6fb17efd59d88e4a3c382";
|
|
6
6
|
var paneltirBuild = {
|
|
7
7
|
version: PANELTIR_VERSION,
|
|
8
8
|
fingerprint: PANELTIR_FINGERPRINT,
|
|
@@ -182,10 +182,25 @@ var paperForm = {
|
|
|
182
182
|
labelTracking: "1.2px",
|
|
183
183
|
density: 1.1
|
|
184
184
|
};
|
|
185
|
+
var warRoomForm = {
|
|
186
|
+
shape: "warRoom",
|
|
187
|
+
radiusPanel: "2px",
|
|
188
|
+
radiusCard: "0px",
|
|
189
|
+
radiusControl: "2px",
|
|
190
|
+
radiusSquare: "0px",
|
|
191
|
+
radiusPill: "2px",
|
|
192
|
+
borderWidth: "1px",
|
|
193
|
+
fontSize: "13.5px",
|
|
194
|
+
labelTracking: "1.6px",
|
|
195
|
+
// The only form that tightens rather than loosens. A war room is judged on
|
|
196
|
+
// how much of the board is on the screen at once.
|
|
197
|
+
density: 0.82
|
|
198
|
+
};
|
|
185
199
|
var THEME_FORMS = {
|
|
186
200
|
panel: panelForm,
|
|
187
201
|
ledger: ledgerForm,
|
|
188
|
-
paper: paperForm
|
|
202
|
+
paper: paperForm,
|
|
203
|
+
warRoom: warRoomForm
|
|
189
204
|
};
|
|
190
205
|
var THEME_PRESETS = {
|
|
191
206
|
midnight: midnightTheme,
|
|
@@ -244,30 +259,61 @@ function HealthPillRow({ children }) {
|
|
|
244
259
|
return /* @__PURE__ */ jsx5("div", { className: "pt-health-row", children });
|
|
245
260
|
}
|
|
246
261
|
|
|
262
|
+
// src/components/Situation/SituationRow.tsx
|
|
263
|
+
import { Fragment as Fragment2, jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
264
|
+
function SituationRow({
|
|
265
|
+
blockingLabel,
|
|
266
|
+
blocking,
|
|
267
|
+
clearLabel,
|
|
268
|
+
statusLabel,
|
|
269
|
+
status
|
|
270
|
+
}) {
|
|
271
|
+
const total = blocking.reduce((sum, item) => sum + item.count, 0);
|
|
272
|
+
return /* @__PURE__ */ jsxs5("div", { className: "pt-situation", children: [
|
|
273
|
+
/* @__PURE__ */ jsxs5("section", { className: "pt-situation__half pt-situation__half--blocking", children: [
|
|
274
|
+
/* @__PURE__ */ jsx6("p", { className: "pt-eyebrow", children: blockingLabel }),
|
|
275
|
+
total === 0 ? /* @__PURE__ */ jsx6("p", { className: "pt-situation__clear", children: clearLabel }) : /* @__PURE__ */ jsx6("div", { className: "pt-situation__items", children: blocking.map((item) => {
|
|
276
|
+
const tone = item.count === 0 ? "clear" : item.tone ?? "attention";
|
|
277
|
+
const className = `pt-situation__item pt-situation__item--${tone}`;
|
|
278
|
+
const body = /* @__PURE__ */ jsxs5(Fragment2, { children: [
|
|
279
|
+
/* @__PURE__ */ jsx6("span", { className: "pt-situation__count", children: item.count }),
|
|
280
|
+
/* @__PURE__ */ jsx6("span", { className: "pt-situation__label", children: item.label }),
|
|
281
|
+
item.hint ? /* @__PURE__ */ jsx6("span", { className: "pt-situation__hint", children: item.hint }) : null
|
|
282
|
+
] });
|
|
283
|
+
return item.onClick ? /* @__PURE__ */ jsx6("button", { type: "button", className, onClick: item.onClick, children: body }, item.id) : /* @__PURE__ */ jsx6("div", { className, children: body }, item.id);
|
|
284
|
+
}) })
|
|
285
|
+
] }),
|
|
286
|
+
status ? /* @__PURE__ */ jsxs5("section", { className: "pt-situation__half pt-situation__half--status", children: [
|
|
287
|
+
/* @__PURE__ */ jsx6("p", { className: "pt-eyebrow", children: statusLabel }),
|
|
288
|
+
status
|
|
289
|
+
] }) : null
|
|
290
|
+
] });
|
|
291
|
+
}
|
|
292
|
+
|
|
247
293
|
// src/components/FilterChips/FilterChip.tsx
|
|
248
|
-
import { jsx as
|
|
294
|
+
import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
249
295
|
function FilterChip({ label, count, active, onClick }) {
|
|
250
|
-
return /* @__PURE__ */
|
|
296
|
+
return /* @__PURE__ */ jsxs6("button", { type: "button", className: `pt-filter-chip${active ? " is-active" : ""}`, "aria-pressed": active, onClick, children: [
|
|
251
297
|
label,
|
|
252
|
-
typeof count === "number" && /* @__PURE__ */
|
|
298
|
+
typeof count === "number" && /* @__PURE__ */ jsx7("span", { className: "pt-filter-chip__count", children: count })
|
|
253
299
|
] });
|
|
254
300
|
}
|
|
255
301
|
function FilterChipRow({ children }) {
|
|
256
|
-
return /* @__PURE__ */
|
|
302
|
+
return /* @__PURE__ */ jsx7("div", { className: "pt-filter-row", children });
|
|
257
303
|
}
|
|
258
304
|
|
|
259
305
|
// src/components/Board/Board.tsx
|
|
260
306
|
import { useRef as useRef3 } from "react";
|
|
261
307
|
|
|
262
308
|
// src/components/Board/Column.tsx
|
|
263
|
-
import { Fragment as
|
|
309
|
+
import { Fragment as Fragment3 } from "react";
|
|
264
310
|
|
|
265
311
|
// src/components/Board/BoardDndContext.tsx
|
|
266
312
|
import { createContext as createContext2, useContext as useContext2 } from "react";
|
|
267
|
-
import { jsx as
|
|
313
|
+
import { jsx as jsx8 } from "react/jsx-runtime";
|
|
268
314
|
var BoardDndContext = createContext2(null);
|
|
269
315
|
function BoardDndProvider({ value, children }) {
|
|
270
|
-
return /* @__PURE__ */
|
|
316
|
+
return /* @__PURE__ */ jsx8(BoardDndContext.Provider, { value, children });
|
|
271
317
|
}
|
|
272
318
|
function useBoardDnDContext() {
|
|
273
319
|
const ctx = useContext2(BoardDndContext);
|
|
@@ -278,16 +324,16 @@ function useBoardDnDContext() {
|
|
|
278
324
|
}
|
|
279
325
|
|
|
280
326
|
// src/components/Board/Column.tsx
|
|
281
|
-
import { jsx as
|
|
327
|
+
import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
282
328
|
function Column({ column, renderCard, onAddCard }) {
|
|
283
329
|
const dnd = useBoardDnDContext();
|
|
284
|
-
return /* @__PURE__ */
|
|
285
|
-
/* @__PURE__ */
|
|
286
|
-
/* @__PURE__ */
|
|
287
|
-
/* @__PURE__ */
|
|
288
|
-
column.hint && /* @__PURE__ */
|
|
289
|
-
/* @__PURE__ */
|
|
290
|
-
onAddCard && /* @__PURE__ */
|
|
330
|
+
return /* @__PURE__ */ jsxs7("div", { className: "pt-column", children: [
|
|
331
|
+
/* @__PURE__ */ jsxs7("div", { className: "pt-column__header", children: [
|
|
332
|
+
/* @__PURE__ */ jsx9("span", { className: "pt-column__title", title: column.hint, children: column.title }),
|
|
333
|
+
/* @__PURE__ */ jsx9("span", { className: "pt-column__count", children: column.cards.length }),
|
|
334
|
+
column.hint && /* @__PURE__ */ jsx9("span", { className: "pt-sr-only", children: column.hint }),
|
|
335
|
+
/* @__PURE__ */ jsx9("span", { className: "pt-column__spacer" }),
|
|
336
|
+
onAddCard && /* @__PURE__ */ jsx9(
|
|
291
337
|
"button",
|
|
292
338
|
{
|
|
293
339
|
type: "button",
|
|
@@ -298,16 +344,16 @@ function Column({ column, renderCard, onAddCard }) {
|
|
|
298
344
|
}
|
|
299
345
|
)
|
|
300
346
|
] }),
|
|
301
|
-
/* @__PURE__ */
|
|
347
|
+
/* @__PURE__ */ jsxs7("div", { className: "pt-column__list", "data-pt-column-list": column.id, children: [
|
|
302
348
|
column.cards.map((card, index) => {
|
|
303
349
|
const showBefore = dnd.isDragging && dnd.dropTarget?.columnId === column.id && dnd.dropTarget.index === index;
|
|
304
|
-
return /* @__PURE__ */
|
|
305
|
-
showBefore && /* @__PURE__ */
|
|
350
|
+
return /* @__PURE__ */ jsxs7(Fragment3, { children: [
|
|
351
|
+
showBefore && /* @__PURE__ */ jsx9("div", { className: "pt-card-placeholder", "data-pt-placeholder": true }),
|
|
306
352
|
renderCard(card, index, column.id)
|
|
307
353
|
] }, card.id);
|
|
308
354
|
}),
|
|
309
|
-
dnd.isDragging && dnd.dropTarget?.columnId === column.id && dnd.dropTarget.index === column.cards.length && /* @__PURE__ */
|
|
310
|
-
column.footer ? /* @__PURE__ */
|
|
355
|
+
dnd.isDragging && dnd.dropTarget?.columnId === column.id && dnd.dropTarget.index === column.cards.length && /* @__PURE__ */ jsx9("div", { className: "pt-card-placeholder", "data-pt-placeholder": true }),
|
|
356
|
+
column.footer ? /* @__PURE__ */ jsx9("div", { className: "pt-column__footer", children: column.footer }) : null
|
|
311
357
|
] })
|
|
312
358
|
] });
|
|
313
359
|
}
|
|
@@ -360,6 +406,11 @@ function useAutoscroll({ active, pointerRef, scrollContainerRef, edgeSize = 56,
|
|
|
360
406
|
}
|
|
361
407
|
|
|
362
408
|
// src/components/Board/useBoardDnD.ts
|
|
409
|
+
function dropIndex(source, target) {
|
|
410
|
+
if (source.columnId !== target.columnId) return target.index;
|
|
411
|
+
if (target.index === source.index || target.index === source.index + 1) return null;
|
|
412
|
+
return target.index > source.index ? target.index - 1 : target.index;
|
|
413
|
+
}
|
|
363
414
|
function useBoardDnD({ columns, onMove, scrollContainerRef }) {
|
|
364
415
|
const [drag, setDrag] = useState(null);
|
|
365
416
|
const [pointer, setPointer] = useState(null);
|
|
@@ -420,6 +471,7 @@ function useBoardDnD({ columns, onMove, scrollContainerRef }) {
|
|
|
420
471
|
if (!listEl) return;
|
|
421
472
|
const columnId = listEl.getAttribute("data-pt-column-list");
|
|
422
473
|
const cardEl = el?.closest("[data-pt-card]");
|
|
474
|
+
if (el?.closest("[data-pt-placeholder]")) return;
|
|
423
475
|
let index;
|
|
424
476
|
if (cardEl && listEl.contains(cardEl)) {
|
|
425
477
|
const cardRect = cardEl.getBoundingClientRect();
|
|
@@ -446,13 +498,13 @@ function useBoardDnD({ columns, onMove, scrollContainerRef }) {
|
|
|
446
498
|
const finalTarget = dropTargetRef.current;
|
|
447
499
|
const source = dragRef.current;
|
|
448
500
|
if (finalTarget && source) {
|
|
449
|
-
const
|
|
450
|
-
if (
|
|
501
|
+
const toIndex = dropIndex(source, finalTarget);
|
|
502
|
+
if (toIndex !== null) {
|
|
451
503
|
onMove({
|
|
452
504
|
cardId: source.cardId,
|
|
453
505
|
fromColumnId: source.columnId,
|
|
454
506
|
toColumnId: finalTarget.columnId,
|
|
455
|
-
toIndex
|
|
507
|
+
toIndex
|
|
456
508
|
});
|
|
457
509
|
}
|
|
458
510
|
}
|
|
@@ -490,22 +542,22 @@ function useBoardDnD({ columns, onMove, scrollContainerRef }) {
|
|
|
490
542
|
}
|
|
491
543
|
|
|
492
544
|
// src/components/Board/Board.tsx
|
|
493
|
-
import { jsx as
|
|
545
|
+
import { jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
494
546
|
function Board({ columns, renderCard, onMove, onAddCard }) {
|
|
495
547
|
const scrollRef = useRef3(null);
|
|
496
548
|
const dnd = useBoardDnD({ columns, onMove, scrollContainerRef: scrollRef });
|
|
497
|
-
return /* @__PURE__ */
|
|
498
|
-
/* @__PURE__ */
|
|
499
|
-
/* @__PURE__ */
|
|
549
|
+
return /* @__PURE__ */ jsxs8(BoardDndProvider, { value: dnd, children: [
|
|
550
|
+
/* @__PURE__ */ jsx10("div", { ref: scrollRef, className: `pt-board${dnd.isDragging ? " pt-board--dragging" : ""}`, children: columns.map((column) => /* @__PURE__ */ jsx10(Column, { column, renderCard, onAddCard }, column.id)) }),
|
|
551
|
+
/* @__PURE__ */ jsx10("div", { className: "pt-board__clone-layer", ref: dnd.cloneLayerRef })
|
|
500
552
|
] });
|
|
501
553
|
}
|
|
502
554
|
|
|
503
555
|
// src/components/Board/Card.tsx
|
|
504
|
-
import { jsx as
|
|
556
|
+
import { jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
505
557
|
function Card({ cardId, columnId, index, title, priorityColor, tags, progress, children, onClick }) {
|
|
506
558
|
const dnd = useBoardDnDContext();
|
|
507
559
|
const isDraggedSource = dnd.drag?.cardId === cardId;
|
|
508
|
-
return /* @__PURE__ */
|
|
560
|
+
return /* @__PURE__ */ jsxs9(
|
|
509
561
|
"div",
|
|
510
562
|
{
|
|
511
563
|
className: `pt-card${isDraggedSource ? " pt-card--dragging-source" : ""}`,
|
|
@@ -514,8 +566,8 @@ function Card({ cardId, columnId, index, title, priorityColor, tags, progress, c
|
|
|
514
566
|
style: priorityColor ? { "--pt-card-stripe": priorityColor } : void 0,
|
|
515
567
|
onClick,
|
|
516
568
|
children: [
|
|
517
|
-
/* @__PURE__ */
|
|
518
|
-
/* @__PURE__ */
|
|
569
|
+
/* @__PURE__ */ jsxs9("div", { className: "pt-card__row", children: [
|
|
570
|
+
/* @__PURE__ */ jsx11(
|
|
519
571
|
"button",
|
|
520
572
|
{
|
|
521
573
|
type: "button",
|
|
@@ -525,10 +577,10 @@ function Card({ cardId, columnId, index, title, priorityColor, tags, progress, c
|
|
|
525
577
|
children: "\u283F"
|
|
526
578
|
}
|
|
527
579
|
),
|
|
528
|
-
/* @__PURE__ */
|
|
580
|
+
/* @__PURE__ */ jsx11("div", { className: "pt-card__title", children: title })
|
|
529
581
|
] }),
|
|
530
|
-
tags && tags.length > 0 && /* @__PURE__ */
|
|
531
|
-
progress && /* @__PURE__ */
|
|
582
|
+
tags && tags.length > 0 && /* @__PURE__ */ jsx11("div", { className: "pt-card__tags", children: tags.map((tag, i) => /* @__PURE__ */ jsx11("span", { className: `pt-tag pt-tag--${tag.tone ?? "neutral"}${tag.emphasize ? " pt-tag--emphasize" : ""}`, children: tag.label }, i)) }),
|
|
583
|
+
progress && /* @__PURE__ */ jsxs9("div", { className: `pt-card__progress${progress.done >= progress.total ? " is-complete" : ""}`, children: [
|
|
532
584
|
progress.done,
|
|
533
585
|
"/",
|
|
534
586
|
progress.total
|
|
@@ -562,9 +614,10 @@ function moveCardInColumns(columns, move) {
|
|
|
562
614
|
}
|
|
563
615
|
|
|
564
616
|
// src/components/DetailSheet/DetailSheet.tsx
|
|
565
|
-
import { useEffect as useEffect3 } from "react";
|
|
566
|
-
import { jsx as
|
|
617
|
+
import { useEffect as useEffect3, useRef as useRef4 } from "react";
|
|
618
|
+
import { jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
567
619
|
function DetailSheet({ open, onClose, children, ariaLabel }) {
|
|
620
|
+
const pressedBackdrop = useRef4(false);
|
|
568
621
|
useEffect3(() => {
|
|
569
622
|
if (!open) return;
|
|
570
623
|
function handleKey(e) {
|
|
@@ -574,16 +627,30 @@ function DetailSheet({ open, onClose, children, ariaLabel }) {
|
|
|
574
627
|
return () => window.removeEventListener("keydown", handleKey);
|
|
575
628
|
}, [open, onClose]);
|
|
576
629
|
if (!open) return null;
|
|
577
|
-
return /* @__PURE__ */
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
630
|
+
return /* @__PURE__ */ jsx12(
|
|
631
|
+
"div",
|
|
632
|
+
{
|
|
633
|
+
className: "pt-sheet-backdrop",
|
|
634
|
+
onPointerDown: (e) => {
|
|
635
|
+
pressedBackdrop.current = e.target === e.currentTarget;
|
|
636
|
+
},
|
|
637
|
+
onClick: (e) => {
|
|
638
|
+
const began = pressedBackdrop.current;
|
|
639
|
+
pressedBackdrop.current = false;
|
|
640
|
+
if (began && e.target === e.currentTarget) onClose();
|
|
641
|
+
},
|
|
642
|
+
children: /* @__PURE__ */ jsxs10("div", { className: "pt-sheet", role: "dialog", "aria-modal": "true", "aria-label": ariaLabel, onClick: (e) => e.stopPropagation(), children: [
|
|
643
|
+
/* @__PURE__ */ jsx12("div", { className: "pt-sheet__handle" }),
|
|
644
|
+
children
|
|
645
|
+
] })
|
|
646
|
+
}
|
|
647
|
+
);
|
|
581
648
|
}
|
|
582
649
|
function DetailSection({ title, subtitle, children }) {
|
|
583
|
-
return /* @__PURE__ */
|
|
584
|
-
/* @__PURE__ */
|
|
650
|
+
return /* @__PURE__ */ jsxs10("section", { className: "pt-detail-section", children: [
|
|
651
|
+
/* @__PURE__ */ jsxs10("h3", { className: "pt-detail-section__title", children: [
|
|
585
652
|
title,
|
|
586
|
-
subtitle && /* @__PURE__ */
|
|
653
|
+
subtitle && /* @__PURE__ */ jsxs10("span", { className: "pt-detail-section__subtitle", children: [
|
|
587
654
|
" \u2014 ",
|
|
588
655
|
subtitle
|
|
589
656
|
] })
|
|
@@ -594,7 +661,7 @@ function DetailSection({ title, subtitle, children }) {
|
|
|
594
661
|
|
|
595
662
|
// src/components/Guide/Guide.tsx
|
|
596
663
|
import { useCallback as useCallback2, useEffect as useEffect4, useState as useState2 } from "react";
|
|
597
|
-
import { jsx as
|
|
664
|
+
import { jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
598
665
|
import { createElement } from "react";
|
|
599
666
|
var STORE_PREFIX = "pt-guide:";
|
|
600
667
|
function readDismissed(key) {
|
|
@@ -648,19 +715,19 @@ function GuideNote({
|
|
|
648
715
|
dismiss();
|
|
649
716
|
onDismissed?.();
|
|
650
717
|
};
|
|
651
|
-
return /* @__PURE__ */
|
|
652
|
-
/* @__PURE__ */
|
|
653
|
-
/* @__PURE__ */
|
|
654
|
-
step && /* @__PURE__ */
|
|
718
|
+
return /* @__PURE__ */ jsxs11("aside", { className: "pt-guide", role: "note", children: [
|
|
719
|
+
/* @__PURE__ */ jsxs11("div", { className: "pt-guide__head", children: [
|
|
720
|
+
/* @__PURE__ */ jsx13("p", { className: "pt-guide__title", children: title }),
|
|
721
|
+
step && /* @__PURE__ */ jsxs11("span", { className: "pt-guide__step", "aria-label": `Step ${step.index} of ${step.total}`, children: [
|
|
655
722
|
step.index,
|
|
656
723
|
"/",
|
|
657
724
|
step.total
|
|
658
725
|
] })
|
|
659
726
|
] }),
|
|
660
|
-
/* @__PURE__ */
|
|
661
|
-
/* @__PURE__ */
|
|
662
|
-
action && /* @__PURE__ */
|
|
663
|
-
/* @__PURE__ */
|
|
727
|
+
/* @__PURE__ */ jsx13("div", { className: "pt-guide__body", children }),
|
|
728
|
+
/* @__PURE__ */ jsxs11("div", { className: "pt-guide__actions", children: [
|
|
729
|
+
action && /* @__PURE__ */ jsx13("button", { type: "button", className: "pt-guide__do", onClick: action.onClick, children: action.label }),
|
|
730
|
+
/* @__PURE__ */ jsx13("button", { type: "button", className: "pt-guide__dismiss", onClick: close, children: dismissLabel })
|
|
664
731
|
] })
|
|
665
732
|
] });
|
|
666
733
|
}
|
|
@@ -693,8 +760,8 @@ function GuideTour({ notes, dismissed, onDismiss }) {
|
|
|
693
760
|
}
|
|
694
761
|
|
|
695
762
|
// src/components/Notifications/Notifications.tsx
|
|
696
|
-
import { useCallback as useCallback3, useEffect as useEffect5, useMemo as useMemo2, useRef as
|
|
697
|
-
import { jsx as
|
|
763
|
+
import { useCallback as useCallback3, useEffect as useEffect5, useMemo as useMemo2, useRef as useRef5, useState as useState3 } from "react";
|
|
764
|
+
import { jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
698
765
|
var STORE_KEY = "pt-seen";
|
|
699
766
|
function readSeen() {
|
|
700
767
|
try {
|
|
@@ -722,7 +789,7 @@ function NotificationBell({ notifications, labels, seen: given, onSeen }) {
|
|
|
722
789
|
const controlled = given !== void 0;
|
|
723
790
|
const [stored, setStored] = useState3(null);
|
|
724
791
|
const [open, setOpen] = useState3(false);
|
|
725
|
-
const root =
|
|
792
|
+
const root = useRef5(null);
|
|
726
793
|
useEffect5(() => {
|
|
727
794
|
setStored(readSeen());
|
|
728
795
|
}, []);
|
|
@@ -760,8 +827,8 @@ function NotificationBell({ notifications, labels, seen: given, onSeen }) {
|
|
|
760
827
|
);
|
|
761
828
|
if (!seen) return null;
|
|
762
829
|
const count = unread.length;
|
|
763
|
-
return /* @__PURE__ */
|
|
764
|
-
/* @__PURE__ */
|
|
830
|
+
return /* @__PURE__ */ jsxs12("div", { className: "pt-bell", ref: root, children: [
|
|
831
|
+
/* @__PURE__ */ jsxs12(
|
|
765
832
|
"button",
|
|
766
833
|
{
|
|
767
834
|
type: "button",
|
|
@@ -771,8 +838,8 @@ function NotificationBell({ notifications, labels, seen: given, onSeen }) {
|
|
|
771
838
|
title: count ? `${text2.title} \u2014 ${text2.unread(count)}` : text2.title,
|
|
772
839
|
onClick: () => setOpen((v) => !v),
|
|
773
840
|
children: [
|
|
774
|
-
/* @__PURE__ */
|
|
775
|
-
/* @__PURE__ */
|
|
841
|
+
/* @__PURE__ */ jsx14("span", { className: "pt-bell__icon", "aria-hidden": "true", children: /* @__PURE__ */ jsxs12("svg", { viewBox: "0 0 16 16", width: "15", height: "15", children: [
|
|
842
|
+
/* @__PURE__ */ jsx14(
|
|
776
843
|
"path",
|
|
777
844
|
{
|
|
778
845
|
d: "M8 1.6a3.6 3.6 0 0 0-3.6 3.6v2.3L3.1 10.2h9.8l-1.3-2.7V5.2A3.6 3.6 0 0 0 8 1.6Z",
|
|
@@ -782,17 +849,17 @@ function NotificationBell({ notifications, labels, seen: given, onSeen }) {
|
|
|
782
849
|
strokeLinejoin: "round"
|
|
783
850
|
}
|
|
784
851
|
),
|
|
785
|
-
/* @__PURE__ */
|
|
852
|
+
/* @__PURE__ */ jsx14("path", { d: "M6.5 12a1.5 1.5 0 0 0 3 0", fill: "none", stroke: "currentColor", strokeWidth: "1.3" })
|
|
786
853
|
] }) }),
|
|
787
|
-
/* @__PURE__ */
|
|
788
|
-
count > 0 && /* @__PURE__ */
|
|
854
|
+
/* @__PURE__ */ jsx14("span", { className: "pt-sr-only", children: count ? text2.unread(count) : text2.title }),
|
|
855
|
+
count > 0 && /* @__PURE__ */ jsx14("span", { className: "pt-bell__count", "aria-hidden": "true", children: count > 99 ? "99+" : count })
|
|
789
856
|
]
|
|
790
857
|
}
|
|
791
858
|
),
|
|
792
|
-
open && /* @__PURE__ */
|
|
793
|
-
/* @__PURE__ */
|
|
794
|
-
/* @__PURE__ */
|
|
795
|
-
count > 0 && /* @__PURE__ */
|
|
859
|
+
open && /* @__PURE__ */ jsxs12("div", { className: "pt-bell__panel", role: "dialog", "aria-label": text2.title, children: [
|
|
860
|
+
/* @__PURE__ */ jsxs12("div", { className: "pt-bell__head", children: [
|
|
861
|
+
/* @__PURE__ */ jsx14("p", { className: "pt-bell__title", children: text2.title }),
|
|
862
|
+
count > 0 && /* @__PURE__ */ jsx14(
|
|
796
863
|
"button",
|
|
797
864
|
{
|
|
798
865
|
type: "button",
|
|
@@ -802,7 +869,7 @@ function NotificationBell({ notifications, labels, seen: given, onSeen }) {
|
|
|
802
869
|
}
|
|
803
870
|
)
|
|
804
871
|
] }),
|
|
805
|
-
count === 0 ? /* @__PURE__ */
|
|
872
|
+
count === 0 ? /* @__PURE__ */ jsx14("p", { className: "pt-bell__empty", children: text2.empty }) : /* @__PURE__ */ jsx14("ul", { className: "pt-bell__list", children: unread.map((item) => /* @__PURE__ */ jsx14("li", { children: /* @__PURE__ */ jsxs12(
|
|
806
873
|
"button",
|
|
807
874
|
{
|
|
808
875
|
type: "button",
|
|
@@ -813,11 +880,11 @@ function NotificationBell({ notifications, labels, seen: given, onSeen }) {
|
|
|
813
880
|
if (item.onOpen) setOpen(false);
|
|
814
881
|
},
|
|
815
882
|
children: [
|
|
816
|
-
/* @__PURE__ */
|
|
817
|
-
/* @__PURE__ */
|
|
818
|
-
/* @__PURE__ */
|
|
819
|
-
item.detail && /* @__PURE__ */
|
|
820
|
-
item.at && /* @__PURE__ */
|
|
883
|
+
/* @__PURE__ */ jsx14("span", { className: "pt-bell__mark", "aria-hidden": "true" }),
|
|
884
|
+
/* @__PURE__ */ jsxs12("span", { className: "pt-bell__body", children: [
|
|
885
|
+
/* @__PURE__ */ jsx14("span", { className: "pt-bell__item-title", children: item.title }),
|
|
886
|
+
item.detail && /* @__PURE__ */ jsx14("span", { className: "pt-bell__detail", children: item.detail }),
|
|
887
|
+
item.at && /* @__PURE__ */ jsx14("span", { className: "pt-bell__at", children: item.at })
|
|
821
888
|
] })
|
|
822
889
|
]
|
|
823
890
|
}
|
|
@@ -827,8 +894,8 @@ function NotificationBell({ notifications, labels, seen: given, onSeen }) {
|
|
|
827
894
|
}
|
|
828
895
|
|
|
829
896
|
// src/components/CopyBlock/CopyBlock.tsx
|
|
830
|
-
import { useCallback as useCallback4, useEffect as useEffect6, useRef as
|
|
831
|
-
import { jsx as
|
|
897
|
+
import { useCallback as useCallback4, useEffect as useEffect6, useRef as useRef6, useState as useState4 } from "react";
|
|
898
|
+
import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
832
899
|
var DEFAULT_LABELS2 = {
|
|
833
900
|
copy: "Copy",
|
|
834
901
|
copied: "Copied",
|
|
@@ -837,8 +904,8 @@ var DEFAULT_LABELS2 = {
|
|
|
837
904
|
function CopyBlock({ text: text2, label, note, labels }) {
|
|
838
905
|
const words = { ...DEFAULT_LABELS2, ...labels };
|
|
839
906
|
const [result, setResult] = useState4("idle");
|
|
840
|
-
const pre =
|
|
841
|
-
const timer =
|
|
907
|
+
const pre = useRef6(null);
|
|
908
|
+
const timer = useRef6(void 0);
|
|
842
909
|
useEffect6(() => () => window.clearTimeout(timer.current), []);
|
|
843
910
|
const announce = useCallback4((next) => {
|
|
844
911
|
setResult(next);
|
|
@@ -869,21 +936,21 @@ function CopyBlock({ text: text2, label, note, labels }) {
|
|
|
869
936
|
}
|
|
870
937
|
if (select()) announce("selected");
|
|
871
938
|
}, [announce, select, text2]);
|
|
872
|
-
return /* @__PURE__ */
|
|
873
|
-
/* @__PURE__ */
|
|
874
|
-
/* @__PURE__ */
|
|
875
|
-
label && /* @__PURE__ */
|
|
876
|
-
note && /* @__PURE__ */
|
|
939
|
+
return /* @__PURE__ */ jsxs13("div", { className: "pt-copy", children: [
|
|
940
|
+
/* @__PURE__ */ jsxs13("div", { className: "pt-copy__head", children: [
|
|
941
|
+
/* @__PURE__ */ jsxs13("div", { className: "pt-copy__meta", children: [
|
|
942
|
+
label && /* @__PURE__ */ jsx15("p", { className: "pt-copy__label", children: label }),
|
|
943
|
+
note && /* @__PURE__ */ jsx15("p", { className: "pt-copy__note", children: note })
|
|
877
944
|
] }),
|
|
878
|
-
/* @__PURE__ */
|
|
945
|
+
/* @__PURE__ */ jsx15("button", { type: "button", className: "pt-copy__button", onClick: copy, children: result === "copied" ? words.copied : result === "selected" ? words.selected : words.copy })
|
|
879
946
|
] }),
|
|
880
|
-
/* @__PURE__ */
|
|
881
|
-
/* @__PURE__ */
|
|
947
|
+
/* @__PURE__ */ jsx15("div", { className: "pt-copy__body", children: /* @__PURE__ */ jsx15("pre", { className: "pt-copy__text", ref: pre, children: text2 }) }),
|
|
948
|
+
/* @__PURE__ */ jsx15("p", { className: "pt-sr-only", role: "status", children: result === "copied" ? words.copied : result === "selected" ? words.selected : "" })
|
|
882
949
|
] });
|
|
883
950
|
}
|
|
884
951
|
|
|
885
952
|
// src/components/Setup/SetupGuide.tsx
|
|
886
|
-
import { jsx as
|
|
953
|
+
import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
887
954
|
var DEFAULT_LABELS3 = {
|
|
888
955
|
ok: "in place",
|
|
889
956
|
missing: "not set",
|
|
@@ -894,23 +961,23 @@ function SetupGuide({ requirements, readyMessage, labels }) {
|
|
|
894
961
|
const text2 = { ...DEFAULT_LABELS3, ...labels };
|
|
895
962
|
const missing = requirements.filter((r) => r.status === "missing");
|
|
896
963
|
const allOk = requirements.length > 0 && missing.length === 0;
|
|
897
|
-
return /* @__PURE__ */
|
|
898
|
-
/* @__PURE__ */
|
|
899
|
-
/* @__PURE__ */
|
|
900
|
-
/* @__PURE__ */
|
|
901
|
-
/* @__PURE__ */
|
|
964
|
+
return /* @__PURE__ */ jsxs14("div", { className: "pt-setup", children: [
|
|
965
|
+
/* @__PURE__ */ jsx16("ul", { className: "pt-setup__list", children: requirements.map((requirement) => /* @__PURE__ */ jsxs14("li", { className: `pt-setup__item is-${requirement.status}`, children: [
|
|
966
|
+
/* @__PURE__ */ jsx16("span", { className: "pt-setup__mark", "aria-hidden": "true" }),
|
|
967
|
+
/* @__PURE__ */ jsxs14("div", { className: "pt-setup__main", children: [
|
|
968
|
+
/* @__PURE__ */ jsxs14("p", { className: "pt-setup__label", children: [
|
|
902
969
|
requirement.label,
|
|
903
|
-
/* @__PURE__ */
|
|
970
|
+
/* @__PURE__ */ jsx16("span", { className: "pt-setup__state", children: text2[requirement.status] })
|
|
904
971
|
] }),
|
|
905
|
-
requirement.variable && /* @__PURE__ */
|
|
906
|
-
requirement.enables && /* @__PURE__ */
|
|
907
|
-
requirement.status !== "ok" && requirement.fix && /* @__PURE__ */
|
|
908
|
-
/* @__PURE__ */
|
|
972
|
+
requirement.variable && /* @__PURE__ */ jsx16("p", { className: "pt-setup__var", children: requirement.variable }),
|
|
973
|
+
requirement.enables && /* @__PURE__ */ jsx16("p", { className: "pt-setup__enables", children: requirement.enables }),
|
|
974
|
+
requirement.status !== "ok" && requirement.fix && /* @__PURE__ */ jsxs14("div", { className: "pt-setup__fix", children: [
|
|
975
|
+
/* @__PURE__ */ jsx16("p", { className: "pt-setup__fix-title", children: text2.whatToDo }),
|
|
909
976
|
requirement.fix
|
|
910
977
|
] })
|
|
911
978
|
] })
|
|
912
979
|
] }, requirement.id)) }),
|
|
913
|
-
allOk && readyMessage && /* @__PURE__ */
|
|
980
|
+
allOk && readyMessage && /* @__PURE__ */ jsx16("p", { className: "pt-setup__ready", children: readyMessage })
|
|
914
981
|
] });
|
|
915
982
|
}
|
|
916
983
|
|
|
@@ -941,7 +1008,7 @@ function isFirstRun(board) {
|
|
|
941
1008
|
}
|
|
942
1009
|
|
|
943
1010
|
// src/components/Setup/SetupWizard.tsx
|
|
944
|
-
import { jsx as
|
|
1011
|
+
import { jsx as jsx17, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
945
1012
|
function SetupWizard({ requirements, labels, onCheck, onClose }) {
|
|
946
1013
|
const step = wizardStep(requirements);
|
|
947
1014
|
const [checking, setChecking] = useState5(false);
|
|
@@ -964,37 +1031,37 @@ function SetupWizard({ requirements, labels, onCheck, onClose }) {
|
|
|
964
1031
|
} catch {
|
|
965
1032
|
}
|
|
966
1033
|
}
|
|
967
|
-
return /* @__PURE__ */
|
|
968
|
-
/* @__PURE__ */
|
|
969
|
-
/* @__PURE__ */
|
|
970
|
-
step.current && /* @__PURE__ */
|
|
1034
|
+
return /* @__PURE__ */ jsxs15("section", { className: "pt-wizard", "aria-labelledby": "pt-wizard-title", children: [
|
|
1035
|
+
/* @__PURE__ */ jsxs15("header", { className: "pt-wizard__head", children: [
|
|
1036
|
+
/* @__PURE__ */ jsx17("h2", { className: "pt-h2", id: "pt-wizard-title", children: labels.title }),
|
|
1037
|
+
step.current && /* @__PURE__ */ jsx17("p", { className: "pt-wizard__progress", children: labels.progress(step.index, step.total) })
|
|
971
1038
|
] }),
|
|
972
|
-
step.current ? /* @__PURE__ */
|
|
973
|
-
/* @__PURE__ */
|
|
974
|
-
/* @__PURE__ */
|
|
975
|
-
step.current.variable && /* @__PURE__ */
|
|
976
|
-
step.current.enables && /* @__PURE__ */
|
|
977
|
-
step.current.fix && /* @__PURE__ */
|
|
978
|
-
/* @__PURE__ */
|
|
979
|
-
/* @__PURE__ */
|
|
980
|
-
checked && !checking && /* @__PURE__ */
|
|
1039
|
+
step.current ? /* @__PURE__ */ jsxs15("div", { className: "pt-wizard__step", children: [
|
|
1040
|
+
/* @__PURE__ */ jsx17("p", { className: "pt-wizard__now", children: labels.nowDo }),
|
|
1041
|
+
/* @__PURE__ */ jsx17("h3", { className: "pt-wizard__label", children: step.current.label }),
|
|
1042
|
+
step.current.variable && /* @__PURE__ */ jsx17("p", { className: "pt-wizard__var", children: step.current.variable }),
|
|
1043
|
+
step.current.enables && /* @__PURE__ */ jsx17("p", { className: "pt-wizard__enables", children: step.current.enables }),
|
|
1044
|
+
step.current.fix && /* @__PURE__ */ jsx17("div", { className: "pt-wizard__fix", children: step.current.fix }),
|
|
1045
|
+
/* @__PURE__ */ jsxs15("div", { className: "pt-wizard__actions", children: [
|
|
1046
|
+
/* @__PURE__ */ jsx17("button", { type: "button", className: "pt-btn pt-btn--primary", onClick: check, disabled: checking, children: checking ? labels.checking : labels.check }),
|
|
1047
|
+
checked && !checking && /* @__PURE__ */ jsx17("p", { className: "pt-wizard__said", children: step.unknown ? labels.cannotTell : labels.stillMissing })
|
|
981
1048
|
] })
|
|
982
|
-
] }) : /* @__PURE__ */
|
|
983
|
-
/* @__PURE__ */
|
|
984
|
-
/* @__PURE__ */
|
|
985
|
-
/* @__PURE__ */
|
|
1049
|
+
] }) : /* @__PURE__ */ jsxs15("div", { className: "pt-wizard__step pt-wizard__step--done", children: [
|
|
1050
|
+
/* @__PURE__ */ jsx17("h3", { className: "pt-wizard__label", children: labels.readyTitle }),
|
|
1051
|
+
/* @__PURE__ */ jsx17("p", { className: "pt-wizard__enables", children: labels.readyBody }),
|
|
1052
|
+
/* @__PURE__ */ jsx17("ol", { className: "pt-wizard__verify", children: labels.verify.map((line) => /* @__PURE__ */ jsx17("li", { children: line }, line)) })
|
|
986
1053
|
] }),
|
|
987
|
-
step.done.length > 0 && /* @__PURE__ */
|
|
988
|
-
/* @__PURE__ */
|
|
989
|
-
/* @__PURE__ */
|
|
1054
|
+
step.done.length > 0 && /* @__PURE__ */ jsxs15("div", { className: "pt-wizard__done", children: [
|
|
1055
|
+
/* @__PURE__ */ jsx17("p", { className: "pt-wizard__done-title", children: labels.doneTitle }),
|
|
1056
|
+
/* @__PURE__ */ jsx17("ul", { children: step.done.map((requirement) => /* @__PURE__ */ jsx17("li", { children: requirement.label }, requirement.id)) })
|
|
990
1057
|
] }),
|
|
991
|
-
/* @__PURE__ */
|
|
992
|
-
/* @__PURE__ */
|
|
993
|
-
/* @__PURE__ */
|
|
994
|
-
/* @__PURE__ */
|
|
995
|
-
/* @__PURE__ */
|
|
1058
|
+
/* @__PURE__ */ jsxs15("div", { className: "pt-wizard__stuck", children: [
|
|
1059
|
+
/* @__PURE__ */ jsx17("p", { className: "pt-wizard__done-title", children: labels.stuckTitle }),
|
|
1060
|
+
/* @__PURE__ */ jsx17("p", { className: "pt-wizard__enables", children: labels.stuckBody }),
|
|
1061
|
+
/* @__PURE__ */ jsx17("pre", { className: "pt-wizard__prompt", children: labels.stuckPrompt }),
|
|
1062
|
+
/* @__PURE__ */ jsx17("button", { type: "button", className: "pt-btn pt-btn--sm", onClick: copyPrompt, children: copied ? labels.copied : labels.copy })
|
|
996
1063
|
] }),
|
|
997
|
-
onClose && /* @__PURE__ */
|
|
1064
|
+
onClose && /* @__PURE__ */ jsx17("div", { className: "pt-wizard__actions", children: /* @__PURE__ */ jsx17("button", { type: "button", className: "pt-btn pt-btn--sm", onClick: onClose, children: labels.close }) })
|
|
998
1065
|
] });
|
|
999
1066
|
}
|
|
1000
1067
|
|
|
@@ -1171,6 +1238,12 @@ function stampForColumn(card, columns) {
|
|
|
1171
1238
|
if (column.active && !next.startedAt) next.startedAt = today();
|
|
1172
1239
|
return next;
|
|
1173
1240
|
}
|
|
1241
|
+
function queueColumn(columns) {
|
|
1242
|
+
const next = columns.find((column) => column.id === "next");
|
|
1243
|
+
if (next) return next.id;
|
|
1244
|
+
const queued = columns.find((column) => !column.active && !column.done && column.id !== "yours");
|
|
1245
|
+
return (queued ?? columns[0])?.id ?? "next";
|
|
1246
|
+
}
|
|
1174
1247
|
function claimedWithoutStarting(card) {
|
|
1175
1248
|
return Boolean(card.completedAt) && !card.startedAt;
|
|
1176
1249
|
}
|
|
@@ -1592,12 +1665,19 @@ var UI = {
|
|
|
1592
1665
|
filterForClaude: "For Claude",
|
|
1593
1666
|
filterYours: "Waiting on you",
|
|
1594
1667
|
filterHighRisk: "High risk",
|
|
1668
|
+
situationBlocking: "What is waiting on you",
|
|
1669
|
+
situationClear: "Nothing is waiting on you. Every open card is either being worked or is Claude\u2019s to pick up.",
|
|
1670
|
+
situationStatus: "System",
|
|
1671
|
+
situationYoursHint: "Yours to finish \u2014 Claude will not touch these",
|
|
1672
|
+
situationDecisionsHint: "Questions nobody has answered yet",
|
|
1673
|
+
situationOrdersHint: "Asked for \u2014 waiting on Claude",
|
|
1595
1674
|
statOpen: "Open",
|
|
1596
1675
|
statOrders: "Orders",
|
|
1597
1676
|
statYours: "For you",
|
|
1598
1677
|
statDecisions: "Decisions",
|
|
1599
1678
|
statHighRisk: "High risk",
|
|
1600
1679
|
statDone: "Done",
|
|
1680
|
+
statArchived: "Archived",
|
|
1601
1681
|
theme: "Theme",
|
|
1602
1682
|
themeSubtitle: "the only thing that changes between projects",
|
|
1603
1683
|
themeNote: "The structure does not move: only the palette handed to the theme provider changes.",
|
|
@@ -1628,9 +1708,10 @@ var UI = {
|
|
|
1628
1708
|
needTokenEnables: "Lets Save commit the board back to the repository. Without it everything else works and Save fails.",
|
|
1629
1709
|
needRepo: "The repository to write to",
|
|
1630
1710
|
needRepoEnables: "Which repository the board is committed to. There is no default on purpose: writing to the wrong one is worse than not writing.",
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1711
|
+
archiveTitle: "Archive",
|
|
1712
|
+
archiveHeading: "Finished, and out of the way",
|
|
1713
|
+
archiveIntro: "Cards that reached Done over a week ago. They are still on the board file and nothing has been deleted \u2014 they are simply no longer in the way of the work that is not finished.",
|
|
1714
|
+
archiveFinished: (date) => `Finished ${date}`,
|
|
1634
1715
|
needGate: "The gate this project copied",
|
|
1635
1716
|
needGateEnables: "The sign-in, the session and the write-back are files this project owns, copied once and never updated with the library. When one of them is older than the package, the panel does not look misconfigured \u2014 it looks broken.",
|
|
1636
1717
|
fixGate: "The gate is older than the installed kit. See what changed before replacing anything:",
|
|
@@ -1919,12 +2000,19 @@ var UI = {
|
|
|
1919
2000
|
filterForClaude: "Para Claude",
|
|
1920
2001
|
filterYours: "Depende de ti",
|
|
1921
2002
|
filterHighRisk: "Riesgo alto",
|
|
2003
|
+
situationBlocking: "Lo que te bloquea a ti",
|
|
2004
|
+
situationClear: "Nada espera por ti. Cada tarjeta abierta o est\xE1 en marcha o le toca a Claude.",
|
|
2005
|
+
situationStatus: "Sistema",
|
|
2006
|
+
situationYoursHint: "Tuyas para terminar: Claude no las toca",
|
|
2007
|
+
situationDecisionsHint: "Preguntas que nadie ha contestado todav\xEDa",
|
|
2008
|
+
situationOrdersHint: "Pedidas: esperando a Claude",
|
|
1922
2009
|
statOpen: "Abiertas",
|
|
1923
2010
|
statOrders: "\xD3rdenes",
|
|
1924
2011
|
statYours: "Para ti",
|
|
1925
2012
|
statDecisions: "Decisiones",
|
|
1926
2013
|
statHighRisk: "Riesgo alto",
|
|
1927
2014
|
statDone: "Hecho",
|
|
2015
|
+
statArchived: "Archivadas",
|
|
1928
2016
|
theme: "Tema",
|
|
1929
2017
|
themeSubtitle: "lo \xFAnico que cambia entre proyectos",
|
|
1930
2018
|
themeNote: "La estructura no se mueve: cambia solo la paleta que recibe el proveedor de tema.",
|
|
@@ -1955,9 +2043,10 @@ var UI = {
|
|
|
1955
2043
|
needTokenEnables: "Permite que Guardar confirme el tablero en el repositorio. Sin \xE9l todo lo dem\xE1s funciona y Guardar falla.",
|
|
1956
2044
|
needRepo: "El repositorio donde escribir",
|
|
1957
2045
|
needRepoEnables: "En qu\xE9 repositorio se confirma el tablero. No hay valor por defecto a prop\xF3sito: escribir en el equivocado es peor que no escribir.",
|
|
1958
|
-
|
|
1959
|
-
|
|
1960
|
-
|
|
2046
|
+
archiveTitle: "Archivo",
|
|
2047
|
+
archiveHeading: "Terminadas, y fuera de en medio",
|
|
2048
|
+
archiveIntro: "Tarjetas que llegaron a Hecho hace m\xE1s de una semana. Siguen en el archivo del tablero y no se ha borrado nada: simplemente ya no estorban al trabajo que no est\xE1 terminado.",
|
|
2049
|
+
archiveFinished: (date) => `Terminada el ${date}`,
|
|
1961
2050
|
needGate: "La puerta que copi\xF3 este proyecto",
|
|
1962
2051
|
needGateEnables: "El acceso, la sesi\xF3n y la escritura de vuelta son archivos de este proyecto, copiados una vez y que no se actualizan con la librer\xEDa. Cuando uno se queda m\xE1s viejo que el paquete, el panel no parece mal configurado: parece roto.",
|
|
1963
2052
|
fixGate: "La puerta es m\xE1s vieja que el kit instalado. Mira qu\xE9 cambi\xF3 antes de reemplazar nada:",
|
|
@@ -2178,7 +2267,7 @@ var UI = {
|
|
|
2178
2267
|
};
|
|
2179
2268
|
|
|
2180
2269
|
// src/panel/AnalysisView.tsx
|
|
2181
|
-
import { Fragment as
|
|
2270
|
+
import { Fragment as Fragment4, jsx as jsx18, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
2182
2271
|
var SUGGESTION_STATUSES = ["new", "doing", "done", "dismissed"];
|
|
2183
2272
|
function MetricTile({ metric, lang, ui }) {
|
|
2184
2273
|
const { latest, delta, against } = trendOf(metric);
|
|
@@ -2187,23 +2276,23 @@ function MetricTile({ metric, lang, ui }) {
|
|
|
2187
2276
|
const height = 34;
|
|
2188
2277
|
const path = points.map((point) => `${(point.x * width).toFixed(1)},${(point.y * (height - 6) + 3).toFixed(1)}`);
|
|
2189
2278
|
const last = points[points.length - 1];
|
|
2190
|
-
return /* @__PURE__ */
|
|
2191
|
-
/* @__PURE__ */
|
|
2192
|
-
/* @__PURE__ */
|
|
2279
|
+
return /* @__PURE__ */ jsxs16("article", { className: "pt-metric", children: [
|
|
2280
|
+
/* @__PURE__ */ jsx18("p", { className: "pt-metric__label", children: text(metric.label, lang) }),
|
|
2281
|
+
/* @__PURE__ */ jsxs16("p", { className: "pt-metric__value", children: [
|
|
2193
2282
|
latest ? latest.value : "\u2014",
|
|
2194
|
-
/* @__PURE__ */
|
|
2283
|
+
/* @__PURE__ */ jsx18("span", { className: "pt-metric__unit", children: metric.unit })
|
|
2195
2284
|
] }),
|
|
2196
|
-
delta !== null && /* @__PURE__ */
|
|
2285
|
+
delta !== null && /* @__PURE__ */ jsxs16("p", { className: `pt-metric__delta${against ? " is-against" : " is-with"}`, children: [
|
|
2197
2286
|
delta > 0 ? "\u25B2" : delta < 0 ? "\u25BC" : "\u25A0",
|
|
2198
2287
|
" ",
|
|
2199
2288
|
delta > 0 ? "+" : "",
|
|
2200
2289
|
delta,
|
|
2201
|
-
/* @__PURE__ */
|
|
2290
|
+
/* @__PURE__ */ jsxs16("span", { className: "pt-metric__since", children: [
|
|
2202
2291
|
" \xB7 ",
|
|
2203
2292
|
against ? ui.metricAgainst : ui.metricWith
|
|
2204
2293
|
] })
|
|
2205
2294
|
] }),
|
|
2206
|
-
points.length > 1 && /* @__PURE__ */
|
|
2295
|
+
points.length > 1 && /* @__PURE__ */ jsxs16(
|
|
2207
2296
|
"svg",
|
|
2208
2297
|
{
|
|
2209
2298
|
className: "pt-metric__spark",
|
|
@@ -2213,12 +2302,12 @@ function MetricTile({ metric, lang, ui }) {
|
|
|
2213
2302
|
role: "img",
|
|
2214
2303
|
"aria-label": `${text(metric.label, lang)}: ${metric.readings.map((r) => `${r.date} ${r.value}`).join(", ")}`,
|
|
2215
2304
|
children: [
|
|
2216
|
-
/* @__PURE__ */
|
|
2217
|
-
last && /* @__PURE__ */
|
|
2305
|
+
/* @__PURE__ */ jsx18("polyline", { points: path.join(" "), fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinejoin: "round" }),
|
|
2306
|
+
last && /* @__PURE__ */ jsx18("circle", { cx: last.x * width, cy: last.y * (height - 6) + 3, r: "3.5", className: "pt-metric__point" })
|
|
2218
2307
|
]
|
|
2219
2308
|
}
|
|
2220
2309
|
),
|
|
2221
|
-
latest?.note && /* @__PURE__ */
|
|
2310
|
+
latest?.note && /* @__PURE__ */ jsx18("p", { className: "pt-metric__note", children: text(latest.note, lang) })
|
|
2222
2311
|
] });
|
|
2223
2312
|
}
|
|
2224
2313
|
function ChoiceCard({
|
|
@@ -2229,11 +2318,11 @@ function ChoiceCard({
|
|
|
2229
2318
|
onDecide
|
|
2230
2319
|
}) {
|
|
2231
2320
|
const answered = choice.options.find((option) => option.id === choice.value);
|
|
2232
|
-
return /* @__PURE__ */
|
|
2233
|
-
/* @__PURE__ */
|
|
2234
|
-
/* @__PURE__ */
|
|
2235
|
-
choice.why && /* @__PURE__ */
|
|
2236
|
-
/* @__PURE__ */
|
|
2321
|
+
return /* @__PURE__ */ jsxs16("article", { className: `pt-choice${answered ? " is-decided" : ""}`, children: [
|
|
2322
|
+
/* @__PURE__ */ jsx18("p", { className: "pt-choice__state", children: answered ? ui.choiceDecidedAt(choice.decidedAt ?? "") : ui.choiceOpen }),
|
|
2323
|
+
/* @__PURE__ */ jsx18("p", { className: "pt-choice__question", children: text(choice.question, lang) }),
|
|
2324
|
+
choice.why && /* @__PURE__ */ jsx18("p", { className: "pt-choice__why", children: text(choice.why, lang) }),
|
|
2325
|
+
/* @__PURE__ */ jsx18("div", { className: "pt-panel-row pt-choice__options", children: choice.options.map((option) => /* @__PURE__ */ jsx18(
|
|
2237
2326
|
FilterChip,
|
|
2238
2327
|
{
|
|
2239
2328
|
label: text(option.label, lang),
|
|
@@ -2242,8 +2331,8 @@ function ChoiceCard({
|
|
|
2242
2331
|
},
|
|
2243
2332
|
option.id
|
|
2244
2333
|
)) }),
|
|
2245
|
-
answered?.detail && /* @__PURE__ */
|
|
2246
|
-
answered && /* @__PURE__ */
|
|
2334
|
+
answered?.detail && /* @__PURE__ */ jsx18("p", { className: "pt-choice__detail", children: text(answered.detail, lang) }),
|
|
2335
|
+
answered && /* @__PURE__ */ jsx18(
|
|
2247
2336
|
"button",
|
|
2248
2337
|
{
|
|
2249
2338
|
type: "button",
|
|
@@ -2262,10 +2351,10 @@ function Choices({
|
|
|
2262
2351
|
onDecide
|
|
2263
2352
|
}) {
|
|
2264
2353
|
const choices = analysis.choices?.[section] ?? [];
|
|
2265
|
-
return /* @__PURE__ */
|
|
2266
|
-
/* @__PURE__ */
|
|
2267
|
-
/* @__PURE__ */
|
|
2268
|
-
choices.length === 0 ? /* @__PURE__ */
|
|
2354
|
+
return /* @__PURE__ */ jsxs16("section", { children: [
|
|
2355
|
+
/* @__PURE__ */ jsx18("h3", { className: "pt-cap__title", children: ui.choicesTitle }),
|
|
2356
|
+
/* @__PURE__ */ jsx18("p", { className: "pt-sub", children: ui.choicesIntro }),
|
|
2357
|
+
choices.length === 0 ? /* @__PURE__ */ jsx18("p", { className: "pt-analysis__empty", children: ui.choicesNone }) : /* @__PURE__ */ jsx18("div", { className: "pt-choice-grid", children: choices.map((choice) => /* @__PURE__ */ jsx18(
|
|
2269
2358
|
ChoiceCard,
|
|
2270
2359
|
{
|
|
2271
2360
|
section,
|
|
@@ -2299,17 +2388,17 @@ function AnalysisView({
|
|
|
2299
2388
|
const total = answers.length + open.length;
|
|
2300
2389
|
const here = analysis.choices?.[section] ?? [];
|
|
2301
2390
|
const answeredHere = here.filter((choice) => choice.options.some((option) => option.id === choice.value)).length;
|
|
2302
|
-
return /* @__PURE__ */
|
|
2303
|
-
/* @__PURE__ */
|
|
2304
|
-
/* @__PURE__ */
|
|
2305
|
-
/* @__PURE__ */
|
|
2306
|
-
/* @__PURE__ */
|
|
2307
|
-
onRequestReport && /* @__PURE__ */
|
|
2308
|
-
/* @__PURE__ */
|
|
2391
|
+
return /* @__PURE__ */ jsxs16("div", { className: "pt-panel-page pt-panel-section pt-analysis", children: [
|
|
2392
|
+
/* @__PURE__ */ jsxs16("section", { children: [
|
|
2393
|
+
/* @__PURE__ */ jsx18("p", { className: "pt-eyebrow", children: ui.analysisEyebrow }),
|
|
2394
|
+
/* @__PURE__ */ jsx18("h2", { className: "pt-h2", children: ui.analysisSections[section] }),
|
|
2395
|
+
/* @__PURE__ */ jsx18("p", { className: "pt-sub", children: ui.analysisSectionHints[section] }),
|
|
2396
|
+
onRequestReport && /* @__PURE__ */ jsx18("p", { className: "pt-panel-row", children: /* @__PURE__ */ jsx18("button", { type: "button", className: "pt-btn pt-btn--sm", onClick: () => onRequestReport(section), children: ui.analysisRedo }) }),
|
|
2397
|
+
/* @__PURE__ */ jsx18("nav", { className: "pt-analysis__nav", "aria-label": ui.analysis, children: ANALYSIS_SECTIONS.map((id) => {
|
|
2309
2398
|
const count = (analysis.choices?.[id] ?? []).filter(
|
|
2310
2399
|
(choice) => !choice.options.some((option) => option.id === choice.value)
|
|
2311
2400
|
).length;
|
|
2312
|
-
return /* @__PURE__ */
|
|
2401
|
+
return /* @__PURE__ */ jsxs16(
|
|
2313
2402
|
"button",
|
|
2314
2403
|
{
|
|
2315
2404
|
type: "button",
|
|
@@ -2318,110 +2407,110 @@ function AnalysisView({
|
|
|
2318
2407
|
onClick: () => setSection(id),
|
|
2319
2408
|
children: [
|
|
2320
2409
|
ui.analysisSections[id],
|
|
2321
|
-
count > 0 && /* @__PURE__ */
|
|
2410
|
+
count > 0 && /* @__PURE__ */ jsx18("span", { className: "pt-analysis__open", "aria-hidden": "true", children: count })
|
|
2322
2411
|
]
|
|
2323
2412
|
},
|
|
2324
2413
|
id
|
|
2325
2414
|
);
|
|
2326
2415
|
}) }),
|
|
2327
|
-
here.length > 0 && /* @__PURE__ */
|
|
2416
|
+
here.length > 0 && /* @__PURE__ */ jsxs16("p", { className: "pt-analysis__stage", children: [
|
|
2328
2417
|
ui.analysisAnswered(answeredHere, here.length),
|
|
2329
|
-
answeredHere === here.length && /* @__PURE__ */
|
|
2418
|
+
answeredHere === here.length && /* @__PURE__ */ jsxs16(Fragment4, { children: [
|
|
2330
2419
|
" \xB7 ",
|
|
2331
2420
|
ui.analysisAllDecided
|
|
2332
2421
|
] })
|
|
2333
2422
|
] })
|
|
2334
2423
|
] }),
|
|
2335
|
-
section === "board" && /* @__PURE__ */
|
|
2336
|
-
/* @__PURE__ */
|
|
2337
|
-
/* @__PURE__ */
|
|
2338
|
-
/* @__PURE__ */
|
|
2339
|
-
/* @__PURE__ */
|
|
2424
|
+
section === "board" && /* @__PURE__ */ jsxs16(Fragment4, { children: [
|
|
2425
|
+
/* @__PURE__ */ jsxs16("section", { children: [
|
|
2426
|
+
/* @__PURE__ */ jsx18("h3", { className: "pt-cap__title", children: ui.boardFactsTitle }),
|
|
2427
|
+
/* @__PURE__ */ jsx18("p", { className: "pt-sub", children: ui.boardFactsIntro }),
|
|
2428
|
+
/* @__PURE__ */ jsx18("div", { className: "pt-fact-grid", children: [
|
|
2340
2429
|
[ui.factOpen, String(facts.open)],
|
|
2341
2430
|
[ui.factWaiting, String(facts.waitingOnOwner)],
|
|
2342
2431
|
[ui.factOrders, String(facts.orders)],
|
|
2343
2432
|
[ui.factHighRisk, String(facts.highRisk)]
|
|
2344
|
-
].map(([label, value]) => /* @__PURE__ */
|
|
2345
|
-
/* @__PURE__ */
|
|
2346
|
-
/* @__PURE__ */
|
|
2433
|
+
].map(([label, value]) => /* @__PURE__ */ jsxs16("article", { className: "pt-fact", children: [
|
|
2434
|
+
/* @__PURE__ */ jsx18("p", { className: "pt-fact__label", children: label }),
|
|
2435
|
+
/* @__PURE__ */ jsx18("p", { className: "pt-fact__value", children: value })
|
|
2347
2436
|
] }, label)) }),
|
|
2348
|
-
/* @__PURE__ */
|
|
2349
|
-
/* @__PURE__ */
|
|
2350
|
-
/* @__PURE__ */
|
|
2351
|
-
/* @__PURE__ */
|
|
2437
|
+
/* @__PURE__ */ jsx18("h4", { className: "pt-analysis__minor", children: ui.factColumnsTitle }),
|
|
2438
|
+
/* @__PURE__ */ jsx18("ul", { className: "pt-analysis__list", children: facts.byColumn.map((column) => /* @__PURE__ */ jsxs16("li", { className: "pt-analysis__goal", children: [
|
|
2439
|
+
/* @__PURE__ */ jsx18("span", { children: t(column.title) }),
|
|
2440
|
+
/* @__PURE__ */ jsx18("span", { className: "pt-analysis__weight", children: column.count })
|
|
2352
2441
|
] }, column.id)) }),
|
|
2353
|
-
facts.oldestOpen && facts.oldestOpenDays !== null && /* @__PURE__ */
|
|
2442
|
+
facts.oldestOpen && facts.oldestOpenDays !== null && /* @__PURE__ */ jsxs16("p", { className: "pt-analysis__stage", children: [
|
|
2354
2443
|
ui.factOldest,
|
|
2355
2444
|
": ",
|
|
2356
|
-
/* @__PURE__ */
|
|
2445
|
+
/* @__PURE__ */ jsx18("strong", { children: ui.factDays(facts.oldestOpenDays) }),
|
|
2357
2446
|
" \xB7 ",
|
|
2358
2447
|
t(facts.oldestOpen.title)
|
|
2359
2448
|
] })
|
|
2360
2449
|
] }),
|
|
2361
|
-
/* @__PURE__ */
|
|
2362
|
-
/* @__PURE__ */
|
|
2363
|
-
/* @__PURE__ */
|
|
2364
|
-
facts.claimed.length === 0 ? /* @__PURE__ */
|
|
2365
|
-
/* @__PURE__ */
|
|
2366
|
-
/* @__PURE__ */
|
|
2450
|
+
/* @__PURE__ */ jsxs16("section", { children: [
|
|
2451
|
+
/* @__PURE__ */ jsx18("h3", { className: "pt-cap__title", children: ui.factClaimedTitle }),
|
|
2452
|
+
/* @__PURE__ */ jsx18("p", { className: "pt-sub", children: ui.factClaimedIntro }),
|
|
2453
|
+
facts.claimed.length === 0 ? /* @__PURE__ */ jsx18("p", { className: "pt-analysis__empty", children: ui.factClaimedNone }) : /* @__PURE__ */ jsx18("ul", { className: "pt-analysis__list", children: facts.claimed.map((card) => /* @__PURE__ */ jsxs16("li", { className: "pt-analysis__goal", children: [
|
|
2454
|
+
/* @__PURE__ */ jsx18("button", { type: "button", className: "pt-analysis__link", onClick: () => onOpenCard?.(card.id), children: t(card.title) || ui.untitled }),
|
|
2455
|
+
/* @__PURE__ */ jsx18("span", { className: "pt-analysis__weight", children: ui.neverStarted })
|
|
2367
2456
|
] }, card.id)) })
|
|
2368
2457
|
] })
|
|
2369
2458
|
] }),
|
|
2370
|
-
section === "project" && /* @__PURE__ */
|
|
2371
|
-
/* @__PURE__ */
|
|
2372
|
-
/* @__PURE__ */
|
|
2373
|
-
/* @__PURE__ */
|
|
2374
|
-
/* @__PURE__ */
|
|
2459
|
+
section === "project" && /* @__PURE__ */ jsxs16(Fragment4, { children: [
|
|
2460
|
+
/* @__PURE__ */ jsxs16("section", { children: [
|
|
2461
|
+
/* @__PURE__ */ jsx18("h3", { className: "pt-cap__title", children: ui.briefTitle }),
|
|
2462
|
+
/* @__PURE__ */ jsx18("p", { className: "pt-sub", children: t(analysis.brief) }),
|
|
2463
|
+
/* @__PURE__ */ jsxs16("p", { className: "pt-analysis__stage", children: [
|
|
2375
2464
|
ui.stage,
|
|
2376
2465
|
": ",
|
|
2377
|
-
/* @__PURE__ */
|
|
2466
|
+
/* @__PURE__ */ jsx18("strong", { children: analysis.stage })
|
|
2378
2467
|
] })
|
|
2379
2468
|
] }),
|
|
2380
|
-
/* @__PURE__ */
|
|
2381
|
-
/* @__PURE__ */
|
|
2382
|
-
/* @__PURE__ */
|
|
2383
|
-
/* @__PURE__ */
|
|
2384
|
-
/* @__PURE__ */
|
|
2385
|
-
/* @__PURE__ */
|
|
2469
|
+
/* @__PURE__ */ jsxs16("section", { className: "pt-analysis__split", children: [
|
|
2470
|
+
/* @__PURE__ */ jsxs16("div", { className: "pt-cap pt-hud", children: [
|
|
2471
|
+
/* @__PURE__ */ jsx18("h3", { className: "pt-cap__title", children: ui.goalsTitle }),
|
|
2472
|
+
/* @__PURE__ */ jsx18("ul", { className: "pt-analysis__list", children: analysis.goals.map((goal) => /* @__PURE__ */ jsxs16("li", { className: `pt-analysis__goal is-${goal.weight}`, children: [
|
|
2473
|
+
/* @__PURE__ */ jsx18("span", { children: t(goal.label) }),
|
|
2474
|
+
/* @__PURE__ */ jsx18("span", { className: "pt-analysis__weight", children: ui.weights[goal.weight] })
|
|
2386
2475
|
] }, goal.id)) })
|
|
2387
2476
|
] }),
|
|
2388
|
-
/* @__PURE__ */
|
|
2389
|
-
/* @__PURE__ */
|
|
2390
|
-
/* @__PURE__ */
|
|
2391
|
-
/* @__PURE__ */
|
|
2392
|
-
/* @__PURE__ */
|
|
2477
|
+
/* @__PURE__ */ jsxs16("div", { className: "pt-cap pt-hud", children: [
|
|
2478
|
+
/* @__PURE__ */ jsx18("h3", { className: "pt-cap__title", children: ui.constraintsTitle }),
|
|
2479
|
+
/* @__PURE__ */ jsx18("ul", { className: "pt-analysis__list", children: analysis.constraints.map((constraint) => /* @__PURE__ */ jsxs16("li", { className: `pt-analysis__goal${constraint.on ? "" : " is-off"}`, children: [
|
|
2480
|
+
/* @__PURE__ */ jsx18("span", { children: t(constraint.label) }),
|
|
2481
|
+
/* @__PURE__ */ jsx18("span", { className: "pt-analysis__weight", children: constraint.on ? ui.constraintOn : ui.constraintOff })
|
|
2393
2482
|
] }, constraint.id)) })
|
|
2394
2483
|
] })
|
|
2395
2484
|
] }),
|
|
2396
|
-
/* @__PURE__ */
|
|
2397
|
-
/* @__PURE__ */
|
|
2398
|
-
/* @__PURE__ */
|
|
2399
|
-
/* @__PURE__ */
|
|
2485
|
+
/* @__PURE__ */ jsxs16("section", { children: [
|
|
2486
|
+
/* @__PURE__ */ jsx18("h3", { className: "pt-cap__title", children: ui.metricsTitle }),
|
|
2487
|
+
/* @__PURE__ */ jsx18("p", { className: "pt-sub", children: ui.metricsIntro }),
|
|
2488
|
+
/* @__PURE__ */ jsx18("div", { className: "pt-metric-grid", children: analysis.metrics.map((metric) => /* @__PURE__ */ jsx18(MetricTile, { metric, lang, ui }, metric.id)) })
|
|
2400
2489
|
] })
|
|
2401
2490
|
] }),
|
|
2402
|
-
section === "strategy" && /* @__PURE__ */
|
|
2403
|
-
/* @__PURE__ */
|
|
2404
|
-
/* @__PURE__ */
|
|
2405
|
-
/* @__PURE__ */
|
|
2406
|
-
/* @__PURE__ */
|
|
2491
|
+
section === "strategy" && /* @__PURE__ */ jsxs16(Fragment4, { children: [
|
|
2492
|
+
/* @__PURE__ */ jsxs16("section", { children: [
|
|
2493
|
+
/* @__PURE__ */ jsx18("h3", { className: "pt-cap__title", children: ui.strategiesTitle }),
|
|
2494
|
+
/* @__PURE__ */ jsx18("p", { className: "pt-sub", children: analysis.chosen ? ui.strategyChosenHint : ui.strategyOpenHint }),
|
|
2495
|
+
/* @__PURE__ */ jsx18("div", { className: "pt-strategy-grid", children: analysis.strategies.map((strategy) => {
|
|
2407
2496
|
const chosen = analysis.chosen === strategy.id;
|
|
2408
|
-
return /* @__PURE__ */
|
|
2409
|
-
/* @__PURE__ */
|
|
2410
|
-
/* @__PURE__ */
|
|
2411
|
-
/* @__PURE__ */
|
|
2497
|
+
return /* @__PURE__ */ jsxs16("article", { className: `pt-strategy pt-hud${chosen ? " is-chosen" : ""}`, children: [
|
|
2498
|
+
/* @__PURE__ */ jsx18("h4", { className: "pt-strategy__title", children: t(strategy.title) }),
|
|
2499
|
+
/* @__PURE__ */ jsx18("p", { className: "pt-panel-text", children: t(strategy.thesis) }),
|
|
2500
|
+
/* @__PURE__ */ jsx18("dl", { className: "pt-strategy__meters", children: [
|
|
2412
2501
|
[ui.effort, strategy.effort],
|
|
2413
2502
|
[ui.riskShort, strategy.risk],
|
|
2414
2503
|
[ui.upside, strategy.upside]
|
|
2415
|
-
].map(([label, value]) => /* @__PURE__ */
|
|
2416
|
-
/* @__PURE__ */
|
|
2417
|
-
/* @__PURE__ */
|
|
2418
|
-
/* @__PURE__ */
|
|
2419
|
-
/* @__PURE__ */
|
|
2504
|
+
].map(([label, value]) => /* @__PURE__ */ jsxs16("div", { children: [
|
|
2505
|
+
/* @__PURE__ */ jsx18("dt", { children: label }),
|
|
2506
|
+
/* @__PURE__ */ jsxs16("dd", { children: [
|
|
2507
|
+
/* @__PURE__ */ jsx18("span", { className: "pt-strategy__track", children: /* @__PURE__ */ jsx18("span", { className: "pt-strategy__fill", style: { width: `${value * 10}%` } }) }),
|
|
2508
|
+
/* @__PURE__ */ jsx18("b", { children: value })
|
|
2420
2509
|
] })
|
|
2421
2510
|
] }, label)) }),
|
|
2422
|
-
/* @__PURE__ */
|
|
2423
|
-
/* @__PURE__ */
|
|
2424
|
-
/* @__PURE__ */
|
|
2511
|
+
/* @__PURE__ */ jsx18("p", { className: "pt-strategy__horizon", children: t(strategy.horizon) }),
|
|
2512
|
+
/* @__PURE__ */ jsx18("ul", { className: "pt-cap__list", children: strategy.moves.map((move) => /* @__PURE__ */ jsx18("li", { children: t(move) }, t(move))) }),
|
|
2513
|
+
/* @__PURE__ */ jsx18(
|
|
2425
2514
|
FilterChip,
|
|
2426
2515
|
{
|
|
2427
2516
|
label: chosen ? ui.strategyChosen : ui.strategyChoose,
|
|
@@ -2432,19 +2521,19 @@ function AnalysisView({
|
|
|
2432
2521
|
] }, strategy.id);
|
|
2433
2522
|
}) })
|
|
2434
2523
|
] }),
|
|
2435
|
-
/* @__PURE__ */
|
|
2436
|
-
/* @__PURE__ */
|
|
2437
|
-
/* @__PURE__ */
|
|
2438
|
-
/* @__PURE__ */
|
|
2439
|
-
/* @__PURE__ */
|
|
2524
|
+
/* @__PURE__ */ jsxs16("section", { children: [
|
|
2525
|
+
/* @__PURE__ */ jsx18("h3", { className: "pt-cap__title", children: ui.suggestionsTitle }),
|
|
2526
|
+
/* @__PURE__ */ jsx18("p", { className: "pt-sub", children: ui.suggestionsIntro }),
|
|
2527
|
+
/* @__PURE__ */ jsx18("ul", { className: "pt-analysis__suggestions", children: analysis.suggestions.map((suggestion) => /* @__PURE__ */ jsxs16("li", { className: `pt-suggestion pt-hud is-${suggestion.severity}`, children: [
|
|
2528
|
+
/* @__PURE__ */ jsxs16("p", { className: "pt-suggestion__meta", children: [
|
|
2440
2529
|
suggestion.area,
|
|
2441
2530
|
" \xB7 ",
|
|
2442
2531
|
ui.severities[suggestion.severity],
|
|
2443
2532
|
" \xB7 ",
|
|
2444
2533
|
suggestion.date
|
|
2445
2534
|
] }),
|
|
2446
|
-
/* @__PURE__ */
|
|
2447
|
-
/* @__PURE__ */
|
|
2535
|
+
/* @__PURE__ */ jsx18("p", { className: "pt-panel-text", children: t(suggestion.text) }),
|
|
2536
|
+
/* @__PURE__ */ jsx18("div", { className: "pt-panel-row", children: SUGGESTION_STATUSES.map((status) => /* @__PURE__ */ jsx18(
|
|
2448
2537
|
FilterChip,
|
|
2449
2538
|
{
|
|
2450
2539
|
label: ui.suggestionStatuses[status],
|
|
@@ -2456,67 +2545,67 @@ function AnalysisView({
|
|
|
2456
2545
|
] }, suggestion.id)) })
|
|
2457
2546
|
] })
|
|
2458
2547
|
] }),
|
|
2459
|
-
section === "market" && /* @__PURE__ */
|
|
2460
|
-
/* @__PURE__ */
|
|
2461
|
-
/* @__PURE__ */
|
|
2462
|
-
/* @__PURE__ */
|
|
2463
|
-
/* @__PURE__ */
|
|
2548
|
+
section === "market" && /* @__PURE__ */ jsx18("section", { children: analysis.market ? /* @__PURE__ */ jsxs16(Fragment4, { children: [
|
|
2549
|
+
/* @__PURE__ */ jsxs16("div", { className: "pt-analysis__split", children: [
|
|
2550
|
+
/* @__PURE__ */ jsxs16("div", { className: "pt-cap pt-hud", children: [
|
|
2551
|
+
/* @__PURE__ */ jsx18("h3", { className: "pt-cap__title", children: ui.audienceTitle }),
|
|
2552
|
+
/* @__PURE__ */ jsx18("p", { className: "pt-panel-text", children: t(analysis.market.audience) })
|
|
2464
2553
|
] }),
|
|
2465
|
-
/* @__PURE__ */
|
|
2466
|
-
/* @__PURE__ */
|
|
2467
|
-
/* @__PURE__ */
|
|
2554
|
+
/* @__PURE__ */ jsxs16("div", { className: "pt-cap pt-hud", children: [
|
|
2555
|
+
/* @__PURE__ */ jsx18("h3", { className: "pt-cap__title", children: ui.positioningTitle }),
|
|
2556
|
+
/* @__PURE__ */ jsx18("p", { className: "pt-panel-text", children: t(analysis.market.positioning) })
|
|
2468
2557
|
] })
|
|
2469
2558
|
] }),
|
|
2470
|
-
/* @__PURE__ */
|
|
2471
|
-
/* @__PURE__ */
|
|
2472
|
-
/* @__PURE__ */
|
|
2473
|
-
/* @__PURE__ */
|
|
2474
|
-
/* @__PURE__ */
|
|
2475
|
-
/* @__PURE__ */
|
|
2559
|
+
/* @__PURE__ */ jsx18("h3", { className: "pt-cap__title pt-analysis__minor", children: ui.competitorsTitle }),
|
|
2560
|
+
/* @__PURE__ */ jsx18("p", { className: "pt-sub", children: ui.marketIntro }),
|
|
2561
|
+
/* @__PURE__ */ jsx18("div", { className: "pt-rival-grid", children: analysis.market.competitors.map((rival) => /* @__PURE__ */ jsxs16("article", { className: "pt-rival pt-hud", children: [
|
|
2562
|
+
/* @__PURE__ */ jsx18("h4", { className: "pt-rival__name", children: rival.name }),
|
|
2563
|
+
/* @__PURE__ */ jsxs16("p", { className: "pt-rival__line", children: [
|
|
2564
|
+
/* @__PURE__ */ jsx18("span", { className: "pt-rival__tag", children: ui.competitorStrength }),
|
|
2476
2565
|
t(rival.strength)
|
|
2477
2566
|
] }),
|
|
2478
|
-
/* @__PURE__ */
|
|
2479
|
-
/* @__PURE__ */
|
|
2567
|
+
/* @__PURE__ */ jsxs16("p", { className: "pt-rival__line is-gap", children: [
|
|
2568
|
+
/* @__PURE__ */ jsx18("span", { className: "pt-rival__tag", children: ui.competitorGap }),
|
|
2480
2569
|
t(rival.gap)
|
|
2481
2570
|
] })
|
|
2482
2571
|
] }, rival.id)) }),
|
|
2483
|
-
analysis.market.pricing && /* @__PURE__ */
|
|
2484
|
-
/* @__PURE__ */
|
|
2485
|
-
/* @__PURE__ */
|
|
2572
|
+
analysis.market.pricing && /* @__PURE__ */ jsxs16(Fragment4, { children: [
|
|
2573
|
+
/* @__PURE__ */ jsx18("h3", { className: "pt-cap__title pt-analysis__minor", children: ui.pricingTitle }),
|
|
2574
|
+
/* @__PURE__ */ jsx18("p", { className: "pt-panel-text", children: t(analysis.market.pricing) })
|
|
2486
2575
|
] }),
|
|
2487
|
-
analysis.market.notes && analysis.market.notes.length > 0 && /* @__PURE__ */
|
|
2488
|
-
/* @__PURE__ */
|
|
2489
|
-
/* @__PURE__ */
|
|
2576
|
+
analysis.market.notes && analysis.market.notes.length > 0 && /* @__PURE__ */ jsxs16(Fragment4, { children: [
|
|
2577
|
+
/* @__PURE__ */ jsx18("h3", { className: "pt-cap__title pt-analysis__minor", children: ui.marketNotesTitle }),
|
|
2578
|
+
/* @__PURE__ */ jsx18("ul", { className: "pt-cap__list", children: analysis.market.notes.map((note) => /* @__PURE__ */ jsx18("li", { children: t(note) }, t(note))) })
|
|
2490
2579
|
] })
|
|
2491
|
-
] }) : /* @__PURE__ */
|
|
2492
|
-
/* @__PURE__ */
|
|
2493
|
-
total > 0 && /* @__PURE__ */
|
|
2494
|
-
/* @__PURE__ */
|
|
2495
|
-
/* @__PURE__ */
|
|
2496
|
-
/* @__PURE__ */
|
|
2497
|
-
/* @__PURE__ */
|
|
2498
|
-
answers.map(({ section: from, choice, option }) => /* @__PURE__ */
|
|
2499
|
-
/* @__PURE__ */
|
|
2500
|
-
/* @__PURE__ */
|
|
2580
|
+
] }) : /* @__PURE__ */ jsx18("p", { className: "pt-analysis__empty", children: ui.marketEmpty }) }),
|
|
2581
|
+
/* @__PURE__ */ jsx18(Choices, { section, analysis, lang, ui, onDecide }),
|
|
2582
|
+
total > 0 && /* @__PURE__ */ jsxs16("section", { className: "pt-analysis__split", children: [
|
|
2583
|
+
/* @__PURE__ */ jsxs16("div", { className: "pt-cap pt-hud", children: [
|
|
2584
|
+
/* @__PURE__ */ jsx18("h3", { className: "pt-cap__title", children: ui.claudeReadsTitle }),
|
|
2585
|
+
/* @__PURE__ */ jsx18("p", { className: "pt-sub", children: ui.claudeReadsIntro }),
|
|
2586
|
+
/* @__PURE__ */ jsxs16("ul", { className: "pt-analysis__list", children: [
|
|
2587
|
+
answers.map(({ section: from, choice, option }) => /* @__PURE__ */ jsxs16("li", { className: "pt-analysis__goal is-primary", children: [
|
|
2588
|
+
/* @__PURE__ */ jsxs16("span", { children: [
|
|
2589
|
+
/* @__PURE__ */ jsx18("span", { className: "pt-analysis__from", children: ui.analysisSections[from] }),
|
|
2501
2590
|
t(choice.question)
|
|
2502
2591
|
] }),
|
|
2503
|
-
/* @__PURE__ */
|
|
2592
|
+
/* @__PURE__ */ jsx18("span", { className: "pt-analysis__weight", children: t(option.label) })
|
|
2504
2593
|
] }, choice.id)),
|
|
2505
|
-
answers.length === 0 && /* @__PURE__ */
|
|
2594
|
+
answers.length === 0 && /* @__PURE__ */ jsx18("li", { className: "pt-analysis__goal is-off", children: ui.choicesNone })
|
|
2506
2595
|
] })
|
|
2507
2596
|
] }),
|
|
2508
|
-
/* @__PURE__ */
|
|
2509
|
-
/* @__PURE__ */
|
|
2510
|
-
/* @__PURE__ */
|
|
2511
|
-
/* @__PURE__ */
|
|
2512
|
-
open.map(({ section: from, choice }) => /* @__PURE__ */
|
|
2513
|
-
/* @__PURE__ */
|
|
2514
|
-
/* @__PURE__ */
|
|
2597
|
+
/* @__PURE__ */ jsxs16("div", { className: "pt-cap pt-hud", children: [
|
|
2598
|
+
/* @__PURE__ */ jsx18("h3", { className: "pt-cap__title", children: ui.claudeOpenTitle }),
|
|
2599
|
+
/* @__PURE__ */ jsx18("p", { className: "pt-sub", children: ui.claudeOpenIntro }),
|
|
2600
|
+
/* @__PURE__ */ jsxs16("ul", { className: "pt-analysis__list", children: [
|
|
2601
|
+
open.map(({ section: from, choice }) => /* @__PURE__ */ jsxs16("li", { className: "pt-analysis__goal", children: [
|
|
2602
|
+
/* @__PURE__ */ jsxs16("button", { type: "button", className: "pt-analysis__link", onClick: () => setSection(from), children: [
|
|
2603
|
+
/* @__PURE__ */ jsx18("span", { className: "pt-analysis__from", children: ui.analysisSections[from] }),
|
|
2515
2604
|
t(choice.question)
|
|
2516
2605
|
] }),
|
|
2517
|
-
/* @__PURE__ */
|
|
2606
|
+
/* @__PURE__ */ jsx18("span", { className: "pt-analysis__weight", children: ui.choiceOpen })
|
|
2518
2607
|
] }, choice.id)),
|
|
2519
|
-
open.length === 0 && /* @__PURE__ */
|
|
2608
|
+
open.length === 0 && /* @__PURE__ */ jsx18("li", { className: "pt-analysis__goal is-off", children: ui.analysisAllDecided })
|
|
2520
2609
|
] })
|
|
2521
2610
|
] })
|
|
2522
2611
|
] })
|
|
@@ -2567,39 +2656,39 @@ function ageInWords(seconds, lang) {
|
|
|
2567
2656
|
}
|
|
2568
2657
|
|
|
2569
2658
|
// src/panel/MarketplaceView.tsx
|
|
2570
|
-
import { Fragment as
|
|
2659
|
+
import { Fragment as Fragment5, jsx as jsx19, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
2571
2660
|
function ToolRow({
|
|
2572
2661
|
tool,
|
|
2573
2662
|
lang,
|
|
2574
2663
|
ui,
|
|
2575
2664
|
onInstall
|
|
2576
2665
|
}) {
|
|
2577
|
-
return /* @__PURE__ */
|
|
2578
|
-
/* @__PURE__ */
|
|
2579
|
-
/* @__PURE__ */
|
|
2580
|
-
/* @__PURE__ */
|
|
2666
|
+
return /* @__PURE__ */ jsxs17("article", { className: `pt-tool${tool.state ? ` is-${tool.state}` : " is-command"}`, children: [
|
|
2667
|
+
/* @__PURE__ */ jsxs17("div", { className: "pt-tool__head", children: [
|
|
2668
|
+
/* @__PURE__ */ jsx19("h3", { className: "pt-tool__name", children: tool.name }),
|
|
2669
|
+
/* @__PURE__ */ jsx19("span", { className: "pt-tool__state", children: tool.state ? ui.installStates[tool.state] : ui.toolCommandOnly })
|
|
2581
2670
|
] }),
|
|
2582
|
-
tool.summary && /* @__PURE__ */
|
|
2583
|
-
/* @__PURE__ */
|
|
2584
|
-
/* @__PURE__ */
|
|
2585
|
-
tool.claudePlugin && /* @__PURE__ */
|
|
2671
|
+
tool.summary && /* @__PURE__ */ jsx19("p", { className: "pt-panel-text", children: tool.summary }),
|
|
2672
|
+
/* @__PURE__ */ jsxs17("p", { className: "pt-tool__meta", children: [
|
|
2673
|
+
/* @__PURE__ */ jsx19("span", { className: "pt-tool__id", children: tool.id }),
|
|
2674
|
+
tool.claudePlugin && /* @__PURE__ */ jsxs17(Fragment5, { children: [
|
|
2586
2675
|
" \xB7 ",
|
|
2587
|
-
tool.version ? /* @__PURE__ */
|
|
2676
|
+
tool.version ? /* @__PURE__ */ jsxs17("span", { className: "pt-tool__version", children: [
|
|
2588
2677
|
"v",
|
|
2589
2678
|
tool.version
|
|
2590
2679
|
] }) : (
|
|
2591
2680
|
// Never a version we made up. A blank here is the plugin's own
|
|
2592
2681
|
// manifest failing to answer, and it says so on hover.
|
|
2593
|
-
/* @__PURE__ */
|
|
2682
|
+
/* @__PURE__ */ jsx19("span", { className: "pt-tool__version is-unknown", title: tool.versionError ?? void 0, children: ui.versionUnknown })
|
|
2594
2683
|
)
|
|
2595
2684
|
] }),
|
|
2596
|
-
tool.repo && /* @__PURE__ */
|
|
2685
|
+
tool.repo && /* @__PURE__ */ jsxs17(Fragment5, { children: [
|
|
2597
2686
|
" \xB7 ",
|
|
2598
|
-
/* @__PURE__ */
|
|
2687
|
+
/* @__PURE__ */ jsx19("a", { className: "pt-tool__repo", href: `https://github.com/${tool.repo}`, target: "_blank", rel: "noreferrer", children: tool.repo })
|
|
2599
2688
|
] })
|
|
2600
2689
|
] }),
|
|
2601
|
-
tool.tags.length > 0 && /* @__PURE__ */
|
|
2602
|
-
!tool.claudePlugin && tool.standaloneCommand && /* @__PURE__ */
|
|
2690
|
+
tool.tags.length > 0 && /* @__PURE__ */ jsx19("p", { className: "pt-tool__tags", children: tool.tags.map((tag) => /* @__PURE__ */ jsx19("span", { className: "pt-tool__tag", children: tag }, tag)) }),
|
|
2691
|
+
!tool.claudePlugin && tool.standaloneCommand && /* @__PURE__ */ jsx19(
|
|
2603
2692
|
CopyBlock,
|
|
2604
2693
|
{
|
|
2605
2694
|
text: tool.standaloneCommand,
|
|
@@ -2607,11 +2696,11 @@ function ToolRow({
|
|
|
2607
2696
|
labels: { copy: ui.copy, copied: ui.copied, selected: ui.copySelected }
|
|
2608
2697
|
}
|
|
2609
2698
|
),
|
|
2610
|
-
/* @__PURE__ */
|
|
2611
|
-
/* @__PURE__ */
|
|
2612
|
-
tool.homepage && /* @__PURE__ */
|
|
2699
|
+
/* @__PURE__ */ jsxs17("div", { className: "pt-panel-row pt-tool__actions", children: [
|
|
2700
|
+
/* @__PURE__ */ jsx19("button", { type: "button", className: "pt-btn pt-btn--sm", onClick: () => onInstall(tool), children: tool.claudePlugin ? ui.install : ui.howToRun }),
|
|
2701
|
+
tool.homepage && /* @__PURE__ */ jsx19("a", { className: "pt-btn pt-btn--sm", href: tool.homepage, target: "_blank", rel: "noreferrer", children: ui.learnMore })
|
|
2613
2702
|
] }),
|
|
2614
|
-
tool.state === "misconfigured" && /* @__PURE__ */
|
|
2703
|
+
tool.state === "misconfigured" && /* @__PURE__ */ jsx19("p", { className: "pt-warn", children: ui.stateMisconfiguredWhy })
|
|
2615
2704
|
] });
|
|
2616
2705
|
}
|
|
2617
2706
|
function MarketplaceView({ report, loading, failure, lang, ui, onRefresh }) {
|
|
@@ -2633,39 +2722,39 @@ function MarketplaceView({ report, loading, failure, lang, ui, onRefresh }) {
|
|
|
2633
2722
|
}),
|
|
2634
2723
|
[tools]
|
|
2635
2724
|
);
|
|
2636
|
-
return /* @__PURE__ */
|
|
2637
|
-
/* @__PURE__ */
|
|
2638
|
-
/* @__PURE__ */
|
|
2639
|
-
/* @__PURE__ */
|
|
2640
|
-
/* @__PURE__ */
|
|
2641
|
-
/* @__PURE__ */
|
|
2642
|
-
onRefresh && /* @__PURE__ */
|
|
2643
|
-
report && onRefresh && /* @__PURE__ */
|
|
2725
|
+
return /* @__PURE__ */ jsxs17("div", { className: "pt-panel-page pt-panel-section pt-marketplace", children: [
|
|
2726
|
+
/* @__PURE__ */ jsxs17("section", { children: [
|
|
2727
|
+
/* @__PURE__ */ jsx19("p", { className: "pt-eyebrow", children: report?.marketplace.name ?? ui.marketplaceEyebrow }),
|
|
2728
|
+
/* @__PURE__ */ jsx19("h2", { className: "pt-h2", children: ui.marketplaceTitle }),
|
|
2729
|
+
/* @__PURE__ */ jsx19("p", { className: "pt-sub", children: ui.marketplaceIntro }),
|
|
2730
|
+
/* @__PURE__ */ jsxs17("div", { className: "pt-panel-row pt-marketplace__status", children: [
|
|
2731
|
+
onRefresh && /* @__PURE__ */ jsx19("button", { type: "button", className: "pt-btn pt-btn--sm", onClick: onRefresh, disabled: loading, children: loading ? ui.refreshing : ui.refresh }),
|
|
2732
|
+
report && onRefresh && /* @__PURE__ */ jsx19("span", { className: "pt-marketplace__age", children: ui.readAt(ageInWords(report.ageSeconds, lang)) })
|
|
2644
2733
|
] }),
|
|
2645
|
-
report?.stale && !report.unavailable && /* @__PURE__ */
|
|
2646
|
-
report?.unavailable && /* @__PURE__ */
|
|
2647
|
-
failure && /* @__PURE__ */
|
|
2734
|
+
report?.stale && !report.unavailable && /* @__PURE__ */ jsx19("p", { className: "pt-warn", children: ui.catalogueStale(ageInWords(report.ageSeconds, lang)) }),
|
|
2735
|
+
report?.unavailable && /* @__PURE__ */ jsx19("p", { className: "pt-warn", children: ui.catalogueUnavailable }),
|
|
2736
|
+
failure && /* @__PURE__ */ jsx19("p", { className: "pt-warn", children: ui.catalogueFailed })
|
|
2648
2737
|
] }),
|
|
2649
|
-
report && /* @__PURE__ */
|
|
2650
|
-
/* @__PURE__ */
|
|
2738
|
+
report && /* @__PURE__ */ jsxs17("section", { children: [
|
|
2739
|
+
/* @__PURE__ */ jsxs17("p", { className: "pt-marketplace__project", children: [
|
|
2651
2740
|
ui.stateFrom(report.project.repo, SETTINGS_PATH),
|
|
2652
|
-
report.project.settingsStatus === "absent" && /* @__PURE__ */
|
|
2741
|
+
report.project.settingsStatus === "absent" && /* @__PURE__ */ jsxs17(Fragment5, { children: [
|
|
2653
2742
|
" \xB7 ",
|
|
2654
2743
|
ui.settingsAbsent
|
|
2655
2744
|
] }),
|
|
2656
|
-
report.project.settingsStatus === "unreadable" && /* @__PURE__ */
|
|
2745
|
+
report.project.settingsStatus === "unreadable" && /* @__PURE__ */ jsxs17(Fragment5, { children: [
|
|
2657
2746
|
" \xB7 ",
|
|
2658
2747
|
ui.settingsUnreadable
|
|
2659
2748
|
] }),
|
|
2660
|
-
report.project.settingsStatus === "unparseable" && /* @__PURE__ */
|
|
2749
|
+
report.project.settingsStatus === "unparseable" && /* @__PURE__ */ jsxs17(Fragment5, { children: [
|
|
2661
2750
|
" \xB7 ",
|
|
2662
2751
|
ui.settingsUnparseable
|
|
2663
2752
|
] })
|
|
2664
2753
|
] }),
|
|
2665
|
-
report.project.detail && /* @__PURE__ */
|
|
2666
|
-
/* @__PURE__ */
|
|
2667
|
-
/* @__PURE__ */
|
|
2668
|
-
/* @__PURE__ */
|
|
2754
|
+
report.project.detail && /* @__PURE__ */ jsx19("p", { className: "pt-marketplace__detail", children: report.project.detail }),
|
|
2755
|
+
/* @__PURE__ */ jsxs17("div", { className: "pt-panel-row pt-marketplace__filters", children: [
|
|
2756
|
+
/* @__PURE__ */ jsx19(FilterChip, { label: ui.all, count: counts.all, active: filter === "all", onClick: () => setFilter("all") }),
|
|
2757
|
+
/* @__PURE__ */ jsx19(
|
|
2669
2758
|
FilterChip,
|
|
2670
2759
|
{
|
|
2671
2760
|
label: ui.filterPlugins,
|
|
@@ -2674,7 +2763,7 @@ function MarketplaceView({ report, loading, failure, lang, ui, onRefresh }) {
|
|
|
2674
2763
|
onClick: () => setFilter("plugins")
|
|
2675
2764
|
}
|
|
2676
2765
|
),
|
|
2677
|
-
/* @__PURE__ */
|
|
2766
|
+
/* @__PURE__ */ jsx19(
|
|
2678
2767
|
FilterChip,
|
|
2679
2768
|
{
|
|
2680
2769
|
label: ui.filterActive,
|
|
@@ -2683,7 +2772,7 @@ function MarketplaceView({ report, loading, failure, lang, ui, onRefresh }) {
|
|
|
2683
2772
|
onClick: () => setFilter("active")
|
|
2684
2773
|
}
|
|
2685
2774
|
),
|
|
2686
|
-
/* @__PURE__ */
|
|
2775
|
+
/* @__PURE__ */ jsx19(
|
|
2687
2776
|
FilterChip,
|
|
2688
2777
|
{
|
|
2689
2778
|
label: ui.filterStandalone,
|
|
@@ -2693,12 +2782,12 @@ function MarketplaceView({ report, loading, failure, lang, ui, onRefresh }) {
|
|
|
2693
2782
|
}
|
|
2694
2783
|
)
|
|
2695
2784
|
] }),
|
|
2696
|
-
loading && tools.length === 0 ? /* @__PURE__ */
|
|
2785
|
+
loading && tools.length === 0 ? /* @__PURE__ */ jsx19("p", { className: "pt-analysis__empty", children: ui.catalogueLoading }) : shown.length === 0 ? /* @__PURE__ */ jsx19("p", { className: "pt-analysis__empty", children: ui.catalogueEmpty }) : /* @__PURE__ */ jsx19("div", { className: "pt-tool-grid", children: shown.map((tool) => /* @__PURE__ */ jsx19(ToolRow, { tool, lang, ui, onInstall: setOpen }, tool.id)) })
|
|
2697
2786
|
] }),
|
|
2698
|
-
open && /* @__PURE__ */
|
|
2699
|
-
/* @__PURE__ */
|
|
2700
|
-
/* @__PURE__ */
|
|
2701
|
-
/* @__PURE__ */
|
|
2787
|
+
open && /* @__PURE__ */ jsxs17(DetailSheet, { open: true, onClose: () => setOpen(null), ariaLabel: `${ui.installTitle} \u2014 ${open.name}`, children: [
|
|
2788
|
+
/* @__PURE__ */ jsx19("p", { className: "pt-eyebrow", children: ui.installTitle }),
|
|
2789
|
+
/* @__PURE__ */ jsx19("h2", { className: "pt-h2", children: open.name }),
|
|
2790
|
+
/* @__PURE__ */ jsx19(
|
|
2702
2791
|
InstallSheet,
|
|
2703
2792
|
{
|
|
2704
2793
|
tool: open,
|
|
@@ -2707,7 +2796,7 @@ function MarketplaceView({ report, loading, failure, lang, ui, onRefresh }) {
|
|
|
2707
2796
|
registered: report?.project.marketplaceRegistered ?? false
|
|
2708
2797
|
}
|
|
2709
2798
|
),
|
|
2710
|
-
/* @__PURE__ */
|
|
2799
|
+
/* @__PURE__ */ jsx19("button", { type: "button", className: "pt-btn pt-btn--sm", onClick: () => setOpen(null), children: ui.close })
|
|
2711
2800
|
] })
|
|
2712
2801
|
] });
|
|
2713
2802
|
}
|
|
@@ -2718,9 +2807,9 @@ function InstallSheet({
|
|
|
2718
2807
|
registered
|
|
2719
2808
|
}) {
|
|
2720
2809
|
const copy = { copy: ui.copy, copied: ui.copied, selected: ui.copySelected };
|
|
2721
|
-
return /* @__PURE__ */
|
|
2722
|
-
tool.claudePlugin ? /* @__PURE__ */
|
|
2723
|
-
/* @__PURE__ */
|
|
2810
|
+
return /* @__PURE__ */ jsxs17(Fragment5, { children: [
|
|
2811
|
+
tool.claudePlugin ? /* @__PURE__ */ jsxs17(Fragment5, { children: [
|
|
2812
|
+
/* @__PURE__ */ jsx19(DetailSection, { title: ui.installRepoTitle, subtitle: ui.installRepoHint, children: /* @__PURE__ */ jsx19(
|
|
2724
2813
|
CopyBlock,
|
|
2725
2814
|
{
|
|
2726
2815
|
text: repositorySnippet(tool.id, marketplace),
|
|
@@ -2729,16 +2818,16 @@ function InstallSheet({
|
|
|
2729
2818
|
labels: copy
|
|
2730
2819
|
}
|
|
2731
2820
|
) }),
|
|
2732
|
-
/* @__PURE__ */
|
|
2733
|
-
] }) : /* @__PURE__ */
|
|
2734
|
-
tool.standaloneCommand ? /* @__PURE__ */
|
|
2735
|
-
/* @__PURE__ */
|
|
2821
|
+
/* @__PURE__ */ jsx19(DetailSection, { title: ui.installCliTitle, subtitle: ui.installCliHint, children: /* @__PURE__ */ jsx19(CopyBlock, { text: commandSnippet(tool.id, marketplace), labels: copy }) })
|
|
2822
|
+
] }) : /* @__PURE__ */ jsx19("p", { className: "pt-panel-text", children: ui.installNoPlugin }),
|
|
2823
|
+
tool.standaloneCommand ? /* @__PURE__ */ jsx19(DetailSection, { title: ui.installStandaloneTitle, subtitle: ui.installStandaloneHint, children: /* @__PURE__ */ jsx19(CopyBlock, { text: tool.standaloneCommand, labels: copy }) }) : /* @__PURE__ */ jsx19(DetailSection, { title: ui.installStandaloneTitle, children: /* @__PURE__ */ jsx19("p", { className: "pt-panel-text", children: ui.installNoStandalone }) }),
|
|
2824
|
+
/* @__PURE__ */ jsx19("p", { className: "pt-marketplace__source", children: ui.marketplaceSource(marketplace.url) })
|
|
2736
2825
|
] });
|
|
2737
2826
|
}
|
|
2738
2827
|
|
|
2739
2828
|
// src/panel/CardSheet.tsx
|
|
2740
2829
|
import { useState as useState9 } from "react";
|
|
2741
|
-
import { jsx as
|
|
2830
|
+
import { jsx as jsx20, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
2742
2831
|
var LEVEL_LABEL = (ui) => ({
|
|
2743
2832
|
high: ui.levelHigh,
|
|
2744
2833
|
medium: ui.levelMedium,
|
|
@@ -2765,9 +2854,9 @@ function CardSheet({ card, state, lang, ui, onChange, onDelete, onClose }) {
|
|
|
2765
2854
|
});
|
|
2766
2855
|
setNote("");
|
|
2767
2856
|
}
|
|
2768
|
-
return /* @__PURE__ */
|
|
2769
|
-
/* @__PURE__ */
|
|
2770
|
-
/* @__PURE__ */
|
|
2857
|
+
return /* @__PURE__ */ jsxs18(DetailSheet, { open: true, onClose, ariaLabel: ui.cardDetail, children: [
|
|
2858
|
+
/* @__PURE__ */ jsxs18(DetailSection, { title: ui.title, children: [
|
|
2859
|
+
/* @__PURE__ */ jsx20(
|
|
2771
2860
|
"input",
|
|
2772
2861
|
{
|
|
2773
2862
|
className: "pt-input",
|
|
@@ -2776,9 +2865,9 @@ function CardSheet({ card, state, lang, ui, onChange, onDelete, onClose }) {
|
|
|
2776
2865
|
onChange: (event) => patch({ title: writeText(lang, event.target.value) })
|
|
2777
2866
|
}
|
|
2778
2867
|
),
|
|
2779
|
-
untranslated(card.title) && /* @__PURE__ */
|
|
2868
|
+
untranslated(card.title) && /* @__PURE__ */ jsx20("span", { className: "pt-flag", children: ui.untranslatedBadge })
|
|
2780
2869
|
] }),
|
|
2781
|
-
/* @__PURE__ */
|
|
2870
|
+
/* @__PURE__ */ jsx20(DetailSection, { title: ui.detail, children: /* @__PURE__ */ jsx20(
|
|
2782
2871
|
"textarea",
|
|
2783
2872
|
{
|
|
2784
2873
|
className: "pt-textarea",
|
|
@@ -2788,7 +2877,7 @@ function CardSheet({ card, state, lang, ui, onChange, onDelete, onClose }) {
|
|
|
2788
2877
|
onChange: (event) => patch({ body: writeText(lang, event.target.value) })
|
|
2789
2878
|
}
|
|
2790
2879
|
) }),
|
|
2791
|
-
/* @__PURE__ */
|
|
2880
|
+
/* @__PURE__ */ jsx20(DetailSection, { title: ui.areaLabel, children: /* @__PURE__ */ jsx20("div", { className: "pt-panel-row", children: state.areas.map((area) => /* @__PURE__ */ jsx20(
|
|
2792
2881
|
FilterChip,
|
|
2793
2882
|
{
|
|
2794
2883
|
label: text(area.label, lang),
|
|
@@ -2797,7 +2886,7 @@ function CardSheet({ card, state, lang, ui, onChange, onDelete, onClose }) {
|
|
|
2797
2886
|
},
|
|
2798
2887
|
area.id
|
|
2799
2888
|
)) }) }),
|
|
2800
|
-
/* @__PURE__ */
|
|
2889
|
+
/* @__PURE__ */ jsx20(DetailSection, { title: ui.priority, children: /* @__PURE__ */ jsx20("div", { className: "pt-panel-row", children: LEVELS.map((level) => /* @__PURE__ */ jsx20(
|
|
2801
2890
|
FilterChip,
|
|
2802
2891
|
{
|
|
2803
2892
|
label: levelLabel[level],
|
|
@@ -2806,7 +2895,7 @@ function CardSheet({ card, state, lang, ui, onChange, onDelete, onClose }) {
|
|
|
2806
2895
|
},
|
|
2807
2896
|
level
|
|
2808
2897
|
)) }) }),
|
|
2809
|
-
/* @__PURE__ */
|
|
2898
|
+
/* @__PURE__ */ jsx20(DetailSection, { title: ui.risk, subtitle: ui.riskHint, children: /* @__PURE__ */ jsx20("div", { className: "pt-panel-row", children: LEVELS.map((level) => /* @__PURE__ */ jsx20(
|
|
2810
2899
|
FilterChip,
|
|
2811
2900
|
{
|
|
2812
2901
|
label: levelLabel[level],
|
|
@@ -2815,7 +2904,7 @@ function CardSheet({ card, state, lang, ui, onChange, onDelete, onClose }) {
|
|
|
2815
2904
|
},
|
|
2816
2905
|
level
|
|
2817
2906
|
)) }) }),
|
|
2818
|
-
/* @__PURE__ */
|
|
2907
|
+
/* @__PURE__ */ jsx20(DetailSection, { title: ui.dependsOn, children: /* @__PURE__ */ jsx20("div", { className: "pt-panel-row", children: OWNERS.map((owner) => /* @__PURE__ */ jsx20(
|
|
2819
2908
|
FilterChip,
|
|
2820
2909
|
{
|
|
2821
2910
|
label: ownerLabel[owner],
|
|
@@ -2824,14 +2913,14 @@ function CardSheet({ card, state, lang, ui, onChange, onDelete, onClose }) {
|
|
|
2824
2913
|
},
|
|
2825
2914
|
owner
|
|
2826
2915
|
)) }) }),
|
|
2827
|
-
/* @__PURE__ */
|
|
2828
|
-
/* @__PURE__ */
|
|
2829
|
-
/* @__PURE__ */
|
|
2916
|
+
/* @__PURE__ */ jsx20(DetailSection, { title: ui.orderTitle, children: /* @__PURE__ */ jsxs18("div", { className: "pt-panel-row", children: [
|
|
2917
|
+
/* @__PURE__ */ jsx20(FilterChip, { label: `\u26A1 ${ui.orderOn}`, active: card.order, onClick: () => patch({ order: true }) }),
|
|
2918
|
+
/* @__PURE__ */ jsx20(FilterChip, { label: ui.orderOff, active: !card.order, onClick: () => patch({ order: false }) })
|
|
2830
2919
|
] }) }),
|
|
2831
|
-
/* @__PURE__ */
|
|
2832
|
-
/* @__PURE__ */
|
|
2833
|
-
/* @__PURE__ */
|
|
2834
|
-
INTENTS.map((intent) => /* @__PURE__ */
|
|
2920
|
+
/* @__PURE__ */ jsxs18(DetailSection, { title: ui.intentTitle, subtitle: ui.intentHint, children: [
|
|
2921
|
+
/* @__PURE__ */ jsxs18("div", { className: "pt-panel-row", children: [
|
|
2922
|
+
/* @__PURE__ */ jsx20(FilterChip, { label: ui.intentNone, active: card.intent === null, onClick: () => patch({ intent: null }) }),
|
|
2923
|
+
INTENTS.map((intent) => /* @__PURE__ */ jsx20(
|
|
2835
2924
|
FilterChip,
|
|
2836
2925
|
{
|
|
2837
2926
|
label: INTENT_COPY[intent].label[lang],
|
|
@@ -2841,12 +2930,12 @@ function CardSheet({ card, state, lang, ui, onChange, onDelete, onClose }) {
|
|
|
2841
2930
|
intent
|
|
2842
2931
|
))
|
|
2843
2932
|
] }),
|
|
2844
|
-
card.intent && /* @__PURE__ */
|
|
2933
|
+
card.intent && /* @__PURE__ */ jsx20("p", { className: "pt-panel-text pt-meaning", children: INTENT_COPY[card.intent].meaning[lang] })
|
|
2845
2934
|
] }),
|
|
2846
|
-
/* @__PURE__ */
|
|
2847
|
-
card.checks.length > 0 && /* @__PURE__ */
|
|
2848
|
-
/* @__PURE__ */
|
|
2849
|
-
/* @__PURE__ */
|
|
2935
|
+
/* @__PURE__ */ jsxs18(DetailSection, { title: ui.checklist, children: [
|
|
2936
|
+
card.checks.length > 0 && /* @__PURE__ */ jsx20("ul", { className: "pt-checks", children: card.checks.map((check) => /* @__PURE__ */ jsxs18("li", { children: [
|
|
2937
|
+
/* @__PURE__ */ jsxs18("label", { children: [
|
|
2938
|
+
/* @__PURE__ */ jsx20(
|
|
2850
2939
|
"input",
|
|
2851
2940
|
{
|
|
2852
2941
|
type: "checkbox",
|
|
@@ -2858,9 +2947,9 @@ function CardSheet({ card, state, lang, ui, onChange, onDelete, onClose }) {
|
|
|
2858
2947
|
})
|
|
2859
2948
|
}
|
|
2860
2949
|
),
|
|
2861
|
-
/* @__PURE__ */
|
|
2950
|
+
/* @__PURE__ */ jsx20("span", { className: check.done ? "is-done" : void 0, children: text(check.text, lang) })
|
|
2862
2951
|
] }),
|
|
2863
|
-
/* @__PURE__ */
|
|
2952
|
+
/* @__PURE__ */ jsx20(
|
|
2864
2953
|
"button",
|
|
2865
2954
|
{
|
|
2866
2955
|
type: "button",
|
|
@@ -2871,8 +2960,8 @@ function CardSheet({ card, state, lang, ui, onChange, onDelete, onClose }) {
|
|
|
2871
2960
|
}
|
|
2872
2961
|
)
|
|
2873
2962
|
] }, check.id)) }),
|
|
2874
|
-
/* @__PURE__ */
|
|
2875
|
-
/* @__PURE__ */
|
|
2963
|
+
/* @__PURE__ */ jsxs18("div", { className: "pt-compose", children: [
|
|
2964
|
+
/* @__PURE__ */ jsx20(
|
|
2876
2965
|
"input",
|
|
2877
2966
|
{
|
|
2878
2967
|
className: "pt-input",
|
|
@@ -2887,19 +2976,19 @@ function CardSheet({ card, state, lang, ui, onChange, onDelete, onClose }) {
|
|
|
2887
2976
|
}
|
|
2888
2977
|
}
|
|
2889
2978
|
),
|
|
2890
|
-
/* @__PURE__ */
|
|
2979
|
+
/* @__PURE__ */ jsx20("button", { type: "button", className: "pt-btn pt-btn--sm pt-btn--primary", onClick: addStep, children: ui.addStep })
|
|
2891
2980
|
] })
|
|
2892
2981
|
] }),
|
|
2893
|
-
/* @__PURE__ */
|
|
2894
|
-
card.notes.map((entry) => /* @__PURE__ */
|
|
2895
|
-
/* @__PURE__ */
|
|
2982
|
+
/* @__PURE__ */ jsxs18(DetailSection, { title: ui.notes, children: [
|
|
2983
|
+
card.notes.map((entry) => /* @__PURE__ */ jsxs18("div", { className: "pt-note", children: [
|
|
2984
|
+
/* @__PURE__ */ jsxs18("p", { className: "pt-note__meta", children: [
|
|
2896
2985
|
entry.by === "claude" ? "Claude" : ui.ownerYou,
|
|
2897
2986
|
" \xB7 ",
|
|
2898
2987
|
entry.date
|
|
2899
2988
|
] }),
|
|
2900
|
-
/* @__PURE__ */
|
|
2989
|
+
/* @__PURE__ */ jsx20("p", { className: "pt-panel-text", children: text(entry.text, lang) })
|
|
2901
2990
|
] }, entry.id)),
|
|
2902
|
-
/* @__PURE__ */
|
|
2991
|
+
/* @__PURE__ */ jsx20(
|
|
2903
2992
|
"textarea",
|
|
2904
2993
|
{
|
|
2905
2994
|
className: "pt-textarea",
|
|
@@ -2909,10 +2998,10 @@ function CardSheet({ card, state, lang, ui, onChange, onDelete, onClose }) {
|
|
|
2909
2998
|
onChange: (event) => setNote(event.target.value)
|
|
2910
2999
|
}
|
|
2911
3000
|
),
|
|
2912
|
-
/* @__PURE__ */
|
|
3001
|
+
/* @__PURE__ */ jsx20("button", { type: "button", className: "pt-btn pt-btn--sm pt-btn--primary", onClick: addNote, children: ui.leaveNote })
|
|
2913
3002
|
] }),
|
|
2914
|
-
/* @__PURE__ */
|
|
2915
|
-
/* @__PURE__ */
|
|
3003
|
+
/* @__PURE__ */ jsxs18(DetailSection, { title: ui.columnTitle, children: [
|
|
3004
|
+
/* @__PURE__ */ jsx20("div", { className: "pt-panel-row", children: state.columns.map((column) => /* @__PURE__ */ jsx20(
|
|
2916
3005
|
FilterChip,
|
|
2917
3006
|
{
|
|
2918
3007
|
label: text(column.title, lang),
|
|
@@ -2923,16 +3012,16 @@ function CardSheet({ card, state, lang, ui, onChange, onDelete, onClose }) {
|
|
|
2923
3012
|
},
|
|
2924
3013
|
column.id
|
|
2925
3014
|
)) }),
|
|
2926
|
-
(card.startedAt || card.completedAt) && /* @__PURE__ */
|
|
3015
|
+
(card.startedAt || card.completedAt) && /* @__PURE__ */ jsxs18("p", { className: "pt-panel-text pt-stamps", children: [
|
|
2927
3016
|
card.startedAt && `${ui.started}: ${card.startedAt}`,
|
|
2928
3017
|
card.startedAt && card.completedAt && " \xB7 ",
|
|
2929
3018
|
card.completedAt && `${ui.completed}: ${card.completedAt}`
|
|
2930
3019
|
] }),
|
|
2931
|
-
claimedWithoutStarting(card) && /* @__PURE__ */
|
|
3020
|
+
claimedWithoutStarting(card) && /* @__PURE__ */ jsx20("p", { className: "pt-warn", children: ui.neverStarted })
|
|
2932
3021
|
] }),
|
|
2933
|
-
/* @__PURE__ */
|
|
2934
|
-
/* @__PURE__ */
|
|
2935
|
-
/* @__PURE__ */
|
|
3022
|
+
/* @__PURE__ */ jsxs18("div", { className: "pt-sheet-actions", children: [
|
|
3023
|
+
/* @__PURE__ */ jsx20("button", { type: "button", className: "pt-btn pt-btn--sm", onClick: onClose, children: ui.close }),
|
|
3024
|
+
/* @__PURE__ */ jsx20("button", { type: "button", className: "pt-btn pt-btn--sm pt-danger", onClick: () => onDelete(card.id), children: ui.deleteCard })
|
|
2936
3025
|
] })
|
|
2937
3026
|
] });
|
|
2938
3027
|
}
|
|
@@ -2965,7 +3054,7 @@ function resolveTheme(saved, stored, themes, hasImported, fallback) {
|
|
|
2965
3054
|
}
|
|
2966
3055
|
|
|
2967
3056
|
// src/panel/PanelApp.tsx
|
|
2968
|
-
import { Fragment as
|
|
3057
|
+
import { Fragment as Fragment6, jsx as jsx21, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
2969
3058
|
var IMPORTED = "imported";
|
|
2970
3059
|
var WIZARD_KEY = "paneltir:setup-done";
|
|
2971
3060
|
var THEME_KEY = "paneltir:theme";
|
|
@@ -3051,7 +3140,6 @@ function PanelApp({
|
|
|
3051
3140
|
);
|
|
3052
3141
|
const [state, setState] = useState10(initialState);
|
|
3053
3142
|
const [filter, setFilter] = useState10("all");
|
|
3054
|
-
const [showArchived, setShowArchived] = useState10(() => /* @__PURE__ */ new Set());
|
|
3055
3143
|
const [openCardId, setOpenCardId] = useState10(null);
|
|
3056
3144
|
const [settingsOpen, setSettingsOpen] = useState10(false);
|
|
3057
3145
|
const [update, setUpdate] = useState10(null);
|
|
@@ -3095,11 +3183,11 @@ function PanelApp({
|
|
|
3095
3183
|
status: state_("GH_TOKEN"),
|
|
3096
3184
|
variable: "GH_TOKEN",
|
|
3097
3185
|
enables: ui.needTokenEnables,
|
|
3098
|
-
fix: /* @__PURE__ */
|
|
3099
|
-
/* @__PURE__ */
|
|
3100
|
-
/* @__PURE__ */
|
|
3101
|
-
/* @__PURE__ */
|
|
3102
|
-
/* @__PURE__ */
|
|
3186
|
+
fix: /* @__PURE__ */ jsxs19("ol", { children: [
|
|
3187
|
+
/* @__PURE__ */ jsx21("li", { children: ui.fixTokenCreate }),
|
|
3188
|
+
/* @__PURE__ */ jsx21("li", { children: ui.fixTokenScope }),
|
|
3189
|
+
/* @__PURE__ */ jsx21("li", { children: ui.fixTokenPaste }),
|
|
3190
|
+
/* @__PURE__ */ jsx21("li", { children: ui.fixTokenRedeploy })
|
|
3103
3191
|
] })
|
|
3104
3192
|
},
|
|
3105
3193
|
{
|
|
@@ -3108,7 +3196,7 @@ function PanelApp({
|
|
|
3108
3196
|
status: state_("PANEL_REPO"),
|
|
3109
3197
|
variable: "PANEL_REPO",
|
|
3110
3198
|
enables: ui.needRepoEnables,
|
|
3111
|
-
fix: /* @__PURE__ */
|
|
3199
|
+
fix: /* @__PURE__ */ jsx21("p", { children: ui.fixRepo })
|
|
3112
3200
|
},
|
|
3113
3201
|
// The gate is the only requirement here that is not an environment
|
|
3114
3202
|
// variable: it is files this project owns, and the only one whose
|
|
@@ -3135,12 +3223,12 @@ function PanelApp({
|
|
|
3135
3223
|
label: ui.needGate,
|
|
3136
3224
|
status: gateReading.verdict === "current" ? "ok" : gateReading.verdict === "behind" ? "missing" : "unknown",
|
|
3137
3225
|
enables: ui.needGateEnables,
|
|
3138
|
-
fix: /* @__PURE__ */
|
|
3139
|
-
/* @__PURE__ */
|
|
3226
|
+
fix: /* @__PURE__ */ jsxs19(Fragment6, { children: [
|
|
3227
|
+
/* @__PURE__ */ jsxs19("p", { children: [
|
|
3140
3228
|
ui.fixGate,
|
|
3141
3229
|
gateReading.copiedFrom ? ` (v${gateReading.copiedFrom} \u2192 v${gateReading.installed})` : ""
|
|
3142
3230
|
] }),
|
|
3143
|
-
/* @__PURE__ */
|
|
3231
|
+
/* @__PURE__ */ jsx21("pre", { className: "pt-copy__pre", children: "npx paneltir doctor" })
|
|
3144
3232
|
] })
|
|
3145
3233
|
}]
|
|
3146
3234
|
];
|
|
@@ -3174,32 +3262,24 @@ function PanelApp({
|
|
|
3174
3262
|
[filter]
|
|
3175
3263
|
);
|
|
3176
3264
|
const visibleCards = useMemo5(() => state.cards.filter(matches), [state.cards, matches]);
|
|
3265
|
+
const archivedCards = useMemo5(
|
|
3266
|
+
() => state.cards.filter((card) => isArchived(card, doneColumns)),
|
|
3267
|
+
[state.cards, doneColumns]
|
|
3268
|
+
);
|
|
3269
|
+
const archivedIds = useMemo5(() => new Set(archivedCards.map((card) => card.id)), [archivedCards]);
|
|
3270
|
+
const hasRecord = Boolean(showHistory) || archivedCards.length > 0;
|
|
3271
|
+
const openChoices = useMemo5(
|
|
3272
|
+
() => state.analysis ? undecided(state.analysis).length : 0,
|
|
3273
|
+
[state.analysis]
|
|
3274
|
+
);
|
|
3177
3275
|
const boardColumns = useMemo5(
|
|
3178
|
-
() => state.columns.map((column) => {
|
|
3179
|
-
|
|
3180
|
-
|
|
3181
|
-
|
|
3182
|
-
|
|
3183
|
-
|
|
3184
|
-
|
|
3185
|
-
hint: column.hint ? t(column.hint) : void 0,
|
|
3186
|
-
cards: showing,
|
|
3187
|
-
footer: archived.length ? /* @__PURE__ */ jsx20(
|
|
3188
|
-
"button",
|
|
3189
|
-
{
|
|
3190
|
-
type: "button",
|
|
3191
|
-
onClick: () => setShowArchived((current) => {
|
|
3192
|
-
const next = new Set(current);
|
|
3193
|
-
if (next.has(column.id)) next.delete(column.id);
|
|
3194
|
-
else next.add(column.id);
|
|
3195
|
-
return next;
|
|
3196
|
-
}),
|
|
3197
|
-
children: showArchived.has(column.id) ? ui.archivedHide : `${archived.length} ${archived.length === 1 ? ui.archivedOne : ui.archivedMany}`
|
|
3198
|
-
}
|
|
3199
|
-
) : void 0
|
|
3200
|
-
};
|
|
3201
|
-
}),
|
|
3202
|
-
[state.columns, visibleCards, doneColumns, showArchived, t, ui]
|
|
3276
|
+
() => state.columns.map((column) => ({
|
|
3277
|
+
id: column.id,
|
|
3278
|
+
title: t(column.title),
|
|
3279
|
+
hint: column.hint ? t(column.hint) : void 0,
|
|
3280
|
+
cards: visibleCards.filter((card) => card.column === column.id && !archivedIds.has(card.id))
|
|
3281
|
+
})),
|
|
3282
|
+
[state.columns, visibleCards, archivedIds, t]
|
|
3203
3283
|
);
|
|
3204
3284
|
const notifications = useMemo5(() => {
|
|
3205
3285
|
const items = [];
|
|
@@ -3297,18 +3377,18 @@ function PanelApp({
|
|
|
3297
3377
|
}, []);
|
|
3298
3378
|
const addCard = useCallback5(
|
|
3299
3379
|
(columnId) => {
|
|
3300
|
-
const card = emptyCard(columnId, state.areas[0]?.id ?? "general");
|
|
3380
|
+
const card = stampForColumn(emptyCard(columnId, state.areas[0]?.id ?? "general"), state.columns);
|
|
3301
3381
|
setState((current) => ({ ...current, updatedAt: today(), cards: [...current.cards, card] }));
|
|
3302
3382
|
setOpenCardId(card.id);
|
|
3303
3383
|
},
|
|
3304
|
-
[state.areas]
|
|
3384
|
+
[state.areas, state.columns]
|
|
3305
3385
|
);
|
|
3306
3386
|
const addUpdateCard = useCallback5(() => {
|
|
3307
3387
|
if (!update?.behind) return;
|
|
3308
3388
|
const id = updateCardId(update.latest);
|
|
3309
3389
|
if (state.cards.some((card2) => card2.id === id)) return;
|
|
3310
3390
|
const card = {
|
|
3311
|
-
...emptyCard(
|
|
3391
|
+
...emptyCard(queueColumn(state.columns), state.areas[0]?.id ?? "general"),
|
|
3312
3392
|
id,
|
|
3313
3393
|
title: { en: UI.en.updateCardTitle(update.latest), es: UI.es.updateCardTitle(update.latest) },
|
|
3314
3394
|
body: { en: UI.en.updateCardBody(update.latest), es: UI.es.updateCardBody(update.latest) },
|
|
@@ -3319,7 +3399,7 @@ function PanelApp({
|
|
|
3319
3399
|
};
|
|
3320
3400
|
setState((current) => ({ ...current, updatedAt: today(), cards: [...current.cards, card] }));
|
|
3321
3401
|
setOpenCardId(id);
|
|
3322
|
-
}, [update, state.cards, state.areas, state.preferences?.updateAsOrder]);
|
|
3402
|
+
}, [update, state.cards, state.areas, state.columns, state.preferences?.updateAsOrder]);
|
|
3323
3403
|
const requestReport = useCallback5(
|
|
3324
3404
|
(section) => {
|
|
3325
3405
|
const id = `report-${section}-${today()}`;
|
|
@@ -3328,7 +3408,7 @@ function PanelApp({
|
|
|
3328
3408
|
return;
|
|
3329
3409
|
}
|
|
3330
3410
|
const card = {
|
|
3331
|
-
...emptyCard(
|
|
3411
|
+
...emptyCard(queueColumn(state.columns), state.areas[0]?.id ?? "general"),
|
|
3332
3412
|
id,
|
|
3333
3413
|
title: { en: UI.en.analysisRedoTitle[section], es: UI.es.analysisRedoTitle[section] },
|
|
3334
3414
|
body: { en: UI.en.analysisRedoBody[section], es: UI.es.analysisRedoBody[section] },
|
|
@@ -3341,12 +3421,14 @@ function PanelApp({
|
|
|
3341
3421
|
setState((current) => ({ ...current, updatedAt: today(), cards: [...current.cards, card] }));
|
|
3342
3422
|
setOpenCardId(id);
|
|
3343
3423
|
},
|
|
3344
|
-
[state.cards, state.areas]
|
|
3424
|
+
[state.cards, state.areas, state.columns]
|
|
3345
3425
|
);
|
|
3346
3426
|
const moveCard = useCallback5(
|
|
3347
3427
|
(move) => {
|
|
3348
3428
|
setState((current) => {
|
|
3349
|
-
const
|
|
3429
|
+
const done = new Set(current.columns.filter((column) => column.done).map((column) => column.id));
|
|
3430
|
+
const drawn = current.cards.filter((card) => matches(card) && !isArchived(card, done));
|
|
3431
|
+
const moved = applyMove(current.cards, move, drawn);
|
|
3350
3432
|
return {
|
|
3351
3433
|
...current,
|
|
3352
3434
|
updatedAt: today(),
|
|
@@ -3534,7 +3616,7 @@ function PanelApp({
|
|
|
3534
3616
|
throw Object.assign(new Error(saveError(response.status, data, body)), { conflict });
|
|
3535
3617
|
}
|
|
3536
3618
|
setSavedSnapshot(JSON.stringify(next));
|
|
3537
|
-
setState(next);
|
|
3619
|
+
setState((current) => current === state ? next : current);
|
|
3538
3620
|
setSave({
|
|
3539
3621
|
status: "saved",
|
|
3540
3622
|
at: (/* @__PURE__ */ new Date()).toLocaleTimeString(lang === "es" ? "es-ES" : "en-GB", {
|
|
@@ -3569,21 +3651,21 @@ function PanelApp({
|
|
|
3569
3651
|
state.updatedAt,
|
|
3570
3652
|
save.status === "saved" ? ui.savedAt(save.at) : dirty ? ui.unsaved : ""
|
|
3571
3653
|
].filter(Boolean).join(" \xB7 ");
|
|
3572
|
-
return /* @__PURE__ */
|
|
3654
|
+
return /* @__PURE__ */ jsxs19(DashboardThemeProvider, { tokens: theme, form, className, children: [
|
|
3573
3655
|
typeof decoration === "function" ? decoration(themeName) : decoration,
|
|
3574
|
-
/* @__PURE__ */
|
|
3656
|
+
/* @__PURE__ */ jsx21(
|
|
3575
3657
|
DashboardHeader,
|
|
3576
3658
|
{
|
|
3577
3659
|
wordmark: (
|
|
3578
3660
|
/* A board belongs to a project, so its name is what goes here. A
|
|
3579
3661
|
caller with a mark of its own passes `brand`; drawing one here
|
|
3580
3662
|
would be the kit deciding what somebody else's panel is called. */
|
|
3581
|
-
brand ?? /* @__PURE__ */
|
|
3663
|
+
brand ?? /* @__PURE__ */ jsx21("span", { className: "pt-panel-brand", children: state.project })
|
|
3582
3664
|
),
|
|
3583
3665
|
status,
|
|
3584
|
-
controls: /* @__PURE__ */
|
|
3585
|
-
(initialState.analysis || hasMarketplace ||
|
|
3586
|
-
/* @__PURE__ */
|
|
3666
|
+
controls: /* @__PURE__ */ jsxs19(Fragment6, { children: [
|
|
3667
|
+
(initialState.analysis || hasMarketplace || hasRecord) && /* @__PURE__ */ jsxs19("span", { className: "pt-views", children: [
|
|
3668
|
+
/* @__PURE__ */ jsx21(
|
|
3587
3669
|
"button",
|
|
3588
3670
|
{
|
|
3589
3671
|
type: "button",
|
|
@@ -3593,7 +3675,7 @@ function PanelApp({
|
|
|
3593
3675
|
children: ui.board
|
|
3594
3676
|
}
|
|
3595
3677
|
),
|
|
3596
|
-
initialState.analysis && /* @__PURE__ */
|
|
3678
|
+
initialState.analysis && /* @__PURE__ */ jsx21(
|
|
3597
3679
|
"button",
|
|
3598
3680
|
{
|
|
3599
3681
|
type: "button",
|
|
@@ -3603,7 +3685,7 @@ function PanelApp({
|
|
|
3603
3685
|
children: ui.analysis
|
|
3604
3686
|
}
|
|
3605
3687
|
),
|
|
3606
|
-
hasMarketplace && /* @__PURE__ */
|
|
3688
|
+
hasMarketplace && /* @__PURE__ */ jsx21(
|
|
3607
3689
|
"button",
|
|
3608
3690
|
{
|
|
3609
3691
|
type: "button",
|
|
@@ -3613,18 +3695,18 @@ function PanelApp({
|
|
|
3613
3695
|
children: ui.marketplace
|
|
3614
3696
|
}
|
|
3615
3697
|
),
|
|
3616
|
-
|
|
3698
|
+
hasRecord && /* @__PURE__ */ jsx21(
|
|
3617
3699
|
"button",
|
|
3618
3700
|
{
|
|
3619
3701
|
type: "button",
|
|
3620
3702
|
className: `pt-lang${view === "history" ? " is-on" : ""}`,
|
|
3621
3703
|
"aria-pressed": view === "history",
|
|
3622
3704
|
onClick: () => setView("history"),
|
|
3623
|
-
children: ui.history
|
|
3705
|
+
children: showHistory ? ui.history : ui.archiveTitle
|
|
3624
3706
|
}
|
|
3625
3707
|
)
|
|
3626
3708
|
] }),
|
|
3627
|
-
showLanguage && LANGS.map((code) => /* @__PURE__ */
|
|
3709
|
+
showLanguage && LANGS.map((code) => /* @__PURE__ */ jsx21(
|
|
3628
3710
|
"button",
|
|
3629
3711
|
{
|
|
3630
3712
|
type: "button",
|
|
@@ -3635,7 +3717,7 @@ function PanelApp({
|
|
|
3635
3717
|
},
|
|
3636
3718
|
code
|
|
3637
3719
|
)),
|
|
3638
|
-
/* @__PURE__ */
|
|
3720
|
+
/* @__PURE__ */ jsx21(
|
|
3639
3721
|
NotificationBell,
|
|
3640
3722
|
{
|
|
3641
3723
|
notifications,
|
|
@@ -3649,8 +3731,8 @@ function PanelApp({
|
|
|
3649
3731
|
}
|
|
3650
3732
|
}
|
|
3651
3733
|
),
|
|
3652
|
-
saveEndpoint && /* @__PURE__ */
|
|
3653
|
-
saveEndpoint && (dirty || save.status === "saving") && /* @__PURE__ */
|
|
3734
|
+
saveEndpoint && /* @__PURE__ */ jsx21("button", { type: "button", className: "pt-lang", onClick: () => setHelpOpen(true), children: ui.help }),
|
|
3735
|
+
saveEndpoint && (dirty || save.status === "saving") && /* @__PURE__ */ jsx21(
|
|
3654
3736
|
"button",
|
|
3655
3737
|
{
|
|
3656
3738
|
type: "button",
|
|
@@ -3665,7 +3747,7 @@ function PanelApp({
|
|
|
3665
3747
|
onLinkClick: () => setSettingsOpen(true)
|
|
3666
3748
|
}
|
|
3667
3749
|
),
|
|
3668
|
-
state.notice && /* @__PURE__ */
|
|
3750
|
+
state.notice && /* @__PURE__ */ jsx21(
|
|
3669
3751
|
AlertBanner,
|
|
3670
3752
|
{
|
|
3671
3753
|
visible: noticeVisible,
|
|
@@ -3674,8 +3756,8 @@ function PanelApp({
|
|
|
3674
3756
|
onAction: () => setNoticeVisible(false)
|
|
3675
3757
|
}
|
|
3676
3758
|
),
|
|
3677
|
-
save.status === "error" && /* @__PURE__ */
|
|
3678
|
-
saveEndpoint && setup && !setup.ready && !setup.unknown && !wizardOpen && /* @__PURE__ */
|
|
3759
|
+
save.status === "error" && /* @__PURE__ */ jsx21(AlertBanner, { visible: true, message: `${ui.saveFailed}: ${save.message}` }),
|
|
3760
|
+
saveEndpoint && setup && !setup.ready && !setup.unknown && !wizardOpen && /* @__PURE__ */ jsx21(
|
|
3679
3761
|
AlertBanner,
|
|
3680
3762
|
{
|
|
3681
3763
|
visible: true,
|
|
@@ -3684,7 +3766,7 @@ function PanelApp({
|
|
|
3684
3766
|
onAction: () => setWizardOpen(true)
|
|
3685
3767
|
}
|
|
3686
3768
|
),
|
|
3687
|
-
view === "board" && !saveEndpoint && /* @__PURE__ */
|
|
3769
|
+
view === "board" && !saveEndpoint && /* @__PURE__ */ jsx21(
|
|
3688
3770
|
GuideTour,
|
|
3689
3771
|
{
|
|
3690
3772
|
dismissed: state.preferences?.guideDismissed,
|
|
@@ -3693,32 +3775,32 @@ function PanelApp({
|
|
|
3693
3775
|
{
|
|
3694
3776
|
id: "demo-welcome",
|
|
3695
3777
|
title: ui.demoTourWelcomeTitle,
|
|
3696
|
-
children: /* @__PURE__ */
|
|
3778
|
+
children: /* @__PURE__ */ jsx21("p", { children: ui.demoTourWelcomeBody }),
|
|
3697
3779
|
dismissLabel: ui.gotIt
|
|
3698
3780
|
},
|
|
3699
3781
|
{
|
|
3700
3782
|
id: "demo-board",
|
|
3701
3783
|
title: ui.demoTourBoardTitle,
|
|
3702
|
-
children: /* @__PURE__ */
|
|
3784
|
+
children: /* @__PURE__ */ jsx21("p", { children: ui.demoTourBoardBody }),
|
|
3703
3785
|
dismissLabel: ui.gotIt
|
|
3704
3786
|
},
|
|
3705
3787
|
{
|
|
3706
3788
|
id: "demo-theme",
|
|
3707
3789
|
title: ui.demoTourThemeTitle,
|
|
3708
|
-
children: /* @__PURE__ */
|
|
3790
|
+
children: /* @__PURE__ */ jsx21("p", { children: ui.demoTourThemeBody }),
|
|
3709
3791
|
dismissLabel: ui.gotIt,
|
|
3710
3792
|
action: { label: ui.settings, onClick: () => setSettingsOpen(true) }
|
|
3711
3793
|
},
|
|
3712
3794
|
{
|
|
3713
3795
|
id: "demo-keep",
|
|
3714
3796
|
title: ui.demoTourKeepTitle,
|
|
3715
|
-
children: /* @__PURE__ */
|
|
3797
|
+
children: /* @__PURE__ */ jsx21("p", { children: ui.demoTourKeepBody }),
|
|
3716
3798
|
dismissLabel: ui.gotIt
|
|
3717
3799
|
}
|
|
3718
3800
|
]
|
|
3719
3801
|
}
|
|
3720
3802
|
),
|
|
3721
|
-
view === "board" && saveEndpoint && /* @__PURE__ */
|
|
3803
|
+
view === "board" && saveEndpoint && /* @__PURE__ */ jsx21(
|
|
3722
3804
|
GuideTour,
|
|
3723
3805
|
{
|
|
3724
3806
|
dismissed: state.preferences?.guideDismissed,
|
|
@@ -3727,38 +3809,38 @@ function PanelApp({
|
|
|
3727
3809
|
{
|
|
3728
3810
|
id: "welcome",
|
|
3729
3811
|
title: ui.tourWelcomeTitle,
|
|
3730
|
-
children: /* @__PURE__ */
|
|
3812
|
+
children: /* @__PURE__ */ jsx21("p", { children: ui.tourWelcomeBody }),
|
|
3731
3813
|
dismissLabel: ui.gotIt
|
|
3732
3814
|
},
|
|
3733
3815
|
{
|
|
3734
3816
|
id: "board",
|
|
3735
3817
|
title: ui.tourBoardTitle,
|
|
3736
|
-
children: /* @__PURE__ */
|
|
3818
|
+
children: /* @__PURE__ */ jsx21("p", { children: ui.tourBoardBody }),
|
|
3737
3819
|
dismissLabel: ui.gotIt
|
|
3738
3820
|
},
|
|
3739
3821
|
{
|
|
3740
3822
|
id: "orders",
|
|
3741
3823
|
title: ui.tourOrdersTitle,
|
|
3742
|
-
children: /* @__PURE__ */
|
|
3824
|
+
children: /* @__PURE__ */ jsx21("p", { children: ui.tourOrdersBody }),
|
|
3743
3825
|
dismissLabel: ui.gotIt
|
|
3744
3826
|
},
|
|
3745
3827
|
{
|
|
3746
3828
|
id: "save",
|
|
3747
3829
|
title: ui.tourSaveTitle,
|
|
3748
|
-
children: /* @__PURE__ */
|
|
3830
|
+
children: /* @__PURE__ */ jsx21("p", { children: ui.tourSaveBody }),
|
|
3749
3831
|
dismissLabel: ui.gotIt
|
|
3750
3832
|
},
|
|
3751
3833
|
{
|
|
3752
3834
|
id: "theme",
|
|
3753
3835
|
title: ui.tourThemeTitle,
|
|
3754
|
-
children: /* @__PURE__ */
|
|
3836
|
+
children: /* @__PURE__ */ jsx21("p", { children: ui.tourThemeBody }),
|
|
3755
3837
|
dismissLabel: ui.gotIt,
|
|
3756
3838
|
action: { label: ui.settings, onClick: () => setSettingsOpen(true) }
|
|
3757
3839
|
}
|
|
3758
3840
|
]
|
|
3759
3841
|
}
|
|
3760
3842
|
),
|
|
3761
|
-
view === "marketplace" && hasMarketplace && /* @__PURE__ */
|
|
3843
|
+
view === "marketplace" && hasMarketplace && /* @__PURE__ */ jsx21(
|
|
3762
3844
|
MarketplaceView,
|
|
3763
3845
|
{
|
|
3764
3846
|
report: market,
|
|
@@ -3769,7 +3851,7 @@ function PanelApp({
|
|
|
3769
3851
|
onRefresh: marketplaceEndpoint ? () => loadMarketplace(true) : void 0
|
|
3770
3852
|
}
|
|
3771
3853
|
),
|
|
3772
|
-
view === "analysis" && state.analysis && /* @__PURE__ */
|
|
3854
|
+
view === "analysis" && state.analysis && /* @__PURE__ */ jsx21(
|
|
3773
3855
|
AnalysisView,
|
|
3774
3856
|
{
|
|
3775
3857
|
onRequestReport: saveEndpoint ? requestReport : void 0,
|
|
@@ -3785,20 +3867,52 @@ function PanelApp({
|
|
|
3785
3867
|
onOpenCard: setOpenCardId
|
|
3786
3868
|
}
|
|
3787
3869
|
),
|
|
3788
|
-
view === "board" && /* @__PURE__ */
|
|
3789
|
-
/* @__PURE__ */
|
|
3790
|
-
/* @__PURE__ */
|
|
3791
|
-
|
|
3792
|
-
|
|
3793
|
-
|
|
3794
|
-
|
|
3795
|
-
|
|
3796
|
-
|
|
3870
|
+
view === "board" && /* @__PURE__ */ jsxs19(Fragment6, { children: [
|
|
3871
|
+
/* @__PURE__ */ jsxs19("div", { className: "pt-panel-page", children: [
|
|
3872
|
+
/* @__PURE__ */ jsx21(
|
|
3873
|
+
SituationRow,
|
|
3874
|
+
{
|
|
3875
|
+
blockingLabel: ui.situationBlocking,
|
|
3876
|
+
clearLabel: ui.situationClear,
|
|
3877
|
+
statusLabel: ui.situationStatus,
|
|
3878
|
+
blocking: [
|
|
3879
|
+
{
|
|
3880
|
+
id: "yours",
|
|
3881
|
+
label: ui.statYours,
|
|
3882
|
+
hint: ui.situationYoursHint,
|
|
3883
|
+
count: counts.yours,
|
|
3884
|
+
tone: "alarm",
|
|
3885
|
+
onClick: () => setFilter("yours")
|
|
3886
|
+
},
|
|
3887
|
+
{
|
|
3888
|
+
id: "decisions",
|
|
3889
|
+
label: ui.statDecisions,
|
|
3890
|
+
hint: ui.situationDecisionsHint,
|
|
3891
|
+
count: openChoices,
|
|
3892
|
+
tone: "alarm",
|
|
3893
|
+
onClick: initialState.analysis ? () => setView("analysis") : void 0
|
|
3894
|
+
},
|
|
3895
|
+
{
|
|
3896
|
+
id: "orders",
|
|
3897
|
+
label: ui.statOrders,
|
|
3898
|
+
hint: ui.situationOrdersHint,
|
|
3899
|
+
count: counts.orders,
|
|
3900
|
+
tone: "attention",
|
|
3901
|
+
onClick: () => setFilter("orders")
|
|
3902
|
+
}
|
|
3903
|
+
],
|
|
3904
|
+
status: state.health.length > 0 ? /* @__PURE__ */ jsx21(HealthPillRow, { children: state.health.map((pill) => /* @__PURE__ */ jsx21(HealthPill, { label: t(pill.label), value: t(pill.value), status: pill.status }, t(pill.label))) }) : void 0
|
|
3905
|
+
}
|
|
3906
|
+
),
|
|
3907
|
+
/* @__PURE__ */ jsxs19(StatTileGrid, { children: [
|
|
3908
|
+
/* @__PURE__ */ jsx21(StatTile, { label: ui.statOpen, value: counts.open, isZero: counts.open === 0 }),
|
|
3909
|
+
/* @__PURE__ */ jsx21(StatTile, { label: ui.statHighRisk, value: counts.highRisk, tone: "danger", isZero: counts.highRisk === 0 }),
|
|
3910
|
+
/* @__PURE__ */ jsx21(StatTile, { label: ui.statDone, value: counts.done, tone: "success", isZero: counts.done === 0 }),
|
|
3911
|
+
archivedCards.length > 0 && /* @__PURE__ */ jsx21(StatTile, { label: ui.statArchived, value: archivedCards.length, isZero: true })
|
|
3797
3912
|
] }),
|
|
3798
|
-
/* @__PURE__ */
|
|
3799
|
-
|
|
3800
|
-
/* @__PURE__ */
|
|
3801
|
-
/* @__PURE__ */ jsx20(
|
|
3913
|
+
/* @__PURE__ */ jsxs19(FilterChipRow, { children: [
|
|
3914
|
+
/* @__PURE__ */ jsx21(FilterChip, { label: ui.all, count: state.cards.length, active: filter === "all", onClick: () => setFilter("all") }),
|
|
3915
|
+
/* @__PURE__ */ jsx21(
|
|
3802
3916
|
FilterChip,
|
|
3803
3917
|
{
|
|
3804
3918
|
label: `\u26A1 ${ui.filterForClaude}`,
|
|
@@ -3807,7 +3921,7 @@ function PanelApp({
|
|
|
3807
3921
|
onClick: () => setFilter("orders")
|
|
3808
3922
|
}
|
|
3809
3923
|
),
|
|
3810
|
-
/* @__PURE__ */
|
|
3924
|
+
/* @__PURE__ */ jsx21(
|
|
3811
3925
|
FilterChip,
|
|
3812
3926
|
{
|
|
3813
3927
|
label: ui.filterYours,
|
|
@@ -3816,7 +3930,7 @@ function PanelApp({
|
|
|
3816
3930
|
onClick: () => setFilter("yours")
|
|
3817
3931
|
}
|
|
3818
3932
|
),
|
|
3819
|
-
/* @__PURE__ */
|
|
3933
|
+
/* @__PURE__ */ jsx21(
|
|
3820
3934
|
FilterChip,
|
|
3821
3935
|
{
|
|
3822
3936
|
label: ui.filterHighRisk,
|
|
@@ -3825,7 +3939,7 @@ function PanelApp({
|
|
|
3825
3939
|
onClick: () => setFilter("risk")
|
|
3826
3940
|
}
|
|
3827
3941
|
),
|
|
3828
|
-
state.areas.map((area) => /* @__PURE__ */
|
|
3942
|
+
state.areas.map((area) => /* @__PURE__ */ jsx21(
|
|
3829
3943
|
FilterChip,
|
|
3830
3944
|
{
|
|
3831
3945
|
label: t(area.label),
|
|
@@ -3837,13 +3951,13 @@ function PanelApp({
|
|
|
3837
3951
|
))
|
|
3838
3952
|
] })
|
|
3839
3953
|
] }),
|
|
3840
|
-
/* @__PURE__ */
|
|
3954
|
+
/* @__PURE__ */ jsx21(
|
|
3841
3955
|
Board,
|
|
3842
3956
|
{
|
|
3843
3957
|
columns: boardColumns,
|
|
3844
3958
|
onMove: moveCard,
|
|
3845
3959
|
onAddCard: addCard,
|
|
3846
|
-
renderCard: (card, index, columnId) => /* @__PURE__ */
|
|
3960
|
+
renderCard: (card, index, columnId) => /* @__PURE__ */ jsx21(
|
|
3847
3961
|
Card,
|
|
3848
3962
|
{
|
|
3849
3963
|
cardId: card.id,
|
|
@@ -3860,51 +3974,72 @@ function PanelApp({
|
|
|
3860
3974
|
}
|
|
3861
3975
|
),
|
|
3862
3976
|
extras,
|
|
3863
|
-
capabilities && capabilities.length > 0 && /* @__PURE__ */
|
|
3864
|
-
/* @__PURE__ */
|
|
3865
|
-
/* @__PURE__ */
|
|
3866
|
-
/* @__PURE__ */
|
|
3867
|
-
/* @__PURE__ */
|
|
3977
|
+
capabilities && capabilities.length > 0 && /* @__PURE__ */ jsxs19("section", { className: "pt-panel-page pt-panel-section", id: "functions", children: [
|
|
3978
|
+
/* @__PURE__ */ jsxs19("div", { children: [
|
|
3979
|
+
/* @__PURE__ */ jsx21("p", { className: "pt-eyebrow", children: ui.functionsEyebrow }),
|
|
3980
|
+
/* @__PURE__ */ jsx21("h2", { className: "pt-h2", children: ui.functionsTitle }),
|
|
3981
|
+
/* @__PURE__ */ jsx21("p", { className: "pt-sub", children: ui.functionsIntro })
|
|
3868
3982
|
] }),
|
|
3869
|
-
/* @__PURE__ */
|
|
3870
|
-
/* @__PURE__ */
|
|
3871
|
-
/* @__PURE__ */
|
|
3872
|
-
/* @__PURE__ */
|
|
3873
|
-
capability.code && /* @__PURE__ */
|
|
3874
|
-
/* @__PURE__ */
|
|
3875
|
-
/* @__PURE__ */
|
|
3983
|
+
/* @__PURE__ */ jsx21("div", { className: "pt-cap-list", children: capabilities.map((capability) => /* @__PURE__ */ jsxs19("article", { className: "pt-cap pt-hud", children: [
|
|
3984
|
+
/* @__PURE__ */ jsx21("h3", { className: "pt-cap__title", children: t(capability.title) }),
|
|
3985
|
+
/* @__PURE__ */ jsx21("p", { className: "pt-cap__summary", children: t(capability.summary) }),
|
|
3986
|
+
/* @__PURE__ */ jsx21("ul", { className: "pt-cap__list", children: capability.points.map((point) => /* @__PURE__ */ jsx21("li", { children: t(point) }, t(point))) }),
|
|
3987
|
+
capability.code && /* @__PURE__ */ jsxs19("div", { className: "pt-cap__code", children: [
|
|
3988
|
+
/* @__PURE__ */ jsx21("p", { className: "pt-cap__caption", children: t(capability.code.caption) }),
|
|
3989
|
+
/* @__PURE__ */ jsx21("pre", { children: /* @__PURE__ */ jsx21("code", { children: capability.code.body }) })
|
|
3876
3990
|
] })
|
|
3877
3991
|
] }, capability.id)) })
|
|
3878
3992
|
] })
|
|
3879
3993
|
] }),
|
|
3880
|
-
view === "history" &&
|
|
3881
|
-
/* @__PURE__ */
|
|
3882
|
-
/* @__PURE__ */
|
|
3883
|
-
|
|
3884
|
-
|
|
3885
|
-
|
|
3886
|
-
state.runs.length === 0 ? /* @__PURE__ */ jsx20("p", { className: "pt-panel-text", children: ui.historyEmpty }) : /* @__PURE__ */ jsx20("ol", { className: "pt-runs", children: [...state.runs].reverse().map((run) => /* @__PURE__ */ jsxs18("li", { className: "pt-run pt-hud", children: [
|
|
3887
|
-
/* @__PURE__ */ jsxs18("p", { className: "pt-run__meta", children: [
|
|
3888
|
-
run.date,
|
|
3889
|
-
" \xB7 ",
|
|
3890
|
-
run.by === "claude" ? "Claude" : ui.ownerYou,
|
|
3891
|
-
run.fingerprint ? ` \xB7 ${run.fingerprint.replace("sha256:", "").slice(0, 12)}` : ""
|
|
3994
|
+
view === "history" && hasRecord && /* @__PURE__ */ jsxs19("section", { className: "pt-panel-page pt-panel-section", id: "revisions", children: [
|
|
3995
|
+
showHistory && /* @__PURE__ */ jsxs19(Fragment6, { children: [
|
|
3996
|
+
/* @__PURE__ */ jsxs19("div", { children: [
|
|
3997
|
+
/* @__PURE__ */ jsx21("p", { className: "pt-eyebrow", children: ui.historyEyebrow }),
|
|
3998
|
+
/* @__PURE__ */ jsx21("h2", { className: "pt-h2", children: ui.historyTitle }),
|
|
3999
|
+
/* @__PURE__ */ jsx21("p", { className: "pt-sub", children: ui.historyIntro })
|
|
3892
4000
|
] }),
|
|
3893
|
-
/* @__PURE__ */
|
|
3894
|
-
|
|
3895
|
-
|
|
3896
|
-
|
|
3897
|
-
":
|
|
4001
|
+
state.runs.length === 0 ? /* @__PURE__ */ jsx21("p", { className: "pt-panel-text", children: ui.historyEmpty }) : /* @__PURE__ */ jsx21("ol", { className: "pt-runs", children: [...state.runs].reverse().map((run) => /* @__PURE__ */ jsxs19("li", { className: "pt-run pt-hud", children: [
|
|
4002
|
+
/* @__PURE__ */ jsxs19("p", { className: "pt-run__meta", children: [
|
|
4003
|
+
run.date,
|
|
4004
|
+
" \xB7 ",
|
|
4005
|
+
run.by === "claude" ? "Claude" : ui.ownerYou,
|
|
4006
|
+
run.fingerprint ? ` \xB7 ${run.fingerprint.replace("sha256:", "").slice(0, 12)}` : ""
|
|
3898
4007
|
] }),
|
|
3899
|
-
" ",
|
|
3900
|
-
run.cards.
|
|
3901
|
-
|
|
3902
|
-
|
|
3903
|
-
|
|
3904
|
-
|
|
3905
|
-
|
|
4008
|
+
/* @__PURE__ */ jsx21("p", { className: "pt-panel-text", children: t(run.summary) }),
|
|
4009
|
+
run.cards.length > 0 && /* @__PURE__ */ jsxs19("p", { className: "pt-run__cards", children: [
|
|
4010
|
+
/* @__PURE__ */ jsxs19("span", { children: [
|
|
4011
|
+
ui.historyTouched,
|
|
4012
|
+
":"
|
|
4013
|
+
] }),
|
|
4014
|
+
" ",
|
|
4015
|
+
run.cards.map((id) => {
|
|
4016
|
+
const card = state.cards.find((candidate) => candidate.id === id);
|
|
4017
|
+
return card ? t(card.title) || ui.untitled : id;
|
|
4018
|
+
}).join(" \xB7 ")
|
|
4019
|
+
] })
|
|
4020
|
+
] }, run.id)) })
|
|
4021
|
+
] }),
|
|
4022
|
+
archivedCards.length > 0 && /* @__PURE__ */ jsxs19(Fragment6, { children: [
|
|
4023
|
+
/* @__PURE__ */ jsxs19("div", { children: [
|
|
4024
|
+
/* @__PURE__ */ jsx21("p", { className: "pt-eyebrow", children: ui.archiveTitle }),
|
|
4025
|
+
/* @__PURE__ */ jsx21("h2", { className: "pt-h2", children: ui.archiveHeading }),
|
|
4026
|
+
/* @__PURE__ */ jsx21("p", { className: "pt-sub", children: ui.archiveIntro })
|
|
4027
|
+
] }),
|
|
4028
|
+
/* @__PURE__ */ jsx21("ol", { className: "pt-archive", children: archivedCards.slice().sort((a, b) => (b.completedAt ?? "").localeCompare(a.completedAt ?? "")).map((card) => /* @__PURE__ */ jsx21("li", { children: /* @__PURE__ */ jsxs19(
|
|
4029
|
+
"button",
|
|
4030
|
+
{
|
|
4031
|
+
type: "button",
|
|
4032
|
+
className: "pt-archive__row",
|
|
4033
|
+
onClick: () => setOpenCardId(card.id),
|
|
4034
|
+
children: [
|
|
4035
|
+
/* @__PURE__ */ jsx21("span", { className: "pt-archive__title", children: t(card.title) || ui.untitled }),
|
|
4036
|
+
/* @__PURE__ */ jsx21("span", { className: "pt-archive__meta", children: card.completedAt ? ui.archiveFinished(card.completedAt) : "" })
|
|
4037
|
+
]
|
|
4038
|
+
}
|
|
4039
|
+
) }, card.id)) })
|
|
4040
|
+
] })
|
|
3906
4041
|
] }),
|
|
3907
|
-
/* @__PURE__ */
|
|
4042
|
+
/* @__PURE__ */ jsx21(
|
|
3908
4043
|
CardSheet,
|
|
3909
4044
|
{
|
|
3910
4045
|
card: openCard,
|
|
@@ -3916,7 +4051,7 @@ function PanelApp({
|
|
|
3916
4051
|
onClose: () => setOpenCardId(null)
|
|
3917
4052
|
}
|
|
3918
4053
|
),
|
|
3919
|
-
/* @__PURE__ */
|
|
4054
|
+
/* @__PURE__ */ jsx21(
|
|
3920
4055
|
DetailSheet,
|
|
3921
4056
|
{
|
|
3922
4057
|
open: wizardOpen,
|
|
@@ -3925,7 +4060,7 @@ function PanelApp({
|
|
|
3925
4060
|
setWizardOpen(false);
|
|
3926
4061
|
},
|
|
3927
4062
|
ariaLabel: ui.wizardTitle,
|
|
3928
|
-
children: /* @__PURE__ */
|
|
4063
|
+
children: /* @__PURE__ */ jsx21(
|
|
3929
4064
|
SetupWizard,
|
|
3930
4065
|
{
|
|
3931
4066
|
requirements,
|
|
@@ -3957,9 +4092,9 @@ function PanelApp({
|
|
|
3957
4092
|
)
|
|
3958
4093
|
}
|
|
3959
4094
|
),
|
|
3960
|
-
/* @__PURE__ */
|
|
3961
|
-
/* @__PURE__ */
|
|
3962
|
-
/* @__PURE__ */
|
|
4095
|
+
/* @__PURE__ */ jsxs19(DetailSheet, { open: helpOpen, onClose: () => setHelpOpen(false), ariaLabel: ui.helpTitle, children: [
|
|
4096
|
+
/* @__PURE__ */ jsx21(DetailSection, { title: ui.helpTitle, children: !setup ? /* @__PURE__ */ jsx21("p", { className: "pt-panel-text", children: ui.setupChecking }) : /* @__PURE__ */ jsxs19(Fragment6, { children: [
|
|
4097
|
+
/* @__PURE__ */ jsx21(
|
|
3963
4098
|
SetupGuide,
|
|
3964
4099
|
{
|
|
3965
4100
|
requirements,
|
|
@@ -3972,8 +4107,8 @@ function PanelApp({
|
|
|
3972
4107
|
}
|
|
3973
4108
|
}
|
|
3974
4109
|
),
|
|
3975
|
-
setup.repo && /* @__PURE__ */
|
|
3976
|
-
!setup.ready && /* @__PURE__ */
|
|
4110
|
+
setup.repo && /* @__PURE__ */ jsx21("p", { className: "pt-panel-text", style: { marginTop: 12 }, children: ui.setupWriteTarget(setup.repo, setup.branch, setup.file) }),
|
|
4111
|
+
!setup.ready && /* @__PURE__ */ jsx21("div", { className: "pt-panel-row", style: { marginTop: 12 }, children: /* @__PURE__ */ jsx21(
|
|
3977
4112
|
"button",
|
|
3978
4113
|
{
|
|
3979
4114
|
type: "button",
|
|
@@ -3986,7 +4121,7 @@ function PanelApp({
|
|
|
3986
4121
|
}
|
|
3987
4122
|
) })
|
|
3988
4123
|
] }) }),
|
|
3989
|
-
/* @__PURE__ */
|
|
4124
|
+
/* @__PURE__ */ jsx21(DetailSection, { title: ui.guideSection, children: /* @__PURE__ */ jsx21("div", { className: "pt-panel-row", children: /* @__PURE__ */ jsx21(
|
|
3990
4125
|
"button",
|
|
3991
4126
|
{
|
|
3992
4127
|
type: "button",
|
|
@@ -4004,24 +4139,24 @@ function PanelApp({
|
|
|
4004
4139
|
}
|
|
4005
4140
|
) }) })
|
|
4006
4141
|
] }),
|
|
4007
|
-
update?.behind && /* @__PURE__ */
|
|
4142
|
+
update?.behind && /* @__PURE__ */ jsxs19(
|
|
4008
4143
|
DetailSheet,
|
|
4009
4144
|
{
|
|
4010
4145
|
open: releaseOpen,
|
|
4011
4146
|
onClose: () => setReleaseOpen(false),
|
|
4012
4147
|
ariaLabel: ui.releaseTitle(update.latest),
|
|
4013
4148
|
children: [
|
|
4014
|
-
/* @__PURE__ */
|
|
4015
|
-
/* @__PURE__ */
|
|
4016
|
-
/* @__PURE__ */
|
|
4017
|
-
update.notes?.date && /* @__PURE__ */
|
|
4149
|
+
/* @__PURE__ */ jsxs19("div", { children: [
|
|
4150
|
+
/* @__PURE__ */ jsx21("p", { className: "pt-eyebrow", children: releaseShape(update.notes) ? ui.releaseShape[releaseShape(update.notes)] : "" }),
|
|
4151
|
+
/* @__PURE__ */ jsx21("h2", { className: "pt-h2", children: ui.releaseTitle(update.latest) }),
|
|
4152
|
+
update.notes?.date && /* @__PURE__ */ jsx21("p", { className: "pt-sub", children: ui.releaseDate(update.notes.date) })
|
|
4018
4153
|
] }),
|
|
4019
|
-
update.notes ? /* @__PURE__ */
|
|
4020
|
-
/* @__PURE__ */
|
|
4021
|
-
/* @__PURE__ */
|
|
4022
|
-
] }, index)) }) : /* @__PURE__ */
|
|
4023
|
-
/* @__PURE__ */
|
|
4024
|
-
/* @__PURE__ */
|
|
4154
|
+
update.notes ? /* @__PURE__ */ jsx21("ul", { className: "pt-runs", children: update.notes.entries.map((item, index) => /* @__PURE__ */ jsxs19("li", { className: "pt-run pt-hud", children: [
|
|
4155
|
+
/* @__PURE__ */ jsx21("p", { className: "pt-run__meta", children: ui.releaseKind[item.kind] }),
|
|
4156
|
+
/* @__PURE__ */ jsx21("p", { className: "pt-panel-text", children: item.text[lang] })
|
|
4157
|
+
] }, index)) }) : /* @__PURE__ */ jsx21("p", { className: "pt-panel-text", children: ui.releaseNone }),
|
|
4158
|
+
/* @__PURE__ */ jsxs19("div", { className: "pt-panel-row", style: { marginTop: 16 }, children: [
|
|
4159
|
+
/* @__PURE__ */ jsx21(
|
|
4025
4160
|
"button",
|
|
4026
4161
|
{
|
|
4027
4162
|
type: "button",
|
|
@@ -4033,14 +4168,14 @@ function PanelApp({
|
|
|
4033
4168
|
children: ui.updateCreateCard
|
|
4034
4169
|
}
|
|
4035
4170
|
),
|
|
4036
|
-
/* @__PURE__ */
|
|
4171
|
+
/* @__PURE__ */ jsx21("button", { type: "button", className: "pt-btn", onClick: () => setReleaseOpen(false), children: ui.releaseClose })
|
|
4037
4172
|
] })
|
|
4038
4173
|
]
|
|
4039
4174
|
}
|
|
4040
4175
|
),
|
|
4041
|
-
/* @__PURE__ */
|
|
4042
|
-
saveEndpoint ? /* @__PURE__ */
|
|
4043
|
-
/* @__PURE__ */
|
|
4176
|
+
/* @__PURE__ */ jsxs19(DetailSheet, { open: settingsOpen, onClose: () => setSettingsOpen(false), ariaLabel: ui.panelSettings, children: [
|
|
4177
|
+
saveEndpoint ? /* @__PURE__ */ jsxs19(DetailSection, { title: ui.saveSection, subtitle: ui.saveSubtitle, children: [
|
|
4178
|
+
/* @__PURE__ */ jsx21("div", { className: "pt-panel-row", children: /* @__PURE__ */ jsx21(
|
|
4044
4179
|
"button",
|
|
4045
4180
|
{
|
|
4046
4181
|
type: "button",
|
|
@@ -4050,15 +4185,15 @@ function PanelApp({
|
|
|
4050
4185
|
children: save.status === "saving" ? ui.saving : ui.save
|
|
4051
4186
|
}
|
|
4052
4187
|
) }),
|
|
4053
|
-
/* @__PURE__ */
|
|
4188
|
+
/* @__PURE__ */ jsxs19("p", { className: "pt-panel-text", style: { marginTop: 10 }, children: [
|
|
4054
4189
|
save.status === "error" ? `${ui.saveFailed}: ${save.message}` : save.status === "saved" ? ui.savedWithCommit : dirty ? ui.saveHelp : ui.upToDate,
|
|
4055
|
-
save.status === "saved" && save.url && /* @__PURE__ */
|
|
4190
|
+
save.status === "saved" && save.url && /* @__PURE__ */ jsxs19(Fragment6, { children: [
|
|
4056
4191
|
" ",
|
|
4057
|
-
/* @__PURE__ */
|
|
4192
|
+
/* @__PURE__ */ jsx21("a", { href: save.url, children: "commit" })
|
|
4058
4193
|
] })
|
|
4059
4194
|
] })
|
|
4060
|
-
] }) : /* @__PURE__ */
|
|
4061
|
-
showLanguage && /* @__PURE__ */
|
|
4195
|
+
] }) : /* @__PURE__ */ jsx21(DetailSection, { title: ui.saveSection, subtitle: ui.saveSubtitle, children: /* @__PURE__ */ jsx21("p", { className: "pt-panel-text", children: ui.demoNotice }) }),
|
|
4196
|
+
showLanguage && /* @__PURE__ */ jsx21(DetailSection, { title: ui.language, subtitle: ui.languageSubtitle, children: /* @__PURE__ */ jsx21("div", { className: "pt-panel-row", children: LANGS.map((code) => /* @__PURE__ */ jsx21(
|
|
4062
4197
|
FilterChip,
|
|
4063
4198
|
{
|
|
4064
4199
|
label: LANG_LABELS[code],
|
|
@@ -4067,9 +4202,9 @@ function PanelApp({
|
|
|
4067
4202
|
},
|
|
4068
4203
|
code
|
|
4069
4204
|
)) }) }),
|
|
4070
|
-
/* @__PURE__ */
|
|
4071
|
-
/* @__PURE__ */
|
|
4072
|
-
Object.entries(themes).map(([name, entry]) => /* @__PURE__ */
|
|
4205
|
+
/* @__PURE__ */ jsxs19(DetailSection, { title: ui.theme, subtitle: ui.themeSubtitle, children: [
|
|
4206
|
+
/* @__PURE__ */ jsxs19("div", { className: "pt-panel-row", children: [
|
|
4207
|
+
Object.entries(themes).map(([name, entry]) => /* @__PURE__ */ jsx21(
|
|
4073
4208
|
FilterChip,
|
|
4074
4209
|
{
|
|
4075
4210
|
label: entry.label,
|
|
@@ -4078,7 +4213,7 @@ function PanelApp({
|
|
|
4078
4213
|
},
|
|
4079
4214
|
name
|
|
4080
4215
|
)),
|
|
4081
|
-
state.importedTheme && /* @__PURE__ */
|
|
4216
|
+
state.importedTheme && /* @__PURE__ */ jsx21(
|
|
4082
4217
|
FilterChip,
|
|
4083
4218
|
{
|
|
4084
4219
|
label: t(state.importedTheme.label),
|
|
@@ -4087,21 +4222,21 @@ function PanelApp({
|
|
|
4087
4222
|
}
|
|
4088
4223
|
)
|
|
4089
4224
|
] }),
|
|
4090
|
-
/* @__PURE__ */
|
|
4091
|
-
state.importedTheme && /* @__PURE__ */
|
|
4092
|
-
/* @__PURE__ */
|
|
4093
|
-
/* @__PURE__ */
|
|
4094
|
-
state.importedTheme.from.colours.length > 0 && /* @__PURE__ */
|
|
4095
|
-
state.importedTheme.refreshRequested ? /* @__PURE__ */
|
|
4096
|
-
/* @__PURE__ */
|
|
4225
|
+
/* @__PURE__ */ jsx21("p", { className: "pt-panel-text", style: { marginTop: 10 }, children: themeName === IMPORTED ? t(imported?.from.reasoning) : [chosen.note, ui.themeNote].filter(Boolean).join(". ") }),
|
|
4226
|
+
state.importedTheme && /* @__PURE__ */ jsxs19("div", { className: "pt-cap pt-hud", style: { marginTop: 14 }, children: [
|
|
4227
|
+
/* @__PURE__ */ jsx21("h3", { className: "pt-cap__title", children: ui.importedTheme }),
|
|
4228
|
+
/* @__PURE__ */ jsx21("p", { className: "pt-panel-text", children: ui.importedFrom(state.importedTheme.importedAt, state.importedTheme.from.files.join(", ")) }),
|
|
4229
|
+
state.importedTheme.from.colours.length > 0 && /* @__PURE__ */ jsx21("p", { className: "pt-tool__tags", children: state.importedTheme.from.colours.map((colour) => /* @__PURE__ */ jsx21("span", { className: "pt-tool__tag", children: colour }, colour)) }),
|
|
4230
|
+
state.importedTheme.refreshRequested ? /* @__PURE__ */ jsx21("p", { className: "pt-warn", children: ui.importedRefreshAsked(state.importedTheme.refreshRequested) }) : /* @__PURE__ */ jsx21("div", { className: "pt-panel-row", style: { marginTop: 10 }, children: /* @__PURE__ */ jsx21("button", { type: "button", className: "pt-btn pt-btn--sm", onClick: requestThemeRefresh, children: ui.importedRefresh }) }),
|
|
4231
|
+
/* @__PURE__ */ jsx21("p", { className: "pt-marketplace__detail", children: ui.importedRefreshHow })
|
|
4097
4232
|
] })
|
|
4098
4233
|
] }),
|
|
4099
|
-
checkForUpdates && fingerprint?.version && /* @__PURE__ */
|
|
4100
|
-
/* @__PURE__ */
|
|
4101
|
-
/* @__PURE__ */
|
|
4102
|
-
update?.behind && (state.cards.some((card) => card.id === updateCardId(update.latest)) ? /* @__PURE__ */
|
|
4103
|
-
/* @__PURE__ */
|
|
4104
|
-
/* @__PURE__ */
|
|
4234
|
+
checkForUpdates && fingerprint?.version && /* @__PURE__ */ jsxs19(DetailSection, { title: ui.updateTitle, subtitle: ui.updateSubtitle, children: [
|
|
4235
|
+
/* @__PURE__ */ jsx21("p", { className: "pt-panel-text", children: ui.updateCurrent(fingerprint.version) }),
|
|
4236
|
+
/* @__PURE__ */ jsx21("p", { className: "pt-panel-text", style: { marginTop: 8 }, children: !update ? ui.updateUnknown : update.behind ? ui.updateAvailable(update.latest) : ui.updateUpToDate }),
|
|
4237
|
+
update?.behind && (state.cards.some((card) => card.id === updateCardId(update.latest)) ? /* @__PURE__ */ jsx21("p", { className: "pt-panel-text", style: { marginTop: 8 }, children: ui.updateCardExists }) : /* @__PURE__ */ jsx21("div", { className: "pt-panel-row", style: { marginTop: 12 }, children: /* @__PURE__ */ jsx21("button", { type: "button", className: "pt-btn", onClick: addUpdateCard, children: ui.updateCreateCard }) })),
|
|
4238
|
+
/* @__PURE__ */ jsxs19("label", { className: "pt-panel-row", style: { marginTop: 12 }, children: [
|
|
4239
|
+
/* @__PURE__ */ jsx21(
|
|
4105
4240
|
"input",
|
|
4106
4241
|
{
|
|
4107
4242
|
type: "checkbox",
|
|
@@ -4109,16 +4244,16 @@ function PanelApp({
|
|
|
4109
4244
|
onChange: (event) => setPreference("updateAsOrder", event.target.checked)
|
|
4110
4245
|
}
|
|
4111
4246
|
),
|
|
4112
|
-
/* @__PURE__ */
|
|
4247
|
+
/* @__PURE__ */ jsx21("span", { className: "pt-panel-text", children: ui.updateAsOrder })
|
|
4113
4248
|
] }),
|
|
4114
|
-
/* @__PURE__ */
|
|
4249
|
+
/* @__PURE__ */ jsx21("p", { className: "pt-marketplace__detail", children: ui.updateAsOrderHow })
|
|
4115
4250
|
] }),
|
|
4116
|
-
fingerprint && /* @__PURE__ */
|
|
4117
|
-
/* @__PURE__ */
|
|
4118
|
-
/* @__PURE__ */
|
|
4251
|
+
fingerprint && /* @__PURE__ */ jsxs19(DetailSection, { title: ui.fingerprint, subtitle: ui.fingerprintSubtitle, children: [
|
|
4252
|
+
/* @__PURE__ */ jsx21("p", { className: "pt-panel-mono", children: fingerprint.hash }),
|
|
4253
|
+
/* @__PURE__ */ jsx21("p", { className: "pt-panel-text", style: { marginTop: 8 }, children: ui.trackedFiles(fingerprint.fileCount, fingerprint.version) })
|
|
4119
4254
|
] }),
|
|
4120
|
-
saveEndpoint && /* @__PURE__ */
|
|
4121
|
-
/* @__PURE__ */
|
|
4255
|
+
saveEndpoint && /* @__PURE__ */ jsxs19(DetailSection, { title: ui.session, subtitle: ui.sessionSubtitle, children: [
|
|
4256
|
+
/* @__PURE__ */ jsx21("div", { className: "pt-panel-row", children: /* @__PURE__ */ jsx21(
|
|
4122
4257
|
"button",
|
|
4123
4258
|
{
|
|
4124
4259
|
type: "button",
|
|
@@ -4128,11 +4263,11 @@ function PanelApp({
|
|
|
4128
4263
|
children: signOut === "working" ? ui.signingOut : ui.signOut
|
|
4129
4264
|
}
|
|
4130
4265
|
) }),
|
|
4131
|
-
signOut === "failed" && /* @__PURE__ */
|
|
4266
|
+
signOut === "failed" && /* @__PURE__ */ jsx21("p", { className: "pt-panel-text", style: { marginTop: 10 }, children: ui.signOutFailed })
|
|
4132
4267
|
] }),
|
|
4133
|
-
links && links.length > 0 && /* @__PURE__ */
|
|
4268
|
+
links && links.length > 0 && /* @__PURE__ */ jsx21(DetailSection, { title: ui.links, children: /* @__PURE__ */ jsx21("p", { className: "pt-panel-text", children: links.map((link, index) => /* @__PURE__ */ jsxs19(React13.Fragment, { children: [
|
|
4134
4269
|
index > 0 && " \xB7 ",
|
|
4135
|
-
/* @__PURE__ */
|
|
4270
|
+
/* @__PURE__ */ jsx21("a", { href: link.href, children: link.label })
|
|
4136
4271
|
] }, link.href)) }) })
|
|
4137
4272
|
] }),
|
|
4138
4273
|
footer
|
|
@@ -4338,6 +4473,7 @@ export {
|
|
|
4338
4473
|
PanelApp,
|
|
4339
4474
|
SetupGuide,
|
|
4340
4475
|
SetupWizard,
|
|
4476
|
+
SituationRow,
|
|
4341
4477
|
StatTile,
|
|
4342
4478
|
StatTileGrid,
|
|
4343
4479
|
THEME_FORMS,
|
|
@@ -4352,6 +4488,7 @@ export {
|
|
|
4352
4488
|
countCards,
|
|
4353
4489
|
cyberpunkTheme,
|
|
4354
4490
|
decided,
|
|
4491
|
+
dropIndex,
|
|
4355
4492
|
emptyCard,
|
|
4356
4493
|
explainBoard,
|
|
4357
4494
|
gateStatus,
|
|
@@ -4367,6 +4504,7 @@ export {
|
|
|
4367
4504
|
panelForm,
|
|
4368
4505
|
paneltirBuild,
|
|
4369
4506
|
paperForm,
|
|
4507
|
+
queueColumn,
|
|
4370
4508
|
readBoard,
|
|
4371
4509
|
readStoredLang,
|
|
4372
4510
|
repositorySnippet,
|
|
@@ -4385,6 +4523,7 @@ export {
|
|
|
4385
4523
|
useGuideNote,
|
|
4386
4524
|
useMediaQuery,
|
|
4387
4525
|
validateBoard,
|
|
4526
|
+
warRoomForm,
|
|
4388
4527
|
wizardStep,
|
|
4389
4528
|
writeText
|
|
4390
4529
|
};
|