@quantabit/kanban-sdk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +22 -0
- package/dist/index.cjs +355 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.esm.js +345 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/styles.css +2 -0
- package/dist/styles.css.map +1 -0
- package/package.json +70 -0
- package/types/index.d.ts +10 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 QuantaBit Team
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# @quantabit/kanban-sdk
|
|
2
|
+
|
|
3
|
+
> 看板/项目管理组件
|
|
4
|
+
|
|
5
|
+
- KanbanBoard — 看板面板 (拖拽移动卡片)
|
|
6
|
+
- KanbanColumn — 看板列 (拖放区域)
|
|
7
|
+
- KanbanCard — 任务卡片 (标签/优先级/指派人)
|
|
8
|
+
- useKanban — 状态管理 Hook
|
|
9
|
+
|
|
10
|
+
## License
|
|
11
|
+
MIT
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 🌐 Brand & Links
|
|
18
|
+
- Official Mainnet: [QuantaBit Chain](https://qbitchain.io/)
|
|
19
|
+
- Developer Platform: [Developer Platform](https://developer.quantabit.io/)
|
|
20
|
+
- Open Platform: [Open Platform](https://open.quantabit.io/)
|
|
21
|
+
- Payment Platform: [Pay Platform](https://pay.qbitwallet.io/)
|
|
22
|
+
- Feedback: [Feedback](https://xwin.live/qbit)
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
|
|
5
|
+
function _extends() {
|
|
6
|
+
return _extends = Object.assign ? Object.assign.bind() : function (n) {
|
|
7
|
+
for (var e = 1; e < arguments.length; e++) {
|
|
8
|
+
var t = arguments[e];
|
|
9
|
+
for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
|
|
10
|
+
}
|
|
11
|
+
return n;
|
|
12
|
+
}, _extends.apply(null, arguments);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function KanbanCard({
|
|
16
|
+
title,
|
|
17
|
+
description,
|
|
18
|
+
tags = [],
|
|
19
|
+
assignee,
|
|
20
|
+
priority,
|
|
21
|
+
dueDate,
|
|
22
|
+
onClick,
|
|
23
|
+
onDragStart,
|
|
24
|
+
draggable = true,
|
|
25
|
+
className = ''
|
|
26
|
+
}) {
|
|
27
|
+
const prioColors = {
|
|
28
|
+
high: '#ef4444',
|
|
29
|
+
medium: '#f59e0b',
|
|
30
|
+
low: '#22c55e'
|
|
31
|
+
};
|
|
32
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
33
|
+
className: `qkb-card ${className}`,
|
|
34
|
+
draggable: draggable,
|
|
35
|
+
onDragStart: onDragStart,
|
|
36
|
+
onClick: onClick,
|
|
37
|
+
style: {
|
|
38
|
+
padding: 14,
|
|
39
|
+
borderRadius: 10,
|
|
40
|
+
background: '#fff',
|
|
41
|
+
border: '1px solid #e4e4e7',
|
|
42
|
+
cursor: draggable ? 'grab' : 'pointer',
|
|
43
|
+
boxShadow: '0 1px 3px rgba(0,0,0,0.04)',
|
|
44
|
+
transition: 'all 0.2s',
|
|
45
|
+
userSelect: 'none'
|
|
46
|
+
}
|
|
47
|
+
}, priority && /*#__PURE__*/React.createElement("div", {
|
|
48
|
+
style: {
|
|
49
|
+
width: 6,
|
|
50
|
+
height: 6,
|
|
51
|
+
borderRadius: '50%',
|
|
52
|
+
background: prioColors[priority] || '#a1a1aa',
|
|
53
|
+
marginBottom: 6
|
|
54
|
+
}
|
|
55
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
56
|
+
style: {
|
|
57
|
+
fontSize: 14,
|
|
58
|
+
fontWeight: 600,
|
|
59
|
+
color: '#18181b',
|
|
60
|
+
lineHeight: 1.4
|
|
61
|
+
}
|
|
62
|
+
}, title), description && /*#__PURE__*/React.createElement("div", {
|
|
63
|
+
style: {
|
|
64
|
+
fontSize: 12,
|
|
65
|
+
color: '#71717a',
|
|
66
|
+
marginTop: 4,
|
|
67
|
+
lineHeight: 1.4,
|
|
68
|
+
display: '-webkit-box',
|
|
69
|
+
WebkitLineClamp: 2,
|
|
70
|
+
WebkitBoxOrient: 'vertical',
|
|
71
|
+
overflow: 'hidden'
|
|
72
|
+
}
|
|
73
|
+
}, description), tags.length > 0 && /*#__PURE__*/React.createElement("div", {
|
|
74
|
+
style: {
|
|
75
|
+
display: 'flex',
|
|
76
|
+
gap: 4,
|
|
77
|
+
flexWrap: 'wrap',
|
|
78
|
+
marginTop: 8
|
|
79
|
+
}
|
|
80
|
+
}, tags.map((tag, i) => /*#__PURE__*/React.createElement("span", {
|
|
81
|
+
key: i,
|
|
82
|
+
style: {
|
|
83
|
+
fontSize: 10,
|
|
84
|
+
padding: '2px 8px',
|
|
85
|
+
borderRadius: 4,
|
|
86
|
+
background: tag.color ? tag.color + '18' : '#eff6ff',
|
|
87
|
+
color: tag.color || '#3b82f6',
|
|
88
|
+
fontWeight: 600
|
|
89
|
+
}
|
|
90
|
+
}, typeof tag === 'string' ? tag : tag.label))), /*#__PURE__*/React.createElement("div", {
|
|
91
|
+
style: {
|
|
92
|
+
display: 'flex',
|
|
93
|
+
alignItems: 'center',
|
|
94
|
+
justifyContent: 'space-between',
|
|
95
|
+
marginTop: 8
|
|
96
|
+
}
|
|
97
|
+
}, assignee && /*#__PURE__*/React.createElement("div", {
|
|
98
|
+
style: {
|
|
99
|
+
display: 'flex',
|
|
100
|
+
alignItems: 'center',
|
|
101
|
+
gap: 4
|
|
102
|
+
}
|
|
103
|
+
}, assignee.avatar ? /*#__PURE__*/React.createElement("img", {
|
|
104
|
+
src: assignee.avatar,
|
|
105
|
+
alt: "",
|
|
106
|
+
style: {
|
|
107
|
+
width: 20,
|
|
108
|
+
height: 20,
|
|
109
|
+
borderRadius: '50%',
|
|
110
|
+
objectFit: 'cover'
|
|
111
|
+
}
|
|
112
|
+
}) : /*#__PURE__*/React.createElement("div", {
|
|
113
|
+
style: {
|
|
114
|
+
width: 20,
|
|
115
|
+
height: 20,
|
|
116
|
+
borderRadius: '50%',
|
|
117
|
+
background: '#eff6ff',
|
|
118
|
+
display: 'flex',
|
|
119
|
+
alignItems: 'center',
|
|
120
|
+
justifyContent: 'center',
|
|
121
|
+
fontSize: 9,
|
|
122
|
+
fontWeight: 700,
|
|
123
|
+
color: '#3b82f6'
|
|
124
|
+
}
|
|
125
|
+
}, (assignee.name || '?')[0]), /*#__PURE__*/React.createElement("span", {
|
|
126
|
+
style: {
|
|
127
|
+
fontSize: 11,
|
|
128
|
+
color: '#71717a'
|
|
129
|
+
}
|
|
130
|
+
}, assignee.name)), dueDate && /*#__PURE__*/React.createElement("span", {
|
|
131
|
+
style: {
|
|
132
|
+
fontSize: 10,
|
|
133
|
+
color: '#a1a1aa'
|
|
134
|
+
}
|
|
135
|
+
}, "\uD83D\uDCC5 ", dueDate)));
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function KanbanColumn({
|
|
139
|
+
title,
|
|
140
|
+
cards = [],
|
|
141
|
+
color = '#3b82f6',
|
|
142
|
+
onAdd,
|
|
143
|
+
onDrop,
|
|
144
|
+
onDragOver,
|
|
145
|
+
renderCard,
|
|
146
|
+
className = ''
|
|
147
|
+
}) {
|
|
148
|
+
const handleDragOver = e => {
|
|
149
|
+
e.preventDefault();
|
|
150
|
+
e.currentTarget.style.background = 'rgba(59,130,246,0.04)';
|
|
151
|
+
onDragOver?.(e);
|
|
152
|
+
};
|
|
153
|
+
const handleDragLeave = e => {
|
|
154
|
+
e.currentTarget.style.background = 'transparent';
|
|
155
|
+
};
|
|
156
|
+
const handleDrop = e => {
|
|
157
|
+
e.currentTarget.style.background = 'transparent';
|
|
158
|
+
onDrop?.(e);
|
|
159
|
+
};
|
|
160
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
161
|
+
className: `qkb-column ${className}`,
|
|
162
|
+
onDragOver: handleDragOver,
|
|
163
|
+
onDragLeave: handleDragLeave,
|
|
164
|
+
onDrop: handleDrop,
|
|
165
|
+
style: {
|
|
166
|
+
flex: '0 0 280px',
|
|
167
|
+
borderRadius: 12,
|
|
168
|
+
background: '#fafafa',
|
|
169
|
+
padding: 12,
|
|
170
|
+
display: 'flex',
|
|
171
|
+
flexDirection: 'column',
|
|
172
|
+
minHeight: 200,
|
|
173
|
+
transition: 'background 0.15s'
|
|
174
|
+
}
|
|
175
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
176
|
+
style: {
|
|
177
|
+
display: 'flex',
|
|
178
|
+
alignItems: 'center',
|
|
179
|
+
justifyContent: 'space-between',
|
|
180
|
+
marginBottom: 12,
|
|
181
|
+
padding: '0 4px'
|
|
182
|
+
}
|
|
183
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
184
|
+
style: {
|
|
185
|
+
display: 'flex',
|
|
186
|
+
alignItems: 'center',
|
|
187
|
+
gap: 6
|
|
188
|
+
}
|
|
189
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
190
|
+
style: {
|
|
191
|
+
width: 8,
|
|
192
|
+
height: 8,
|
|
193
|
+
borderRadius: '50%',
|
|
194
|
+
background: color
|
|
195
|
+
}
|
|
196
|
+
}), /*#__PURE__*/React.createElement("span", {
|
|
197
|
+
style: {
|
|
198
|
+
fontSize: 13,
|
|
199
|
+
fontWeight: 700,
|
|
200
|
+
color: '#18181b'
|
|
201
|
+
}
|
|
202
|
+
}, title), /*#__PURE__*/React.createElement("span", {
|
|
203
|
+
style: {
|
|
204
|
+
fontSize: 11,
|
|
205
|
+
color: '#a1a1aa',
|
|
206
|
+
background: '#fff',
|
|
207
|
+
borderRadius: 10,
|
|
208
|
+
padding: '0 6px',
|
|
209
|
+
border: '1px solid #e4e4e7'
|
|
210
|
+
}
|
|
211
|
+
}, cards.length)), onAdd && /*#__PURE__*/React.createElement("button", {
|
|
212
|
+
onClick: onAdd,
|
|
213
|
+
style: {
|
|
214
|
+
border: 'none',
|
|
215
|
+
background: 'none',
|
|
216
|
+
cursor: 'pointer',
|
|
217
|
+
fontSize: 16,
|
|
218
|
+
color: '#a1a1aa',
|
|
219
|
+
lineHeight: 1
|
|
220
|
+
}
|
|
221
|
+
}, "+")), /*#__PURE__*/React.createElement("div", {
|
|
222
|
+
style: {
|
|
223
|
+
display: 'flex',
|
|
224
|
+
flexDirection: 'column',
|
|
225
|
+
gap: 8,
|
|
226
|
+
flex: 1
|
|
227
|
+
}
|
|
228
|
+
}, cards.map((card, i) => renderCard ? renderCard(card, i) : /*#__PURE__*/React.createElement(KanbanCard, _extends({
|
|
229
|
+
key: card.id || i
|
|
230
|
+
}, card, {
|
|
231
|
+
onDragStart: e => {
|
|
232
|
+
e.dataTransfer.setData('cardId', card.id || i);
|
|
233
|
+
e.dataTransfer.setData('fromColumn', title);
|
|
234
|
+
}
|
|
235
|
+
})))));
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function KanbanBoard({
|
|
239
|
+
columns = [],
|
|
240
|
+
onMoveCard,
|
|
241
|
+
onAddCard,
|
|
242
|
+
renderCard,
|
|
243
|
+
className = ''
|
|
244
|
+
}) {
|
|
245
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
246
|
+
className: `qkb-board ${className}`,
|
|
247
|
+
style: {
|
|
248
|
+
display: 'flex',
|
|
249
|
+
gap: 16,
|
|
250
|
+
overflowX: 'auto',
|
|
251
|
+
padding: '4px 0',
|
|
252
|
+
minHeight: 300
|
|
253
|
+
}
|
|
254
|
+
}, columns.map((col, i) => /*#__PURE__*/React.createElement(KanbanColumn, {
|
|
255
|
+
key: col.id || col.title || i,
|
|
256
|
+
title: col.title,
|
|
257
|
+
cards: col.cards || [],
|
|
258
|
+
color: col.color,
|
|
259
|
+
onAdd: onAddCard ? () => onAddCard(col.id || col.title) : null,
|
|
260
|
+
renderCard: renderCard,
|
|
261
|
+
onDrop: e => {
|
|
262
|
+
const cardId = e.dataTransfer.getData('cardId');
|
|
263
|
+
const from = e.dataTransfer.getData('fromColumn');
|
|
264
|
+
onMoveCard?.(cardId, from, col.id || col.title);
|
|
265
|
+
}
|
|
266
|
+
})));
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
function useKanban(initialColumns = []) {
|
|
270
|
+
const [columns, setColumns] = React.useState(initialColumns);
|
|
271
|
+
const moveCard = React.useCallback((cardId, fromCol, toCol) => {
|
|
272
|
+
setColumns(prev => {
|
|
273
|
+
const next = [...prev];
|
|
274
|
+
const from = next.find(c => (c.id || c.title) === fromCol);
|
|
275
|
+
const to = next.find(c => (c.id || c.title) === toCol);
|
|
276
|
+
if (!from || !to) return prev;
|
|
277
|
+
const idx = from.cards.findIndex(c => String(c.id) === String(cardId));
|
|
278
|
+
if (idx === -1) return prev;
|
|
279
|
+
const [card] = from.cards.splice(idx, 1);
|
|
280
|
+
to.cards.push(card);
|
|
281
|
+
return next;
|
|
282
|
+
});
|
|
283
|
+
}, []);
|
|
284
|
+
const addCard = React.useCallback((colId, card) => {
|
|
285
|
+
setColumns(prev => prev.map(c => (c.id || c.title) === colId ? {
|
|
286
|
+
...c,
|
|
287
|
+
cards: [...c.cards, {
|
|
288
|
+
id: Date.now(),
|
|
289
|
+
...card
|
|
290
|
+
}]
|
|
291
|
+
} : c));
|
|
292
|
+
}, []);
|
|
293
|
+
const removeCard = React.useCallback((colId, cardId) => {
|
|
294
|
+
setColumns(prev => prev.map(c => (c.id || c.title) === colId ? {
|
|
295
|
+
...c,
|
|
296
|
+
cards: c.cards.filter(card => card.id !== cardId)
|
|
297
|
+
} : c));
|
|
298
|
+
}, []);
|
|
299
|
+
return {
|
|
300
|
+
columns,
|
|
301
|
+
setColumns,
|
|
302
|
+
moveCard,
|
|
303
|
+
addCard,
|
|
304
|
+
removeCard
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
const SUPPORTED_LANGUAGES = ['en', 'zh', 'ja', 'ko'];
|
|
309
|
+
const messages = {
|
|
310
|
+
en: {
|
|
311
|
+
"kb.add": "Add Card",
|
|
312
|
+
"kb.todo": "To Do",
|
|
313
|
+
"kb.doing": "In Progress",
|
|
314
|
+
"kb.done": "Done"
|
|
315
|
+
},
|
|
316
|
+
zh: {
|
|
317
|
+
"kb.add": "添加卡片",
|
|
318
|
+
"kb.todo": "待办",
|
|
319
|
+
"kb.doing": "进行中",
|
|
320
|
+
"kb.done": "已完成"
|
|
321
|
+
},
|
|
322
|
+
ja: {
|
|
323
|
+
"kb.add": "カードを追加",
|
|
324
|
+
"kb.todo": "未対応",
|
|
325
|
+
"kb.doing": "進行中",
|
|
326
|
+
"kb.done": "完了"
|
|
327
|
+
},
|
|
328
|
+
ko: {
|
|
329
|
+
"kb.add": "카드 추가",
|
|
330
|
+
"kb.todo": "할 일",
|
|
331
|
+
"kb.doing": "진행 중",
|
|
332
|
+
"kb.done": "완료"
|
|
333
|
+
}
|
|
334
|
+
};
|
|
335
|
+
let currentLang = 'en';
|
|
336
|
+
function setLanguage(l) {
|
|
337
|
+
if (SUPPORTED_LANGUAGES.includes(l)) currentLang = l;
|
|
338
|
+
}
|
|
339
|
+
function getLanguage() {
|
|
340
|
+
return currentLang;
|
|
341
|
+
}
|
|
342
|
+
function t(k) {
|
|
343
|
+
return messages[currentLang]?.[k] || messages.en?.[k] || k;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
exports.KanbanBoard = KanbanBoard;
|
|
347
|
+
exports.KanbanCard = KanbanCard;
|
|
348
|
+
exports.KanbanColumn = KanbanColumn;
|
|
349
|
+
exports.SUPPORTED_LANGUAGES = SUPPORTED_LANGUAGES;
|
|
350
|
+
exports.getLanguage = getLanguage;
|
|
351
|
+
exports.messages = messages;
|
|
352
|
+
exports.setLanguage = setLanguage;
|
|
353
|
+
exports.t = t;
|
|
354
|
+
exports.useKanban = useKanban;
|
|
355
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/components/KanbanCard.jsx","../src/components/KanbanColumn.jsx","../src/components/KanbanBoard.jsx","../src/hooks/useKanban.js","../src/i18n/index.js"],"sourcesContent":["import React from'react';\nexport function KanbanCard({title,description,tags=[],assignee,priority,dueDate,onClick,onDragStart,draggable=true,className=''}){\n const prioColors={high:'#ef4444',medium:'#f59e0b',low:'#22c55e'};\n return(<div className={`qkb-card ${className}`} draggable={draggable} onDragStart={onDragStart} onClick={onClick}\n style={{padding:14,borderRadius:10,background:'#fff',border:'1px solid #e4e4e7',cursor:draggable?'grab':'pointer',\n boxShadow:'0 1px 3px rgba(0,0,0,0.04)',transition:'all 0.2s',userSelect:'none'}}>\n {priority&&<div style={{width:6,height:6,borderRadius:'50%',background:prioColors[priority]||'#a1a1aa',marginBottom:6}}/>}\n <div style={{fontSize:14,fontWeight:600,color:'#18181b',lineHeight:1.4}}>{title}</div>\n {description&&<div style={{fontSize:12,color:'#71717a',marginTop:4,lineHeight:1.4,display:'-webkit-box',WebkitLineClamp:2,WebkitBoxOrient:'vertical',overflow:'hidden'}}>{description}</div>}\n {tags.length>0&&<div style={{display:'flex',gap:4,flexWrap:'wrap',marginTop:8}}>\n {tags.map((tag,i)=>(<span key={i} style={{fontSize:10,padding:'2px 8px',borderRadius:4,background:tag.color?tag.color+'18':'#eff6ff',color:tag.color||'#3b82f6',fontWeight:600}}>\n {typeof tag==='string'?tag:tag.label}</span>))}</div>}\n <div style={{display:'flex',alignItems:'center',justifyContent:'space-between',marginTop:8}}>\n {assignee&&<div style={{display:'flex',alignItems:'center',gap:4}}>\n {assignee.avatar?<img src={assignee.avatar} alt=\"\" style={{width:20,height:20,borderRadius:'50%',objectFit:'cover'}}/>\n :<div style={{width:20,height:20,borderRadius:'50%',background:'#eff6ff',display:'flex',alignItems:'center',justifyContent:'center',fontSize:9,fontWeight:700,color:'#3b82f6'}}>{(assignee.name||'?')[0]}</div>}\n <span style={{fontSize:11,color:'#71717a'}}>{assignee.name}</span></div>}\n {dueDate&&<span style={{fontSize:10,color:'#a1a1aa'}}>📅 {dueDate}</span>}\n </div>\n </div>);\n}\n","import React from'react';\nimport{KanbanCard}from'./KanbanCard';\nexport function KanbanColumn({title,cards=[],color='#3b82f6',onAdd,onDrop,onDragOver,renderCard,className=''}){\n const handleDragOver=e=>{e.preventDefault();e.currentTarget.style.background='rgba(59,130,246,0.04)';onDragOver?.(e);};\n const handleDragLeave=e=>{e.currentTarget.style.background='transparent';};\n const handleDrop=e=>{e.currentTarget.style.background='transparent';onDrop?.(e);};\n return(<div className={`qkb-column ${className}`} onDragOver={handleDragOver} onDragLeave={handleDragLeave} onDrop={handleDrop}\n style={{flex:'0 0 280px',borderRadius:12,background:'#fafafa',padding:12,display:'flex',flexDirection:'column',minHeight:200,transition:'background 0.15s'}}>\n <div style={{display:'flex',alignItems:'center',justifyContent:'space-between',marginBottom:12,padding:'0 4px'}}>\n <div style={{display:'flex',alignItems:'center',gap:6}}>\n <div style={{width:8,height:8,borderRadius:'50%',background:color}}/>\n <span style={{fontSize:13,fontWeight:700,color:'#18181b'}}>{title}</span>\n <span style={{fontSize:11,color:'#a1a1aa',background:'#fff',borderRadius:10,padding:'0 6px',border:'1px solid #e4e4e7'}}>{cards.length}</span>\n </div>\n {onAdd&&<button onClick={onAdd} style={{border:'none',background:'none',cursor:'pointer',fontSize:16,color:'#a1a1aa',lineHeight:1}}>+</button>}\n </div>\n <div style={{display:'flex',flexDirection:'column',gap:8,flex:1}}>\n {cards.map((card,i)=>renderCard?renderCard(card,i):<KanbanCard key={card.id||i} {...card}\n onDragStart={e=>{e.dataTransfer.setData('cardId',card.id||i);e.dataTransfer.setData('fromColumn',title);}}/>)}\n </div>\n </div>);\n}\n","import React from'react';\nimport{KanbanColumn}from'./KanbanColumn';\nexport function KanbanBoard({columns=[],onMoveCard,onAddCard,renderCard,className=''}){\n return(<div className={`qkb-board ${className}`} style={{display:'flex',gap:16,overflowX:'auto',padding:'4px 0',minHeight:300}}>\n {columns.map((col,i)=>(<KanbanColumn key={col.id||col.title||i} title={col.title} cards={col.cards||[]}\n color={col.color} onAdd={onAddCard?()=>onAddCard(col.id||col.title):null} renderCard={renderCard}\n onDrop={e=>{const cardId=e.dataTransfer.getData('cardId');const from=e.dataTransfer.getData('fromColumn');\n onMoveCard?.(cardId,from,col.id||col.title);}}/>))}\n </div>);\n}\n","import{useState,useCallback}from'react';\nexport function useKanban(initialColumns=[]){\n const[columns,setColumns]=useState(initialColumns);\n const moveCard=useCallback((cardId,fromCol,toCol)=>{\n setColumns(prev=>{const next=[...prev];const from=next.find(c=>(c.id||c.title)===fromCol);const to=next.find(c=>(c.id||c.title)===toCol);\n if(!from||!to)return prev;const idx=from.cards.findIndex(c=>String(c.id)===String(cardId));if(idx===-1)return prev;\n const[card]=from.cards.splice(idx,1);to.cards.push(card);return next;});\n },[]);\n const addCard=useCallback((colId,card)=>{\n setColumns(prev=>prev.map(c=>(c.id||c.title)===colId?{...c,cards:[...c.cards,{id:Date.now(),...card}]}:c));\n },[]);\n const removeCard=useCallback((colId,cardId)=>{\n setColumns(prev=>prev.map(c=>(c.id||c.title)===colId?{...c,cards:c.cards.filter(card=>card.id!==cardId)}:c));\n },[]);\n return{columns,setColumns,moveCard,addCard,removeCard};\n}\n","export const SUPPORTED_LANGUAGES = ['en', 'zh', 'ja', 'ko'];\nexport const messages = {\n en: {\n \"kb.add\": \"Add Card\",\n \"kb.todo\": \"To Do\",\n \"kb.doing\": \"In Progress\",\n \"kb.done\": \"Done\"\n},\n zh: {\n \"kb.add\": \"添加卡片\",\n \"kb.todo\": \"待办\",\n \"kb.doing\": \"进行中\",\n \"kb.done\": \"已完成\"\n},\n ja: {\n \"kb.add\": \"カードを追加\",\n \"kb.todo\": \"未対応\",\n \"kb.doing\": \"進行中\",\n \"kb.done\": \"完了\"\n},\n ko: {\n \"kb.add\": \"카드 추가\",\n \"kb.todo\": \"할 일\",\n \"kb.doing\": \"진행 중\",\n \"kb.done\": \"완료\"\n}\n};\nlet currentLang = 'en';\nexport function setLanguage(l) { if (SUPPORTED_LANGUAGES.includes(l)) currentLang = l; }\nexport function getLanguage() { return currentLang; }\nexport function t(k) { return messages[currentLang]?.[k] || messages.en?.[k] || k; }\n"],"names":["KanbanCard","title","description","tags","assignee","priority","dueDate","onClick","onDragStart","draggable","className","prioColors","high","medium","low","React","createElement","style","padding","borderRadius","background","border","cursor","boxShadow","transition","userSelect","width","height","marginBottom","fontSize","fontWeight","color","lineHeight","marginTop","display","WebkitLineClamp","WebkitBoxOrient","overflow","length","gap","flexWrap","map","tag","i","key","label","alignItems","justifyContent","avatar","src","alt","objectFit","name","KanbanColumn","cards","onAdd","onDrop","onDragOver","renderCard","handleDragOver","e","preventDefault","currentTarget","handleDragLeave","handleDrop","onDragLeave","flex","flexDirection","minHeight","card","_extends","id","dataTransfer","setData","KanbanBoard","columns","onMoveCard","onAddCard","overflowX","col","cardId","getData","from","useKanban","initialColumns","setColumns","useState","moveCard","useCallback","fromCol","toCol","prev","next","find","c","to","idx","findIndex","String","splice","push","addCard","colId","Date","now","removeCard","filter","SUPPORTED_LANGUAGES","messages","en","zh","ja","ko","currentLang","setLanguage","l","includes","getLanguage","t","k"],"mappings":"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"}
|
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
import React, { useState, useCallback } from 'react';
|
|
2
|
+
|
|
3
|
+
function _extends() {
|
|
4
|
+
return _extends = Object.assign ? Object.assign.bind() : function (n) {
|
|
5
|
+
for (var e = 1; e < arguments.length; e++) {
|
|
6
|
+
var t = arguments[e];
|
|
7
|
+
for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
|
|
8
|
+
}
|
|
9
|
+
return n;
|
|
10
|
+
}, _extends.apply(null, arguments);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function KanbanCard({
|
|
14
|
+
title,
|
|
15
|
+
description,
|
|
16
|
+
tags = [],
|
|
17
|
+
assignee,
|
|
18
|
+
priority,
|
|
19
|
+
dueDate,
|
|
20
|
+
onClick,
|
|
21
|
+
onDragStart,
|
|
22
|
+
draggable = true,
|
|
23
|
+
className = ''
|
|
24
|
+
}) {
|
|
25
|
+
const prioColors = {
|
|
26
|
+
high: '#ef4444',
|
|
27
|
+
medium: '#f59e0b',
|
|
28
|
+
low: '#22c55e'
|
|
29
|
+
};
|
|
30
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
31
|
+
className: `qkb-card ${className}`,
|
|
32
|
+
draggable: draggable,
|
|
33
|
+
onDragStart: onDragStart,
|
|
34
|
+
onClick: onClick,
|
|
35
|
+
style: {
|
|
36
|
+
padding: 14,
|
|
37
|
+
borderRadius: 10,
|
|
38
|
+
background: '#fff',
|
|
39
|
+
border: '1px solid #e4e4e7',
|
|
40
|
+
cursor: draggable ? 'grab' : 'pointer',
|
|
41
|
+
boxShadow: '0 1px 3px rgba(0,0,0,0.04)',
|
|
42
|
+
transition: 'all 0.2s',
|
|
43
|
+
userSelect: 'none'
|
|
44
|
+
}
|
|
45
|
+
}, priority && /*#__PURE__*/React.createElement("div", {
|
|
46
|
+
style: {
|
|
47
|
+
width: 6,
|
|
48
|
+
height: 6,
|
|
49
|
+
borderRadius: '50%',
|
|
50
|
+
background: prioColors[priority] || '#a1a1aa',
|
|
51
|
+
marginBottom: 6
|
|
52
|
+
}
|
|
53
|
+
}), /*#__PURE__*/React.createElement("div", {
|
|
54
|
+
style: {
|
|
55
|
+
fontSize: 14,
|
|
56
|
+
fontWeight: 600,
|
|
57
|
+
color: '#18181b',
|
|
58
|
+
lineHeight: 1.4
|
|
59
|
+
}
|
|
60
|
+
}, title), description && /*#__PURE__*/React.createElement("div", {
|
|
61
|
+
style: {
|
|
62
|
+
fontSize: 12,
|
|
63
|
+
color: '#71717a',
|
|
64
|
+
marginTop: 4,
|
|
65
|
+
lineHeight: 1.4,
|
|
66
|
+
display: '-webkit-box',
|
|
67
|
+
WebkitLineClamp: 2,
|
|
68
|
+
WebkitBoxOrient: 'vertical',
|
|
69
|
+
overflow: 'hidden'
|
|
70
|
+
}
|
|
71
|
+
}, description), tags.length > 0 && /*#__PURE__*/React.createElement("div", {
|
|
72
|
+
style: {
|
|
73
|
+
display: 'flex',
|
|
74
|
+
gap: 4,
|
|
75
|
+
flexWrap: 'wrap',
|
|
76
|
+
marginTop: 8
|
|
77
|
+
}
|
|
78
|
+
}, tags.map((tag, i) => /*#__PURE__*/React.createElement("span", {
|
|
79
|
+
key: i,
|
|
80
|
+
style: {
|
|
81
|
+
fontSize: 10,
|
|
82
|
+
padding: '2px 8px',
|
|
83
|
+
borderRadius: 4,
|
|
84
|
+
background: tag.color ? tag.color + '18' : '#eff6ff',
|
|
85
|
+
color: tag.color || '#3b82f6',
|
|
86
|
+
fontWeight: 600
|
|
87
|
+
}
|
|
88
|
+
}, typeof tag === 'string' ? tag : tag.label))), /*#__PURE__*/React.createElement("div", {
|
|
89
|
+
style: {
|
|
90
|
+
display: 'flex',
|
|
91
|
+
alignItems: 'center',
|
|
92
|
+
justifyContent: 'space-between',
|
|
93
|
+
marginTop: 8
|
|
94
|
+
}
|
|
95
|
+
}, assignee && /*#__PURE__*/React.createElement("div", {
|
|
96
|
+
style: {
|
|
97
|
+
display: 'flex',
|
|
98
|
+
alignItems: 'center',
|
|
99
|
+
gap: 4
|
|
100
|
+
}
|
|
101
|
+
}, assignee.avatar ? /*#__PURE__*/React.createElement("img", {
|
|
102
|
+
src: assignee.avatar,
|
|
103
|
+
alt: "",
|
|
104
|
+
style: {
|
|
105
|
+
width: 20,
|
|
106
|
+
height: 20,
|
|
107
|
+
borderRadius: '50%',
|
|
108
|
+
objectFit: 'cover'
|
|
109
|
+
}
|
|
110
|
+
}) : /*#__PURE__*/React.createElement("div", {
|
|
111
|
+
style: {
|
|
112
|
+
width: 20,
|
|
113
|
+
height: 20,
|
|
114
|
+
borderRadius: '50%',
|
|
115
|
+
background: '#eff6ff',
|
|
116
|
+
display: 'flex',
|
|
117
|
+
alignItems: 'center',
|
|
118
|
+
justifyContent: 'center',
|
|
119
|
+
fontSize: 9,
|
|
120
|
+
fontWeight: 700,
|
|
121
|
+
color: '#3b82f6'
|
|
122
|
+
}
|
|
123
|
+
}, (assignee.name || '?')[0]), /*#__PURE__*/React.createElement("span", {
|
|
124
|
+
style: {
|
|
125
|
+
fontSize: 11,
|
|
126
|
+
color: '#71717a'
|
|
127
|
+
}
|
|
128
|
+
}, assignee.name)), dueDate && /*#__PURE__*/React.createElement("span", {
|
|
129
|
+
style: {
|
|
130
|
+
fontSize: 10,
|
|
131
|
+
color: '#a1a1aa'
|
|
132
|
+
}
|
|
133
|
+
}, "\uD83D\uDCC5 ", dueDate)));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function KanbanColumn({
|
|
137
|
+
title,
|
|
138
|
+
cards = [],
|
|
139
|
+
color = '#3b82f6',
|
|
140
|
+
onAdd,
|
|
141
|
+
onDrop,
|
|
142
|
+
onDragOver,
|
|
143
|
+
renderCard,
|
|
144
|
+
className = ''
|
|
145
|
+
}) {
|
|
146
|
+
const handleDragOver = e => {
|
|
147
|
+
e.preventDefault();
|
|
148
|
+
e.currentTarget.style.background = 'rgba(59,130,246,0.04)';
|
|
149
|
+
onDragOver?.(e);
|
|
150
|
+
};
|
|
151
|
+
const handleDragLeave = e => {
|
|
152
|
+
e.currentTarget.style.background = 'transparent';
|
|
153
|
+
};
|
|
154
|
+
const handleDrop = e => {
|
|
155
|
+
e.currentTarget.style.background = 'transparent';
|
|
156
|
+
onDrop?.(e);
|
|
157
|
+
};
|
|
158
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
159
|
+
className: `qkb-column ${className}`,
|
|
160
|
+
onDragOver: handleDragOver,
|
|
161
|
+
onDragLeave: handleDragLeave,
|
|
162
|
+
onDrop: handleDrop,
|
|
163
|
+
style: {
|
|
164
|
+
flex: '0 0 280px',
|
|
165
|
+
borderRadius: 12,
|
|
166
|
+
background: '#fafafa',
|
|
167
|
+
padding: 12,
|
|
168
|
+
display: 'flex',
|
|
169
|
+
flexDirection: 'column',
|
|
170
|
+
minHeight: 200,
|
|
171
|
+
transition: 'background 0.15s'
|
|
172
|
+
}
|
|
173
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
174
|
+
style: {
|
|
175
|
+
display: 'flex',
|
|
176
|
+
alignItems: 'center',
|
|
177
|
+
justifyContent: 'space-between',
|
|
178
|
+
marginBottom: 12,
|
|
179
|
+
padding: '0 4px'
|
|
180
|
+
}
|
|
181
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
182
|
+
style: {
|
|
183
|
+
display: 'flex',
|
|
184
|
+
alignItems: 'center',
|
|
185
|
+
gap: 6
|
|
186
|
+
}
|
|
187
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
188
|
+
style: {
|
|
189
|
+
width: 8,
|
|
190
|
+
height: 8,
|
|
191
|
+
borderRadius: '50%',
|
|
192
|
+
background: color
|
|
193
|
+
}
|
|
194
|
+
}), /*#__PURE__*/React.createElement("span", {
|
|
195
|
+
style: {
|
|
196
|
+
fontSize: 13,
|
|
197
|
+
fontWeight: 700,
|
|
198
|
+
color: '#18181b'
|
|
199
|
+
}
|
|
200
|
+
}, title), /*#__PURE__*/React.createElement("span", {
|
|
201
|
+
style: {
|
|
202
|
+
fontSize: 11,
|
|
203
|
+
color: '#a1a1aa',
|
|
204
|
+
background: '#fff',
|
|
205
|
+
borderRadius: 10,
|
|
206
|
+
padding: '0 6px',
|
|
207
|
+
border: '1px solid #e4e4e7'
|
|
208
|
+
}
|
|
209
|
+
}, cards.length)), onAdd && /*#__PURE__*/React.createElement("button", {
|
|
210
|
+
onClick: onAdd,
|
|
211
|
+
style: {
|
|
212
|
+
border: 'none',
|
|
213
|
+
background: 'none',
|
|
214
|
+
cursor: 'pointer',
|
|
215
|
+
fontSize: 16,
|
|
216
|
+
color: '#a1a1aa',
|
|
217
|
+
lineHeight: 1
|
|
218
|
+
}
|
|
219
|
+
}, "+")), /*#__PURE__*/React.createElement("div", {
|
|
220
|
+
style: {
|
|
221
|
+
display: 'flex',
|
|
222
|
+
flexDirection: 'column',
|
|
223
|
+
gap: 8,
|
|
224
|
+
flex: 1
|
|
225
|
+
}
|
|
226
|
+
}, cards.map((card, i) => renderCard ? renderCard(card, i) : /*#__PURE__*/React.createElement(KanbanCard, _extends({
|
|
227
|
+
key: card.id || i
|
|
228
|
+
}, card, {
|
|
229
|
+
onDragStart: e => {
|
|
230
|
+
e.dataTransfer.setData('cardId', card.id || i);
|
|
231
|
+
e.dataTransfer.setData('fromColumn', title);
|
|
232
|
+
}
|
|
233
|
+
})))));
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function KanbanBoard({
|
|
237
|
+
columns = [],
|
|
238
|
+
onMoveCard,
|
|
239
|
+
onAddCard,
|
|
240
|
+
renderCard,
|
|
241
|
+
className = ''
|
|
242
|
+
}) {
|
|
243
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
244
|
+
className: `qkb-board ${className}`,
|
|
245
|
+
style: {
|
|
246
|
+
display: 'flex',
|
|
247
|
+
gap: 16,
|
|
248
|
+
overflowX: 'auto',
|
|
249
|
+
padding: '4px 0',
|
|
250
|
+
minHeight: 300
|
|
251
|
+
}
|
|
252
|
+
}, columns.map((col, i) => /*#__PURE__*/React.createElement(KanbanColumn, {
|
|
253
|
+
key: col.id || col.title || i,
|
|
254
|
+
title: col.title,
|
|
255
|
+
cards: col.cards || [],
|
|
256
|
+
color: col.color,
|
|
257
|
+
onAdd: onAddCard ? () => onAddCard(col.id || col.title) : null,
|
|
258
|
+
renderCard: renderCard,
|
|
259
|
+
onDrop: e => {
|
|
260
|
+
const cardId = e.dataTransfer.getData('cardId');
|
|
261
|
+
const from = e.dataTransfer.getData('fromColumn');
|
|
262
|
+
onMoveCard?.(cardId, from, col.id || col.title);
|
|
263
|
+
}
|
|
264
|
+
})));
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
function useKanban(initialColumns = []) {
|
|
268
|
+
const [columns, setColumns] = useState(initialColumns);
|
|
269
|
+
const moveCard = useCallback((cardId, fromCol, toCol) => {
|
|
270
|
+
setColumns(prev => {
|
|
271
|
+
const next = [...prev];
|
|
272
|
+
const from = next.find(c => (c.id || c.title) === fromCol);
|
|
273
|
+
const to = next.find(c => (c.id || c.title) === toCol);
|
|
274
|
+
if (!from || !to) return prev;
|
|
275
|
+
const idx = from.cards.findIndex(c => String(c.id) === String(cardId));
|
|
276
|
+
if (idx === -1) return prev;
|
|
277
|
+
const [card] = from.cards.splice(idx, 1);
|
|
278
|
+
to.cards.push(card);
|
|
279
|
+
return next;
|
|
280
|
+
});
|
|
281
|
+
}, []);
|
|
282
|
+
const addCard = useCallback((colId, card) => {
|
|
283
|
+
setColumns(prev => prev.map(c => (c.id || c.title) === colId ? {
|
|
284
|
+
...c,
|
|
285
|
+
cards: [...c.cards, {
|
|
286
|
+
id: Date.now(),
|
|
287
|
+
...card
|
|
288
|
+
}]
|
|
289
|
+
} : c));
|
|
290
|
+
}, []);
|
|
291
|
+
const removeCard = useCallback((colId, cardId) => {
|
|
292
|
+
setColumns(prev => prev.map(c => (c.id || c.title) === colId ? {
|
|
293
|
+
...c,
|
|
294
|
+
cards: c.cards.filter(card => card.id !== cardId)
|
|
295
|
+
} : c));
|
|
296
|
+
}, []);
|
|
297
|
+
return {
|
|
298
|
+
columns,
|
|
299
|
+
setColumns,
|
|
300
|
+
moveCard,
|
|
301
|
+
addCard,
|
|
302
|
+
removeCard
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
const SUPPORTED_LANGUAGES = ['en', 'zh', 'ja', 'ko'];
|
|
307
|
+
const messages = {
|
|
308
|
+
en: {
|
|
309
|
+
"kb.add": "Add Card",
|
|
310
|
+
"kb.todo": "To Do",
|
|
311
|
+
"kb.doing": "In Progress",
|
|
312
|
+
"kb.done": "Done"
|
|
313
|
+
},
|
|
314
|
+
zh: {
|
|
315
|
+
"kb.add": "添加卡片",
|
|
316
|
+
"kb.todo": "待办",
|
|
317
|
+
"kb.doing": "进行中",
|
|
318
|
+
"kb.done": "已完成"
|
|
319
|
+
},
|
|
320
|
+
ja: {
|
|
321
|
+
"kb.add": "カードを追加",
|
|
322
|
+
"kb.todo": "未対応",
|
|
323
|
+
"kb.doing": "進行中",
|
|
324
|
+
"kb.done": "完了"
|
|
325
|
+
},
|
|
326
|
+
ko: {
|
|
327
|
+
"kb.add": "카드 추가",
|
|
328
|
+
"kb.todo": "할 일",
|
|
329
|
+
"kb.doing": "진행 중",
|
|
330
|
+
"kb.done": "완료"
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
let currentLang = 'en';
|
|
334
|
+
function setLanguage(l) {
|
|
335
|
+
if (SUPPORTED_LANGUAGES.includes(l)) currentLang = l;
|
|
336
|
+
}
|
|
337
|
+
function getLanguage() {
|
|
338
|
+
return currentLang;
|
|
339
|
+
}
|
|
340
|
+
function t(k) {
|
|
341
|
+
return messages[currentLang]?.[k] || messages.en?.[k] || k;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
export { KanbanBoard, KanbanCard, KanbanColumn, SUPPORTED_LANGUAGES, getLanguage, messages, setLanguage, t, useKanban };
|
|
345
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/components/KanbanCard.jsx","../src/components/KanbanColumn.jsx","../src/components/KanbanBoard.jsx","../src/hooks/useKanban.js","../src/i18n/index.js"],"sourcesContent":["import React from'react';\nexport function KanbanCard({title,description,tags=[],assignee,priority,dueDate,onClick,onDragStart,draggable=true,className=''}){\n const prioColors={high:'#ef4444',medium:'#f59e0b',low:'#22c55e'};\n return(<div className={`qkb-card ${className}`} draggable={draggable} onDragStart={onDragStart} onClick={onClick}\n style={{padding:14,borderRadius:10,background:'#fff',border:'1px solid #e4e4e7',cursor:draggable?'grab':'pointer',\n boxShadow:'0 1px 3px rgba(0,0,0,0.04)',transition:'all 0.2s',userSelect:'none'}}>\n {priority&&<div style={{width:6,height:6,borderRadius:'50%',background:prioColors[priority]||'#a1a1aa',marginBottom:6}}/>}\n <div style={{fontSize:14,fontWeight:600,color:'#18181b',lineHeight:1.4}}>{title}</div>\n {description&&<div style={{fontSize:12,color:'#71717a',marginTop:4,lineHeight:1.4,display:'-webkit-box',WebkitLineClamp:2,WebkitBoxOrient:'vertical',overflow:'hidden'}}>{description}</div>}\n {tags.length>0&&<div style={{display:'flex',gap:4,flexWrap:'wrap',marginTop:8}}>\n {tags.map((tag,i)=>(<span key={i} style={{fontSize:10,padding:'2px 8px',borderRadius:4,background:tag.color?tag.color+'18':'#eff6ff',color:tag.color||'#3b82f6',fontWeight:600}}>\n {typeof tag==='string'?tag:tag.label}</span>))}</div>}\n <div style={{display:'flex',alignItems:'center',justifyContent:'space-between',marginTop:8}}>\n {assignee&&<div style={{display:'flex',alignItems:'center',gap:4}}>\n {assignee.avatar?<img src={assignee.avatar} alt=\"\" style={{width:20,height:20,borderRadius:'50%',objectFit:'cover'}}/>\n :<div style={{width:20,height:20,borderRadius:'50%',background:'#eff6ff',display:'flex',alignItems:'center',justifyContent:'center',fontSize:9,fontWeight:700,color:'#3b82f6'}}>{(assignee.name||'?')[0]}</div>}\n <span style={{fontSize:11,color:'#71717a'}}>{assignee.name}</span></div>}\n {dueDate&&<span style={{fontSize:10,color:'#a1a1aa'}}>📅 {dueDate}</span>}\n </div>\n </div>);\n}\n","import React from'react';\nimport{KanbanCard}from'./KanbanCard';\nexport function KanbanColumn({title,cards=[],color='#3b82f6',onAdd,onDrop,onDragOver,renderCard,className=''}){\n const handleDragOver=e=>{e.preventDefault();e.currentTarget.style.background='rgba(59,130,246,0.04)';onDragOver?.(e);};\n const handleDragLeave=e=>{e.currentTarget.style.background='transparent';};\n const handleDrop=e=>{e.currentTarget.style.background='transparent';onDrop?.(e);};\n return(<div className={`qkb-column ${className}`} onDragOver={handleDragOver} onDragLeave={handleDragLeave} onDrop={handleDrop}\n style={{flex:'0 0 280px',borderRadius:12,background:'#fafafa',padding:12,display:'flex',flexDirection:'column',minHeight:200,transition:'background 0.15s'}}>\n <div style={{display:'flex',alignItems:'center',justifyContent:'space-between',marginBottom:12,padding:'0 4px'}}>\n <div style={{display:'flex',alignItems:'center',gap:6}}>\n <div style={{width:8,height:8,borderRadius:'50%',background:color}}/>\n <span style={{fontSize:13,fontWeight:700,color:'#18181b'}}>{title}</span>\n <span style={{fontSize:11,color:'#a1a1aa',background:'#fff',borderRadius:10,padding:'0 6px',border:'1px solid #e4e4e7'}}>{cards.length}</span>\n </div>\n {onAdd&&<button onClick={onAdd} style={{border:'none',background:'none',cursor:'pointer',fontSize:16,color:'#a1a1aa',lineHeight:1}}>+</button>}\n </div>\n <div style={{display:'flex',flexDirection:'column',gap:8,flex:1}}>\n {cards.map((card,i)=>renderCard?renderCard(card,i):<KanbanCard key={card.id||i} {...card}\n onDragStart={e=>{e.dataTransfer.setData('cardId',card.id||i);e.dataTransfer.setData('fromColumn',title);}}/>)}\n </div>\n </div>);\n}\n","import React from'react';\nimport{KanbanColumn}from'./KanbanColumn';\nexport function KanbanBoard({columns=[],onMoveCard,onAddCard,renderCard,className=''}){\n return(<div className={`qkb-board ${className}`} style={{display:'flex',gap:16,overflowX:'auto',padding:'4px 0',minHeight:300}}>\n {columns.map((col,i)=>(<KanbanColumn key={col.id||col.title||i} title={col.title} cards={col.cards||[]}\n color={col.color} onAdd={onAddCard?()=>onAddCard(col.id||col.title):null} renderCard={renderCard}\n onDrop={e=>{const cardId=e.dataTransfer.getData('cardId');const from=e.dataTransfer.getData('fromColumn');\n onMoveCard?.(cardId,from,col.id||col.title);}}/>))}\n </div>);\n}\n","import{useState,useCallback}from'react';\nexport function useKanban(initialColumns=[]){\n const[columns,setColumns]=useState(initialColumns);\n const moveCard=useCallback((cardId,fromCol,toCol)=>{\n setColumns(prev=>{const next=[...prev];const from=next.find(c=>(c.id||c.title)===fromCol);const to=next.find(c=>(c.id||c.title)===toCol);\n if(!from||!to)return prev;const idx=from.cards.findIndex(c=>String(c.id)===String(cardId));if(idx===-1)return prev;\n const[card]=from.cards.splice(idx,1);to.cards.push(card);return next;});\n },[]);\n const addCard=useCallback((colId,card)=>{\n setColumns(prev=>prev.map(c=>(c.id||c.title)===colId?{...c,cards:[...c.cards,{id:Date.now(),...card}]}:c));\n },[]);\n const removeCard=useCallback((colId,cardId)=>{\n setColumns(prev=>prev.map(c=>(c.id||c.title)===colId?{...c,cards:c.cards.filter(card=>card.id!==cardId)}:c));\n },[]);\n return{columns,setColumns,moveCard,addCard,removeCard};\n}\n","export const SUPPORTED_LANGUAGES = ['en', 'zh', 'ja', 'ko'];\nexport const messages = {\n en: {\n \"kb.add\": \"Add Card\",\n \"kb.todo\": \"To Do\",\n \"kb.doing\": \"In Progress\",\n \"kb.done\": \"Done\"\n},\n zh: {\n \"kb.add\": \"添加卡片\",\n \"kb.todo\": \"待办\",\n \"kb.doing\": \"进行中\",\n \"kb.done\": \"已完成\"\n},\n ja: {\n \"kb.add\": \"カードを追加\",\n \"kb.todo\": \"未対応\",\n \"kb.doing\": \"進行中\",\n \"kb.done\": \"完了\"\n},\n ko: {\n \"kb.add\": \"카드 추가\",\n \"kb.todo\": \"할 일\",\n \"kb.doing\": \"진행 중\",\n \"kb.done\": \"완료\"\n}\n};\nlet currentLang = 'en';\nexport function setLanguage(l) { if (SUPPORTED_LANGUAGES.includes(l)) currentLang = l; }\nexport function getLanguage() { return currentLang; }\nexport function t(k) { return messages[currentLang]?.[k] || messages.en?.[k] || k; }\n"],"names":["KanbanCard","title","description","tags","assignee","priority","dueDate","onClick","onDragStart","draggable","className","prioColors","high","medium","low","React","createElement","style","padding","borderRadius","background","border","cursor","boxShadow","transition","userSelect","width","height","marginBottom","fontSize","fontWeight","color","lineHeight","marginTop","display","WebkitLineClamp","WebkitBoxOrient","overflow","length","gap","flexWrap","map","tag","i","key","label","alignItems","justifyContent","avatar","src","alt","objectFit","name","KanbanColumn","cards","onAdd","onDrop","onDragOver","renderCard","handleDragOver","e","preventDefault","currentTarget","handleDragLeave","handleDrop","onDragLeave","flex","flexDirection","minHeight","card","_extends","id","dataTransfer","setData","KanbanBoard","columns","onMoveCard","onAddCard","overflowX","col","cardId","getData","from","useKanban","initialColumns","setColumns","useState","moveCard","useCallback","fromCol","toCol","prev","next","find","c","to","idx","findIndex","String","splice","push","addCard","colId","Date","now","removeCard","filter","SUPPORTED_LANGUAGES","messages","en","zh","ja","ko","currentLang","setLanguage","l","includes","getLanguage","t","k"],"mappings":"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"}
|
package/dist/styles.css
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
.qkb-card:hover{box-shadow:0 4px 12px rgba(0,0,0,.08)!important;transform:translateY(-1px)}.qkb-card:active{box-shadow:0 8px 24px rgba(0,0,0,.12)!important;cursor:grabbing!important}.qkb-board::-webkit-scrollbar{height:6px}.qkb-board::-webkit-scrollbar-thumb{background:#d4d4d8;border-radius:3px}
|
|
2
|
+
/*# sourceMappingURL=styles.css.map */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["kanban.css"],"names":[],"mappings":"AAAA,gBAAgB,+CAAgD,CAAC,0BAA0B,CAC3F,iBAA2C,+CAAA,CAA1B,yBAA0E,CAC3F,8BAA8B,UAAU,CAAC,oCAAoC,kBAAkB,CAAC,iBAAiB","file":"styles.css","sourcesContent":[".qkb-card:hover{box-shadow:0 4px 12px rgba(0,0,0,0.08)!important;transform:translateY(-1px)}\n.qkb-card:active{cursor:grabbing!important;box-shadow:0 8px 24px rgba(0,0,0,0.12)!important}\n.qkb-board::-webkit-scrollbar{height:6px}.qkb-board::-webkit-scrollbar-thumb{background:#d4d4d8;border-radius:3px}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@quantabit/kanban-sdk",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Kanban board with drag-and-drop columns and cards",
|
|
6
|
+
"main": "dist/index.cjs",
|
|
7
|
+
"module": "dist/index.esm.js",
|
|
8
|
+
"types": "types/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./types/index.d.ts",
|
|
12
|
+
"import": "./dist/index.esm.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"sideEffects": [
|
|
17
|
+
"*.css"
|
|
18
|
+
],
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"types",
|
|
22
|
+
"README.md",
|
|
23
|
+
"LICENSE"
|
|
24
|
+
],
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "rollup -c",
|
|
27
|
+
"dev": "rollup -c -w",
|
|
28
|
+
"test": "jest --passWithNoTests",
|
|
29
|
+
"prepublishOnly": "npm run build"
|
|
30
|
+
},
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "https://github.com/quantabit-chain/qbit-sdk.git",
|
|
34
|
+
"directory": "packages/kanban-sdk"
|
|
35
|
+
},
|
|
36
|
+
"keywords": [
|
|
37
|
+
"kanban",
|
|
38
|
+
"board",
|
|
39
|
+
"drag",
|
|
40
|
+
"project-management",
|
|
41
|
+
"react"
|
|
42
|
+
],
|
|
43
|
+
"author": "QuantaBit Team",
|
|
44
|
+
"license": "MIT",
|
|
45
|
+
"engines": {
|
|
46
|
+
"node": ">=18.0.0"
|
|
47
|
+
},
|
|
48
|
+
"peerDependencies": {
|
|
49
|
+
"react": ">=17.0.0",
|
|
50
|
+
"react-dom": ">=17.0.0"
|
|
51
|
+
},
|
|
52
|
+
"dependencies": {
|
|
53
|
+
"@quantabit/sdk-config": "^1.0.6"
|
|
54
|
+
},
|
|
55
|
+
"publishConfig": {
|
|
56
|
+
"access": "public"
|
|
57
|
+
},
|
|
58
|
+
"qbit": {
|
|
59
|
+
"privacy": {
|
|
60
|
+
"level": "functional",
|
|
61
|
+
"dataCollection": "Feature-related data for personalization. Requires user consent.",
|
|
62
|
+
"gdprCompliant": true,
|
|
63
|
+
"ccpaCompliant": true
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
"homepage": "https://github.com/quantabit-chain/qbit-sdk/tree/main/packages/kanban-sdk#readme",
|
|
67
|
+
"bugs": {
|
|
68
|
+
"url": "https://github.com/quantabit-chain/qbit-sdk/issues"
|
|
69
|
+
}
|
|
70
|
+
}
|
package/types/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Type definitions for @quantabit/kanban-sdk
|
|
2
|
+
export declare const KanbanBoard: any;
|
|
3
|
+
export declare const KanbanCard: any;
|
|
4
|
+
export declare const KanbanColumn: any;
|
|
5
|
+
export declare const SUPPORTED_LANGUAGES: any;
|
|
6
|
+
export declare const getLanguage: any;
|
|
7
|
+
export declare const messages: any;
|
|
8
|
+
export declare const setLanguage: any;
|
|
9
|
+
export declare const t: any;
|
|
10
|
+
export declare const useKanban: any;
|