<template id="card-template">
  <style>
    .card {
      display: flex;
      font-family: Arial;
      background: #fff;
      box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); 
      width: 300px;
      height: 150px;
      margin: 20px 10px;
      padding-right: 20px;
      border-radius: 4px;
      overflow: hidden;
    }
    
    .picture {
      margin-right: 20px;
    }
    
    h1 {
      font-size: 24px;
      color: #34495e;
      margin: 20px 0 10px;
    }
    
    p {
      color: #2c3e50;
      margin: 0;
      font-size: 12px;
    }
    
    /* Afecta la imagen por defecto que está definida en el Web Component */
    img {
      width: 100%;
      height: 150px;
      object-fit: cover;
      border-right: 5px solid navy;
    }
  </style>  
  <div class="card">
    <div class="picture">
      <slot name="image">
        <img src="https://placeimg.com/640/480/people" />
      </slot>
    </div>
    <div class="content">
      <h1><slot name="title"/></h1>
      <p><slot name="description"></slot></p>
    </div>
  </div>
</template>

<div class="card-list">
  <beauty-card>
    <span slot="title">La Floresta</span>
    <span slot="description">La Estación Floresta es la quinta de la Línea B del Metro de Medellín del centro al occidente y la tercera en sentido inverso. 
  </beauty-card>
    
  <beauty-card>
    <span slot="image">
      <img src="https://placeimg.com/640/480/animals" />
    </span>
          
    <span slot="title">San Javier</span>
    <span slot="description">La Estación San Javier es la séptima y última estación de la línea B del Metro de Medellín, así como la primera de la línea J.</span>
  </beauty-card>
    
  <beauty-card>
    <span slot="image">
      <img src="https://placeimg.com/640/480/arch" />
    </span>
    <span slot="title">Santa Lucia</span>
    <span slot="description">La Estación Santa Lucía es la sexta estación de la línea B del Metro de Medellín del centro al occidente y la segunda en sentido contrario.</span>
  </beauty-card>
</div>
body {
  background: #ecf0f1;
}

.card-list {
  display: flex;
  flex-wrap: wrap;
}

/* Afecta la imagen que se envió mediante el slot en el Web Component */
beauty-card img {
  width: 100%;
  height: 150px;
  object-fit: cover;
  border-right: 5px dashed tomato;
}
class BeautyCard extends HTMLElement {
  constructor() {
    super();
    this._tplContent = document.getElementById('card-template').content;
    this._shadowRoot = this.attachShadow({ mode: 'closed'});
  }
  
  connectedCallback() {
    this._shadowRoot.appendChild(this._tplContent.cloneNode(true));
  }
}



customElements.define('beauty-card', BeautyCard);
Run Pen

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.