@parhelia/core 0.1.12767 → 0.1.12774

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/components/PageHeader.js +1 -1
  2. package/dist/components/PageHeader.js.map +1 -1
  3. package/dist/components/ui/breadcrumb.d.ts +12 -0
  4. package/dist/components/ui/breadcrumb.js +32 -0
  5. package/dist/components/ui/breadcrumb.js.map +1 -0
  6. package/dist/editor/ContentTree.js +2 -1
  7. package/dist/editor/ContentTree.js.map +1 -1
  8. package/dist/editor/ai/AgentBanners.js +1 -1
  9. package/dist/editor/ai/AgentBanners.js.map +1 -1
  10. package/dist/editor/ai/AgentTerminal.js +243 -50
  11. package/dist/editor/ai/AgentTerminal.js.map +1 -1
  12. package/dist/editor/ai/agentDiagnostics.d.ts +56 -1
  13. package/dist/editor/ai/agentDiagnostics.js +207 -0
  14. package/dist/editor/ai/agentDiagnostics.js.map +1 -1
  15. package/dist/editor/ai/agentDiagnostics.test.d.ts +1 -0
  16. package/dist/editor/ai/agentDiagnostics.test.js +372 -0
  17. package/dist/editor/ai/agentDiagnostics.test.js.map +1 -0
  18. package/dist/editor/ai-image-editor/AiImageEditorDialog.js +5 -2
  19. package/dist/editor/ai-image-editor/AiImageEditorDialog.js.map +1 -1
  20. package/dist/editor/client/EditorShell.js +6 -3
  21. package/dist/editor/client/EditorShell.js.map +1 -1
  22. package/dist/editor/client/hooks/useEditorWebSocket.d.ts +12 -0
  23. package/dist/editor/client/hooks/useEditorWebSocket.js +27 -0
  24. package/dist/editor/client/hooks/useEditorWebSocket.js.map +1 -1
  25. package/dist/editor/personalization/RuleParameterInput.js +12 -1
  26. package/dist/editor/personalization/RuleParameterInput.js.map +1 -1
  27. package/dist/editor/services/agentService.d.ts +9 -0
  28. package/dist/editor/services/agentService.js.map +1 -1
  29. package/dist/editor/services/agentSubscriptionRegistry.d.ts +1 -0
  30. package/dist/editor/services/agentSubscriptionRegistry.js +6 -0
  31. package/dist/editor/services/agentSubscriptionRegistry.js.map +1 -1
  32. package/dist/editor/services/agentSubscriptionRegistry.test.js +18 -1
  33. package/dist/editor/services/agentSubscriptionRegistry.test.js.map +1 -1
  34. package/dist/editor/settings/SettingsBreadcrumb.d.ts +7 -0
  35. package/dist/editor/settings/SettingsBreadcrumb.js +9 -0
  36. package/dist/editor/settings/SettingsBreadcrumb.js.map +1 -0
  37. package/dist/editor/settings/SettingsHeaderActionsContext.d.ts +5 -0
  38. package/dist/editor/settings/SettingsHeaderActionsContext.js +13 -0
  39. package/dist/editor/settings/SettingsHeaderActionsContext.js.map +1 -0
  40. package/dist/editor/settings/SettingsView.js +16 -8
  41. package/dist/editor/settings/SettingsView.js.map +1 -1
  42. package/dist/editor/settings/panels/ProjectTemplateSelector.d.ts +18 -0
  43. package/dist/editor/settings/panels/ProjectTemplateSelector.js +57 -0
  44. package/dist/editor/settings/panels/ProjectTemplateSelector.js.map +1 -0
  45. package/dist/editor/settings/panels/ProjectTemplatesPanel.js +81 -67
  46. package/dist/editor/settings/panels/ProjectTemplatesPanel.js.map +1 -1
  47. package/dist/revision.d.ts +2 -2
  48. package/dist/revision.js +2 -2
  49. package/dist/types.d.ts +6 -0
  50. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsView.js","sourceRoot":"","sources":["../../../src/editor/settings/SettingsView.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SettingsView.js","sourceRoot":"","sources":["../../../src/editor/settings/SettingsView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type ReactNode } from "react";
2
+ import type { ProjectTemplate } from "../../../task-board/types";
3
+ type StepState = "loading" | "success" | "error";
4
+ interface ProjectTemplateSelectorProps {
5
+ templates: ProjectTemplate[];
6
+ selectedTemplate: ProjectTemplate | null;
7
+ selectedTemplateId: string | null;
8
+ state: StepState;
9
+ error: string | null;
10
+ deleting: boolean;
11
+ statusBadge?: ReactNode;
12
+ onSelectTemplate: (template: ProjectTemplate) => Promise<boolean>;
13
+ onCreateTemplate: () => Promise<void>;
14
+ onRefreshTemplates: () => Promise<void>;
15
+ onDeleteTemplate: (template: ProjectTemplate) => void;
16
+ }
17
+ export declare function ProjectTemplateSelector({ templates, selectedTemplate, selectedTemplateId, state, error, deleting, statusBadge, onSelectTemplate, onCreateTemplate, onRefreshTemplates, onDeleteTemplate, }: ProjectTemplateSelectorProps): import("react/jsx-runtime").JSX.Element;
18
+ export {};
@@ -0,0 +1,57 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useMemo, useState } from "react";
4
+ import { AlertCircle, ChevronDown, GitBranch, Plus, RefreshCw, Search, Trash2, } from "lucide-react";
5
+ import { Badge } from "../../../components/ui/badge";
6
+ import { Button } from "../../../components/ui/button";
7
+ import { Input } from "../../../components/ui/input";
8
+ import { Popover, PopoverContent, PopoverTrigger, } from "../../../components/ui/popover";
9
+ import { cn } from "../../../lib/utils";
10
+ import { ParheliaIconWhite } from "../../ui/ParheliaIconWhite";
11
+ function getTemplateSummary(template) {
12
+ if (!template) {
13
+ return "Select a template to start editing";
14
+ }
15
+ const summaryParts = [`${template.taskTemplates.length} task templates`];
16
+ if (template.defaultCostLimit != null) {
17
+ summaryParts.push(`Default budget: ${template.defaultCostLimit}`);
18
+ }
19
+ return summaryParts.join(" - ");
20
+ }
21
+ export function ProjectTemplateSelector({ templates, selectedTemplate, selectedTemplateId, state, error, deleting, statusBadge, onSelectTemplate, onCreateTemplate, onRefreshTemplates, onDeleteTemplate, }) {
22
+ const [open, setOpen] = useState(false);
23
+ const [searchQuery, setSearchQuery] = useState("");
24
+ const filteredTemplates = useMemo(() => {
25
+ const query = searchQuery.trim().toLowerCase();
26
+ if (!query)
27
+ return templates;
28
+ return templates.filter((template) => {
29
+ const description = template.description?.toLowerCase() ?? "";
30
+ return (template.name.toLowerCase().includes(query) ||
31
+ description.includes(query) ||
32
+ template.taskTemplates.some((task) => task.title.toLowerCase().includes(query)));
33
+ });
34
+ }, [searchQuery, templates]);
35
+ const selectorTitle = selectedTemplate?.name?.trim() || "Project Templates";
36
+ const selectorSummary = getTemplateSummary(selectedTemplate);
37
+ return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", "data-testid": "project-template-selector-trigger", className: "group flex min-w-0 items-center gap-2 rounded-md px-2 py-0.5 text-left hover:bg-slate-100/70", title: "Select project template", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "truncate text-sm font-semibold text-slate-900", children: selectorTitle }), _jsxs("div", { className: "mt-0.5 flex min-h-[20px] flex-wrap items-center gap-2 text-[11px] text-slate-500", children: [_jsx("span", { className: "truncate", children: selectorSummary }), statusBadge] })] }), _jsx(ChevronDown, { className: "h-4 w-4 shrink-0 text-slate-500 group-hover:text-slate-700" })] }) }), _jsxs(PopoverContent, { align: "start", sideOffset: 8, className: "w-[calc(100vw-2rem)] max-w-[560px] p-0", "data-testid": "project-template-selector-popover", children: [_jsxs("div", { className: "border-b px-3 py-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "text-xs font-semibold tracking-wider text-slate-500 uppercase", children: "Project Templates" }), state === "loading" ? (_jsx(RefreshCw, { className: "h-3.5 w-3.5 animate-spin text-amber-600", strokeWidth: 1.5 })) : null, state === "error" ? (_jsx(AlertCircle, { className: "h-3.5 w-3.5 text-red-600", strokeWidth: 1.5 })) : null] }), _jsxs("div", { className: "mt-2", children: [_jsx("div", { className: "truncate text-sm font-semibold text-slate-900", children: selectedTemplate
38
+ ? `Project Templates: ${selectedTemplate.name}`
39
+ : "Project Templates" }), _jsx("p", { className: "mt-1 text-xs text-slate-500", children: selectorSummary })] })] }), _jsxs("div", { className: "border-b px-3 py-2", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx(Button, { size: "sm", variant: "outline", onClick: () => void onRefreshTemplates(), disabled: state === "loading" || deleting, "data-testid": "project-template-refresh-button", children: _jsx(RefreshCw, { className: cn("h-4 w-4", state === "loading" && "animate-spin"), strokeWidth: 1.5 }) }), _jsxs(Button, { size: "sm", onClick: () => void onCreateTemplate(), "data-testid": "project-template-create-button", children: [_jsx(Plus, { className: "h-4 w-4", strokeWidth: 1.5 }), "Create Template"] })] }), _jsxs("div", { className: "relative mt-2", children: [_jsx(Search, { className: "pointer-events-none absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 text-slate-400", strokeWidth: 1.5 }), _jsx(Input, { type: "text", placeholder: "Search templates...", value: searchQuery, onChange: (event) => setSearchQuery(event.target.value), className: "pl-9 text-xs md:text-xs", "data-testid": "project-template-search-input" })] }), error ? (_jsx("div", { className: "mt-2 rounded border border-red-200 bg-red-50 p-2 text-xs whitespace-pre-wrap text-red-700", children: error })) : null] }), _jsx("div", { className: "max-h-[360px] overflow-y-auto p-2", children: filteredTemplates.length === 0 ? (_jsxs("div", { className: "flex flex-col items-center justify-center py-12 text-center", children: [_jsx(GitBranch, { className: "mb-4 h-10 w-10 text-gray-300", strokeWidth: 1.2 }), _jsx("p", { className: "text-xs text-gray-500", children: searchQuery
40
+ ? "No templates match your search"
41
+ : "No project templates found" })] })) : (_jsx("div", { className: "flex flex-col gap-1", children: filteredTemplates.map((template) => {
42
+ const isSelected = selectedTemplateId === template.id;
43
+ return (_jsxs("div", { className: "relative", children: [_jsx("button", { type: "button", onClick: async () => {
44
+ const didSelect = await onSelectTemplate(template);
45
+ if (didSelect) {
46
+ setOpen(false);
47
+ }
48
+ }, "data-testid": `project-template-list-item-${template.id}`, className: cn("w-full rounded-lg border p-3 pr-12 text-left transition-colors", isSelected
49
+ ? "border-slate-300 bg-slate-50"
50
+ : "border-transparent hover:border-slate-200 hover:bg-slate-50/60"), children: _jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [template.isSystem ? (_jsx("span", { title: "System template", className: "inline-flex", "aria-label": "System template", children: _jsx(ParheliaIconWhite, { size: 14, className: "shrink-0 invert" }) })) : null, _jsx("span", { className: "truncate text-sm font-medium text-slate-800", children: template.name }), template.disabled ? (_jsx(Badge, { variant: "outline", className: "text-[10px] uppercase", children: "Disabled" })) : null, template.hideFromCreateDialog ? (_jsx(Badge, { variant: "outline", className: "text-[10px] uppercase", children: "Hidden" })) : null, template.openInWizardMode ? (_jsx(Badge, { variant: "outline", className: "text-[10px] uppercase", children: "Wizard" })) : null] }), template.description ? (_jsx("div", { className: "mt-1 line-clamp-2 text-xs text-slate-500", children: template.description })) : null, _jsxs("div", { className: "mt-2 flex flex-wrap items-center gap-2 text-xs text-slate-500", children: [_jsxs("span", { children: [template.taskTemplates.length, " task templates"] }), template.defaultCostLimit != null ? (_jsxs("span", { children: ["Default budget: ", template.defaultCostLimit] })) : null] })] }) }), !template.isSystem ? (_jsx(Button, { type: "button", variant: "ghost", size: "iconXs", className: "absolute top-2.5 right-2.5 text-gray-400 hover:text-red-600", "data-testid": `project-template-card-delete-button-${template.id}`, "aria-label": `Delete ${template.name}`, disabled: deleting, onClick: (event) => {
51
+ event.preventDefault();
52
+ event.stopPropagation();
53
+ onDeleteTemplate(template);
54
+ }, children: _jsx(Trash2, { className: "h-3.5 w-3.5", strokeWidth: 1.5 }) })) : null] }, template.id));
55
+ }) })) })] })] }));
56
+ }
57
+ //# sourceMappingURL=ProjectTemplateSelector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectTemplateSelector.js","sourceRoot":"","sources":["../../../../src/editor/settings/panels/ProjectTemplateSelector.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useCallback, useEffect, useMemo, useRef, useState, } from "react";
3
- import { AlertCircle, Bot, ChevronDown, ChevronLeft, CopyPlus, CornerDownRight, GitBranch, Link2, Plus, LayoutTemplate, RefreshCw, Search, Settings2, Shield, Trash2, X, } from "lucide-react";
3
+ import { ChevronLeft, CopyPlus, CornerDownRight, GitBranch, Link2, Plus, LayoutTemplate, RefreshCw, Settings2, Shield, Trash2, X, } from "lucide-react";
4
4
  import { toast } from "sonner";
5
5
  import { Button } from "../../../components/ui/button";
6
6
  import { Dialog, DialogContent, DialogFooter, } from "../../../components/ui/dialog";
@@ -20,12 +20,14 @@ import { getAiProfilesErrorMessage, loadAiProfiles, } from "../../services/aiSer
20
20
  import { updateAgentContext } from "../../services/agentService";
21
21
  import { useEditContext } from "../../client/editContext";
22
22
  import { ItemNameDialog, } from "../../ui/ItemNameDialogNew";
23
+ import { SimpleTabs } from "../../ui/SimpleTabs";
23
24
  import { isTypingEventTarget } from "../../utils/keyboardNavigation";
24
25
  import { cn } from "../../../lib/utils";
25
26
  import { AgentProfileEditorPanel, } from "./AgentProfileEditorPanel";
26
27
  import { ProjectTemplateAgentPanel } from "./ProjectTemplateAgentPanel";
28
+ import { ProjectTemplateSelector } from "./ProjectTemplateSelector";
29
+ import { useRequiredSettingsHeaderActions } from "../SettingsHeaderActionsContext";
27
30
  import { useSearchParams } from "../../client/navigation";
28
- import { ParheliaIconWhite } from "../../ui/ParheliaIconWhite";
29
31
  // Query param for deep-linking the selected project template (settings reload).
30
32
  const SELECTED_PROJECT_TEMPLATE_QUERY_PARAM = "projectTemplateId";
31
33
  const PRIORITY_OPTIONS = [
@@ -378,7 +380,6 @@ export function ProjectTemplatesPanel() {
378
380
  const [state, setState] = useState("loading");
379
381
  const [templates, setTemplates] = useState([]);
380
382
  const [error, setError] = useState(null);
381
- const [searchQuery, setSearchQuery] = useState("");
382
383
  const [selectedTemplateId, setSelectedTemplateId] = useState(null);
383
384
  const [draftTemplate, setDraftTemplate] = useState(null);
384
385
  const [selectedTaskId, setSelectedTaskId] = useState(null);
@@ -397,14 +398,15 @@ export function ProjectTemplatesPanel() {
397
398
  const [creatingChildTask, setCreatingChildTask] = useState(false);
398
399
  const [dependencyPickerOpen, setDependencyPickerOpen] = useState(false);
399
400
  const [selectedDependencyId, setSelectedDependencyId] = useState(null);
400
- const [isBasicSettingsExpanded, setIsBasicSettingsExpanded] = useState(false);
401
+ const [activeDetailTab, setActiveDetailTab] = useState("tasks");
401
402
  const [templateAgentId, setTemplateAgentId] = useState(null);
402
403
  const [templateAgentLoading, setTemplateAgentLoading] = useState(false);
403
404
  const [templateAgentResetting, setTemplateAgentResetting] = useState(false);
404
405
  const [templateAgentError, setTemplateAgentError] = useState(null);
405
406
  const [duplicatingAgentProfile, setDuplicatingAgentProfile] = useState(false);
406
- const [mobileView, setMobileView] = useState("list");
407
+ const [mobileView, setMobileView] = useState("detail");
407
408
  const [editingAgentProfile, setEditingAgentProfile] = useState(null);
409
+ const setSettingsHeaderActions = useRequiredSettingsHeaderActions();
408
410
  const autosaveTimeoutRef = useRef(null);
409
411
  const lastPersistedSignatureRef = useRef(null);
410
412
  const latestDraftSignatureRef = useRef(null);
@@ -442,9 +444,9 @@ export function ProjectTemplatesPanel() {
442
444
  }, [draftTemplate]);
443
445
  useEffect(() => {
444
446
  if (draftTemplate && !draftTemplate.name.trim()) {
445
- setIsBasicSettingsExpanded(true);
447
+ setActiveDetailTab("basic");
446
448
  }
447
- }, [draftTemplate?.id, draftTemplate?.name]);
449
+ }, [draftTemplate]);
448
450
  const selectTemplate = useCallback((template) => {
449
451
  // Re-selecting the currently-selected template while a save is in flight
450
452
  // or the draft has unsaved changes would clobber the optimistic state
@@ -470,6 +472,7 @@ export function ProjectTemplatesPanel() {
470
472
  setDraftTemplate(clonedTemplate);
471
473
  setEditingAgentProfile(null);
472
474
  setSelectedTaskId(getSelectedTaskIdForTemplate(clonedTemplate, preferredTaskId));
475
+ setActiveDetailTab(clonedTemplate && !clonedTemplate.name.trim() ? "basic" : "tasks");
473
476
  setIsDirty(false);
474
477
  setSaveError(null);
475
478
  lastPersistedSignatureRef.current = persistedSignature;
@@ -482,17 +485,13 @@ export function ProjectTemplatesPanel() {
482
485
  });
483
486
  }
484
487
  }, [editContext, searchParams]);
485
- const handleMobileBackToList = useCallback(() => {
486
- setMobileView("list");
487
- selectTemplate(null);
488
- }, [selectTemplate]);
489
488
  const handleMobileBackFromAgent = useCallback(() => {
490
489
  setEditingAgentProfile(null);
491
490
  setMobileView("detail");
492
491
  }, []);
493
492
  useEffect(() => {
494
493
  if (!isMobile) {
495
- setMobileView("list");
494
+ setMobileView("detail");
496
495
  }
497
496
  }, [isMobile]);
498
497
  useEffect(() => {
@@ -587,16 +586,6 @@ export function ProjectTemplatesPanel() {
587
586
  }
588
587
  return byId;
589
588
  }, [aiProfiles]);
590
- const filteredTemplates = useMemo(() => {
591
- const query = searchQuery.trim().toLowerCase();
592
- if (!query)
593
- return templates;
594
- return templates.filter((template) => {
595
- return (template.name.toLowerCase().includes(query) ||
596
- template.description?.toLowerCase().includes(query) ||
597
- template.taskTemplates.some((task) => task.title.toLowerCase().includes(query)));
598
- });
599
- }, [searchQuery, templates]);
600
589
  const selectedTask = useMemo(() => draftTemplate?.taskTemplates.find((task) => task.id === selectedTaskId) ??
601
590
  null, [draftTemplate, selectedTaskId]);
602
591
  const dependencyTasks = useMemo(() => {
@@ -1184,12 +1173,13 @@ export function ProjectTemplatesPanel() {
1184
1173
  const handleSelectTemplate = useCallback(async (template) => {
1185
1174
  const canContinue = await flushPendingSave({ showErrorToast: true });
1186
1175
  if (!canContinue) {
1187
- return;
1176
+ return false;
1188
1177
  }
1189
1178
  selectTemplate(template);
1190
1179
  if (isMobile) {
1191
1180
  setMobileView("detail");
1192
1181
  }
1182
+ return true;
1193
1183
  }, [flushPendingSave, selectTemplate, isMobile]);
1194
1184
  const handleRefreshTemplates = useCallback(async () => {
1195
1185
  const canContinue = await flushPendingSave({ showErrorToast: true });
@@ -1559,18 +1549,28 @@ export function ProjectTemplatesPanel() {
1559
1549
  selectedDependencyId,
1560
1550
  selectedTaskId,
1561
1551
  ]);
1562
- const listContent = (_jsx("div", { className: "h-full overflow-auto p-4", "data-testid": "project-template-list-pane", children: _jsxs("div", { className: "flex h-full flex-col overflow-hidden", children: [_jsxs("div", { className: "shrink-0 space-y-4 pb-4", children: [_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsx("div", { className: "flex min-h-5 items-center gap-2 text-xs text-gray-700", children: state === "loading" ? (_jsx(RefreshCw, { className: "h-4 w-4 animate-spin text-amber-600", strokeWidth: 1.5 })) : state === "error" ? (_jsx(AlertCircle, { className: "h-4 w-4 text-red-600", strokeWidth: 1.5 })) : null }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { size: "sm", variant: "outline", onClick: () => void handleRefreshTemplates(), disabled: state === "loading" || deleting, "data-testid": "project-template-refresh-button", children: _jsx(RefreshCw, { className: cn("h-4 w-4", state === "loading" && "animate-spin"), strokeWidth: 1.5 }) }), _jsxs(Button, { size: "sm", onClick: () => void handleCreateTemplate(), "data-testid": "project-template-create-button", children: [_jsx(Plus, { className: "h-4 w-4", strokeWidth: 1.5 }), "Create Template"] })] })] }), _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 text-gray-400", strokeWidth: 1.5 }), _jsx(Input, { type: "text", placeholder: "Search templates...", value: searchQuery, onChange: (event) => setSearchQuery(event.target.value), className: "pl-9 text-xs md:text-xs", "data-testid": "project-template-search-input" })] }), error && (_jsx("div", { className: "rounded border border-red-200 bg-red-50 p-2 text-xs whitespace-pre-wrap text-red-700", children: error }))] }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto", children: filteredTemplates.length === 0 ? (_jsxs("div", { className: "flex flex-col items-center justify-center py-12 text-center", children: [_jsx(GitBranch, { className: "mb-4 h-10 w-10 text-gray-300", strokeWidth: 1.2 }), _jsx("p", { className: "text-xs text-gray-500", children: searchQuery
1563
- ? "No templates match your search"
1564
- : "No project templates found" })] })) : (_jsx("div", { className: "space-y-3", children: filteredTemplates.map((template) => {
1565
- const isSelected = selectedTemplateId === template.id;
1566
- return (_jsxs("div", { className: "relative", children: [_jsx("button", { type: "button", onClick: () => void handleSelectTemplate(template), "data-testid": `project-template-list-item-${template.id}`, className: cn("w-full rounded-lg border p-4 pr-14 text-left transition-shadow hover:shadow-sm", isSelected
1567
- ? "border-blue-400 bg-blue-50"
1568
- : "border-gray-200 bg-white"), children: _jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [template.isSystem && (_jsx("span", { title: "System template", className: "inline-flex", "aria-label": "System template", children: _jsx(ParheliaIconWhite, { size: 14, className: "shrink-0 invert" }) })), _jsx("h4", { className: "font-medium text-gray-900", children: template.name }), template.disabled && (_jsx(Badge, { variant: "outline", className: "text-[10px] uppercase", children: "Disabled" })), template.hideFromCreateDialog && (_jsx(Badge, { variant: "outline", className: "text-[10px] uppercase", children: "Hidden" })), template.openInWizardMode && (_jsx(Badge, { variant: "outline", className: "text-[10px] uppercase", children: "Wizard" }))] }), template.description && (_jsx("div", { className: "mt-2 line-clamp-2 text-xs text-gray-600", children: template.description })), _jsxs("div", { className: "mt-3 flex flex-wrap items-center gap-2 text-xs text-gray-500", children: [_jsxs("span", { children: [template.taskTemplates.length, " task templates"] }), template.defaultCostLimit != null && (_jsxs("span", { children: ["Default budget: ", template.defaultCostLimit] }))] })] }) }), !template.isSystem && (_jsx(Button, { type: "button", variant: "ghost", size: "iconXs", className: "absolute top-3 right-3 text-gray-400 hover:text-red-600", "data-testid": `project-template-card-delete-button-${template.id}`, "aria-label": `Delete ${template.name}`, disabled: deleting, onClick: (event) => {
1569
- event.preventDefault();
1570
- event.stopPropagation();
1571
- handleDeleteTemplate(template);
1572
- }, children: _jsx(Trash2, { className: "h-3.5 w-3.5", strokeWidth: 1.5 }) }))] }, template.id));
1573
- }) })) })] }) }));
1552
+ const templateSelector = useMemo(() => (_jsx(ProjectTemplateSelector, { templates: templates, selectedTemplate: draftTemplate, selectedTemplateId: selectedTemplateId, state: state, error: error, deleting: deleting, statusBadge: headerStatusBadge, onSelectTemplate: handleSelectTemplate, onCreateTemplate: handleCreateTemplate, onRefreshTemplates: handleRefreshTemplates, onDeleteTemplate: handleDeleteTemplate })), [
1553
+ deleting,
1554
+ draftTemplate,
1555
+ error,
1556
+ handleCreateTemplate,
1557
+ handleDeleteTemplate,
1558
+ handleRefreshTemplates,
1559
+ handleSelectTemplate,
1560
+ headerStatusBadge,
1561
+ selectedTemplateId,
1562
+ state,
1563
+ templates,
1564
+ ]);
1565
+ const desktopTemplateSelector = useMemo(() => !isMobile ? (_jsxs("div", { className: "flex w-full max-w-[40rem] items-center justify-end gap-2", children: [_jsx("div", { className: "min-w-0 flex-1 max-w-[32rem]", children: templateSelector }), draftTemplate && !draftTemplate.isSystem ? (_jsxs(Button, { variant: "outline", size: "sm", onClick: () => handleDeleteTemplate(), disabled: deleting, "data-testid": "project-template-delete-button", children: [_jsx(Trash2, { className: "h-4 w-4", strokeWidth: 1.5 }), deleting ? "Deleting..." : "Delete"] })) : null] })) : null, [deleting, draftTemplate, handleDeleteTemplate, isMobile, templateSelector]);
1566
+ useEffect(() => {
1567
+ if (!setSettingsHeaderActions)
1568
+ return;
1569
+ setSettingsHeaderActions(desktopTemplateSelector);
1570
+ return () => {
1571
+ setSettingsHeaderActions(null);
1572
+ };
1573
+ }, [desktopTemplateSelector, setSettingsHeaderActions]);
1574
1574
  const renderTemplateTaskEditorMain = () => {
1575
1575
  if (!draftTemplate) {
1576
1576
  return null;
@@ -1590,7 +1590,7 @@ export function ProjectTemplatesPanel() {
1590
1590
  }));
1591
1591
  return nextLayout;
1592
1592
  } }) }));
1593
- const taskPane = (_jsx("div", { className: "flex h-full min-h-0 flex-col overflow-hidden", "data-testid": "project-template-task-detail-pane", children: !selectedTask ? (_jsx("div", { className: "min-h-0 flex-1 overflow-y-auto p-4", children: _jsx("div", { className: "rounded-lg border border-dashed border-gray-200 bg-gray-50 p-6 text-center text-xs text-gray-500", children: "Select a task node to edit its details." }) })) : (_jsxs(_Fragment, { children: [_jsx("div", { className: "shrink-0 border-b border-gray-100 bg-white px-4 pt-4 pb-3", children: _jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsxs("div", { children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "text-xs font-semibold text-gray-900", "data-testid": "project-template-selected-task-title", children: selectedTask.title || "Untitled Task" }), selectedTask.taskType === "DecisionPoint" ? (_jsx(Badge, { variant: "outline", className: "border-violet-200 bg-violet-50 text-[10px] uppercase text-violet-700", children: "Decision Point" })) : null, selectedTask.disabled ? (_jsx(Badge, { variant: "outline", className: "text-[10px] uppercase", children: "Disabled" })) : null] }), _jsx("div", { className: "text-xs text-gray-500", children: "Configure task details, assignment, and dependencies." })] }), _jsxs(Button, { variant: "outline", size: "sm", onClick: handleDeleteSelectedTask, "data-testid": "project-template-remove-task-button", children: [_jsx(Trash2, { className: "h-4 w-4", strokeWidth: 1.5 }), "Remove Task"] })] }) }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto px-4 pt-3 pb-4", children: _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "grid gap-4 md:grid-cols-2", children: [_jsxs("div", { className: "grid gap-1.5 md:col-span-2", children: [_jsx(Label, { className: "text-xs", children: "Task title" }), _jsx(Input, { value: selectedTask.title, onChange: (event) => updateSelectedTask((currentTask) => ({
1593
+ const taskPane = (_jsx("div", { className: "flex h-full min-h-0 flex-col overflow-hidden", "data-testid": "project-template-task-detail-pane", children: !selectedTask ? (_jsx("div", { className: "min-h-0 flex-1 overflow-y-auto p-4", children: _jsx("div", { className: "rounded-lg border border-dashed border-gray-200 bg-gray-50 p-6 text-center text-xs text-gray-500", children: "Select a task node to edit its details." }) })) : (_jsxs(_Fragment, { children: [_jsx("div", { className: "shrink-0 border-b border-gray-100 bg-white px-4 pt-4 pb-3", children: _jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsxs("div", { children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "text-xs font-semibold text-gray-900", "data-testid": "project-template-selected-task-title", children: selectedTask.title || "Untitled Task" }), selectedTask.taskType === "DecisionPoint" ? (_jsx(Badge, { variant: "outline", className: "border-violet-200 bg-violet-50 text-[10px] uppercase text-violet-700", children: "Decision Point" })) : null, selectedTask.disabled ? (_jsx(Badge, { variant: "outline", className: "text-[10px] uppercase", children: "Disabled" })) : null] }), _jsx("div", { className: "text-xs text-gray-500", children: "Configure task details, assignment, and dependencies." })] }), _jsxs(Button, { variant: "outline", size: "sm", onClick: handleDeleteSelectedTask, "data-testid": "project-template-remove-task-button", children: [_jsx(Trash2, { className: "h-4 w-4", strokeWidth: 1.5 }), "Remove Task"] })] }) }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto px-4 pt-3 pb-4", children: _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "grid gap-4 md:grid-cols-2", children: [_jsxs("div", { className: "grid gap-1.5 md:col-span-2", children: [_jsx(Label, { className: "text-xs", htmlFor: "project-template-task-title-input", children: "Task title" }), _jsx(Input, { id: "project-template-task-title-input", value: selectedTask.title, onChange: (event) => updateSelectedTask((currentTask) => ({
1594
1594
  ...currentTask,
1595
1595
  title: event.target.value,
1596
1596
  })), placeholder: "Task title", className: "text-xs md:text-xs", "data-testid": "project-template-task-title-input" })] }), _jsxs("div", { className: "grid gap-1.5 md:col-span-2", children: [_jsx(Label, { className: "text-xs", children: "Description" }), _jsx(Textarea, { className: "text-xs", value: selectedTask.description ?? "", onChange: (event) => updateSelectedTask((currentTask) => ({
@@ -1652,43 +1652,57 @@ export function ProjectTemplatesPanel() {
1652
1652
  },
1653
1653
  ] }) }));
1654
1654
  };
1655
- const detailContent = draftTemplate ? (_jsxs("div", { className: "flex h-full flex-col bg-gray-50/40", "data-testid": "project-template-detail-pane", children: [_jsxs("div", { className: cn("gap-3 border-b border-gray-200 bg-white px-5 py-3.5", isMobile
1655
+ const detailContent = (_jsxs("div", { className: "flex h-full flex-col bg-gray-50/40", "data-testid": "project-template-detail-pane", children: [isMobile ? (_jsxs("div", { className: cn("gap-3 border-b border-gray-200 bg-white px-5 pt-1 pb-0.5", isMobile
1656
1656
  ? "grid grid-cols-[minmax(0,1fr)_auto] items-center gap-x-3"
1657
- : "flex items-center justify-between"), children: [_jsx("div", { className: "min-w-0", children: _jsxs("div", { className: "flex items-center gap-2", children: [isMobile ? (_jsx("button", { type: "button", className: "shrink-0 rounded-md p-1.5 text-gray-700 hover:bg-gray-100 md:hidden", onClick: handleMobileBackToList, "aria-label": "Back to template list", "data-testid": "project-template-mobile-back-to-list", children: _jsx(ChevronLeft, { className: "h-5 w-5", strokeWidth: 1.5 }) })) : null, _jsx("div", { className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-gray-900 text-white", children: _jsx(GitBranch, { className: "h-4 w-4", strokeWidth: 1.5 }) }), _jsxs("div", { className: "min-w-0", children: [_jsx("h2", { className: "truncate text-xs font-semibold text-gray-900", children: draftTemplate.name || "Project Template" }), _jsxs("div", { className: "mt-0.5 flex min-h-[20px] items-center gap-2 text-[11px] text-gray-500", children: [_jsxs("span", { children: [draftTemplate.taskTemplates.length, " task templates"] }), headerStatusBadge] })] })] }) }), _jsxs("div", { className: "flex shrink-0 items-center gap-1.5 self-center bg-white pl-1", children: [isMobile ? (_jsx(Button, { type: "button", variant: "outline", size: "icon", className: "h-9 w-9 shrink-0 md:hidden", onClick: () => setMobileView("agent"), "aria-label": "Open template assistant", title: "Open template assistant", "data-testid": "project-template-mobile-open-assistant", children: _jsx(Bot, { className: "h-4 w-4", strokeWidth: 1.5 }) })) : null, !draftTemplate.isSystem &&
1658
- (isMobile ? (_jsx(Button, { variant: "outline", size: "icon", className: "h-9 w-9 shrink-0", onClick: () => handleDeleteTemplate(), disabled: deleting, "aria-label": deleting ? "Deleting template" : "Delete template", title: deleting ? "Deleting…" : "Delete template", "data-testid": "project-template-delete-button", children: deleting ? (_jsx(RefreshCw, { className: "h-4 w-4 animate-spin", strokeWidth: 1.5 })) : (_jsx(Trash2, { className: "h-4 w-4", strokeWidth: 1.5 })) })) : (_jsxs(Button, { variant: "outline", size: "sm", onClick: () => handleDeleteTemplate(), disabled: deleting, "data-testid": "project-template-delete-button", children: [_jsx(Trash2, { className: "h-4 w-4", strokeWidth: 1.5 }), deleting ? "Deleting..." : "Delete"] })))] })] }), _jsxs("div", { className: "flex min-h-0 flex-1 flex-col gap-5 overflow-y-auto overscroll-y-contain p-5 md:overflow-hidden", children: [_jsxs("div", { className: "flex shrink-0 flex-col gap-5 md:max-h-[50vh] md:min-h-0 md:overflow-y-auto md:overscroll-y-contain", children: [saveError && (_jsx("div", { className: "rounded border border-red-200 bg-red-50 px-4 py-3 text-xs text-red-700", children: saveError })), _jsxs("section", { className: "shrink-0 rounded-lg border border-gray-200 bg-white shadow-sm md:overflow-hidden", children: [_jsxs("button", { type: "button", className: "flex w-full items-center justify-between gap-3 px-4 py-3 text-left", onClick: () => setIsBasicSettingsExpanded((currentValue) => !currentValue), "aria-expanded": isBasicSettingsExpanded, "aria-controls": "project-template-basic-settings", "data-testid": "project-template-basic-settings-toggle", children: [_jsxs("div", { className: "flex items-center gap-2.5", children: [_jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-md bg-gray-100 text-gray-500", children: _jsx(Settings2, { className: "h-3.5 w-3.5", strokeWidth: 1.5 }) }), _jsxs("div", { children: [_jsx("h3", { className: "text-xs font-semibold tracking-wide text-gray-800", children: "Basic Settings" }), _jsx("p", { className: "text-[11px] leading-tight text-gray-400", children: "Configure the shared defaults for this project template." })] })] }), _jsx(ChevronDown, { className: cn("h-4 w-4 shrink-0 text-gray-400 transition-transform", isBasicSettingsExpanded ? "rotate-180" : "rotate-0"), strokeWidth: 1.5 })] }), isBasicSettingsExpanded && (_jsxs("div", { id: "project-template-basic-settings", className: "grid gap-4 border-t border-gray-100 p-4 md:grid-cols-2", children: [_jsxs("div", { className: "grid gap-1.5 md:col-span-2", children: [_jsx(Label, { className: "text-xs", children: "Template name" }), _jsx(Input, { value: draftTemplate.name, onChange: (event) => applyDraftChange((currentTemplate) => ({
1659
- ...currentTemplate,
1660
- name: event.target.value,
1661
- })), placeholder: "Project template name", className: "text-xs md:text-xs", "data-testid": "project-template-name-input" })] }), _jsxs("div", { className: "grid gap-1.5 md:col-span-2", children: [_jsx(Label, { className: "text-xs", children: "Description" }), _jsx(Textarea, { className: "text-xs", value: draftTemplate.description ?? "", onChange: (event) => applyDraftChange((currentTemplate) => ({
1662
- ...currentTemplate,
1663
- description: event.target.value,
1664
- })), rows: 4, placeholder: "Describe when to use this template", "data-testid": "project-template-description-input" })] }), _jsxs("div", { className: "grid gap-1.5", children: [_jsx(Label, { className: "text-xs", children: "Default cost limit" }), _jsx(Input, { type: "number", value: draftTemplate.defaultCostLimit ?? "", onChange: (event) => applyDraftChange((currentTemplate) => ({
1665
- ...currentTemplate,
1666
- defaultCostLimit: event.target.value.trim() === ""
1667
- ? null
1668
- : Number(event.target.value),
1669
- })), placeholder: "0", className: "text-xs md:text-xs", "data-testid": "project-template-default-cost-limit-input" })] }), _jsxs("div", { className: "flex items-center justify-between gap-4 md:col-span-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-xs font-medium text-zinc-900", children: "Disabled" }), _jsx("div", { className: "mt-0.5 text-xs text-zinc-500", children: "Makes the template unavailable for project creation and template resolution." })] }), _jsx(Switch, { checked: draftTemplate.disabled === true, onCheckedChange: (checked) => applyDraftChange((currentTemplate) => ({
1670
- ...currentTemplate,
1671
- disabled: checked,
1672
- })), className: "data-[state=checked]:bg-amber-600 data-[state=checked]:shadow-inner dark:data-[state=checked]:bg-amber-600", "aria-label": "Disable this project template", "data-testid": "project-template-disabled-switch" })] }), _jsxs("div", { className: "flex items-center justify-between gap-4 md:col-span-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-xs font-medium text-zinc-900", children: "Hide from create dialog" }), _jsx("div", { className: "mt-0.5 text-xs text-zinc-500", children: "Keeps the template active, but removes it from the create project dialog." })] }), _jsx(Switch, { checked: draftTemplate.hideFromCreateDialog === true, onCheckedChange: (checked) => applyDraftChange((currentTemplate) => ({
1673
- ...currentTemplate,
1674
- hideFromCreateDialog: checked,
1675
- })), "aria-label": "Hide this project template from the create dialog", "data-testid": "project-template-hide-from-create-dialog-switch" })] }), _jsxs("div", { className: "flex items-center justify-between gap-4 md:col-span-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-xs font-medium text-zinc-900", children: "Open in wizard mode" }), _jsx("div", { className: "mt-0.5 text-xs text-zinc-500", children: "New projects created from this template start in taskboard wizard mode." })] }), _jsx(Switch, { checked: draftTemplate.openInWizardMode === true, onCheckedChange: (checked) => applyDraftChange((currentTemplate) => ({
1676
- ...currentTemplate,
1677
- openInWizardMode: checked,
1678
- })), "aria-label": "Open new projects from this template in wizard mode", "data-testid": "project-template-open-in-wizard-mode-switch" })] })] }))] })] }), _jsxs("section", { className: "flex shrink-0 flex-col rounded-lg border border-gray-200 bg-white shadow-sm md:min-h-0 md:flex-1 md:overflow-hidden", children: [_jsxs("div", { className: "flex shrink-0 items-center justify-between gap-3 border-b border-gray-100 px-4 py-3", children: [_jsxs("div", { className: "flex items-center gap-2.5", children: [_jsx("span", { className: "flex h-6 w-6 items-center justify-center rounded-md bg-gray-100 text-gray-500", children: _jsx(GitBranch, { className: "h-3.5 w-3.5", strokeWidth: 1.5 }) }), _jsxs("div", { children: [_jsx("h3", { className: "text-xs font-semibold tracking-wide text-gray-800", children: "Template Task Editor" }), _jsx("p", { className: "text-[11px] leading-tight text-gray-400", children: "Add task templates, arrange them in the graph, and define dependencies." })] })] }), _jsxs(Button, { size: "sm", variant: "outline", onClick: () => void handleOpenCreateTaskDialog(), disabled: creatingTask, "data-testid": "project-template-add-task-button", children: [_jsx(Plus, { className: "h-4 w-4", strokeWidth: 1.5 }), "Add Task"] })] }), renderTemplateTaskEditorMain()] })] })] })) : (_jsx("div", { className: "flex h-full items-center justify-center bg-gray-50/40", children: _jsxs("div", { className: "max-w-sm rounded-lg border border-dashed border-gray-300 bg-white p-8 text-center", children: [_jsx(GitBranch, { className: "mx-auto mb-3 h-10 w-10 text-gray-300", strokeWidth: 1.2 }), _jsx("h3", { className: "text-xs font-semibold text-gray-900", children: "Select a project template" }), _jsx("p", { className: "mt-1 text-xs text-gray-500", children: "Choose a template from the list or create a new one to start editing." })] }) }));
1657
+ : "flex items-center justify-end"), "data-testid": "project-template-detail-pane-header", children: [isMobile ? _jsx("div", { className: "min-w-0", children: templateSelector }) : null, _jsx("div", { className: "flex shrink-0 items-center gap-1.5 self-center bg-white pl-1", children: draftTemplate &&
1658
+ !draftTemplate.isSystem &&
1659
+ (isMobile ? (_jsx(Button, { variant: "outline", size: "icon", className: "h-9 w-9 shrink-0", onClick: () => handleDeleteTemplate(), disabled: deleting, "aria-label": deleting ? "Deleting template" : "Delete template", title: deleting ? "Deleting…" : "Delete template", "data-testid": "project-template-delete-button", children: deleting ? (_jsx(RefreshCw, { className: "h-4 w-4 animate-spin", strokeWidth: 1.5 })) : (_jsx(Trash2, { className: "h-4 w-4", strokeWidth: 1.5 })) })) : null) })] })) : null, draftTemplate ? ((() => {
1660
+ const detailTabs = [
1661
+ {
1662
+ id: "project-template-tab-basic-settings",
1663
+ label: "Basic Settings",
1664
+ content: null,
1665
+ testId: "project-template-tab-basic-settings",
1666
+ },
1667
+ {
1668
+ id: "project-template-tab-task-editor",
1669
+ label: "Task Editor",
1670
+ content: null,
1671
+ testId: "project-template-tab-task-editor",
1672
+ },
1673
+ ];
1674
+ const basicSettingsContent = (_jsxs("div", { className: "grid gap-4 overflow-y-auto p-4 md:grid-cols-2", "data-testid": "project-template-basic-settings-panel", children: [_jsxs("div", { className: "grid gap-1.5 md:col-span-2", children: [_jsx(Label, { className: "text-xs", htmlFor: "project-template-name-input", children: "Template name" }), _jsx(Input, { id: "project-template-name-input", value: draftTemplate.name, onChange: (event) => applyDraftChange((currentTemplate) => ({
1675
+ ...currentTemplate,
1676
+ name: event.target.value,
1677
+ })), placeholder: "Project template name", className: "text-xs md:text-xs", "data-testid": "project-template-name-input" })] }), _jsxs("div", { className: "grid gap-1.5 md:col-span-2", children: [_jsx(Label, { className: "text-xs", htmlFor: "project-template-description-input", children: "Description" }), _jsx(Textarea, { id: "project-template-description-input", className: "text-xs", value: draftTemplate.description ?? "", onChange: (event) => applyDraftChange((currentTemplate) => ({
1678
+ ...currentTemplate,
1679
+ description: event.target.value,
1680
+ })), rows: 4, placeholder: "Describe when to use this template", "data-testid": "project-template-description-input" })] }), _jsxs("div", { className: "grid gap-1.5", children: [_jsx(Label, { className: "text-xs", htmlFor: "project-template-default-cost-limit-input", children: "Default cost limit" }), _jsx(Input, { id: "project-template-default-cost-limit-input", type: "number", value: draftTemplate.defaultCostLimit ?? "", onChange: (event) => applyDraftChange((currentTemplate) => ({
1681
+ ...currentTemplate,
1682
+ defaultCostLimit: event.target.value.trim() === ""
1683
+ ? null
1684
+ : Number(event.target.value),
1685
+ })), placeholder: "0", className: "text-xs md:text-xs", "data-testid": "project-template-default-cost-limit-input" })] }), _jsxs("div", { className: "flex items-center justify-between gap-4 md:col-span-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-xs font-medium text-zinc-900", children: "Disabled" }), _jsx("div", { className: "mt-0.5 text-xs text-zinc-500", children: "Makes the template unavailable for project creation and template resolution." })] }), _jsx(Switch, { checked: draftTemplate.disabled === true, onCheckedChange: (checked) => applyDraftChange((currentTemplate) => ({
1686
+ ...currentTemplate,
1687
+ disabled: checked,
1688
+ })), className: "data-[state=checked]:bg-amber-600 data-[state=checked]:shadow-inner dark:data-[state=checked]:bg-amber-600", "aria-label": "Disable this project template", "data-testid": "project-template-disabled-switch" })] }), _jsxs("div", { className: "flex items-center justify-between gap-4 md:col-span-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-xs font-medium text-zinc-900", children: "Hide from create dialog" }), _jsx("div", { className: "mt-0.5 text-xs text-zinc-500", children: "Keeps the template active, but removes it from the create project dialog." })] }), _jsx(Switch, { checked: draftTemplate.hideFromCreateDialog === true, onCheckedChange: (checked) => applyDraftChange((currentTemplate) => ({
1689
+ ...currentTemplate,
1690
+ hideFromCreateDialog: checked,
1691
+ })), "aria-label": "Hide this project template from the create dialog", "data-testid": "project-template-hide-from-create-dialog-switch" })] }), _jsxs("div", { className: "flex items-center justify-between gap-4 md:col-span-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-xs font-medium text-zinc-900", children: "Open in wizard mode" }), _jsx("div", { className: "mt-0.5 text-xs text-zinc-500", children: "New projects created from this template start in taskboard wizard mode." })] }), _jsx(Switch, { checked: draftTemplate.openInWizardMode === true, onCheckedChange: (checked) => applyDraftChange((currentTemplate) => ({
1692
+ ...currentTemplate,
1693
+ openInWizardMode: checked,
1694
+ })), "aria-label": "Open new projects from this template in wizard mode", "data-testid": "project-template-open-in-wizard-mode-switch" })] })] }));
1695
+ const taskEditorContent = (_jsx("div", { className: "flex h-full min-h-0 flex-1 flex-col overflow-hidden", children: renderTemplateTaskEditorMain() }));
1696
+ return (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col overflow-y-auto overscroll-y-contain p-5 md:overflow-hidden", children: [_jsx("div", { className: "flex shrink-0 flex-col gap-5 md:max-h-[50vh] md:min-h-0 md:overflow-y-auto md:overscroll-y-contain", children: saveError && (_jsx("div", { className: "rounded border border-red-200 bg-red-50 px-4 py-3 text-xs text-red-700", children: saveError })) }), _jsxs("section", { className: "flex min-h-0 flex-1 flex-col rounded-lg border border-gray-200 bg-white shadow-sm md:overflow-hidden", children: [_jsxs("div", { className: "flex shrink-0 items-center justify-between gap-3 border-b border-gray-100 px-4 py-3", children: [_jsx("div", { className: "min-w-0 flex-1", children: _jsx(SimpleTabs, { tabs: detailTabs, activeTab: activeDetailTab === "basic" ? 0 : 1, setActiveTab: (index) => setActiveDetailTab(index === 0 ? "basic" : "tasks"), hideContent: true, variant: "elegant", className: "w-full justify-start gap-6" }) }), activeDetailTab === "tasks" ? (_jsxs(Button, { size: "sm", variant: "outline", onClick: () => void handleOpenCreateTaskDialog(), disabled: creatingTask, "data-testid": "project-template-add-task-button", children: [_jsx(Plus, { className: "h-4 w-4", strokeWidth: 1.5 }), "Add Task"] })) : null] }), _jsx("div", { className: "flex flex-col min-h-0 flex-1 overflow-hidden", children: activeDetailTab === "basic"
1697
+ ? basicSettingsContent
1698
+ : taskEditorContent })] })] }));
1699
+ })()) : (_jsx("div", { className: "flex min-h-0 flex-1 items-center justify-center p-5", children: _jsxs("div", { className: "max-w-sm rounded-lg border border-dashed border-gray-300 bg-white p-8 text-center", children: [_jsx(GitBranch, { className: "mx-auto mb-3 h-10 w-10 text-gray-300", strokeWidth: 1.2 }), _jsx("h3", { className: "text-xs font-semibold text-gray-900", children: "Select a project template" }), _jsx("p", { className: "mt-1 text-xs text-gray-500", children: "Choose a template from the dropdown or create a new one to start editing." })] }) }))] }));
1679
1700
  const agentPanelContent = (_jsx(ProjectTemplateAgentPanel, { templateName: draftTemplate?.name ?? null, agentId: templateAgentId, loading: templateAgentLoading, resetting: templateAgentResetting, error: templateAgentError, onStartOver: () => void handleResetTemplateAgent(), headerStart: isMobile ? (_jsx(Button, { type: "button", variant: "ghost", size: "sm", className: "gap-1 px-2", onClick: handleMobileBackFromAgent, "data-testid": "project-template-mobile-back-from-agent", children: _jsx(ChevronLeft, { className: "h-5 w-5", strokeWidth: 1.5 }) })) : undefined }));
1680
1701
  const rightPanelContent = editingAgentProfile ? (_jsx(AgentProfileEditorPanel, { agent: editingAgentProfile, onClose: handleCloseEditingAgentProfile, actions: _jsxs(Button, { type: "button", variant: "outline", size: "sm", onClick: () => void handleDuplicateAssignedAgentProfile(), disabled: !selectedAgentProfileId ||
1681
1702
  !editContext ||
1682
1703
  duplicatingAgentProfile ||
1683
1704
  editingAgentProfile.id !== selectedAgentProfileId, "data-testid": "project-template-task-duplicate-agent-profile-button", children: [_jsx(CopyPlus, { className: "h-3.5 w-3.5", strokeWidth: 1.5 }), duplicatingAgentProfile ? "Duplicating..." : "Duplicate"] }) })) : (agentPanelContent);
1684
1705
  const panels = [
1685
- {
1686
- name: "project-template-list",
1687
- defaultSize: 360,
1688
- content: listContent,
1689
- className: "overflow-hidden",
1690
- hidden: isMobile && mobileView !== "list",
1691
- },
1692
1706
  {
1693
1707
  name: "project-template-detail",
1694
1708
  defaultSize: "auto",
@@ -1705,7 +1719,7 @@ export function ProjectTemplatesPanel() {
1705
1719
  hidden: isMobile && mobileView !== "agent",
1706
1720
  },
1707
1721
  ];
1708
- return (_jsxs(_Fragment, { children: [_jsx("div", { className: "h-full", "data-testid": "project-template-editor", onKeyDownCapture: handleProjectTemplateEditorKeyDownCapture, children: _jsx(Splitter, { panels: panels, localStorageKey: "settings-project-templates-panel-splitter-v2", direction: "horizontal", className: "h-full" }) }), _jsx(Dialog, { open: isCreateTaskDialogOpen, onOpenChange: (open) => {
1722
+ return (_jsxs(_Fragment, { children: [_jsx("div", { className: "h-full", "data-testid": "project-template-editor", onKeyDownCapture: handleProjectTemplateEditorKeyDownCapture, children: _jsx(Splitter, { panels: panels, localStorageKey: "settings-project-templates-panel-splitter-v3", direction: "horizontal", className: "h-full" }) }), _jsx(Dialog, { open: isCreateTaskDialogOpen, onOpenChange: (open) => {
1709
1723
  setIsCreateTaskDialogOpen(open);
1710
1724
  if (!open) {
1711
1725
  setNewTaskDependencySourceId(null);