Top Banner
George Town, November 2014
132

Polymer Polytechnic George Town 2014

Apr 12, 2017

Download

Technology

Vin Lim
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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