The source code

    /**
     * @ignore
     * drag plugin for kissy component
     * @author yiminghe@gmail.com
     */
    KISSY.add('component/plugin/drag', function (S, RichBase, DD) {

        /**
         * drag plugin for kissy component
         *
         *      @example
         *      KISY.use('overlay,component/plugin/drag,dd/plugin/proxy',
         *      function(S,Overlay,DragPlugin,ProxyPlugin){
         *        var o =new Overlay.Dialog({
         *          plugins:[
         *              new DragPlugin({
         *                  handles: [function(){ return o.get('header'); }],
         *                  plugins: [ProxyPlugin]
         *              })
         *          ]
         *        })
         *        // or
         *        o.plug(new DragPlugin({
         *          handles:[function(){ return o.get('header'); }]
         *        });
         *      });
         *
         *
         * @class KISSY.Component.Plugin.Drag
         * @extends KISSY.DD.Draggable
         */
        return DD.Draggable.extend({

            pluginId: 'component/plugin/drag',

            pluginBindUI: function (component) {
                var el = component.get('el'),
                    self = this;
                self.set('node', el);
                // sync
                self.on("dragend", function () {
                    var offset = el.offset();
                    component.setInternal('xy', [offset.left, offset.top]);
                });
            },

            pluginDestructor: function () {
                this.destroy();
            }

        }, {
            ATTRS: {
                move: {
                    value: 1
                }
            }
        });

    }, {
        requires: ['rich-base', 'dd/base']
    });