SKY MODULE - radio button and radio button group
<!-- accessibility handling not implemented yet, pending mojo service -->

<!-- <radio> -->
<template id="radio-shadow">
 <style>
  :host { width: 1em; height: 1em; border: solid; background: white; }
  :host[checked] { background: black; }
 </style>
</template>
<script>
 module.exports.RadioElement = module.registerElement(
   class extends Element {
     static get tagName() { return 'radio'; }
     static get shadow() { return true; }
     constructor (hostModule) {
       super(hostModule);
       this.addEventListener('click', (event) => this.checked = true);
       this.shadowRoot.append(module.document.findId('radio-shadow').content.cloneNode(true));
     }
     get checked () {
       return this.hasAttribute('checked');
     }
     set checked (value) {
       if (value)
         this.setAttribute('checked', '');
       else
         this.removeAttribute('checked');
     }
     get value () {
       return this.getAttribute('name');
     }
     set value (value) {
       this.setAttribute('value', value);
     }
     attributeChanged(name, oldValue, newValue) {
       if ((name == 'checked') && (newValue != null))
         if (this.parentNode instanceof module.exports.RadioGroupElement)
           this.parentNode.setChecked(this);
     }
   }
 );
</script>

<!-- <radiogroup> -->
<template id="radiogroup-shadow">
 <style>
  :host { padding: 1em; border: thin solid; }
 </style>
</template>
<script>
 module.exports.RadioGroupElement = module.registerElement(
   class extends Element {
     static get tagName() { return 'radiogroup'; }
     static get shadow() { return true; }
     constructor (hostModule) {
       super(hostModule);
       this.shadowRoot.append(module.document.findId('radiogroup-shadow').content.cloneNode(true));
     }
     get value () {
       let children = this.getChildNodes();
       for (let child of children)
         if (child instanceof module.exports.RadioElement)
           if (child.checked)
             return child.name;
       return '';
     }
     set value (name) { 
       let children = this.getChildNodes();
       for (let child of children)
         if (child instanceof module.exports.RadioElement)
           if (child.value == name)
             child.checked = true;
     }
     setChecked(radio) {
       if (!((radio instanceof module.exports.Radio) && radio.parentNode == this))
         throw;
       let children = this.getChildNodes();
       for (let child of children)
         if (child instanceof module.exports.RadioElement)
           if (child != radio)
             child.checked = false;
     }
   }
 );
</script>
