anchor.diff:     }
   }
   
  +class AddClass extends AttrCore{
  +  
  +    AddClass(){
  +      this.meta('id','AddClass');
  +
  +      this.makePort('in:class');
  +      
  +      this.port('in:val').forceCondition((n){ return Valids.exist(this.elem); })
  +      this.port('in:val').forceCondition(Valids.isString);
  +      this.port('in:val').tap((n){
  +        this.elem.classes.add(n.data);
  +      });
  +    }
  +}
  +
  +class RemoveClass extends AttrCore{
  +
  +    RemoveClass(){
  +      this.meta('id','RemoveClass');
  +
  +      this.makePort('in:val');
  +      this.makePort('out:success');
  +      this.makePort('err:failed');
  +
  +      this.port('in:val').forceCondition((n){ return Valids.exist(this.elem); });
  +      this.port('in:val').tap((n){
  +          if(!this.elem.classes.contains(n.data)) return this.port('err:failed').send(n);
  +          this.elem.remove(n.data);
  +          this.port('out:success').send(n);
  +      });
  +    }
  +
  +}
  +
  +class GetDataAttr extends AttrCore{
  +
  +    GetDataAttr(){
  +      this.meta('id','GetDataAttr');
  +
  +      this.makePort('in:get');
  +      this.makePort('out:val');
  +
  +      this.port('in:get').forceCondition((n){ return Valids.exist(this.elem); });
  +      this.port('in:get').forceCondition(Valids.isString);
  +
  +      this.port('in:get').tap((n){
  +         Funcs.when(this.elem.dataset.containsKey(n.data),(){
  +           this.port('out:val').send(this.elem.dataset[n.data]);
  +         });
  +      });
  +
  +    }
  +}
  +
  +class SetDataAttr extends AttrCore{
  +
  +    SetDataAttr(){
  +      this.meta('id','SetDataAttr');
  +
  +      this.makePort('in:set');
  +      this.makePort('out:val');
  +
  +      this.port('in:set').forceCondition(Elements.elementExist(this.elem));
  +      this.port('in:set').forceCondition(Valids.isString);
  +
  +      this.port('in:set').tap((n){
  +          
  +      });
  +
  +    }
  +}
  +
  +class DataAttr extends AttrCore{
  +
  +    DataAttr(){
  +      this.meta('id','DataAttr');
  +      this.enableSubnet();
  +
  +      this.makePort('in:get');
  +      this.makePort('in:set');
  +      this.makePort('out:res');
  +
  +      this.network.add('elements/GetDataAttr',(com){
  +
  +      });
  +
  +      this.network.add('elements/SetDataAttr',(com){
  +
  +      });
  +
  +    }
  +}
  +
  +
   class Element extends Component{
     html.Element elem;
     
  
positive.code: 
      this.port('in:get').forceCondition(Valids.isString);
      this.port('in:beat').tap(beat);
      
  
    }
  
  
negative.code:    static create() => new Attr();
  
     Attr(): super('Attr'){
       this.removeDefaultPorts();
       this.enableSubnet();
       
  