2026-06-12 02:03:09 +08:00
( function ( global , factory ) {
typeof exports === "object" && typeof module !== "undefined" ? factory ( exports ) : typeof define === "function" && define . amd ? define ( [ "exports" ] , factory ) : ( global = typeof globalThis !== "undefined" ? globalThis : global || self , factory ( global . ApigoKanban = { } ) ) ;
} ) ( this , function ( exports2 ) {
"use strict" ; var _ _typeError = ( msg ) => {
2026-05-29 22:50:37 +08:00
throw TypeError ( msg ) ;
} ;
var _ _accessCheck = ( obj , member , msg ) => member . has ( obj ) || _ _typeError ( "Cannot " + msg ) ;
var _ _privateGet = ( obj , member , getter ) => ( _ _accessCheck ( obj , member , "read from private field" ) , getter ? getter . call ( obj ) : member . get ( obj ) ) ;
var _ _privateAdd = ( obj , member , value ) => member . has ( obj ) ? _ _typeError ( "Cannot add the same private member more than once" ) : member instanceof WeakSet ? member . add ( obj ) : member . set ( obj , value ) ;
var _ _privateSet = ( obj , member , value , setter ) => ( _ _accessCheck ( obj , member , "write to private field" ) , setter ? setter . call ( obj , value ) : member . set ( obj , value ) , value ) ;
var _ _privateMethod = ( obj , member , method ) => ( _ _accessCheck ( obj , member , "access private method" ) , method ) ;
2026-06-12 02:03:09 +08:00
var _data , _Kanban _instances , render _fn , initDragAndDrop _fn , moveItem _fn ;
class Kanban extends HTMLElement {
constructor ( ) {
super ( ) ;
_ _privateAdd ( this , _Kanban _instances ) ;
_ _privateAdd ( this , _data , [ ] ) ;
this . attachShadow ( { mode : "open" } ) ;
}
connectedCallback ( ) {
_ _privateMethod ( this , _Kanban _instances , render _fn ) . call ( this ) ;
}
get data ( ) {
return _ _privateGet ( this , _data ) ;
}
set data ( value ) {
_ _privateSet ( this , _data , value ) ;
_ _privateMethod ( this , _Kanban _instances , render _fn ) . call ( this ) ;
}
2026-05-29 22:50:37 +08:00
}
2026-06-12 02:03:09 +08:00
_data = new WeakMap ( ) ;
_Kanban _instances = new WeakSet ( ) ;
render _fn = function ( ) {
const style = `
2026-05-29 22:50:37 +08:00
: host {
display : flex ;
gap : 16 px ;
padding : 16 px ;
overflow - x : auto ;
font - family : system - ui , - apple - system , sans - serif ;
}
. column {
background : # f1f2f4 ;
border - radius : 8 px ;
width : 280 px ;
min - width : 280 px ;
display : flex ;
flex - direction : column ;
max - height : 100 % ;
}
. column - header {
padding : 12 px ;
font - weight : bold ;
display : flex ;
justify - content : space - between ;
align - items : center ;
}
. items - container {
flex : 1 ;
padding : 8 px ;
min - height : 50 px ;
}
. item {
background : white ;
border - radius : 4 px ;
padding : 12 px ;
margin - bottom : 8 px ;
box - shadow : 0 1 px 3 px rgba ( 0 , 0 , 0 , 0.1 ) ;
cursor : grab ;
}
. item : active {
cursor : grabbing ;
}
. item . dragging {
opacity : 0.5 ;
}
. items - container . drag - over {
background : rgba ( 0 , 0 , 0 , 0.05 ) ;
}
` ;
2026-06-12 02:03:09 +08:00
this . shadowRoot . innerHTML = `
2026-05-29 22:50:37 +08:00
< style > $ { style } < / s t y l e >
$ { _ _privateGet ( this , _data ) . map ( ( col ) => `
< div class = "column" data - id = "${col.id}" >
< div class = "column-header" >
< span > $ { col . title } < / s p a n >
< / d i v >
< div class = "items-container" data - column - id = "${col.id}" >
$ { ( col . items || [ ] ) . map ( ( item ) => `
< div class = "item" draggable = "true" data - id = "${item.id}" data - column - id = "${col.id}" >
$ { item . content }
< / d i v >
` ).join("")}
< / d i v >
< / d i v >
` ).join("")}
` ;
2026-06-12 02:03:09 +08:00
_ _privateMethod ( this , _Kanban _instances , initDragAndDrop _fn ) . call ( this ) ;
} ;
initDragAndDrop _fn = function ( ) {
const items = this . shadowRoot . querySelectorAll ( ".item" ) ;
const containers = this . shadowRoot . querySelectorAll ( ".items-container" ) ;
items . forEach ( ( item ) => {
item . addEventListener ( "dragstart" , ( e ) => {
item . classList . add ( "dragging" ) ;
e . dataTransfer . setData ( "text/plain" , JSON . stringify ( {
itemId : item . dataset . id ,
fromColumnId : item . dataset . columnId
} ) ) ;
} ) ;
item . addEventListener ( "dragend" , ( ) => {
item . classList . remove ( "dragging" ) ;
} ) ;
2026-05-29 22:50:37 +08:00
} ) ;
2026-06-12 02:03:09 +08:00
containers . forEach ( ( container ) => {
container . addEventListener ( "dragover" , ( e ) => {
e . preventDefault ( ) ;
container . classList . add ( "drag-over" ) ;
} ) ;
container . addEventListener ( "dragleave" , ( ) => {
container . classList . remove ( "drag-over" ) ;
} ) ;
container . addEventListener ( "drop" , ( e ) => {
e . preventDefault ( ) ;
container . classList . remove ( "drag-over" ) ;
const dragData = JSON . parse ( e . dataTransfer . getData ( "text/plain" ) ) ;
_ _privateMethod ( this , _Kanban _instances , moveItem _fn ) . call ( this , dragData . itemId , dragData . fromColumnId , container . dataset . columnId ) ;
} ) ;
2026-05-29 22:50:37 +08:00
} ) ;
2026-06-12 02:03:09 +08:00
} ;
moveItem _fn = function ( itemId , fromColumnId , toColumnId ) {
if ( fromColumnId === toColumnId ) return ;
const fromCol = _ _privateGet ( this , _data ) . find ( ( c ) => c . id === fromColumnId ) ;
const toCol = _ _privateGet ( this , _data ) . find ( ( c ) => c . id === toColumnId ) ;
const itemIndex = fromCol . items . findIndex ( ( i ) => i . id === itemId ) ;
const [ item ] = fromCol . items . splice ( itemIndex , 1 ) ;
toCol . items . push ( item ) ;
_ _privateMethod ( this , _Kanban _instances , render _fn ) . call ( this ) ;
this . dispatchEvent ( new CustomEvent ( "@update" , {
detail : _ _privateGet ( this , _data ) ,
bubbles : true ,
composed : true
} ) ) ;
} ;
customElements . define ( "web-kanban" , Kanban ) ;
if ( typeof globalThis !== "undefined" && globalThis . Component ) {
globalThis . Component . register ( "Kanban" , ( container ) => {
const kanban = document . createElement ( "web-kanban" ) ;
container . appendChild ( kanban ) ;
container . kanbanInstance = kanban ;
container . state . _ _watch ( "data" , ( val ) => kanban . data = val ) ;
if ( container . state . data ) kanban . data = container . state . data ;
kanban . addEventListener ( "@update" , ( e ) => {
container . state . data = e . detail ;
container . dispatchEvent ( new CustomEvent ( "update" , { detail : e . detail } ) ) ;
} ) ;
2026-05-29 22:50:37 +08:00
} ) ;
2026-06-12 02:03:09 +08:00
}
if ( typeof globalThis !== "undefined" ) {
globalThis . Kanban = Kanban ;
}
exports2 . Kanban = Kanban ;
Object . defineProperty ( exports2 , Symbol . toStringTag , { value : "Module" } ) ;
} ) ;