@industry-theme/backlogmd-kanban-panel 1.0.29 → 1.0.31

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.
@@ -1 +1 @@
1
- {"version":3,"file":"KanbanPanel.stories.d.ts","sourceRoot":"","sources":["../../src/panels/KanbanPanel.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAW5D,QAAA,MAAM,IAAI;;;;;;;;;;;;CAkB0B,CAAC;AAErC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAoLnC,eAAO,MAAM,UAAU,EAAE,KA0BxB,CAAC;AAKF,eAAO,MAAM,YAAY,EAAE,KAc1B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAc5B,CAAC"}
1
+ {"version":3,"file":"KanbanPanel.stories.d.ts","sourceRoot":"","sources":["../../src/panels/KanbanPanel.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAe5D,QAAA,MAAM,IAAI;;;;;;;;;;;;CAkB0B,CAAC;AAErC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAqKnC,eAAO,MAAM,UAAU,EAAE,KA0BxB,CAAC;AAKF,eAAO,MAAM,YAAY,EAAE,KAc1B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAc5B,CAAC"}
@@ -1,5 +1,17 @@
1
1
  import React from 'react';
2
2
  import type { PanelComponentProps } from '../types';
3
+ /**
4
+ * Configuration options for TaskDetailPanel
5
+ */
6
+ export interface TaskDetailPanelConfig {
7
+ editable?: boolean;
8
+ }
9
+ /**
10
+ * Extended props for TaskDetailPanel that includes optional config
11
+ */
12
+ export interface TaskDetailPanelProps extends PanelComponentProps {
13
+ config?: TaskDetailPanelConfig;
14
+ }
3
15
  /**
4
16
  * TaskDetailPanel - A panel for viewing task details from Backlog.md
5
17
  *
@@ -10,5 +22,5 @@ import type { PanelComponentProps } from '../types';
10
22
  *
11
23
  * Listens for 'task:selected' events from other panels (e.g., KanbanPanel)
12
24
  */
13
- export declare const TaskDetailPanel: React.FC<PanelComponentProps>;
25
+ export declare const TaskDetailPanel: React.FC<TaskDetailPanelProps>;
14
26
  //# sourceMappingURL=TaskDetailPanel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TaskDetailPanel.d.ts","sourceRoot":"","sources":["../../src/panels/TaskDetailPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAInD,OAAO,KAAK,EAAE,mBAAmB,EAAqB,MAAM,UAAU,CAAC;AA+IvE;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAkRzD,CAAC"}
1
+ {"version":3,"file":"TaskDetailPanel.d.ts","sourceRoot":"","sources":["../../src/panels/TaskDetailPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAInD,OAAO,KAAK,EAAE,mBAAmB,EAAqB,MAAM,UAAU,CAAC;AAuEvE;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC/D,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AA0ED;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAsR1D,CAAC"}
@@ -2,11 +2,12 @@ import React from 'react';
2
2
  import type { StoryObj } from '@storybook/react-vite';
3
3
  declare const meta: {
4
4
  title: string;
5
- component: React.FC<import("@principal-ade/panel-framework-core").PanelComponentProps>;
5
+ component: React.FC<import("./TaskDetailPanel").TaskDetailPanelProps>;
6
6
  parameters: {
7
7
  layout: string;
8
8
  };
9
9
  decorators: ((Story: import("storybook/internal/csf").PartialStoryFn<import("@storybook/react").ReactRenderer, {
10
+ config?: import("./TaskDetailPanel").TaskDetailPanelConfig | undefined;
10
11
  context: import("@principal-ade/panel-framework-core").PanelContextValue;
11
12
  actions: import("@principal-ade/panel-framework-core").PanelActions;
12
13
  events: import("@principal-ade/panel-framework-core").PanelEventEmitter;
@@ -1 +1 @@
1
- {"version":3,"file":"TaskDetailPanel.stories.d.ts","sourceRoot":"","sources":["../../src/panels/TaskDetailPanel.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AACzC,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAW5D,QAAA,MAAM,IAAI;;;;;;;;;;;;CAkB8B,CAAC;AAEzC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAkFnC,eAAO,MAAM,UAAU,EAAE,KAaxB,CAAC;AAQF,eAAO,MAAM,gBAAgB,EAAE,KAoB9B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KA6B9B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KA4BzB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KA2B5B,CAAC"}
1
+ {"version":3,"file":"TaskDetailPanel.stories.d.ts","sourceRoot":"","sources":["../../src/panels/TaskDetailPanel.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AACzC,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAW5D,QAAA,MAAM,IAAI;;;;;;;;;;;;;CAkB8B,CAAC;AAEzC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAkFnC,eAAO,MAAM,UAAU,EAAE,KAaxB,CAAC;AAQF,eAAO,MAAM,gBAAgB,EAAE,KAoB9B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KA6B9B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KA4BzB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KA2B5B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"KanbanColumn.d.ts","sourceRoot":"","sources":["../../../../src/panels/kanban/components/KanbanColumn.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,UAAU,iBAAiB;IACzB,mDAAmD;IACnD,QAAQ,EAAE,YAAY,CAAC;IACvB,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oDAAoD;IACpD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,sEAAsE;IACtE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iCAAiC;IACjC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAuKpD,CAAC"}
1
+ {"version":3,"file":"KanbanColumn.d.ts","sourceRoot":"","sources":["../../../../src/panels/kanban/components/KanbanColumn.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,UAAU,iBAAiB;IACzB,mDAAmD;IACnD,QAAQ,EAAE,YAAY,CAAC;IACvB,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oDAAoD;IACpD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,sEAAsE;IACtE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iCAAiC;IACjC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAyKpD,CAAC"}
@@ -1,11 +1,10 @@
1
1
  import React from 'react';
2
2
  import type { Task } from '@backlog-md/core';
3
- interface TaskCardProps {
3
+ export interface TaskCardProps {
4
4
  task: Task;
5
5
  onClick?: (task: Task) => void;
6
6
  isDragOverlay?: boolean;
7
7
  isSelected?: boolean;
8
8
  }
9
9
  export declare const TaskCard: React.FC<TaskCardProps>;
10
- export {};
11
10
  //# sourceMappingURL=TaskCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TaskCard.d.ts","sourceRoot":"","sources":["../../../../src/panels/kanban/components/TaskCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,UAAU,aAAa;IACrB,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAqL5C,CAAC"}
1
+ {"version":3,"file":"TaskCard.d.ts","sourceRoot":"","sources":["../../../../src/panels/kanban/components/TaskCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAC/B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAyL5C,CAAC"}
@@ -1,13 +1,26 @@
1
1
  /**
2
2
  * Mock Data Generator for Kanban Panel Testing
3
3
  *
4
- * Generates sample task data matching the Backlog.md Task interface
5
- * for testing and development purposes.
4
+ * Provides raw markdown file contents from the Backlog.md CLI project.
5
+ * These are passed to Core for parsing, testing the actual extraction logic.
6
6
  */
7
7
  import type { Task } from '@backlog-md/core';
8
8
  /**
9
- * Generate mock tasks for testing the kanban board
10
- * Creates 30 tasks with evenly distributed statuses (To Do, In Progress, Done)
9
+ * Raw markdown file contents from Backlog.md project
10
+ * The Core instance will parse these to extract description, acceptance criteria, etc.
11
+ */
12
+ export declare const rawTaskMarkdownFiles: Record<string, string>;
13
+ /**
14
+ * Get file paths for all mock task files
15
+ */
16
+ export declare function getMockTaskFilePaths(): string[];
17
+ /**
18
+ * Get raw markdown content for a file path
19
+ */
20
+ export declare function getMockFileContent(filePath: string): string | undefined;
21
+ /**
22
+ * Legacy function - returns empty array since we now use raw markdown
23
+ * @deprecated Use rawTaskMarkdownFiles directly
11
24
  */
12
25
  export declare function generateMockTasks(): Task[];
13
26
  /**
@@ -30,7 +43,7 @@ export declare function getMockPanelConfig(): {
30
43
  enableEdit: boolean;
31
44
  enableCreate: boolean;
32
45
  };
33
- /** Mock milestone data structure (includes filePath for test setup) */
46
+ /** Mock milestone data structure */
34
47
  export interface MockMilestone {
35
48
  id: string;
36
49
  title: string;
@@ -41,7 +54,6 @@ export interface MockMilestone {
41
54
  }
42
55
  /**
43
56
  * Generate mock milestones for testing the milestone view
44
- * Note: Milestone files must be named m-{number}.md (e.g., m-0.md, m-1.md)
45
57
  */
46
58
  export declare function generateMockMilestones(): MockMilestone[];
47
59
  //# sourceMappingURL=mockData.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mockData.d.ts","sourceRoot":"","sources":["../../../../src/panels/kanban/mocks/mockData.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAiE7C;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,EAAE,CA6B1C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C;AAED;;GAEG;AACH,wBAAgB,kBAAkB;;;;;;;;;;;;EAcjC;AAED,uEAAuE;AACvE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,aAAa,EAAE,CAmCxD"}
1
+ {"version":3,"file":"mockData.d.ts","sourceRoot":"","sources":["../../../../src/panels/kanban/mocks/mockData.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAgavD,CAAC;AAEF;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEvE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,EAAE,CAG1C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C;AAED;;GAEG;AACH,wBAAgB,kBAAkB;;;;;;;;;;;;EAcjC;AAED,oCAAoC;AACpC,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,aAAa,EAAE,CAmCxD"}
@@ -4225,15 +4225,24 @@ function parseAcceptanceCriteria(content2) {
4225
4225
  return criteria;
4226
4226
  }
4227
4227
  function extractDescription(content2, title) {
4228
+ const descriptionSection = extractSection(content2, "Description");
4229
+ if (descriptionSection) {
4230
+ return stripHtmlComments(descriptionSection).trim();
4231
+ }
4228
4232
  let body = content2;
4229
4233
  if (title) {
4230
- body = body.replace(new RegExp(`^#\\s+${escapeRegex(title)}\\s*$`, "m"), "");
4234
+ body = body.replace(new RegExp(`^#\\s+${escapeRegex(title)}\\s*\\n?`, "m"), "");
4235
+ }
4236
+ const firstSectionMatch = body.match(/^##\s+/m);
4237
+ if (firstSectionMatch && firstSectionMatch.index !== void 0) {
4238
+ body = body.slice(0, firstSectionMatch.index);
4231
4239
  }
4232
- body = body.replace(/^##\s+Acceptance Criteria[\s\S]*?(?=^##|$)/m, "");
4233
- body = body.replace(/^##\s+Implementation Plan[\s\S]*?(?=^##|$)/m, "");
4234
- body = body.replace(/^##\s+Implementation Notes[\s\S]*?(?=^##|$)/m, "");
4240
+ body = stripHtmlComments(body);
4235
4241
  return body.trim();
4236
4242
  }
4243
+ function stripHtmlComments(content2) {
4244
+ return content2.replace(/<!--[\s\S]*?-->/g, "").trim();
4245
+ }
4237
4246
  function extractIdFromPath(filePath) {
4238
4247
  const filename = filePath.split("/").pop() || "";
4239
4248
  const match = filename.match(/^(?:task-)?(\d+(?:\.\d+)?)\s*-/);
@@ -6150,17 +6159,17 @@ const TaskCard = ({
6150
6159
  case "medium":
6151
6160
  return theme2.colors.warning;
6152
6161
  case "low":
6153
- return theme2.colors.info;
6162
+ return theme2.colors.primary;
6154
6163
  default:
6155
- return theme2.colors.border;
6164
+ return theme2.colors.primary;
6156
6165
  }
6157
6166
  };
6158
6167
  const style2 = {
6159
6168
  flexShrink: 0,
6160
- background: isSelected ? `${theme2.colors.primary}10` : theme2.colors.surface,
6169
+ background: theme2.colors.surface,
6161
6170
  borderRadius: theme2.radii[2],
6162
6171
  padding: "12px",
6163
- border: `1px solid ${isSelected ? theme2.colors.primary : theme2.colors.border}`,
6172
+ border: `1px solid ${theme2.colors.border}`,
6164
6173
  borderLeft: `4px solid ${getPriorityColor(task.priority)}`,
6165
6174
  cursor: isDragOverlay ? "grabbing" : "grab",
6166
6175
  transition: isDragging ? "none" : "all 0.2s ease",
@@ -6170,10 +6179,6 @@ const TaskCard = ({
6170
6179
  // When dragging, the original card stays in place but becomes a placeholder
6171
6180
  // The DragOverlay handles the visual movement
6172
6181
  opacity: isDragging ? 0.4 : 1,
6173
- // Selected card styling
6174
- ...isSelected && !isDragOverlay && {
6175
- boxShadow: `0 0 0 1px ${theme2.colors.primary}`
6176
- },
6177
6182
  // Overlay card styling
6178
6183
  ...isDragOverlay && {
6179
6184
  boxShadow: `0 8px 16px rgba(0, 0, 0, 0.15)`,
@@ -6198,14 +6203,20 @@ const TaskCard = ({
6198
6203
  ...attributes,
6199
6204
  onMouseEnter: (e) => {
6200
6205
  if (!isDragging && !isDragOverlay) {
6201
- e.currentTarget.style.transform = "translateY(-2px)";
6202
- e.currentTarget.style.boxShadow = `0 4px 8px ${theme2.colors.border}`;
6206
+ const desc = e.currentTarget.querySelector("p");
6207
+ if (desc) {
6208
+ desc.style.maxHeight = "20em";
6209
+ }
6210
+ e.currentTarget.style.borderLeft = `4px solid ${getPriorityColor(task.priority)}`;
6203
6211
  }
6204
6212
  },
6205
6213
  onMouseLeave: (e) => {
6206
6214
  if (!isDragging && !isDragOverlay) {
6207
- e.currentTarget.style.transform = "translateY(0)";
6208
- e.currentTarget.style.boxShadow = "none";
6215
+ const desc = e.currentTarget.querySelector("p");
6216
+ if (desc) {
6217
+ desc.style.maxHeight = "2.8em";
6218
+ }
6219
+ e.currentTarget.style.borderLeft = `4px solid ${getPriorityColor(task.priority)}`;
6209
6220
  }
6210
6221
  },
6211
6222
  children: [
@@ -6215,7 +6226,7 @@ const TaskCard = ({
6215
6226
  style: {
6216
6227
  margin: "0 0 8px 0",
6217
6228
  fontSize: theme2.fontSizes[2],
6218
- color: theme2.colors.text,
6229
+ color: isSelected ? getPriorityColor(task.priority) : theme2.colors.text,
6219
6230
  fontWeight: theme2.fontWeights.medium
6220
6231
  },
6221
6232
  children: displayTitle
@@ -6229,11 +6240,10 @@ const TaskCard = ({
6229
6240
  fontSize: theme2.fontSizes[1],
6230
6241
  color: theme2.colors.textSecondary,
6231
6242
  overflow: "hidden",
6232
- textOverflow: "ellipsis",
6233
- display: "-webkit-box",
6234
- WebkitLineClamp: 2,
6235
- WebkitBoxOrient: "vertical",
6236
- lineHeight: "1.4"
6243
+ lineHeight: "1.4",
6244
+ maxHeight: "2.8em",
6245
+ // 2 lines (1.4 * 2)
6246
+ transition: "max-height 0.3s ease"
6237
6247
  },
6238
6248
  children: task.description
6239
6249
  }
@@ -6344,7 +6354,7 @@ const KanbanColumn = ({
6344
6354
  transition: "background-color 0.2s ease, border 0.2s ease"
6345
6355
  },
6346
6356
  children: [
6347
- /* @__PURE__ */ jsxs(
6357
+ !fullWidth && /* @__PURE__ */ jsxs(
6348
6358
  "div",
6349
6359
  {
6350
6360
  style: {
@@ -49318,7 +49328,8 @@ var createIndustryMarkdownComponents = ({
49318
49328
  enableHtmlPopout,
49319
49329
  slideHeaderMarginTopOverride,
49320
49330
  index: index2,
49321
- repositoryInfo
49331
+ repositoryInfo,
49332
+ editable = false
49322
49333
  }) => {
49323
49334
  const getLuminance = (hex) => {
49324
49335
  const rgb = hex.replace("#", "").match(/.{2}/g);
@@ -49450,19 +49461,20 @@ var createIndustryMarkdownComponents = ({
49450
49461
  checked: isChecked,
49451
49462
  onChange: handleChange,
49452
49463
  onClick: (e) => e.stopPropagation(),
49464
+ disabled: !editable,
49453
49465
  style: {
49454
49466
  marginRight: theme2.space[2],
49455
49467
  marginTop: theme2.space[1],
49456
49468
  width: "16px",
49457
49469
  height: "16px",
49458
- cursor: "pointer"
49470
+ cursor: editable ? "pointer" : "default"
49459
49471
  },
49460
49472
  id
49461
49473
  }), /* @__PURE__ */ React2__default.createElement("label", {
49462
49474
  htmlFor: id,
49463
49475
  style: {
49464
49476
  flex: 1,
49465
- cursor: "pointer",
49477
+ cursor: editable ? "pointer" : "default",
49466
49478
  color: isChecked ? theme2.colors.textMuted : "inherit",
49467
49479
  lineHeight: theme2.lineHeights.relaxed
49468
49480
  }
@@ -50544,7 +50556,8 @@ var IndustryMarkdownSlide = React2__default.memo(function IndustryMarkdownSlide2
50544
50556
  maxScreenWidth: _maxScreenWidth,
50545
50557
  enableKeyboardScrolling = true,
50546
50558
  keyboardScrollConfig,
50547
- repositoryInfo
50559
+ repositoryInfo,
50560
+ editable = false
50548
50561
  }) {
50549
50562
  const slideRef = useRef(null);
50550
50563
  const scrollPositionsRef = useRef(/* @__PURE__ */ new Map());
@@ -50900,7 +50913,8 @@ var IndustryMarkdownSlide = React2__default.memo(function IndustryMarkdownSlide2
50900
50913
  enableHtmlPopout,
50901
50914
  slideHeaderMarginTopOverride,
50902
50915
  index: chunkIndex,
50903
- repositoryInfo
50916
+ repositoryInfo,
50917
+ editable
50904
50918
  });
50905
50919
  if (searchQuery) {
50906
50920
  return {
@@ -50933,7 +50947,8 @@ var IndustryMarkdownSlide = React2__default.memo(function IndustryMarkdownSlide2
50933
50947
  enableHtmlPopout,
50934
50948
  slideHeaderMarginTopOverride,
50935
50949
  repositoryInfo,
50936
- searchQuery
50950
+ searchQuery,
50951
+ editable
50937
50952
  ]);
50938
50953
  return /* @__PURE__ */ React2__default.createElement("div", {
50939
50954
  className: "markdown-slide",
@@ -52718,7 +52733,8 @@ var DocumentView = ({
52718
52733
  repositoryInfo,
52719
52734
  fontSizeScale,
52720
52735
  theme: theme2,
52721
- transparentBackground = false
52736
+ transparentBackground = false,
52737
+ editable = false
52722
52738
  }) => {
52723
52739
  const containerRef = useRef(null);
52724
52740
  const backgroundColor = transparentBackground ? "transparent" : theme2.colors.background;
@@ -52750,7 +52766,8 @@ var DocumentView = ({
52750
52766
  fontSizeScale,
52751
52767
  handlePromptCopy,
52752
52768
  repositoryInfo,
52753
- transparentBackground
52769
+ transparentBackground,
52770
+ editable
52754
52771
  })));
52755
52772
  };
52756
52773
  function getTaskBodyMarkdown(task, options = {}) {
@@ -52853,9 +52870,10 @@ const MetadataRow = ({ icon, label, value }) => {
52853
52870
  }
52854
52871
  );
52855
52872
  };
52856
- const TaskDetailPanel = ({ context, actions, events: events2 }) => {
52873
+ const TaskDetailPanel = ({ context, actions, events: events2, config }) => {
52857
52874
  const { theme: theme2 } = useTheme();
52858
52875
  const [selectedTask, setSelectedTask] = useState(null);
52876
+ const { editable = false } = config ?? {};
52859
52877
  useEffect(() => {
52860
52878
  if (!events2) return;
52861
52879
  const handleTaskSelected = (event) => {
@@ -53109,7 +53127,8 @@ const TaskDetailPanel = ({ context, actions, events: events2 }) => {
53109
53127
  content: bodyMarkdown,
53110
53128
  theme: theme2,
53111
53129
  maxWidth: "100%",
53112
- transparentBackground: true
53130
+ transparentBackground: true,
53131
+ editable
53113
53132
  }
53114
53133
  ) : /* @__PURE__ */ jsx(
53115
53134
  "div",