src/css/media-grid.css

HLF Media Grid Extension

Source | Tests

The required extension styling is crucial to extension usage. There's an optional, opinionated set of styles in mg-theme-folio.

Note that --mg-item-expanded-scale is set to 2 and other values are not yet supported. This also requires the item count be enough to form at least two rows.

js-mg is modified with the -dimmed and -ready classes. Note it sets box-sizing: border-box for itself and its descendants, and the (initial) flex-box positioning.

.js-mg { --mg-duration: 0.4s; --mg-fade-duration: 0.3s; --mg-gutter-size: 6px; --mg-fill-color: #333; --mg-item-expanded-scale: 2; --mg-item-fill-color: #000; --mg-item-height: 232px; --mg-item-stroke-color: #fff; --mg-item-transition: var(--mg-duration) cubic-bezier(0.8, 0, 0.2, 1); --mg-item-width: 212px; background: var(--mg-fill-color); display: flex; flex-wrap: wrap; margin-left: var(--mg-gutter-size); margin-top: var(--mg-gutter-size); min-width: calc((var(--mg-item-width) + var(--mg-gutter-size)) * var(--mg-item-expanded-scale)); opacity: 0; position: relative; transition: opacity var(--mg-fade-duration) ease-in-out; } .js-mg *, .js-mg { box-sizing: border-box; } .js-mg.mg-bleed { margin-left: 0; margin-right: calc(-1 * var(--mg-gutter-size)); } .js-mg.js-mg-ready { opacity: 1; }

js-mg-item can be modified with the -expanded, -focused, -transitioning classes. Note the (initial) flex-box positioning, as well as the complex z-index rules when the item has modifier classes.

Its element's DOM can look like (especially if using mg-theme-folio):

<article class="js-mg-item">
  <section class="mg-preview"><!-- hidden when expanded -->
    <img src="..." />
    <div class="mg-headings">
      <h1 class="mg-title">...</h1>
      <h2 class="mg-date">...</h2>
    </div>
    <ul class="mg-tags">
      <li>...</li>
      <li>...</li>
    </ul>
  </section>
  <section class="mg-detail"><!-- visible when expanded -->
    <img src="..." />
    <div class="mg-headings">
      <h1 class="mg-title">...</h1>
      <h2 class="mg-date">...</h2>
    </div>
    <p>...</p>
    <ul class="mg-tags">
      <li>...</li>
      <li>...</li>
    </ul>
  </section>
</article>
.js-mg-item { background: var(--mg-item-fill-color); color: var(--mg-item-stroke-color); flex-basis: var(--mg-item-width); flex-shrink: 0; margin-bottom: var(--mg-gutter-size); margin-right: var(--mg-gutter-size); overflow: hidden; padding: var(--mg-gutter-size); transition: height var(--mg-item-transition), left var(--mg-item-transition), top var(--mg-item-transition), transform var(--mg-item-transition), width var(--mg-item-transition), opacity var(--mg-fade-duration) ease-in-out; } .js-mg-item.js-mg-contracting, .js-mg-item:not(.js-mg-expanding) { height: var(--mg-item-height); width: var(--mg-item-width); } .js-mg-item.js-mg-expanding, .js-mg-item.js-mg-expanded:not(.js-mg-contracting) { height: calc(var(--mg-item-height) * var(--mg-item-expanded-scale) + var(--mg-gutter-size)); width: calc(var(--mg-item-width) * var(--mg-item-expanded-scale) + var(--mg-gutter-size)); } .js-mg-item.js-mg-transitioning, .js-mg-item.js-mg-expanded:not(.js-mg-transitioning) { z-index: 10; } .js-mg-item.js-mg-transitioning.js-mg-focused, .js-mg-item.js-mg-expanded:not(.js-mg-transitioning).js-mg-focused { z-index: 11; } .js-mg-dimmed > .js-mg-item:not(.js-mg-transitioning):not(.js-mg-expanded) { opacity: 0.3; } .js-mg-item:not(.js-mg-transitioning):not(.js-mg-expanded):hover { background: var(--mg-item-stroke-color); color: var(--mg-item-fill-color); } .js-mg-item.js-mg-recessed { opacity: 0; transform: scale(0.9); } .js-mg-item.js-mg-raw { display: none; } .js-mg-item > .mg-preview, .js-mg-item > .mg-detail { height: calc(100% - 2 * var(--mg-gutter-size)); overflow: hidden; position: absolute; top: var(--mg-gutter-size); transition: opacity var(--mg-fade-duration) ease-out; width: calc(100% - 2 * var(--mg-gutter-size)); } .js-mg-item > .mg-preview > img:first-child, .js-mg-item > .mg-detail > img:first-child { width: 100%; } .js-mg-item.js-mg-expanded:not(.js-mg-contracting) > .mg-detail, .js-mg-item:not(.js-mg-transitioning):not(.js-mg-expanded) > .mg-preview { display: block; } .js-mg-item.js-mg-expanded:not(.js-mg-contracting) > .mg-preview, .js-mg-item:not(.js-mg-transitioning):not(.js-mg-expanded) > .mg-detail { display: none; opacity: 0; } .js-mg-item.js-mg-transitioning > .mg-preview, .js-mg-item.js-mg-transitioning > .mg-detail { display: block; } .js-mg-item.js-mg-contracting > .mg-detail, .js-mg-item.js-mg-expanding > .mg-preview { opacity: 0; } .js-mg-item.js-mg-contracting > .mg-preview, .js-mg-item.js-mg-expanding > .mg-detail { opacity: 1; } .mg-theme-folio { --mg-item-corner-radius: 4px; --mg-item-font-size: 10px; } .mg-theme-folio .js-mg-item { border-radius: var(--mg-item-corner-radius); font-family: Helvetica, sans-serif; font-size: var(--mg-item-font-size); line-height: 2em; } .mg-theme-folio .js-mg-item p { line-height: 1.6em; } .mg-theme-folio .js-mg-item p { transition: opacity var(--mg-fade-duration) ease-out, transform var(--mg-fade-duration) ease-in-out; } .mg-theme-folio .js-mg-item.js-mg-transitioning p { transform: translateY(20%); opacity: 0; } .mg-theme-folio .js-mg-item .mg-title { font-size: 1.4em; font-weight: normal; margin: 0; padding: 0; } .mg-theme-folio .js-mg-item .mg-date { font-size: var(--mg-item-font-size); font-weight: normal; margin: 0; padding: 0; } .mg-theme-folio .js-mg-item:not(.js-mg-expanded) .mg-title { overflow-x: hidden; text-overflow: ellipsis; white-space: nowrap; } .mg-theme-folio .js-mg-item.js-mg-transitioning .mg-headings, .mg-theme-folio .js-mg-item.js-mg-expanded:not(.js-mg-transitioning) .mg-headings { display: flex; } .mg-theme-folio .js-mg-item.js-mg-transitioning .mg-headings > .mg-title, .mg-theme-folio .js-mg-item.js-mg-expanded:not(.js-mg-transitioning) .mg-headings > .mg-title { flex-grow: 1; } .mg-theme-folio .js-mg-item.js-mg-transitioning .mg-headings > .mg-date, .mg-theme-folio .js-mg-item.js-mg-expanded:not(.js-mg-transitioning) .mg-headings > .mg-date { margin-left: 1em; white-space: nowrap; } .mg-theme-folio .js-mg-item .mg-tags { list-style: none; padding-left: 0; } .mg-theme-folio .mg-tags li { display: inline; } .mg-theme-folio .mg-tags li > a { color: inherit; } .mg-theme-folio .mg-tags li:not(:last-child)::after { content: ',\0020'; }