@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 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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"}
@@ -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
+ }
@@ -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;