132
George Town, November 2014

Polymer Polytechnic George Town 2014

  • Upload
    vin-lim

  • View
    281

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Polymer Polytechnic George Town 2014

George Town, November 2014

Page 2: Polymer Polytechnic George Town 2014

+Vin Lim @vinlim

#itshackademic @polymer

Page 3: Polymer Polytechnic George Town 2014

Agenda Overview Components Join the revolution

Page 4: Polymer Polytechnic George Town 2014

Web Components: Overview

Page 5: Polymer Polytechnic George Town 2014

What problems are we solving?

Page 6: Polymer Polytechnic George Town 2014

@polymer #itshackademic

Page 7: Polymer Polytechnic George Town 2014

http://drbl.in/esYL

Building UI tabs should be easy!

Page 8: Polymer Polytechnic George Town 2014

@polymer #itshackademic

Page 9: Polymer Polytechnic George Town 2014

@polymer #itshackademic

Page 10: Polymer Polytechnic George Town 2014

@polymer #itshackademic

Page 11: Polymer Polytechnic George Town 2014

@polymer #itshackademic

Page 12: Polymer Polytechnic George Town 2014

@polymer #itshackademic

Page 13: Polymer Polytechnic George Town 2014

<paper-tabs>

<paper-tab>KNOWLEDGE</paper-tab>

<paper-tab>HISTORY</paper-tab>

<paper-tab>FOOD</paper-tab>

</paper-tabs>

Less Code. Less confusion. Web Components

Page 14: Polymer Polytechnic George Town 2014

What are Web Components?

Page 15: Polymer Polytechnic George Town 2014

Custom Elements define new HTML/DOM elements

Page 16: Polymer Polytechnic George Town 2014
Page 17: Polymer Polytechnic George Town 2014

<paper-tabs selected=“1”>

<paper-tab>Tab 1</paper-tab>

<paper-tab>Tab 2</paper-tab>

<paper-tab>Tab 3</paper-tab>

</paper-tabs>

declarative, readable

meaningful HTML

common way to extend → reusable

Custom Elements define new HTML

@polymer #itshackademic

Page 18: Polymer Polytechnic George Town 2014

declarative, readable

meaningful HTML

common way to extend → reusable

Custom Elements define new HTML

var tabs = document.querySelector('paper-tabs');

tabs.addEventListener('core-activate', function() {

console.log(this.selected);

});

@polymer #itshackademic

Page 19: Polymer Polytechnic George Town 2014

Templates native client-side templating

Page 20: Polymer Polytechnic George Town 2014

<template>

<div class=“comment”>

<img src=“image.png”>

</div>

<script>...</script>

</template>

use DOM to scaffold DOM → no XSS

content is inert until cloned/used

doc fragment → not part of the page

HTML Templates native client-side templates

parsed, not rendered

@polymer #itshackademic

Page 21: Polymer Polytechnic George Town 2014

Shadow DOM DOM/CSS scoping

Page 22: Polymer Polytechnic George Town 2014

<video src=“foo.webm” controls></video>

@polymer #itshackademic

Page 23: Polymer Polytechnic George Town 2014

<video src=“foo.webm” controls></video>

Actually Shadow DOM

@polymer #itshackademic

Page 24: Polymer Polytechnic George Town 2014

<video src=“foo.webm” controls></video>

Page 25: Polymer Polytechnic George Town 2014

HTML Imports loading web components

Page 26: Polymer Polytechnic George Town 2014

@polymer #itshackademic

Page 27: Polymer Polytechnic George Town 2014

@polymer #itshackademic

Page 28: Polymer Polytechnic George Town 2014

Vulcanize

$ vulcanize -o build.html index.html \ --csp --strip

npm install -g vulcanize

Page 29: Polymer Polytechnic George Town 2014

grunt-vulcanize

Page 30: Polymer Polytechnic George Town 2014

gulp-vulcanize

Page 31: Polymer Polytechnic George Town 2014

Custom Elements Create new HTML elements and extend existing ones

Templates Native templating in the browser

Shadow DOM Scoped CSS!!! + encapsulated markup

HTML Imports Load custom element definitions and resources

Page 32: Polymer Polytechnic George Town 2014

@polymer #itshackademic

Page 33: Polymer Polytechnic George Town 2014

@polymer #itshackademic

Page 34: Polymer Polytechnic George Town 2014

@polymer #itshackademic

Page 35: Polymer Polytechnic George Town 2014

@polymer #itshackademic

Page 36: Polymer Polytechnic George Town 2014

Browser support Summer 2014

Page 37: Polymer Polytechnic George Town 2014
Page 38: Polymer Polytechnic George Town 2014

Polyfills Web Components with platform.js *

* soon to be called webcomponents.js

Page 39: Polymer Polytechnic George Town 2014

Adds syntactic “sugar” with polymer.js

Page 40: Polymer Polytechnic George Town 2014

Browser support Summer 2014 (without Polymer)

Page 41: Polymer Polytechnic George Town 2014

Browser support Summer 2014 (with Polymer)

Page 42: Polymer Polytechnic George Town 2014

Sugaring: Custom Elements

Page 43: Polymer Polytechnic George Town 2014

vanilla

polymer <polymer-element name=“paper-tabs”> … </polymer-element>

usage

<paper-tabs>…</paper-tabs> // document.createElement(‘paper-tabs’);

document.registerElement(‘paper-tabs’, {

prototype: Object.create(HTMLElement.prototype)

});

@polymer #itshackademic

Page 44: Polymer Polytechnic George Town 2014

document.registerElement(‘paper-tabs’, {

prototype: Object.create(HTMLElement.prototype)

});

vanilla

polymer <polymer-element name=“paper-tabs”> … </polymer-element>

usage

<paper-tabs>…</paper-tabs> // document.createElement(‘paper-tabs’);

@polymer #itshackademic

Page 45: Polymer Polytechnic George Town 2014

vanilla

polymer <polymer-element name=“paper-tabs”> … </polymer-element>

usage

<paper-tabs>…</paper-tabs> // document.createElement(‘paper-tabs’);

document.registerElement(‘paper-tabs’, {

prototype: Object.create(HTMLElement.prototype)

});

@polymer #itshackademic

Page 46: Polymer Polytechnic George Town 2014

vanilla

polymer <polymer-element name=“paper-tabs”> … </polymer-element>

usage

<paper-tabs>…</paper-tabs> // document.createElement(‘paper-tabs’);

document.registerElement(‘paper-tabs’, {

prototype: Object.create(HTMLElement.prototype)

});

@polymer #itshackademic

Page 47: Polymer Polytechnic George Town 2014

vanilla

polymer <polymer-element name=“super-button” extends=“button”> … </polymer-element>

usage

<button is=“super-button”>…</button> // document.createElement(‘button’, ‘super-button’);

document.registerElement(‘super-button’, {

prototype: Object.create(HTMLButtonElement.prototype),

extends: ‘button’

});

@polymer #itshackademic

Page 48: Polymer Polytechnic George Town 2014

vanilla

polymer <polymer-element name=“super-button” extends=“button”> … </polymer-element>

usage

<button is=“super-button”>…</button> // document.createElement(‘button’, ‘super-button’);

document.registerElement(‘super-button’, {

prototype: Object.create(HTMLButtonElement.prototype),

extends: ‘button’

});

@polymer #itshackademic

Page 49: Polymer Polytechnic George Town 2014

vanilla

polymer <polymer-element name=“super-button” extends=“button”> … </polymer-element>

usage

<button is=“super-button”>…</button> // document.createElement(‘button’, ‘super-button’);

document.registerElement(‘super-button’, {

prototype: Object.create(HTMLButtonElement.prototype),

extends: ‘button’

});

@polymer #itshackademic

Page 50: Polymer Polytechnic George Town 2014

vanilla

polymer <polymer-element name=“super-button” extends=“button”> … </polymer-element>

usage

<button is=“super-button”>…</button> // document.createElement(‘button’, ‘super-button’);

document.registerElement(‘super-button’, {

prototype: Object.create(HTMLButtonElement.prototype),

extends: ‘button’

});

@polymer #itshackademic

Page 51: Polymer Polytechnic George Town 2014

Sugaring: Templates

Page 52: Polymer Polytechnic George Town 2014

vanilla

polymer

<polymer-element name=“user-list” noscript> <template> <ul> <template repeat=“{{user, i in users}}”> <li>{{user.name}}</li> </template> </ul> </template> </polymer-element>

<template> … </template>

@polymer #itshackademic

Page 53: Polymer Polytechnic George Town 2014

vanilla

polymer

<polymer-element name=“user-list” noscript> <template> <ul> <template repeat=“{{user, i in users}}”> <li>{{user.name}}</li> </template> </ul> </template> </polymer-element>

<template> … </template>

@polymer #itshackademic

Page 54: Polymer Polytechnic George Town 2014

vanilla

polymer

<polymer-element name=“user-list” noscript> <template> <ul> <template repeat=“{{user, i in users}}”> <li>{{user.name}}</li> </template> </ul> </template> </polymer-element>

<template> … </template>

@polymer #itshackademic

Page 55: Polymer Polytechnic George Town 2014

Sugaring: Shadow DOM

Page 56: Polymer Polytechnic George Town 2014

var shadow = el.createShadowRoot();

shadow.innerHTML = “<style>h2 { color: red; }</style>” +

“<h2>I’m a profile-card</h2>”;

vanilla

<polymer-element name=“profile-card” noscript>

<template>

<link rel=“stylesheet” href=“styles.css”>

<h2>I’m a profile-card</h2>

</template>

</polymer-element>

polymer

@polymer #itshackademic

Page 57: Polymer Polytechnic George Town 2014

var shadow = el.createShadowRoot();

shadow.innerHTML = “<style>h2 { color: red; }</style>” +

“<h2>I’m a profile-card</h2>”;

vanilla

<polymer-element name=“profile-card” noscript>

<template>

<link rel=“stylesheet” href=“styles.css”>

<h2>I’m a profile-card</h2>

</template>

</polymer-element>

polymer

@polymer #itshackademic

Page 58: Polymer Polytechnic George Town 2014

var shadow = el.createShadowRoot();

shadow.innerHTML = “<style>h2 { color: red; }</style>” +

“<h2>I’m a profile-card</h2>”;

vanilla

<polymer-element name=“profile-card” noscript>

<template>

<link rel=“stylesheet” href=“styles.css”>

<h2>I’m a profile-card</h2>

</template>

</polymer-element>

polymer

@polymer #itshackademic

Page 59: Polymer Polytechnic George Town 2014

Components

Page 60: Polymer Polytechnic George Town 2014

<ul> <p>

<h1>

Page 61: Polymer Polytechnic George Town 2014

<menu-button> <page-scaffold>

<animated-pages>

Page 62: Polymer Polytechnic George Town 2014

What if we designed HTML for the mobile web?

Page 63: Polymer Polytechnic George Town 2014

<core-icon>

<paper-fab>

<core-drawer-panel>

<core-field>

Page 64: Polymer Polytechnic George Town 2014

http://bit.ly/1jkTo5c

core-elements

Image: http://bit.ly/1mZjnTu

Page 65: Polymer Polytechnic George Town 2014

<core-toolbar> A basic container for controls like tabs or buttons

MY APP

@polymer #itshackademic

Page 66: Polymer Polytechnic George Town 2014

<link rel=“import”

href=“core-toolbar.html”>

<core-toolbar> A basic container for controls like tabs or buttons

MY APP

@polymer #itshackademic

Page 67: Polymer Polytechnic George Town 2014

<core-toolbar>

<div>MY APP</div>

</core-toolbar>

<link rel=“import”

href=“core-toolbar.html”>

<core-toolbar> A basic container for controls like tabs or buttons

MY APP

@polymer #itshackademic

Page 68: Polymer Polytechnic George Town 2014

<core-toolbar>

<core-icon-button icon=“menu”>

</core-icon-button>

<div>MY APP</div>

</core-toolbar>

<link rel=“import”

href=“core-toolbar.html”>

<core-toolbar> A basic container for controls like tabs or buttons

MY APP

@polymer #itshackademic

Page 69: Polymer Polytechnic George Town 2014

A simple container with a header section and a content section

<core-header-panel>

MY APP

<core-header-panel flex>

<core-toolbar>

<core-icon-button icon=“menu">

</core-icon-button>

<div>MY APP</div>

</core-toolbar>

<div class=“content”>…</div>

</core-header-panel>

Page 70: Polymer Polytechnic George Town 2014

A simple container with a header section and a content section

<core-header-panel>

MY APP

<core-header-panel flex>

<core-toolbar>

<core-icon-button icon=“menu">

</core-icon-button>

<div>MY APP</div>

</core-toolbar>

<div class=“content”>…</div>

</core-header-panel>

Page 71: Polymer Polytechnic George Town 2014

A simple container with a header section and a content section

<core-header-panel>

MY APP

<core-header-panel flex>

<core-toolbar>

<core-icon-button icon=“menu">

</core-icon-button>

<div>MY APP</div>

</core-toolbar>

<div class=“content”>…</div>

</core-header-panel>

Page 72: Polymer Polytechnic George Town 2014

A simple container with a header section and a content section

<core-header-panel>

<core-header-panel flex>

<core-toolbar>

<core-icon-button icon=“menu">

</core-icon-button>

<div>MY APP</div>

</core-toolbar>

<div class=“content”>…</div>

</core-header-panel>

MY APP

Page 73: Polymer Polytechnic George Town 2014

<core-header-panel mode=“scroll" flex>

<core-toolbar>

<core-icon-button icon=“menu">

</core-icon-button>

<div>MY APP</div>

</core-toolbar>

<div class=“content”>…</div>

</core-header-panel>

<core-header-panel>

Toolbar will scroll with the page

Page 74: Polymer Polytechnic George Town 2014

A responsive container that combines a left- or right-side drawer panel and a main content area.

<core-drawer-panel>

<core-drawer-panel>

<div drawer> Drawer panel... </div>

<div main> Main panel... </div>

</core-drawer-panel>

Page 75: Polymer Polytechnic George Town 2014

<core-drawer-panel>

<div drawer> Drawer panel... </div>

<div main> Main panel... </div>

</core-drawer-panel>

A responsive container that combines a left- or right-side drawer panel and a main content area.

<core-drawer-panel>

Page 76: Polymer Polytechnic George Town 2014

<core-drawer-panel>

<div drawer> Drawer panel... </div>

<div main> Main panel... </div>

</core-drawer-panel>

A responsive container that combines a left- or right-side drawer panel and a main content area.

<core-drawer-panel>

Page 77: Polymer Polytechnic George Town 2014
Page 78: Polymer Polytechnic George Town 2014

paper-elements

Page 79: Polymer Polytechnic George Town 2014

<paper-input floatinglabel

label="Type only numbers... (floating)"

validate="^[0-9]*$"

error="Input is not a number!">

</paper-input>

@polymer #itshackademic

Page 80: Polymer Polytechnic George Town 2014

<paper-checkbox></paper-checkbox>

Page 81: Polymer Polytechnic George Town 2014

<div class=“card”>

<img src=“science.svg”>

<paper-ripple fit></paper-ripple>

</div>

A reactive ink effect for indicating touch and mouse actions

<paper-ripple>

Page 82: Polymer Polytechnic George Town 2014

<div class=“card”>

<paper-shadow z=“5” animated>

</paper-shadow>

</div>

A dynamic shadow for conveying z-depth and spatial relationships

<paper-shadow>

@polymer #itshackademic

Page 83: Polymer Polytechnic George Town 2014

Styling

Page 84: Polymer Polytechnic George Town 2014

<paper-slider min=“0” max=“100”>

</paper-slider>

allows you to style nodes internal to an element’s shadow dom

::shadow

@polymer #itshackademic

Page 85: Polymer Polytechnic George Town 2014

allows you to style nodes internal to an element’s shadow dom

::shadow

paper-slider::shadow #sliderKnobInner {

background-color: #f4b400;

}

<paper-slider min=“0” max=“100”>

</paper-slider>

@polymer #itshackademic

Page 86: Polymer Polytechnic George Town 2014

html /deep/ paper-ripple {

background-color: #E91E63;

}

styles will pierce all shadow boundaries

/deep/

@polymer #itshackademic

Page 87: Polymer Polytechnic George Town 2014

With ::shadow and /deep/ you can apply sitewide themes

source: ebidel.github.io/material-playground

Page 88: Polymer Polytechnic George Town 2014

polymer-project.org/apps/topeka/

Page 89: Polymer Polytechnic George Town 2014
Page 90: Polymer Polytechnic George Town 2014

polymer-project.org

Page 91: Polymer Polytechnic George Town 2014

We’re not alone

Page 92: Polymer Polytechnic George Town 2014

Mozilla Brick

Page 93: Polymer Polytechnic George Town 2014

<brick-appbar>

<brick-deck>

<brick-tabbar>

Page 94: Polymer Polytechnic George Town 2014

<core-icon>

<x-instagram>

(not shown)

Page 95: Polymer Polytechnic George Town 2014

Web Components can work together

Page 96: Polymer Polytechnic George Town 2014

Not just browser makers

Page 97: Polymer Polytechnic George Town 2014

<app-router> github.com/erikringsmuth/app-router

my-site.com/order/:id

<app-router>

<!-- matches an exact path -->

<app-route path="/home" import="/pages/home-page.html"></app-route>

<!-- matches using a path variable -->

<app-route path="/order/:id" import=“/pages/order-page.html"></app-route>

</app-router>

Page 98: Polymer Polytechnic George Town 2014

<page-er> github.com/addyosmani/page-er

<page-er perpage="5" previous=“<< Previous" next=“Next >>"></page-er>

var pager = document.querySelector("page-er");

document.addEventListener("polymer-ready", function() {

pager.data = model.items;

});

Page 99: Polymer Polytechnic George Town 2014

<ajax-form> github.com/garstasio/ajax-form

Full Name

Country City

Join newsletter

<form is="ajax-form" action="my/form/handler">

<label>Full Name

<input type="text" name=“full_name">

</label>

</form>

Page 100: Polymer Polytechnic George Town 2014

Apps

Page 101: Polymer Polytechnic George Town 2014

polymer-project.org

Page 102: Polymer Polytechnic George Town 2014

chromestatus.com

Page 103: Polymer Polytechnic George Town 2014

polymer-project.org/tools/designer/

Page 104: Polymer Polytechnic George Town 2014
Page 105: Polymer Polytechnic George Town 2014

github.com/ForceDotComLabs/mobile-ui-elements github.com/ForceDotComLabs

Page 106: Polymer Polytechnic George Town 2014

APIs

Page 107: Polymer Polytechnic George Town 2014

APIs (as elements)

Page 108: Polymer Polytechnic George Town 2014

I want to add a marker to a Google map.

@polymer #itshackademic

Page 109: Polymer Polytechnic George Town 2014

<style>

#map {

height: 400px;

}

</style>

<div id="map"></div>

<script src=“http://maps.googleapis.com/maps/api/js?callback=mapReady">

</script>

<script>

var marker = null;

function getCurrentLocation(callback) {

navigator.geolocation.watchPosition(callback);

}

function addMarker(opts, info) {

var marker = new google.maps.Marker(opts);

var infoWindow = new google.maps.InfoWindow({content: info});

google.maps.event.addListener(marker, 'click', function() {

infoWindow.open(opts.map, marker);

});

return marker;

}

function mapReady() {

var container = document.querySelector('#map');

var map = new google.maps.Map(container, {

zoom: 14, disableDefaultUI: true

});

getCurrentLocation(function(pos) {

var current = new google.maps.LatLng(pos.coords.latitude,

pos.coords.longitude);

map.setCenter(current);

// Re-position marker or create new one.

if (marker) {

marker.setPosition(map.getCenter());

} else {

marker = addMarker({

position: current, map: map, title: 'Your location'

}, '<b>Your location</b>');

}

});

}

</script>

So much code for one map marker!

@polymer #itshackademic

Page 110: Polymer Polytechnic George Town 2014

@polymer #itshackademic

Page 111: Polymer Polytechnic George Town 2014
Page 112: Polymer Polytechnic George Town 2014
Page 113: Polymer Polytechnic George Town 2014
Page 114: Polymer Polytechnic George Town 2014
Page 115: Polymer Polytechnic George Town 2014
Page 116: Polymer Polytechnic George Town 2014

googlewebcomponents.github.io github.com/GoogleWebComponents

Page 117: Polymer Polytechnic George Town 2014

youtube.com/watch?v=eORqFaf_QzM

Page 118: Polymer Polytechnic George Town 2014

Join the revolution

Page 119: Polymer Polytechnic George Town 2014

Learn

Page 120: Polymer Polytechnic George Town 2014
Page 121: Polymer Polytechnic George Town 2014

polymer-project.org

Page 122: Polymer Polytechnic George Town 2014

goo.gl/Ji3WdW

Page 123: Polymer Polytechnic George Town 2014

Build

Page 124: Polymer Polytechnic George Town 2014

YO POLYMER npm install -g generator-polymer

Page 125: Polymer Polytechnic George Town 2014

Start with <seed-element> github.com/PolymerLabs/seed-element

Page 126: Polymer Polytechnic George Town 2014
Page 127: Polymer Polytechnic George Town 2014

youtube.com/watch?v=2toYLLcoY14

Page 128: Polymer Polytechnic George Town 2014

Share!

Page 129: Polymer Polytechnic George Town 2014

customelements.io

Page 130: Polymer Polytechnic George Town 2014

{

"name": "my-element",

"version": "0.0.0",

"description": "My awesome Custom Element",

"license": "MIT",

"keywords": [

"web-components"

],

"ignore": [

"**/.*",

"node_modules",

"bower_components"

]

}

bower.json

@polymer #itshackademic

Page 131: Polymer Polytechnic George Town 2014

EXPLORE

Page 132: Polymer Polytechnic George Town 2014

<thank-you>

+Vin Lim @vinlim