2018-05-02 00:05:36 +00:00
|
|
|
{#if delegateKey}
|
2018-01-28 20:51:48 +00:00
|
|
|
<button type="button"
|
2018-05-02 00:05:36 +00:00
|
|
|
title={label}
|
|
|
|
aria-label={label}
|
2018-12-05 06:31:46 +00:00
|
|
|
aria-pressed={pressable ? !!pressed : void 0}
|
2018-05-02 00:05:36 +00:00
|
|
|
class={computedClass}
|
|
|
|
{disabled}
|
|
|
|
delegate-key={delegateKey}
|
|
|
|
focus-key={focusKey || ''} >
|
|
|
|
<svg class="icon-button-svg {svgClassName || ''}" ref:svg>
|
2018-12-10 08:13:54 +00:00
|
|
|
<use xlink:href={href} />
|
2018-01-28 20:51:48 +00:00
|
|
|
</svg>
|
|
|
|
</button>
|
2018-05-02 00:05:36 +00:00
|
|
|
{:else}
|
2018-01-28 20:51:48 +00:00
|
|
|
<button type="button"
|
2018-05-02 00:05:36 +00:00
|
|
|
title={label}
|
|
|
|
aria-label={label}
|
2018-12-05 06:31:46 +00:00
|
|
|
aria-pressed={pressable ? !!pressed : void 0}
|
2018-05-02 00:05:36 +00:00
|
|
|
class={computedClass}
|
|
|
|
focus-key={focusKey || ''}
|
|
|
|
{disabled}
|
2018-02-28 07:18:07 +00:00
|
|
|
on:click >
|
2018-05-02 00:05:36 +00:00
|
|
|
<svg class="icon-button-svg {svgClassName || ''}" ref:svg>
|
2018-12-10 08:13:54 +00:00
|
|
|
<use xlink:href={href} />
|
2018-01-28 20:51:48 +00:00
|
|
|
</svg>
|
|
|
|
</button>
|
2018-05-02 00:05:36 +00:00
|
|
|
{/if}
|
2018-01-28 20:51:48 +00:00
|
|
|
<style>
|
2018-03-16 15:42:10 +00:00
|
|
|
.icon-button {
|
2018-01-28 20:51:48 +00:00
|
|
|
padding: 6px 10px;
|
|
|
|
background: none;
|
|
|
|
border: none;
|
2018-04-05 04:45:19 +00:00
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
justify-content: center;
|
2018-01-28 20:51:48 +00:00
|
|
|
}
|
|
|
|
|
2018-03-16 15:42:10 +00:00
|
|
|
.icon-button-svg {
|
2018-01-28 20:51:48 +00:00
|
|
|
width: 24px;
|
|
|
|
height: 24px;
|
|
|
|
fill: var(--action-button-fill-color);
|
2018-03-23 03:09:20 +00:00
|
|
|
pointer-events: none; /* hack for Edge */
|
2018-01-28 20:51:48 +00:00
|
|
|
}
|
|
|
|
|
2018-03-16 15:42:10 +00:00
|
|
|
.icon-button.big-icon .icon-button-svg {
|
2018-01-28 20:51:48 +00:00
|
|
|
width: 32px;
|
|
|
|
height: 32px;
|
|
|
|
}
|
|
|
|
|
2018-04-05 04:45:19 +00:00
|
|
|
/*
|
|
|
|
* regular styles
|
|
|
|
*/
|
|
|
|
|
2018-03-16 15:42:10 +00:00
|
|
|
.icon-button:hover .icon-button-svg {
|
2018-01-28 20:51:48 +00:00
|
|
|
fill: var(--action-button-fill-color-hover);
|
|
|
|
}
|
|
|
|
|
2018-03-16 15:42:10 +00:00
|
|
|
.icon-button.not-pressable:active .icon-button-svg {
|
2018-01-28 20:51:48 +00:00
|
|
|
fill: var(--action-button-fill-color-active);
|
|
|
|
}
|
|
|
|
|
2018-03-16 15:42:10 +00:00
|
|
|
.icon-button.pressed .icon-button-svg {
|
2018-03-21 16:38:20 +00:00
|
|
|
fill: var(--action-button-fill-color-pressed);
|
2018-01-28 20:51:48 +00:00
|
|
|
}
|
|
|
|
|
2018-03-16 15:42:10 +00:00
|
|
|
.icon-button.pressed:hover .icon-button-svg {
|
2018-01-28 20:51:48 +00:00
|
|
|
fill: var(--action-button-fill-color-pressed-hover);
|
|
|
|
}
|
|
|
|
|
2018-03-16 15:42:10 +00:00
|
|
|
.icon-button.pressed:active .icon-button-svg {
|
2018-01-28 20:51:48 +00:00
|
|
|
fill: var(--action-button-fill-color-pressed-active);
|
|
|
|
}
|
2018-04-05 04:45:19 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* 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);
|
|
|
|
}
|
|
|
|
|
2019-02-03 07:03:40 +00:00
|
|
|
/*
|
|
|
|
* disable the separate press color (noPressColor)
|
|
|
|
*/
|
|
|
|
.icon-button.pressed.no-press-color .icon-button-svg {
|
|
|
|
fill: var(--action-button-fill-color);
|
|
|
|
}
|
|
|
|
|
|
|
|
.icon-button.pressed.no-press-color:hover .icon-button-svg {
|
|
|
|
fill: var(--action-button-fill-color-hover);
|
|
|
|
}
|
|
|
|
|
|
|
|
.icon-button.pressed.no-press-color:active .icon-button-svg {
|
|
|
|
fill: var(--action-button-fill-color-active);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-02-24 22:49:28 +00:00
|
|
|
</style>
|
|
|
|
<script>
|
2018-03-15 01:52:33 +00:00
|
|
|
import { classname } from '../_utils/classname'
|
2018-03-23 03:23:00 +00:00
|
|
|
import { store } from '../_store/store'
|
2018-03-15 01:52:33 +00:00
|
|
|
|
2018-02-24 22:49:28 +00:00
|
|
|
export default {
|
2018-04-30 05:13:41 +00:00
|
|
|
data: () => ({
|
|
|
|
big: false,
|
|
|
|
muted: false,
|
|
|
|
disabled: false,
|
|
|
|
svgClassName: void 0,
|
|
|
|
focusKey: void 0,
|
|
|
|
pressable: false,
|
|
|
|
pressed: false,
|
|
|
|
className: void 0,
|
2019-02-03 07:03:40 +00:00
|
|
|
delegateKey: void 0,
|
|
|
|
noPressColor: false
|
2018-04-30 05:13:41 +00:00
|
|
|
}),
|
2018-03-23 03:23:00 +00:00
|
|
|
store: () => store,
|
2018-02-24 22:49:28 +00:00
|
|
|
computed: {
|
2019-02-03 07:03:40 +00:00
|
|
|
computedClass: ({ pressable, pressed, big, muted, noPressColor, className }) => {
|
2018-03-15 01:52:33 +00:00
|
|
|
return classname(
|
2018-02-24 22:49:28 +00:00
|
|
|
'icon-button',
|
|
|
|
!pressable && 'not-pressable',
|
|
|
|
pressed && 'pressed',
|
|
|
|
big && 'big-icon',
|
2018-04-05 04:45:19 +00:00
|
|
|
muted && 'muted-style',
|
2019-02-03 07:03:40 +00:00
|
|
|
noPressColor && 'no-press-color',
|
2018-03-03 05:55:04 +00:00
|
|
|
className
|
2018-03-15 01:52:33 +00:00
|
|
|
)
|
2018-02-24 22:49:28 +00:00
|
|
|
}
|
2018-04-21 15:32:40 +00:00
|
|
|
},
|
|
|
|
methods: {
|
|
|
|
animate (animation) {
|
|
|
|
let { reduceMotion } = this.store.get()
|
|
|
|
if (!animation || reduceMotion) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
let svg = this.refs.svg
|
2018-08-30 04:42:57 +00:00
|
|
|
let animations = animation.map(({ properties, options }) => svg.animate(properties, options))
|
2018-04-21 15:32:40 +00:00
|
|
|
animations.forEach(anim => anim.play())
|
|
|
|
}
|
2018-02-24 22:49:28 +00:00
|
|
|
}
|
|
|
|
}
|
2018-12-05 06:31:46 +00:00
|
|
|
</script>
|