blob: 18926baecb12f8ddc8368f5eb58bb521c5f7dcc6 [file] [log] [blame]
<link rel="import" href="../polymer/polymer.html">
<link rel="import" href="../iron-icons/iron-icons.html">
<dom-module id="chops-chip">
<template>
<style>
:host {
vertical-align: top;
font-family: 'Roboto', 'Noto', sans-serif;
font-size: 0.9em;
display: inline-flex;
align-items: center;
flex-direction: row;
flex-wrap: nowrap;
border-radius: 15px;
padding: 0.25em 4px;
margin: 0.25em 2px;
background-color: hsl(0, 0%, 92%);
color: hsl(0, 0%, 13%);
/* Make sure chips with and without images are the same height. */
line-height: var(--chops-chip-img-size);
--chops-chip-img-size: 18px;
--chops-chip-remove-button-size: 15px;
}
img {
border-radius: 50%;
height: var(--chops-chip-img-size);
width: var(--chops-chip-img-size);
}
a {
color: hsl(0, 0%, 13%);
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
iron-icon {
cursor: pointer;
--iron-icon-height: var(--chops-chip-remove-button-size);
--iron-icon-width: var(--chops-chip-remove-button-size);
}
iron-icon:hover {
background-color: hsl(0, 0%, 78%);
border-radius: 50%;
}
.label {
padding: 0 4px;
}
</style>
<template is="dom-if" if="[[imageSrc]]">
<img
src$="[[imageSrc]]"
title$="[[_displayedLabel]]"
role="presentation"
aria-hidden="true"
/>
</template>
<template is="dom-if" if="[[url]]">
<a href$="[[url]]" class="label">[[_displayedLabel]]</a>
</template>
<template is="dom-if" if="[[!url]]">
<span class="label">
[[_displayedLabel]]
</span>
</template>
<iron-icon
icon="clear"
hidden$="[[!removeable]]"
on-click="remove"
></iron-icon>
</template>
<script>
'use strict';
/**
* `<chops-chip>` is an element used for displaying a general data chip.
*
* See https://material.io/design/components/chips.html
*
*
* @customElement
* @polymer
* @demo /demo/chops-chip_demo.html
*/
class ChopsChip extends Polymer.Element {
static get is() { return 'chops-chip'; }
static get properties() {
return {
/**
* The data value represented by the chip. We recommend making this
* value unique between chips in a set.
*
* @type String
*/
value: {
type: String,
},
/**
* The text displayed for a given chip. Defaults to displaying value
* if no label is specified.
*
* @type String
*/
label: {
type: String,
},
/**
* An optional url for a link to an image to be displayed on the chip.
*
* @type String
*/
imageSrc: {
type: String,
value: '',
},
/**
* An optional value for the text in the chip to be linked to.
*
* @type String
*/
url: {
type: String,
value: '',
},
/**
* If true, a 'remove' icon will be visible and fire 'remove' on click.
*
* @type Boolean
*/
removeable: {
type: Boolean,
value: false,
},
_displayedLabel: {
type: String,
computed: '_computeDisplayedLabel(value, label)',
},
}
}
/** Fires 'remove-chip' event. */
remove(e) {
this.dispatchEvent(new CustomEvent('remove-chip', {
detail: {value: this.value}
}));
}
_computeDisplayedLabel(value, label) {
return label || value;
}
/**
* Fired when someone attempts to remove a chip.
*
* @event remove-chip
* @param {Object} value string containing the value for the chip.
*/
}
customElements.define(ChopsChip.is, ChopsChip);
</script>
<dom-module>