dishui 0.0.97 → 0.0.101

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 (74) hide show
  1. package/dist/.release-verified.json +2 -2
  2. package/dist/ai.js +17 -15
  3. package/dist/components/Card/Ticket.d.ts +52 -0
  4. package/dist/components/Card/Ticket2.js +218 -0
  5. package/dist/components/Card/Ticket2.js.map +1 -0
  6. package/dist/components/Card/index.d.ts +12 -0
  7. package/dist/components/Card/index.js +142 -139
  8. package/dist/components/Card/index.js.map +1 -1
  9. package/dist/components/ai/AgentRunCard/index.d.ts +38 -0
  10. package/dist/components/ai/AgentRunCard/index.js +100 -0
  11. package/dist/components/ai/AgentRunCard/index.js.map +1 -0
  12. package/dist/components/ai/IssueCard/index.d.ts +39 -0
  13. package/dist/components/ai/IssueCard/index.js +78 -0
  14. package/dist/components/ai/IssueCard/index.js.map +1 -0
  15. package/dist/components/ai/index.d.ts +4 -0
  16. package/dist/components/pro/Flow/constants.js +3 -3
  17. package/dist/components/pro/Flow/constants.js.map +1 -1
  18. package/dist/components/pro/Flow/nodes/shapes.js +3 -3
  19. package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
  20. package/dist/components/pro/Flow/utils/themeColor.d.ts +2 -2
  21. package/dist/components/pro/Flow/utils/themeColor.js +2 -2
  22. package/dist/components/pro/Flow/utils/themeColor.js.map +1 -1
  23. package/dist/components/pro/Kanban/Kanban.d.ts +3 -0
  24. package/dist/components/pro/Kanban/Kanban.js +339 -0
  25. package/dist/components/pro/Kanban/Kanban.js.map +1 -0
  26. package/dist/components/pro/Kanban/Swimlanes.d.ts +3 -0
  27. package/dist/components/pro/Kanban/Swimlanes.js +60 -0
  28. package/dist/components/pro/Kanban/Swimlanes.js.map +1 -0
  29. package/dist/components/pro/Kanban/index.d.ts +5 -0
  30. package/dist/components/pro/Kanban/types.d.ts +103 -0
  31. package/dist/components/pro/Kanban/useKanbanDrag.d.ts +17 -0
  32. package/dist/components/pro/Kanban/useKanbanDrag.js +69 -0
  33. package/dist/components/pro/Kanban/useKanbanDrag.js.map +1 -0
  34. package/dist/components/pro/Kanban/utils.d.ts +13 -0
  35. package/dist/components/pro/Kanban/utils.js +48 -0
  36. package/dist/components/pro/Kanban/utils.js.map +1 -0
  37. package/dist/components/pro/RichTextEditor/AIRewrite.js +158 -127
  38. package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
  39. package/dist/components/pro/RichTextEditor/BlockHandle.d.ts +2 -0
  40. package/dist/components/pro/RichTextEditor/BlockHandle.js +156 -115
  41. package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
  42. package/dist/components/pro/RichTextEditor/RichTextEditor.js +136 -159
  43. package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
  44. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js +44 -41
  45. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
  46. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js +59 -53
  47. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
  48. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js +48 -44
  49. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
  50. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js +67 -63
  51. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
  52. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.d.ts +1 -0
  53. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js +182 -129
  54. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
  55. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.d.ts +1 -0
  56. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js +3 -3
  57. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js.map +1 -1
  58. package/dist/components/pro/RichTextEditor/Toolbar/useAnchoredDropdown.d.ts +3 -0
  59. package/dist/components/pro/RichTextEditor/Toolbar/useAnchoredDropdown.js +31 -0
  60. package/dist/components/pro/RichTextEditor/Toolbar/useAnchoredDropdown.js.map +1 -0
  61. package/dist/components/pro/RichTextEditor/index.d.ts +1 -1
  62. package/dist/components/pro/RichTextEditor/types.d.ts +78 -11
  63. package/dist/components/pro/RichTextEditor/types.js +11 -0
  64. package/dist/components/pro/RichTextEditor/types.js.map +1 -1
  65. package/dist/dishui.css +1 -1
  66. package/dist/index-nostyled.d.ts +1 -1
  67. package/dist/index.d.ts +4 -2
  68. package/dist/index.js +128 -122
  69. package/dist/kanban.js +5 -0
  70. package/dist/utils/i18n.js +20 -0
  71. package/dist/utils/i18n.js.map +1 -1
  72. package/dist/utils/menu.js +1 -1
  73. package/dist/utils/menu.js.map +1 -1
  74. package/package.json +5 -1
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "0.0.97",
2
+ "version": "0.0.101",
3
3
  "full": false,
4
4
  "node": "v22.13.1",
5
- "verifiedAt": "2026-09-23T00:52:31.796Z"
5
+ "verifiedAt": "2026-09-23T16:41:18.570Z"
6
6
  }
package/dist/ai.js CHANGED
@@ -4,19 +4,21 @@ import i, { confidenceLevel as a } from "./components/ai/RecommendationCard/inde
4
4
  import o from "./components/ai/ContextCards/index.js";
5
5
  import s from "./components/ai/InsightCards/index.js";
6
6
  import c from "./components/ai/FineTuneCard/index.js";
7
- import l from "./components/ai/LoadingState/index.js";
8
- import u from "./components/ai/Thinking/index.js";
7
+ import l from "./components/ai/IssueCard/index.js";
8
+ import u from "./components/ai/AgentRunCard/index.js";
9
9
  import d from "./components/ai/StreamingText/index.js";
10
- import f from "./components/ai/ToolChips/index.js";
11
- import p from "./components/ai/TaskRows/index.js";
12
- import m from "./components/ai/AgentChat/index.js";
13
- import h from "./components/ai/PromptBar/index.js";
14
- import g, { diffRowChange as _, isDiffCellChange as v } from "./components/ai/DiffTable/index.js";
15
- import y, { STRENGTH_LABEL as b, formatRelativeTime as x, strengthPercent as S } from "./components/ai/RecordsTable/index.js";
16
- import C from "./components/ai/FilterTable/index.js";
17
- import w from "./components/ai/CommandSearch/index.js";
18
- import T from "./components/ai/StateFlow/index.js";
19
- import E from "./components/ai/CodeView/index.js";
20
- import D from "./components/ai/SelectionActions/index.js";
21
- import O from "./components/ai/AgentScreen/index.js";
22
- export { t as AGENT_STATUS_LABEL, m as AgentChat, O as AgentScreen, e as ApprovalCard, E as CodeView, w as CommandSearch, o as ContextCards, g as DiffTable, C as FilterTable, c as FineTuneCard, s as InsightCards, l as LoadingState, h as PromptBar, i as RecommendationCard, y as RecordsTable, b as STRENGTH_LABEL, D as SelectionActions, T as StateFlow, d as StreamingText, p as TaskRows, u as Thinking, f as ToolChips, a as confidenceLevel, _ as diffRowChange, n as formatDuration, r as formatElapsed, x as formatRelativeTime, v as isDiffCellChange, S as strengthPercent };
10
+ import f from "./components/ai/LoadingState/index.js";
11
+ import p from "./components/ai/Thinking/index.js";
12
+ import m from "./components/ai/ToolChips/index.js";
13
+ import h from "./components/ai/TaskRows/index.js";
14
+ import g from "./components/ai/AgentChat/index.js";
15
+ import _ from "./components/ai/PromptBar/index.js";
16
+ import v, { diffRowChange as y, isDiffCellChange as b } from "./components/ai/DiffTable/index.js";
17
+ import x, { STRENGTH_LABEL as S, formatRelativeTime as C, strengthPercent as w } from "./components/ai/RecordsTable/index.js";
18
+ import T from "./components/ai/FilterTable/index.js";
19
+ import E from "./components/ai/CommandSearch/index.js";
20
+ import D from "./components/ai/StateFlow/index.js";
21
+ import O from "./components/ai/CodeView/index.js";
22
+ import k from "./components/ai/SelectionActions/index.js";
23
+ import A from "./components/ai/AgentScreen/index.js";
24
+ export { t as AGENT_STATUS_LABEL, g as AgentChat, u as AgentRunCard, A as AgentScreen, e as ApprovalCard, O as CodeView, E as CommandSearch, o as ContextCards, v as DiffTable, T as FilterTable, c as FineTuneCard, s as InsightCards, l as IssueCard, f as LoadingState, _ as PromptBar, i as RecommendationCard, x as RecordsTable, S as STRENGTH_LABEL, k as SelectionActions, D as StateFlow, d as StreamingText, h as TaskRows, p as Thinking, m as ToolChips, a as confidenceLevel, y as diffRowChange, n as formatDuration, r as formatElapsed, C as formatRelativeTime, b as isDiffCellChange, w as strengthPercent };
@@ -0,0 +1,52 @@
1
+ import React from 'react';
2
+ export type CardTicketTone = 'neutral' | 'info' | 'success' | 'warning' | 'danger';
3
+ export type CardTicketPriorityLevel = 'none' | 'lowest' | 'low' | 'medium' | 'high' | 'highest';
4
+ export type CardTicketStatus = {
5
+ label: React.ReactNode;
6
+ tone?: CardTicketTone;
7
+ };
8
+ export type CardTicketIssueType = {
9
+ label: React.ReactNode;
10
+ icon?: React.ReactNode;
11
+ tone?: CardTicketTone;
12
+ };
13
+ export type CardTicketAssignee = {
14
+ id?: React.Key;
15
+ name: string;
16
+ avatarUrl?: string;
17
+ avatarAlt?: string;
18
+ };
19
+ export type CardTicketPriority = {
20
+ level: CardTicketPriorityLevel;
21
+ label?: React.ReactNode;
22
+ };
23
+ export type CardTicketLabel = {
24
+ id?: React.Key;
25
+ label: React.ReactNode;
26
+ };
27
+ export type CardTicketSubtaskProgress = {
28
+ completed: number;
29
+ total: number;
30
+ label?: React.ReactNode;
31
+ };
32
+ export type CardTicketProps = Omit<React.HTMLAttributes<HTMLElement>, 'title' | 'id' | 'onClick'> & {
33
+ /** DOM id for linking the ticket to other UI. Use React's reserved `key` separately in lists. */
34
+ id?: string;
35
+ /** Human-facing issue key, for example `WEB-142`. */
36
+ issueKey?: React.ReactNode;
37
+ title: React.ReactNode;
38
+ description?: React.ReactNode;
39
+ status?: CardTicketStatus | React.ReactNode;
40
+ issueType?: CardTicketIssueType | React.ReactNode;
41
+ assignees?: CardTicketAssignee[];
42
+ priority?: CardTicketPriority | CardTicketPriorityLevel;
43
+ labels?: Array<CardTicketLabel | React.ReactNode>;
44
+ dueDate?: React.ReactNode;
45
+ estimate?: React.ReactNode;
46
+ subtaskProgress?: CardTicketSubtaskProgress;
47
+ selected?: boolean;
48
+ disabled?: boolean;
49
+ onClick?: React.MouseEventHandler<HTMLElement>;
50
+ className?: string;
51
+ };
52
+ export declare const CardTicket: ({ id, issueKey, title, description, status, issueType, assignees, priority, labels, dueDate, estimate, subtaskProgress, selected, disabled, onClick, className, ...rest }: CardTicketProps) => React.JSX.Element;
@@ -0,0 +1,218 @@
1
+ import { cn as e } from "../../utils/cn.js";
2
+ /* empty css */
3
+ import t, { useState as n } from "react";
4
+ import { jsx as r, jsxs as i } from "react/jsx-runtime";
5
+ //#region src/components/Card/Ticket.tsx
6
+ var a = [], o = [], s = {
7
+ none: "No priority",
8
+ lowest: "Lowest priority",
9
+ low: "Low priority",
10
+ medium: "Medium priority",
11
+ high: "High priority",
12
+ highest: "Highest priority"
13
+ }, c = (e) => {
14
+ let t = e.trim().split(/\s+/).filter(Boolean);
15
+ return t.length === 0 ? "?" : t.slice(0, 2).map((e) => Array.from(e)[0]).join("").toUpperCase();
16
+ }, l = () => /* @__PURE__ */ i("svg", {
17
+ viewBox: "0 0 16 16",
18
+ fill: "none",
19
+ "aria-hidden": "true",
20
+ children: [/* @__PURE__ */ r("rect", {
21
+ x: "2.5",
22
+ y: "2.5",
23
+ width: "11",
24
+ height: "11",
25
+ rx: "2",
26
+ stroke: "currentColor"
27
+ }), /* @__PURE__ */ r("path", {
28
+ d: "M5 6h6M5 8.5h4.5",
29
+ stroke: "currentColor",
30
+ strokeLinecap: "round"
31
+ })]
32
+ }), u = ({ type: e }) => e === "calendar" ? /* @__PURE__ */ i("svg", {
33
+ viewBox: "0 0 16 16",
34
+ fill: "none",
35
+ "aria-hidden": "true",
36
+ children: [/* @__PURE__ */ r("rect", {
37
+ x: "2.5",
38
+ y: "3.5",
39
+ width: "11",
40
+ height: "10",
41
+ rx: "2",
42
+ stroke: "currentColor"
43
+ }), /* @__PURE__ */ r("path", {
44
+ d: "M5 2v3M11 2v3M3 6.5h10",
45
+ stroke: "currentColor"
46
+ })]
47
+ }) : e === "estimate" ? /* @__PURE__ */ i("svg", {
48
+ viewBox: "0 0 16 16",
49
+ fill: "none",
50
+ "aria-hidden": "true",
51
+ children: [/* @__PURE__ */ r("circle", {
52
+ cx: "8",
53
+ cy: "8",
54
+ r: "5.5",
55
+ stroke: "currentColor"
56
+ }), /* @__PURE__ */ r("path", {
57
+ d: "M8 5v3.5l2 1",
58
+ stroke: "currentColor",
59
+ strokeLinecap: "round",
60
+ strokeLinejoin: "round"
61
+ })]
62
+ }) : /* @__PURE__ */ i("svg", {
63
+ viewBox: "0 0 16 16",
64
+ fill: "none",
65
+ "aria-hidden": "true",
66
+ children: [/* @__PURE__ */ r("rect", {
67
+ x: "2.5",
68
+ y: "2.5",
69
+ width: "11",
70
+ height: "11",
71
+ rx: "2",
72
+ stroke: "currentColor"
73
+ }), /* @__PURE__ */ r("path", {
74
+ d: "m5 8 2 2 4-4",
75
+ stroke: "currentColor",
76
+ strokeLinecap: "round",
77
+ strokeLinejoin: "round"
78
+ })]
79
+ }), d = ({ assignee: e }) => {
80
+ let [t, i] = n(!1), a = !!e.avatarUrl && !t;
81
+ return /* @__PURE__ */ r("span", {
82
+ className: "dishui-card-ticket__avatar",
83
+ title: e.name,
84
+ "aria-label": e.name,
85
+ children: a ? /* @__PURE__ */ r("img", {
86
+ src: e.avatarUrl,
87
+ alt: e.avatarAlt ?? "",
88
+ onError: () => i(!0)
89
+ }) : /* @__PURE__ */ r("span", {
90
+ "aria-hidden": "true",
91
+ children: c(e.name)
92
+ })
93
+ });
94
+ }, f = (e) => {
95
+ if (e != null) return typeof e == "object" && !t.isValidElement(e) && "label" in e ? e : {
96
+ label: e,
97
+ tone: "neutral"
98
+ };
99
+ }, p = (e) => {
100
+ if (e != null) return typeof e == "object" && !t.isValidElement(e) && "label" in e ? e : {
101
+ label: e,
102
+ tone: "neutral"
103
+ };
104
+ }, m = ({ id: n, issueKey: c, title: m, description: h, status: g, issueType: _, assignees: v = a, priority: y = "none", labels: b = o, dueDate: x, estimate: S, subtaskProgress: C, selected: w = !1, disabled: T = !1, onClick: E, className: D, ...O }) => {
105
+ let k = !!E, A = f(g), j = p(_), M = typeof y == "string" ? { level: y } : y, N = M.label ?? s[M.level], P = Math.max(0, C?.completed ?? 0), F = Math.max(0, C?.total ?? 0), I = F > 0 ? Math.min(100, P / F * 100) : 0;
106
+ return /* @__PURE__ */ i("article", {
107
+ ...O,
108
+ id: n,
109
+ className: e("dishui-card-ticket", k && !T && "dishui-card-ticket--interactive", w && "dishui-card-ticket--selected", T && "dishui-card-ticket--disabled", D),
110
+ role: k ? "button" : void 0,
111
+ tabIndex: k && !T ? 0 : void 0,
112
+ "aria-pressed": k ? w : void 0,
113
+ "aria-disabled": T || void 0,
114
+ onClick: k && !T ? E : void 0,
115
+ onKeyDown: k && !T ? (e) => {
116
+ e.target === e.currentTarget && (e.key === "Enter" || e.key === " ") && (e.preventDefault(), e.repeat || e.currentTarget.click());
117
+ } : void 0,
118
+ children: [
119
+ /* @__PURE__ */ i("div", {
120
+ className: "dishui-card-ticket__header",
121
+ children: [
122
+ j && /* @__PURE__ */ i("span", {
123
+ className: e("dishui-card-ticket__type", `dishui-card-ticket__type--${j.tone ?? "neutral"}`),
124
+ title: typeof j.label == "string" ? j.label : void 0,
125
+ children: [/* @__PURE__ */ r("span", {
126
+ className: "dishui-card-ticket__type-icon",
127
+ "aria-hidden": "true",
128
+ children: j.icon ?? /* @__PURE__ */ r(l, {})
129
+ }), /* @__PURE__ */ r("span", {
130
+ className: "dishui-card-ticket__type-label",
131
+ children: j.label
132
+ })]
133
+ }),
134
+ c != null && /* @__PURE__ */ r("span", {
135
+ className: "dishui-card-ticket__key",
136
+ children: c
137
+ }),
138
+ A && /* @__PURE__ */ r("span", {
139
+ className: e("dishui-card-ticket__status", `dishui-card-ticket__status--${A.tone ?? "neutral"}`),
140
+ children: A.label
141
+ })
142
+ ]
143
+ }),
144
+ /* @__PURE__ */ r("h3", {
145
+ className: "dishui-card-ticket__title",
146
+ children: m
147
+ }),
148
+ h != null && /* @__PURE__ */ r("div", {
149
+ className: "dishui-card-ticket__description",
150
+ children: h
151
+ }),
152
+ b.length > 0 && /* @__PURE__ */ r("div", {
153
+ className: "dishui-card-ticket__labels",
154
+ "aria-label": "Labels",
155
+ children: b.map((e, n) => {
156
+ let i = typeof e == "object" && e && !t.isValidElement(e) && "label" in e ? e : { label: e };
157
+ return /* @__PURE__ */ r("span", {
158
+ className: "dishui-card-ticket__label",
159
+ children: i.label
160
+ }, i.id ?? n);
161
+ })
162
+ }),
163
+ /* @__PURE__ */ i("div", {
164
+ className: "dishui-card-ticket__footer",
165
+ children: [
166
+ /* @__PURE__ */ i("span", {
167
+ className: e("dishui-card-ticket__priority", `dishui-card-ticket__priority--${M.level}`),
168
+ title: typeof N == "string" ? N : void 0,
169
+ children: [/* @__PURE__ */ i("span", {
170
+ className: "dishui-card-ticket__priority-bars",
171
+ "aria-hidden": "true",
172
+ children: [
173
+ /* @__PURE__ */ r("i", {}),
174
+ /* @__PURE__ */ r("i", {}),
175
+ /* @__PURE__ */ r("i", {})
176
+ ]
177
+ }), /* @__PURE__ */ r("span", { children: N })]
178
+ }),
179
+ /* @__PURE__ */ i("div", {
180
+ className: "dishui-card-ticket__metadata",
181
+ children: [
182
+ x != null && /* @__PURE__ */ i("span", {
183
+ className: "dishui-card-ticket__meta",
184
+ children: [/* @__PURE__ */ r(u, { type: "calendar" }), /* @__PURE__ */ r("span", { children: x })]
185
+ }),
186
+ S != null && /* @__PURE__ */ i("span", {
187
+ className: "dishui-card-ticket__meta",
188
+ children: [/* @__PURE__ */ r(u, { type: "estimate" }), /* @__PURE__ */ r("span", { children: S })]
189
+ }),
190
+ C && /* @__PURE__ */ i("span", {
191
+ className: "dishui-card-ticket__meta dishui-card-ticket__subtasks",
192
+ "aria-label": typeof C.label == "string" ? C.label : `${P} of ${F} subtasks complete`,
193
+ children: [
194
+ /* @__PURE__ */ r(u, { type: "subtask" }),
195
+ /* @__PURE__ */ r("span", { children: C.label ?? `${P}/${F}` }),
196
+ /* @__PURE__ */ r("span", {
197
+ className: "dishui-card-ticket__progress",
198
+ "aria-hidden": "true",
199
+ children: /* @__PURE__ */ r("span", { style: { width: `${I}%` } })
200
+ })
201
+ ]
202
+ })
203
+ ]
204
+ }),
205
+ v.length > 0 && /* @__PURE__ */ r("div", {
206
+ className: "dishui-card-ticket__assignees",
207
+ "aria-label": "Assignees",
208
+ children: v.map((e, t) => /* @__PURE__ */ r(d, { assignee: e }, e.id ?? `${e.name}-${t}`))
209
+ })
210
+ ]
211
+ })
212
+ ]
213
+ });
214
+ };
215
+ //#endregion
216
+ export { m as CardTicket };
217
+
218
+ //# sourceMappingURL=Ticket2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Ticket2.js","names":[],"sources":["../../../src/components/Card/Ticket.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { cn } from '../../utils/cn';\nimport './Ticket.css';\n\nexport type CardTicketTone = 'neutral' | 'info' | 'success' | 'warning' | 'danger';\nexport type CardTicketPriorityLevel = 'none' | 'lowest' | 'low' | 'medium' | 'high' | 'highest';\n\nexport type CardTicketStatus = {\n label: React.ReactNode;\n tone?: CardTicketTone;\n};\n\nexport type CardTicketIssueType = {\n label: React.ReactNode;\n icon?: React.ReactNode;\n tone?: CardTicketTone;\n};\n\nexport type CardTicketAssignee = {\n id?: React.Key;\n name: string;\n avatarUrl?: string;\n avatarAlt?: string;\n};\n\nexport type CardTicketPriority = {\n level: CardTicketPriorityLevel;\n label?: React.ReactNode;\n};\n\nexport type CardTicketLabel = {\n id?: React.Key;\n label: React.ReactNode;\n};\n\nexport type CardTicketSubtaskProgress = {\n completed: number;\n total: number;\n label?: React.ReactNode;\n};\n\nexport type CardTicketProps = Omit<React.HTMLAttributes<HTMLElement>, 'title' | 'id' | 'onClick'> & {\n /** DOM id for linking the ticket to other UI. Use React's reserved `key` separately in lists. */\n id?: string;\n /** Human-facing issue key, for example `WEB-142`. */\n issueKey?: React.ReactNode;\n title: React.ReactNode;\n description?: React.ReactNode;\n status?: CardTicketStatus | React.ReactNode;\n issueType?: CardTicketIssueType | React.ReactNode;\n assignees?: CardTicketAssignee[];\n priority?: CardTicketPriority | CardTicketPriorityLevel;\n labels?: Array<CardTicketLabel | React.ReactNode>;\n dueDate?: React.ReactNode;\n estimate?: React.ReactNode;\n subtaskProgress?: CardTicketSubtaskProgress;\n selected?: boolean;\n disabled?: boolean;\n onClick?: React.MouseEventHandler<HTMLElement>;\n className?: string;\n};\n\nconst EMPTY_ASSIGNEES: CardTicketAssignee[] = [];\nconst EMPTY_LABELS: Array<CardTicketLabel | React.ReactNode> = [];\n\nconst PRIORITY_LABELS: Record<CardTicketPriorityLevel, string> = {\n none: 'No priority',\n lowest: 'Lowest priority',\n low: 'Low priority',\n medium: 'Medium priority',\n high: 'High priority',\n highest: 'Highest priority',\n};\n\nconst getInitials = (name: string) => {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '?';\n return parts.slice(0, 2).map(part => Array.from(part)[0]).join('').toUpperCase();\n};\n\nconst DefaultIssueIcon = () => (\n <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"2.5\" y=\"2.5\" width=\"11\" height=\"11\" rx=\"2\" stroke=\"currentColor\" />\n <path d=\"M5 6h6M5 8.5h4.5\" stroke=\"currentColor\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst MetaIcon = ({ type }: { type: 'calendar' | 'estimate' | 'subtask' }) => {\n if (type === 'calendar') return <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><rect x=\"2.5\" y=\"3.5\" width=\"11\" height=\"10\" rx=\"2\" stroke=\"currentColor\" /><path d=\"M5 2v3M11 2v3M3 6.5h10\" stroke=\"currentColor\" /></svg>;\n if (type === 'estimate') return <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><circle cx=\"8\" cy=\"8\" r=\"5.5\" stroke=\"currentColor\" /><path d=\"M8 5v3.5l2 1\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" /></svg>;\n return <svg viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><rect x=\"2.5\" y=\"2.5\" width=\"11\" height=\"11\" rx=\"2\" stroke=\"currentColor\" /><path d=\"m5 8 2 2 4-4\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" /></svg>;\n};\n\nconst TicketAvatar = ({ assignee }: { assignee: CardTicketAssignee }) => {\n const [failed, setFailed] = useState(false);\n const showImage = !!assignee.avatarUrl && !failed;\n\n return (\n <span className=\"dishui-card-ticket__avatar\" title={assignee.name} aria-label={assignee.name}>\n {showImage ? (\n <img\n src={assignee.avatarUrl}\n alt={assignee.avatarAlt ?? ''}\n onError={() => setFailed(true)}\n />\n ) : (\n <span aria-hidden=\"true\">{getInitials(assignee.name)}</span>\n )}\n </span>\n );\n};\n\nconst normalizeStatus = (status: CardTicketProps['status']): CardTicketStatus | undefined => {\n if (status === null || status === undefined) return undefined;\n if (typeof status === 'object' && !React.isValidElement(status) && 'label' in status) return status as CardTicketStatus;\n return { label: status, tone: 'neutral' };\n};\n\nconst normalizeIssueType = (issueType: CardTicketProps['issueType']): CardTicketIssueType | undefined => {\n if (issueType === null || issueType === undefined) return undefined;\n if (typeof issueType === 'object' && !React.isValidElement(issueType) && 'label' in issueType) return issueType as CardTicketIssueType;\n return { label: issueType, tone: 'neutral' };\n};\n\nexport const CardTicket = ({\n id,\n issueKey,\n title,\n description,\n status,\n issueType,\n assignees = EMPTY_ASSIGNEES,\n priority = 'none',\n labels = EMPTY_LABELS,\n dueDate,\n estimate,\n subtaskProgress,\n selected = false,\n disabled = false,\n onClick,\n className,\n ...rest\n}: CardTicketProps) => {\n const interactive = !!onClick;\n const statusValue = normalizeStatus(status);\n const issueTypeValue = normalizeIssueType(issueType);\n const priorityValue = typeof priority === 'string' ? { level: priority } : priority;\n const priorityLabel = priorityValue.label ?? PRIORITY_LABELS[priorityValue.level];\n const completed = Math.max(0, subtaskProgress?.completed ?? 0);\n const total = Math.max(0, subtaskProgress?.total ?? 0);\n const progress = total > 0 ? Math.min(100, (completed / total) * 100) : 0;\n\n return (\n <article\n {...rest}\n id={id}\n className={cn(\n 'dishui-card-ticket',\n interactive && !disabled && 'dishui-card-ticket--interactive',\n selected && 'dishui-card-ticket--selected',\n disabled && 'dishui-card-ticket--disabled',\n className,\n )}\n role={interactive ? 'button' : undefined}\n tabIndex={interactive && !disabled ? 0 : undefined}\n aria-pressed={interactive ? selected : undefined}\n aria-disabled={disabled || undefined}\n onClick={interactive && !disabled ? onClick : undefined}\n onKeyDown={interactive && !disabled ? event => {\n if (event.target !== event.currentTarget) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n if (!event.repeat) event.currentTarget.click();\n }\n } : undefined}\n >\n <div className=\"dishui-card-ticket__header\">\n {issueTypeValue && (\n <span\n className={cn('dishui-card-ticket__type', `dishui-card-ticket__type--${issueTypeValue.tone ?? 'neutral'}`)}\n title={typeof issueTypeValue.label === 'string' ? issueTypeValue.label : undefined}\n >\n <span className=\"dishui-card-ticket__type-icon\" aria-hidden=\"true\">{issueTypeValue.icon ?? <DefaultIssueIcon />}</span>\n <span className=\"dishui-card-ticket__type-label\">{issueTypeValue.label}</span>\n </span>\n )}\n {issueKey !== null && issueKey !== undefined && <span className=\"dishui-card-ticket__key\">{issueKey}</span>}\n {statusValue && (\n <span className={cn('dishui-card-ticket__status', `dishui-card-ticket__status--${statusValue.tone ?? 'neutral'}`)}>\n {statusValue.label}\n </span>\n )}\n </div>\n\n <h3 className=\"dishui-card-ticket__title\">{title}</h3>\n {description !== null && description !== undefined && <div className=\"dishui-card-ticket__description\">{description}</div>}\n\n {labels.length > 0 && (\n <div className=\"dishui-card-ticket__labels\" aria-label=\"Labels\">\n {labels.map((item, index) => {\n const value = typeof item === 'object' && item !== null && !React.isValidElement(item) && 'label' in item\n ? item as CardTicketLabel\n : { label: item };\n return <span className=\"dishui-card-ticket__label\" key={value.id ?? index}>{value.label}</span>;\n })}\n </div>\n )}\n\n <div className=\"dishui-card-ticket__footer\">\n <span\n className={cn('dishui-card-ticket__priority', `dishui-card-ticket__priority--${priorityValue.level}`)}\n title={typeof priorityLabel === 'string' ? priorityLabel : undefined}\n >\n <span className=\"dishui-card-ticket__priority-bars\" aria-hidden=\"true\"><i /><i /><i /></span>\n <span>{priorityLabel}</span>\n </span>\n\n <div className=\"dishui-card-ticket__metadata\">\n {dueDate !== null && dueDate !== undefined && <span className=\"dishui-card-ticket__meta\"><MetaIcon type=\"calendar\" /><span>{dueDate}</span></span>}\n {estimate !== null && estimate !== undefined && <span className=\"dishui-card-ticket__meta\"><MetaIcon type=\"estimate\" /><span>{estimate}</span></span>}\n {subtaskProgress && (\n <span className=\"dishui-card-ticket__meta dishui-card-ticket__subtasks\" aria-label={typeof subtaskProgress.label === 'string' ? subtaskProgress.label : `${completed} of ${total} subtasks complete`}>\n <MetaIcon type=\"subtask\" />\n <span>{subtaskProgress.label ?? `${completed}/${total}`}</span>\n <span className=\"dishui-card-ticket__progress\" aria-hidden=\"true\"><span style={{ width: `${progress}%` }} /></span>\n </span>\n )}\n </div>\n\n {assignees.length > 0 && (\n <div className=\"dishui-card-ticket__assignees\" aria-label=\"Assignees\">\n {assignees.map((assignee, index) => <TicketAvatar key={assignee.id ?? `${assignee.name}-${index}`} assignee={assignee} />)}\n </div>\n )}\n </div>\n </article>\n );\n};\n"],"mappings":"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"}
@@ -1,16 +1,22 @@
1
1
  import React from 'react';
2
2
  import { type CardMetricProps } from './Metric';
3
+ import { type CardTicketProps } from './Ticket';
3
4
  import { type ApprovalCardProps } from '../ai/ApprovalCard';
4
5
  import { type RecommendationCardProps } from '../ai/RecommendationCard';
5
6
  import { type ContextCardsProps } from '../ai/ContextCards';
6
7
  import { type InsightCardsProps } from '../ai/InsightCards';
7
8
  import { type FineTuneCardProps } from '../ai/FineTuneCard';
9
+ import { type IssueCardProps } from '../ai/IssueCard';
10
+ import { type AgentRunCardProps } from '../ai/AgentRunCard';
8
11
  export type { CardMetricProps, CardMetricItem } from './Metric';
12
+ export type { CardTicketProps, CardTicketTone, CardTicketPriorityLevel, CardTicketStatus, CardTicketIssueType, CardTicketAssignee, CardTicketPriority, CardTicketLabel, CardTicketSubtaskProgress, } from './Ticket';
9
13
  export type { ApprovalCardProps, ApprovalOption } from '../ai/ApprovalCard';
10
14
  export type { RecommendationCardProps, Recommendation, RecommendationAlternative, RecommendationCardLabels, ConfidenceLevel } from '../ai/RecommendationCard';
11
15
  export type { ContextCardsProps, ContextChunk, ContextSource, ContextSourceKind, ContextCardsLabels } from '../ai/ContextCards';
12
16
  export type { InsightCardsProps, InsightCardItem } from '../ai/InsightCards';
13
17
  export type { FineTuneCardProps, FineTuneMetric } from '../ai/FineTuneCard';
18
+ export type { IssueCardProps, IssueLabel, IssuePriority, IssueAccent } from '../ai/IssueCard';
19
+ export type { AgentRunCardProps, AgentRunStatus, AgentRunMeta } from '../ai/AgentRunCard';
14
20
  export type CardProps = {
15
21
  children: React.ReactNode;
16
22
  variant?: 'neutral' | 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error';
@@ -197,6 +203,8 @@ export type CardStatProps = {
197
203
  };
198
204
  interface CardCompound extends React.FC<CardProps> {
199
205
  Metric: React.FC<CardMetricProps>;
206
+ /** Jira 风格工单卡:状态、类型、负责人、优先级、日期、估算与子任务进度。 */
207
+ Ticket: React.FC<CardTicketProps>;
200
208
  Title: React.FC<CardTitleProps>;
201
209
  Body: React.FC<CardBodyProps>;
202
210
  Actions: React.FC<CardActionsProps>;
@@ -221,6 +229,10 @@ interface CardCompound extends React.FC<CardProps> {
221
229
  Insights: React.FC<InsightCardsProps>;
222
230
  /** AI 微调任务状态卡片。 */
223
231
  FineTune: React.FC<FineTuneCardProps>;
232
+ /** Linear 风格的工单卡片:标题、标签、类型图标、编号、优先级点、估点与负责人。 */
233
+ Issue: React.FC<IssueCardProps>;
234
+ /** Agent 运行卡片:头像 + 名称 + 模型、状态徽章、任务、当前动作、进度条、元信息与分支页脚。 */
235
+ Run: React.FC<AgentRunCardProps>;
224
236
  }
225
237
  declare const CardWithCompounds: CardCompound;
226
238
  export default CardWithCompounds;