144 lines
		
	
	
		
			No EOL
		
	
	
		
			3.5 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			No EOL
		
	
	
		
			3.5 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
{{#if delegateKey}}
 | 
						|
  <button type="button"
 | 
						|
          title={{label}}
 | 
						|
          aria-label={{label}}
 | 
						|
          aria-pressed={{pressable ? !!pressed : ''}}
 | 
						|
          class={{computedClass}}
 | 
						|
          :disabled
 | 
						|
          delegate-key={{delegateKey}}
 | 
						|
          focus-key={{focusKey || ''}} >
 | 
						|
    <svg class="icon-button-svg {{svgClassName || ''}}" ref:svg>
 | 
						|
      <use xlink:href={{href}} />
 | 
						|
    </svg>
 | 
						|
  </button>
 | 
						|
{{else}}
 | 
						|
  <button type="button"
 | 
						|
          title={{label}}
 | 
						|
          aria-label={{label}}
 | 
						|
          aria-pressed={{pressable ? !!pressed : ''}}
 | 
						|
          class={{computedClass}}
 | 
						|
          focus-key={{focusKey || ''}}
 | 
						|
          :disabled
 | 
						|
          on:click >
 | 
						|
    <svg class="icon-button-svg {{svgClassName || ''}}" ref:svg>
 | 
						|
      <use xlink:href={{href}} />
 | 
						|
    </svg>
 | 
						|
  </button>
 | 
						|
{{/if}}
 | 
						|
<style>
 | 
						|
  .icon-button {
 | 
						|
    padding: 6px 10px;
 | 
						|
    background: none;
 | 
						|
    border: none;
 | 
						|
    display: flex;
 | 
						|
    align-items: center;
 | 
						|
    justify-content: center;
 | 
						|
  }
 | 
						|
 | 
						|
  .icon-button-svg {
 | 
						|
    width: 24px;
 | 
						|
    height: 24px;
 | 
						|
    fill: var(--action-button-fill-color);
 | 
						|
    pointer-events: none; /* hack for Edge */
 | 
						|
  }
 | 
						|
 | 
						|
  .icon-button.big-icon .icon-button-svg {
 | 
						|
    width: 32px;
 | 
						|
    height: 32px;
 | 
						|
  }
 | 
						|
 | 
						|
  /*
 | 
						|
   * regular styles
 | 
						|
   */
 | 
						|
 | 
						|
  .icon-button:hover .icon-button-svg {
 | 
						|
    fill: var(--action-button-fill-color-hover);
 | 
						|
  }
 | 
						|
 | 
						|
  .icon-button.not-pressable:active .icon-button-svg {
 | 
						|
    fill: var(--action-button-fill-color-active);
 | 
						|
  }
 | 
						|
 | 
						|
  .icon-button.pressed .icon-button-svg {
 | 
						|
    fill: var(--action-button-fill-color-pressed);
 | 
						|
  }
 | 
						|
 | 
						|
  .icon-button.pressed:hover .icon-button-svg {
 | 
						|
    fill: var(--action-button-fill-color-pressed-hover);
 | 
						|
  }
 | 
						|
 | 
						|
  .icon-button.pressed:active .icon-button-svg {
 | 
						|
    fill: var(--action-button-fill-color-pressed-active);
 | 
						|
  }
 | 
						|
 | 
						|
  /*
 | 
						|
   * muted
 | 
						|
   */
 | 
						|
 | 
						|
  .icon-button.muted-style .icon-button-svg {
 | 
						|
    fill: var(--action-button-deemphasized-fill-color);
 | 
						|
  }
 | 
						|
 | 
						|
  .icon-button.muted-style:hover .icon-button-svg {
 | 
						|
    fill: var(--action-button-deemphasized-fill-color-hover);
 | 
						|
  }
 | 
						|
 | 
						|
  .icon-button.muted-style.not-pressable:active .icon-button-svg {
 | 
						|
    fill: var(--action-button-deemphasized-fill-color-active);
 | 
						|
  }
 | 
						|
 | 
						|
  .icon-button.muted-style.pressed .icon-button-svg {
 | 
						|
    fill: var(--action-button-deemphasized-fill-color-pressed);
 | 
						|
  }
 | 
						|
 | 
						|
  .icon-button.muted-style.pressed:hover .icon-button-svg {
 | 
						|
    fill: var(--action-button-deemphasized-fill-color-pressed-hover);
 | 
						|
  }
 | 
						|
 | 
						|
  .icon-button.muted-style.pressed:active .icon-button-svg {
 | 
						|
    fill: var(--action-button-deemphasized-fill-color-pressed-active);
 | 
						|
  }
 | 
						|
 | 
						|
</style>
 | 
						|
<script>
 | 
						|
  import { classname } from '../_utils/classname'
 | 
						|
  import { store } from '../_store/store'
 | 
						|
 | 
						|
  export default {
 | 
						|
    data: () => ({
 | 
						|
      big: false,
 | 
						|
      muted: false,
 | 
						|
      disabled: false,
 | 
						|
      svgClassName: void 0,
 | 
						|
      focusKey: void 0,
 | 
						|
      pressable: false,
 | 
						|
      pressed: false,
 | 
						|
      className: void 0,
 | 
						|
      delegateKey: void 0
 | 
						|
    }),
 | 
						|
    store: () => store,
 | 
						|
    computed: {
 | 
						|
      computedClass: (pressable, pressed, big, muted, className) => {
 | 
						|
        return classname(
 | 
						|
          'icon-button',
 | 
						|
          !pressable && 'not-pressable',
 | 
						|
          pressed && 'pressed',
 | 
						|
          big && 'big-icon',
 | 
						|
          muted && 'muted-style',
 | 
						|
          className
 | 
						|
        )
 | 
						|
      }
 | 
						|
    },
 | 
						|
    methods: {
 | 
						|
      animate (animation) {
 | 
						|
        let { reduceMotion } = this.store.get()
 | 
						|
        if (!animation || reduceMotion) {
 | 
						|
          return
 | 
						|
        }
 | 
						|
        let svg = this.refs.svg
 | 
						|
        let animations = animation.map(({properties, options}) => svg.animate(properties, options))
 | 
						|
        animations.forEach(anim => anim.play())
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
</script> |