Giter Site home page Giter Site logo

leifoolsen / mdl-ext Goto Github PK

View Code? Open in Web Editor NEW
112.0 13.0 29.0 30.55 MB

Material Design Lite Ext: Components built with Google Material Design Lite framework. http://leifoolsen.github.io/mdl-ext/

License: Apache License 2.0

JavaScript 32.33% CSS 28.40% HTML 39.28%
material-design material-design-lite sass es6 es2015 javascript

mdl-ext's Introduction

mdl-ext

travis build codecov coverage semantic-release Commitizen friendly version

Material Design Lite Ext (MDLEXT). Components built with the Google Material Design Lite framework. MDLEXT provides the following components.

  • Accordion
    A WAI-ARIA friendly accordion component with vertcial or horizontal layout.
    Note: The accordion has been refactored and is not compatible with accordion prior to version 0.9.13
  • Bordered fields
    The Material Design Lite Ext (MDLEXT) bordered fields component demonstrates how you can create your own theme of MDL text fields.
  • Carousel
    A responsive image carousel.
  • Collapsible
    Accessible collapsible content regions.
  • Color themes
    Material design color themes.
  • Formatfield
    Language sensitive numberformatting.
  • Grid
    A responsive grid based on element queries in favour of media queries.
  • Lightboard
    A lightboard is a translucent surface illuminated from behind, used for situations where a shape laid upon the surface needs to be seen with high contrast. In the "old days" of photography photograpers used a lightboard to get a quick view of, sorting and organizing their slides.
  • Lightbox
    A lightbox displays an image filling the screen, and dimming out the rest of the web page. It acts as a modal dialog using the <dialog> element as a container for the lightbox.
  • Menu Button
    A WAI-ARIA friendly menu button.
  • Selectfield
    The Material Design Lite Ext (MDLEXT) select field component is an enhanced version of the standard HTML <select> element.
  • Sticky Header
    A sticky header makes site navigation easily accessible anywhere on the page and saves content space at the same.

Live demo

A Live demo of MDLEXT is available here

Works with modern browsers. Tested on Edgde, IE11. Firefox: OSX, Ubuntu. Opera: OSX. Safari: OSX, IOS. Chrome: Win, Ubuntu, OSX, IOS, Android.

Introduction

The MDLEXT component library is built with responsiveness in mind. The pre built CSS provided in the lib directory therefore comes in two versions; one based on media queries and one based on element queries, using eq.js. If you build the CSS from SASS, just import the correct sass file, mdl-ext.scss or mdl-ext-eqjs.scss.

Responsive breakpoints

A common metod in responsive design is to use media queries to apply styles based on device characteristics. The problem with media queries is that they relates to the viewport - so every time you write a media query for max-width or min-width, you’re connecting the appearance of your module to the width of the entire canvas, not the part of the canvas the component occupies.

Media queries are a hack

Some developers claim that media queries are a hack, and I totally agree! Imagine a design with a sidebar and a content area. In a responsive, fluent design both the sidebar and the content has "unknown" widths. Trying to add e.g. a responsive grid into the content area which relies on media queries, where you have no knowledge of how much space your content occupies, is in my opinion almost an impossible task.

Element queries to the rescue

An element query is similar to a media query in that, if a condition is met, some CSS will be applied. Element query conditions (such as min-width, max-width, min-height and max-height) are based on elements, instead of the browser viewport. Unfortunately, CSS doesn’t yet support element queries, but there are a couple of JavaScript-based polyfrills involving various syntaxes. They are not standard - but that should not stop us from using them. Element-first design is the spirit of the Atomic design principle, but looks very different in practice than how most people implement Atomic design using their mobile-first mindset. Instead of writing styles on advance for every conceivable situation a widget may find itself in, we are able to allow individual parts of the layout to adapt responsively when those elements require it.

Some of the polyfrills available are:

These are all good libraries, and they serve the purpose. After some evaluation I decided to go for eq.js. It is a small library with support for width based breakpoints. It works without requiring a server to run (no Ajax stuff). It does not break the existing CSS standard. I can use SASS for styling, and it works well in a Webpack workflow.

Install

If you haven't done so already, install Material Design Lite.

$ npm install --save material-design-lite

Install mdl-ext

$ npm install --save mdl-ext

Install eq.js if you choose to use the element query CSS/SASS version.

$ npm install --save eq.js

Getting started

Use it in your (static) page

<!DOCTYPE html>
<html>
<head>
  <title>Material Design Lite Extensions</title>
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:regular,bold,italic,thin,light,bolditalic,black,medium&amp;lang=en">
  <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
  <link rel="stylesheet" href="node_modules/material-design-lite/material.css" />
  <link rel="stylesheet" href="node_modules/mdl-ext/lib/mdl-ext.min.css" />
</head>
<body>
<div class="mdl-layout mdl-js-layout mdl-layout--fixed-drawer">
  <main class="mdl-layout__content">
  </main>
</div>
<script src="https://cdn.polyfill.io/v2/polyfill.min.js"></script>
<script type="text/javascript" src="node_modules/material-design-lite/material.min.js" charset="utf-8"></script>
<script type="text/javascript" src="node_modules/mdl-ext/lib/mdl-ext.min.js" charset="utf-8"></script>
</body>
</html>

Note: You'll probably need several polyfills. If you don't want to waist time writing your own polyfills, the polyfill.io hosted service is a good choice.

<script src="https://cdn.polyfill.io/v2/polyfill.min.js"></script>

Use it with element queries in your (static) page

<!DOCTYPE html>
<html>
<head>
  <title>Material Design Lite Extensions</title>
  <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:regular,bold,italic,thin,light,bolditalic,black,medium&amp;lang=en">
  <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
  <link rel="stylesheet" href="node_modules/material-design-lite/material.css" />
  <link rel="stylesheet" href="node_modules/mdl-ext/lib/mdl-ext-eqjs.min.css" />
</head>
<body>
<div class="mdl-layout mdl-js-layout mdl-layout--fixed-drawer">
  <main class="mdl-layout__content">
  </main>
</div>
<script src="https://cdn.polyfill.io/v2/polyfill.min.js"></script>
<script type="text/javascript" src="node_modules/material-design-lite/material.min.js" charset="utf-8"></script>
<script type="text/javascript" src="node_modules/mdl-ext/lib/mdl-ext.min.js" charset="utf-8"></script>
<script type="text/javascript" src="node_modules/eq.js/dist/eq.min.js" charset="utf-8"></script>
</body>
</html>

Note: Always import mdl-ext css after material css. Adjust path to node_modules (libraries) according to where your HTML file is located.

Use it in your (webpack) build

Import SASS files into your main SCSS file, e.g. ./src/styles.scss

@charset "UTF-8";

// 1.  Configuration and helpers

// MDL image path
$image_path: '~material-design-lite/src/images';

// 2. Vendors

// Import MDL
@import '~material-design-icons/iconfont/material-icons.css';
@import '~roboto-fontface/css/roboto-fontface.css';
@import '~material-design-lite/src/material-design-lite';

// Import MDLEXT
@import '~mdl-ext/src/mdl-ext';

// ... or import mdl-ext-eqjs
//@import '~mdl-ext/src/mdl-ext-eqjs';

// 3. Your stuff
@import 'stylesheets/variables';
@import 'stylesheets/app/whatever';

Import material-design-lite, mdl-ext and styles.scss into your main JavaScript file, e.g. ./scr/index.js

import 'material-design-lite/material';
import 'mdl-ext';
import './styles.scss';

If you choose to use element queries, import eq.js

import eqjs from 'eq.js';
window.eqjs = eqjs; // Put in global scope - for use with script in page

Use of specific components in your (webpack) build

It is possible to use a selection of the provided MDLEXT components. Just import the specific MDLEXT SASS module and the corresponding ES2015 JavaScript component. The following example demonstrates a setup that uses only two of the MDLEXT components; menu-button and selectfield.

Import SASS files into your main SCSS file, e.g. ./src/styles.scss

@charset "UTF-8";

// 1.  Configuration and helpers

// MDL image path
$image_path: '~material-design-lite/src/images';

// Material Design Lite
@import '~material-design-lite/src/variables';
@import '~material-design-lite/src/mixins';

// mdl-ext
@import '~mdl-ext/src/variables';
@import '~mdl-ext/src/mixins';
@import '~mdl-ext/src/functions';

// 2.  Vendors

// Import MDL
@import '~material-design-icons/iconfont/material-icons';
@import '~roboto-fontface/css/roboto/sass/roboto-fontface-light';
@import '~material-design-lite/src/material-design-lite';

// Import required MDLEXT SASS modules
@import '~mdl-ext/src/aria-expanded-toggle/aria-expanded-toggle';
@import '~mdl-ext/src/menu-button/menu-button';
@import '~mdl-ext/src/selectfield/selectfield';

// 3. Your stuff
@import 'stylesheets/variables';
@import 'stylesheets/app/whatever';

Import material-design-lite, mdl-ext components and styles.scss into your main JavaScript file, e.g. ./scr/index.js

import 'material-design-lite/material';

// Import MDLEXT components from the es folder
import 'mdl-ext/es/menu-button/menu-button';
import 'mdl-ext/es/selectfield/selectfield';

import './styles.scss';

You can find a webpack project with this setup in the example-webpack folder. Clone this repo, cd into the example-webpack folder. Run npm install, then run npm start and open a browser @ http://localhost:8080/

Note: The example-webpack project is a stripped down version of the webpack2-boilerplate project. If you need a complete project setup, start with the webpack2 boilerplate or a similar boilerplate project.

Components

Accordion

Accordion

A WAI-ARIA friendly accordion component with vertcial or horizontal layout.

Bordered fields

Bordered fields

The Material Design Lite Ext (MDLEXT) bordered fields component demonstrates how you can create your own theme of MDL text fields.

Carousel

Lightbox

A responsive image carousel.

Collapsible - Collapse All the Things

Collapsed

Collapsible collapsed

Expanded

Collapsible expanded

Accessible collapsible content regions.

Color themes

Palette

The color-themes component demonstrates how you can create your own themes of material design colors.

###Formatfield Formatfield

The formatfield component formats an input field using language sensitive number formatting.

Grid

Grid

A responsive grid based on element queries in favour of media queries.

Lightboard

Lightboard

A lightboard is a translucent surface illuminated from behind, used for situations where a shape laid upon the surface needs to be seen with high contrast. In the "old days" of photography photograpers used a lightboard to get a quick view of, sorting and organizing their slides.

Lightbox

Lightbox

A lightbox displays an image filling the screen, and dimming out the rest of the web page. It acts as a modal dialog using the <dialog> element as a container for the lightbox.

Menu Button

Menu button     Menu button

A menu button is a button that opens a menu. It has roles, attributes and behaviour as outlined in WAI-ARIA Authoring Practices, 2.20 Menu Button.

Selectfield

Selectfield

The Material Design Lite Ext (MDLEXT) select field component is an enhanced version of the standard [HTML <select>] (https://developer.mozilla.org/en/docs/Web/HTML/Element/select) element.

Sticky Header

StickyHeader

A sticky header makes site navigation easily accessible anywhere on the page and saves content space at the same.

The header should auto-hide, i.e. hiding the header automatically when a user starts scrolling down the page and bringing the header back when a user might need it: they reach the bottom of the page or start scrolling up.

Notes

A Live demo of MDLEXT is available here.
You can also download or clone a demo project from here: https://github.com/leifoolsen/mdl-webpack. The demo project demonstrates how you can set up MDL with Babel(6) and Webpack, and how to self host Font Roboto and Material Icons in your web application.

Polyfills you might need:

Using Material Design Lite in a Single Page Application (SPA)

If you use Material Design Lite in a dynamic page, e.g. a single page application, you must call componentHandler.upgradeElement and componentHandler.downgradeElements accordingly to properly initialize an clean up component resources when sections of the page is updated. In a static web application there should be no need to call componentHandler.downgradeElements.

The following code snippet demonstrates how to properly clean up MDL components before removing them from DOM.

// Call 'componentHandler.downgradeElements' to clean up
const content = document.querySelector('#content');
const components = content.querySelectorAll('.is-upgraded');
componentHandler.downgradeElements([...components]);

// Remove elements from DOM.
// See: http://jsperf.com/empty-an-element/16
const removeChildElements = (element, forceReflow = true) => {
  while (element.lastChild) {
    element.removeChild(element.lastChild);
  }
  if(forceReflow) {
    // See: http://jsperf.com/force-reflow
    const d = element.style.display;
    element.style.display = 'none';
    element.style.display = d;
  }
}

removeChildElements(content); 

Licence

© Leif Olsen, 2016. Licensed under an Apache-2 license.

This software is built with the Google Material Design Lite framework, which is licenced under an Apache-2 licence.

mdl-ext's People

Contributors

leifoolsen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mdl-ext's Issues

Accordion Secion Size

Hello Leif,

I played a bit with your accordion - nice work.
While in your examples the opend accordion sections are just big enough to contain their respective content, I somehow managed to create an accordion that always opens its section to the bottom of the browser window. Is there a way to influence this bevaviour deterministically?

Best regards, Bernd

Grid: Rewrite MDL-grid to use element queries in favour of Media-Queries

Element Queries are a new way of writing CSS styles so the rules apply to individual elements on the page, instead of to the whole page as one document like in regular CSS Media Queries.

References:

Will use eq.js since it works well with SASS, and element queries work without requireing a server to run.

Some alternatives:

New feature: Image carousel

Create a MDL based carousel that advance or rotate images in a fixed space

Markup:

  • Use a list to hold each image to display (ul li figure img figcaption)

Features:

  • Navigate carousel using keyboard (arrow keys, tab, pgup, pgdown, home, end), mouse drag, touch or by sending custom events to the carousel (first, scroll-prev, prev, next, scroll-next, last, play, pause)
  • Select a particular image using enter or space key, or by clicking
  • Move images from right to left at a given interval; slideshow
  • Set slideshow interval via a data attribute or as a part of the play custom event
  • Stop slideshow via custom event (pause) or by a user interaction, e.g clicking an image
  • User interactions via keyboard or mouse may be blocked, if configured
  • Start slideshow at page load using a data attribute
  • The carousel should emit custom events reflecting a user action. E.g. clicking an image will emit a 'select' event with a detail object holding a reference to the selected image.
  • The carousel should pause any running animation on window.bur or tab.blur
  • The carousel should pause any running animation when carousel is not i viewport

Limitations:

  • Only horizontal layout in first release

accordion: Add listeners for expand/collapse

A client should be able to send toggle messages to an accordion:

  • expand-all: sets all panels to "open" state
  • collapse-all: removes "open" state from panels
  • open(panel): set open state on a given panel
  • close(panel): removes "open" stat on a given panel
  • toggle(panel): toggles a panels "open" state

Sticky header

A sticky header makes site navigation easily accessible anywhere on the page and saves content space at the same.

The header should auto-hide, i.e. hiding the header automatically when a user starts scrolling down the page and bringing the header back when a user might need it: they reach the bottom of the page or start scrolling up.

Lightboard: Use Element-Queries in favour of Media-Queries

Element Queries are a new way of writing CSS styles so the rules apply to individual elements on the page, instead of to the whole page as one document like in regular CSS Media Queries.

References:

Will use eq.js since it works well with SASS, and element queries work without requireing a server to run.

Some alternatives:

Lightboard layout

A lightboard, also known as a lightbox, is a translucent surface illuminated from behind, used for situations where a shape laid upon the surface needs to be seen with high contrast. In the "old days" of photography photograpers used a lightboard to get a quick view of their slides. The goal is to create a responsive lightbox design, based on flex layout, similar to what is used in Adobe LightRoom to browse images.

carousel: Focus slide on scroll

Improvement: The carousel should focus slide when it receives a scroll command.

  • first: focus first slide in list
  • last: focus last slde in list
  • scroll prev: focus leftmost slide in view
  • scroll-next: focus rightmost slide in view

sticky-header: Add CSS animation

The sticky header should not show or hide itself before abs(scroll distance) >= height of header. Then an animation effect should be used to show/hide the heaer.

Remove global CustomEvent polyfill.

Polyfilling the Customevent constructor for IE11 must be handled per module due to bug in the MDL framework.

Will use a strategy similar to what is provided i the Google Dialog Polyfill.

color-themes: Use accent color for interactive elements

Material Design Lite uses primary color for interactive elements, which is not in line with the Material Design Color guide, https://www.google.com/design/spec/style/color.html#color-color-schemes.

According to the guide this is the correct use:

The accent should be used for the floating action button and interactive elements, such as:

  • Text fields and cursors
  • Text selection
  • Progress bars
  • Selection controls, buttons, and sliders
  • Links

The color-themes component should use the correct definition. All interactive elements in the color-themes component, except buttons, should use accent color.

Implement mdlDowngrade_ to clean up event listeners

mdlext-accordion and mdlext-select adds evetn listeners. Must implement "mdlDowngrade_" and listen to "mdl-componentdowngraded" event to detach listeners before destruction. In SPA's "componentHandler.downgradeElements" must be called before removing MDL-nodes from DOM.

Unfix #40

The focus outline removed in #40 should be reset to it's state before fix. The problem was that the client forgot to call componentHandler.upgradeElement(element, 'MaterialExtSelectfield') after inserting a selectield. Showing the focus outline provides a fallback if the upgradeElement method is not called.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.