SlideShare a Scribd company logo
Making Modern Websites
Patrick Kettner
@PatrickKettner
@PatrickKettner
@PatrickKettner
@PatrickKettner
@PatrickKettner
Websites .
@PatrickKettner
Making Websites .
@PatrickKettner
Making Websites is Hard.
@PatrickKettner
srsly.
@PatrickKettner
Clipboard API
const
Cross-document messaging
Cross-Origin Resource Sharing
crypto.getRandomValues()
CSS Font Loading
CSS.supports() API
CustomEvent
DeviceOrientation & DeviceMotion events
Document Object Model Range
DOM Parsing and Serialization
ECMAScript 5
Element.getBoundingClientRect()
Element.insertAdjacentHTML()
ES6 Number
Fetch
FIDO U2F API
File API
KeyboardEvent.key
KeyboardEvent.location
MathML
MP3 audio format
MPEG-4/H.264 video format
Node.textContent
Ogg Vorbis audio format
Ogg/Theora video format
Opus
PNG alpha transparency
Public Key Pinning
querySelector/querySelectorAll
Referrer Policy
Resource Hints: dns-prefetch
Resource Hints: preconnect
Resource Hints: prefetch
Resource Hints: prerender
WebGL - 3D Canvas graphics
Offline web applications
All HTML5 features
Other
AAC audio file format
asm.js
async attribute for external scripts
autocomplete attribute: on & off values
Brotli Accept-Encoding/Content-Encoding
Client Hints: DPR, Width, Viewport-Width
Content Security Policy 1.0
Content Security Policy Level 2
Data URIs
defer attribute for external scripts
document.head
DOMContentLoaded
ECMAScript 5 Strict Mode
Minimum length attribute
Multiple file selection
New semantic elements
Number input type
Pattern attribute for input field
Picture element
PNG favicons
progress element
Range input type
relList (DOMTokenList)
Reversed attribute of ordered lis
Ruby annotation
sandbox attribute for iframes
Scoped CSS
seamless attribute for iframes
Search input type
Session history management
Autofocus attribute
Canvas (basic support)
Canvas blend modes
classList (DOMTokenList)
Color input type
contenteditable attribute
Custom Elements
Custom protocol handling
Datalist element
dataset & data-* attributes
Date and time input types
Details & Summary elements
Dialog element
disabled attribute
Download attribute
Drag and Drop
Email, telephone & URL input types
letter-spacing CSS property
Media Queries: interaction media features
Media Queries: resolution feature
rem (root em) units
text-decoration styling
text-emphasis styling
TTF/OTF
Viewport units: vw, vh, vmin, vmax
:placeholder-shown CSS pseudo-class
Crisp edges/pixelated images
Backdrop Filter
Canvas Drawings
Cross-Fade Function
font-smooth
image-set
Logical Properties
Motion Path
pointer-events (for HTML)
Background-image options
Border images
Border-radius (rounded corners)
Box-shadow
Box-sizing
Colors
Cursors (original values)
Cursors: zoom-in & zoom-out
font-kerning
image-orientation
Media Queries
Multiple backgrounds
Multiple column layout
object-fit/object-position
Opacity
Overflow-wrap
selectors
tab-size
font-stretch
font-variant-alternates
Generated content
Gradients
Grid Layout
Hyphenation
initial value
inline-block
Masks
min/max-width/height
outline
page-break properties
position:fixed
Regions
Repeating Gradients
resize property
Scroll snap points
Shapes Level 1
element selector
::placeholder CSS pseudo-
element
::selection CSS pseudo-element
@font-face Web fonts
Blending of HTML/SVG elements
calc() as CSS unit value
2.1 selectors
all property
Animation
Appearance
background-attachment
background-blend-mode
background-position edge
offsets
box-decoration-break
clip-path property
Counter Styles
Counters
Node.innerText
Resource Hints: Lazyload
SPDY protocol
WebP image format
WebVTT - Web Video Text Tracks
XHTML+SMIL animation
All Other features
SVG
Inline SVG in HTML5
SVG (basic support)
SVG effects for HTML
SVG favicons
SVG filters
SVG fonts
SVG fragment identifiers
SVG in CSS backgrounds
SVG in HTML img element
SVG SMIL animation
Internationalization API
JSON parsing
let
matches() DOM method
matchMedia
maxlength attribute for input and textarea elements
Media Source Extensions
Mutation Observer
Navigation Timing API
Object RTC (ORTC) API for WebRTC
Online/offline status
Page Visibility
PageTransitionEvent
Pointer events
PointerLock API
Promises
Proximity API
Proxy object
@PatrickKettner
@PatrickKettner
tools .
@PatrickKettner
@PatrickKettner
@PatrickKettner
Second most used lib
@PatrickKettner
@PatrickKettner
@PatrickKettner
commit a9a90192ea11dc0ff916431b40227734af9074b6
Author: Patrick Kettner <patrickkettner@gmail.com>
Date: Fri Sep 11 18:59:17 2015 -0700
release 3.0
@PatrickKettner
@PatrickKettner
{{months of work}}
@PatrickKettner
@PatrickKettner
no one cares.
@PatrickKettner
(other than me)
@PatrickKettner
at best,
we don’t get in the way
@PatrickKettner
we are just a pitstop
@PatrickKettner
we still need to
make users happy
@PatrickKettner
how?
@PatrickKettner
make it
really, really fast
@PatrickKettner
@PatrickKettner
@PatrickKettner
@joecritchley
@PatrickKettner
@font-face
@PatrickKettner
@PatrickKettner
@PatrickKettner
the site works, it
just looks broken
@PatrickKettner
@PatrickKettner
document.fonts.ready.then(() => {
let body = document.body
body.classList.toggle("fontzL0ad3d")
});
@PatrickKettner
body {
font-family: 'T0t411y-R4D-Sans',
'Helvetica', 'Sans-Serif'
}
@PatrickKettner
body {
font-family: 'Helvetica', 'Sans-Serif'
}
body.fontzL0ad3d {
font-family: 'T0t411y-R4D-Sans'
}
@PatrickKettner
@PatrickKettner
@PatrickKettner
@PatrickKettner
@PatrickKettner
FontFaceObserver
@PatrickKettner
github.com/bramstein/fontfaceobserver
document.fonts.ready.then(() => {
let body = document.body
body.classList.toggle("fontzL0ad3d")
});
@PatrickKettner
@PatrickKettner
let observer = new
FontFaceObserver("T0t411y-R4D-Sans");
observer.check().then(() => {
let body = document.body
body.classList.toggle("fontzL0ad3d")
});
@PatrickKettner
@PatrickKettner
December 1, 2015
@PatrickKettner
@PatrickKettner
@PatrickKettner
@PatrickKettner
@PatrickKettner
@PatrickKettner
observer.check().then(() => {
localStorage.setItem("fontzL0ad3d", true)
});
if it is cached properly
@PatrickKettner
and the user didn’t clear
part of the cache
@PatrickKettner
and the browser didn’t
automatically remove it
@PatrickKettner
this was always
an educated guess
@PatrickKettner
ServiceWorker
@PatrickKettner
kindof a big deal...
@PatrickKettner
@PatrickKettner
Offline Experiences
Push Notifications
Background Sync
and much, much more...
@PatrickKettner
Fetch
Cache
- Network Proxy
- Programmable
Cache
@PatrickKettner
259 modules
@PatrickKettner
single module =
dozens of requests
@PatrickKettner
ServiceWorker?
@PatrickKettner
navigator.serviceWorker.register('/serviceworker.js')
@PatrickKettner
let CURRENT_CACHE = {
prefetch: 'prefetch-cache-v1'
};
self.addEventListener('install', event => {
let prefetch = ['/T0t411y-R4D-Sans']
event.waitUntil(caches.open(CURRENT_CACHE['prefetch'])
.then(cache =>
cache.addAll(prefetch.map((url) =>
new Request(url, { 'mode': 'no-cors' })
))
)
)
})
@PatrickKettner
self.addEventListener('fetch', event => {
event.respondWith(caches.match(event.request)
.then((response) => {
if (response) {
return response;
}
return fetch(event.request)
.then(response => response);
}));
});
@PatrickKettner
@PatrickKettner
:(
@PatrickKettner
hero
@PatrickKettner
savior
@PatrickKettner
douchebag
@PatrickKettner
AppCache
@PatrickKettner
@JaffaTheCake
AppCache
@PatrickKettner
ServiceWorker > AppCache
@PatrickKettner
@PatrickKettner
...but it covers our use
@PatrickKettner
CACHE MANIFEST
#__CACHE_VERSION__
/
/download
/css/main.css
/img/logo.svg
/js/build.js
__ASSETS__
NETWORK:
*
@PatrickKettner
<html lang="en" manifest="/offline.appcache">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
...
@PatrickKettner
<html lang="en" manifest="/offline.appcache">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
...
@PatrickKettner
<html lang="en" manifest="/offline.appcache">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
...
@PatrickKettner
ServiceWorker > AppCache
@PatrickKettner
if('serviceWorker' in navigator) {
navigator.serviceWorker.register('/serviceworker.js')
} else if ('applicationCache' in window) {
// add AppCache
}
@PatrickKettner
can’t be added by js
@PatrickKettner
let iframe = document.createElement('iframe')
iframe.style.display = 'none'
iframe.src = '/load-appcache.html'
document.body.appendChild(iframe)
@PatrickKettner
<html manifest="/offline.appcache">
<head>
<title>loading douchebags</title>
</head>
<body></body>
</html>
@PatrickKettner
20.7 seconds
@PatrickKettner
190 milliseconds
@PatrickKettner
ServiceWorker > AppCache
@PatrickKettner
ServiceWorkers!
@PatrickKettner
ServiceWorkers
@PatrickKettner
WebWorkers
@PatrickKettner
commit 90b52e847359ae902d3f7ce7bc511cadfbc29ea8
Author: Alexey Proskuryakov <ap@webkit.org>
Date: Thu Nov 6 07:04:47 +0000
Implement Worker global object
@PatrickKettner
2008!
@PatrickKettner
Version 2
@PatrickKettner
Version 2
@PatrickKettner
WebWorkers
@PatrickKettner
WebWorkers?
@PatrickKettner
single threaded
by default
@PatrickKettner
everything is fighting
for CPU time
@PatrickKettner
lots of number crunchin’
===
hardcore jank
@PatrickKettner
Offload tasks to
background thread
@PatrickKettner
super expensive fns
become pretty cheap
@PatrickKettner
dynamic filesize
calculation
@PatrickKettner
@PatrickKettner
100% clientside!
@PatrickKettner
if ('Worker' in window) {
let gzipWorker = new Worker('/gzip.js');
window.gziper = (config, cb) => {
gzipWorker.postMessage(config);
gzipWorker.onmessage = (e) => cb(e.data);
}
}
@PatrickKettner
@PatrickKettner
importScripts('/pako_deflate.js’, '/pretty-bytes.js');
onmessage = (msg, cb) => {
let build = JSON.parse(msg.data).build;
let response = {
original: prettyBytes(build.length),
compressed: prettyBytes(pako.deflate(build, {
'level’: 6
}).length)
};
postMessage(response);
}
@PatrickKettner
/download
if ('Worker' in window) {
window.buildWorker = new Worker('/build.js');
}
@PatrickKettner
/download
buildWorker.postMessage(JSON.stringify({config}));
@PatrickKettner
@PatrickKettner
/build.js
importScripts('/r.js', '/modernizr/build.js’);
require(['build'],(builder) => {
onmessage = (msg) => {
let config = JSON.parse(msg.data).config;
builder(config, postMessage);
}
});
by the time BUILD is clicked
its already built
@PatrickKettner
“what if their browser
don’t have workers”
@PatrickKettner
@PatrickKettner
¯_(ツ)_/¯
nbd
@PatrickKettner
we’ll just build then
@PatrickKettner
@PatrickKettner
@PatrickKettner
let content = build()
...
zeroClipboard.on('copy', (e) => {
let clipboard = e.clipboardData;
clipboard.setData('text/plain', content);
});
@PatrickKettner
@PatrickKettner
:(
@PatrickKettner
:(
@PatrickKettner
@PatrickKettner
if (Modernizr.flash) {
// ZeroClipboard
} else {
// somethingElse
}
somethingElse?
@PatrickKettner
@PatrickKettner
let content = build()
...
let output = document.querySelector('output')
output.innerHTML = build
output.style.display = 'block'
output.select()
@PatrickKettner
@PatrickKettner
@PatrickKettner
@PatrickKettner
Blobs, URL, & [download]
@PatrickKettner
let content = build()
let blob = new Blob([content], {
type: 'text/plain'
});
let href = URL.createObjectURL(blob)
let download = 'modernizr.custom.js'
@PatrickKettner
@PatrickKettner
<a href={href} download={download}>DOWNLOAD</a>
@PatrickKettner
@PatrickKettner
@PatrickKettner
@PatrickKettner
~ 61% :/
@PatrickKettner
@PatrickKettner
@PatrickKettner
Just POST It
@PatrickKettner
@PatrickKettner
<a href={href} download={download}>DOWNLOAD</a>
@PatrickKettner
if (supportsEurythang) {
download = <a href={href} download={download}>DOWNLOAD</a>
} else {
download = <input type='submit' value='download'/>
}
Decent Markup
@PatrickKettner
@PatrickKettner
CSS
@PatrickKettner
CSS
@PatrickKettner
JavaScript
@PatrickKettner
JavaScript
@PatrickKettner
100% clientside!
@PatrickKettner
100% clientside!
unless it can’t
@PatrickKettner
Server Side
@PatrickKettner
100% static files
@PatrickKettner
@PatrickKettner
let server = new Hapi.Server()
server.routes([{
method: 'GET',
path: '/{param*}',
handler: {
directory: {
path: './dist'
}
}
}])
server.start()
99.999% static files
@PatrickKettner
let buildFromPostedQuery = function(request, reply) {
let config = generateConfig(request.payload);
Modernizr.build(config,(build) => {
reply(build)
.header('Content-Type', 'text/javascript')
.header('Content-Disposition', 'attachment;
filename=modernizr-custom.js')
})
}
@PatrickKettner
@PatrickKettner
let server = new Hapi.Server()
server.routes([{
method: 'GET',
path: '/{param*}',
handler: {directory: {path: './dist'}}
}, {
method: 'POST',
path: '/download',
handler: buildFromPostedQuery
}])
server.start()
works for all browsers!
@PatrickKettner
srsly.
@PatrickKettner
@PatrickKettner
@PatrickKettner
HTML is cool!
@PatrickKettner
no one cares.
@PatrickKettner
@PatrickKettner
@PatrickKettner
“I want to bower install!”
@PatrickKettner
“I want to npm install!”
@PatrickKettner
“There isn’t a file to install”
@PatrickKettner
“...”
@PatrickKettner
“I want to npm install!”
@PatrickKettner
no one cares.
@PatrickKettner
no one cares.
@PatrickKettner
can’t publish every combo
@PatrickKettner
259 modules
@PatrickKettner
259 ^ 259
@PatrickKettner
3.2317 x 10616
@PatrickKettner
no one cares.
@PatrickKettner
Server already builds
for anything POSTed
@PatrickKettner
/*! modernizr 3.2.0 (Custom Build) | MIT *
* https://modernizr.com/download/?-csstransforms-
csstransforms3d-csstransitions-svg !*/
!function(e,t,n){function r(e,t){return typeof e===t}function
o(){var e,t,n,o,i,s,a;for(var l in
y)if(y.hasOwnProperty(l)){if(e=[],t=y[l],t.name&&(e.push(t.na
me.toLowerCase()),t.options&&t.options.aliases&&t.options.ali
ases.length))for(n=0;n<t.options.aliases.length;n++)e.push(t.
options.aliases[n].toLowerCase());for(o=r(t.fn,"function")?t.
fn():t.fn,i=0;i<e.length;i++)s=e[i],a=s.split("."),1===a.leng
th?Modernizr[a[0]]=o:(!Modernizr[a[0]]||Modernizr[a[0]]instan
ceof Boolean||(Modernizr[a[0]]=new
Boolean(Modernizr[a[0]])),Modernizr[a[0]][a[1]]=o),C.push((o?
"":"no-")+a.join("-"))}}function i(e){var t = E.className,A
@PatrickKettner
/*! modernizr 3.2.0 (Custom Build) | MIT *
* https://modernizr.com/download/?-csstransforms-
csstransforms3d-csstransitions-svg !*/
!function(e,t,n){function r(e,t){return typeof e===t}function
o(){var e,t,n,o,i,s,a;for(var l in
y)if(y.hasOwnProperty(l)){if(e=[],t=y[l],t.name&&(e.push(t.na
me.toLowerCase()),t.options&&t.options.aliases&&t.options.ali
ases.length))for(n=0;n<t.options.aliases.length;n++)e.push(t.
options.aliases[n].toLowerCase());for(o=r(t.fn,"function")?t.
fn():t.fn,i=0;i<e.length;i++)s=e[i],a=s.split("."),1===a.leng
th?Modernizr[a[0]]=o:(!Modernizr[a[0]]||Modernizr[a[0]]instan
ceof Boolean||(Modernizr[a[0]]=new
Boolean(Modernizr[a[0]])),Modernizr[a[0]][a[1]]=o),C.push((o?
"":"no-")+a.join("-"))}}function i(e){var t = E.className,A
@PatrickKettner
npm install --save https://modernizr.com/download/?-
csstransforms-csstransforms3d-csstransitions-svg
@PatrickKettner
let handler = (request, reply) => {
if (userAgent.match(/bower/)) {
buildForBower(config)
} else if (userAgent.match(/npm/)) {
buildForNPM(config)
} else {
reply.view('/download', config);
}
}
@PatrickKettner
let Archiver = require('archiver')
let archive = Archiver('tar')
let bowerJSON = makeBowerJSONFile()
let buildForBower = (config) => {
Modernizr.build(config, (build) => {
var module = archive
.append(build, {name: bowerJSON.main})
.append(JSON.stringify(bowerJSON), {name: 'bower.json'})
.finalize();
reply(module)
.header('Content-disposition', 'attachment;
filename=Modernizr.custom.tar')
})
}
@PatrickKettner
let Archiver = require('archiver')
let archive = Archiver('tar')
let pkg = makePackageJSON()
let buildForNPM = (config) => {
Modernizr.build(config, (build) => {
var module = archive
.append(build, {name: pkgJSON.main})
.append(JSON.stringify(pkgJSON), {name: package.json'})
.finalize();
reply(module)
.header('Content-disposition', 'attachment;
filename=Modernizr.custom.tar')
})
}
@PatrickKettner
“wait…
require(‘moderznir’)?”
@PatrickKettner
@PatrickKettner
require(‘moderznir’) !== modernizr
@PatrickKettner
@PatrickKettner
Modernizr.build(config, (build) => {
fs.writeFileSync('./modernizr.js’)
}
very flexible
@PatrickKettner
not super friendly
@PatrickKettner
we already have a
interface we like...
@PatrickKettner
lets reuse it!
@PatrickKettner
React is cool!
@PatrickKettner
no one cares.
@PatrickKettner
get out of the way,
in the best ways possible
@PatrickKettner
make awesome stuff.
@PatrickKettner
use the new shiny.
@PatrickKettner
have a lot of fun.
@PatrickKettner
Thanks!
@PatrickKettner

More Related Content

What's hot

Cassandra Day SV 2014: Fundamentals of Apache Cassandra Data Modeling
Cassandra Day SV 2014: Fundamentals of Apache Cassandra Data ModelingCassandra Day SV 2014: Fundamentals of Apache Cassandra Data Modeling
Cassandra Day SV 2014: Fundamentals of Apache Cassandra Data Modeling
DataStax Academy
 
HTML5 New and Improved
HTML5   New and ImprovedHTML5   New and Improved
HTML5 New and Improved
Timothy Fisher
 
Cassandra Day Chicago 2015: Advanced Data Modeling
Cassandra Day Chicago 2015: Advanced Data ModelingCassandra Day Chicago 2015: Advanced Data Modeling
Cassandra Day Chicago 2015: Advanced Data Modeling
DataStax Academy
 
Domain Driven Design 101
Domain Driven Design 101Domain Driven Design 101
Domain Driven Design 101
Richard Dingwall
 
Service discovery and configuration provisioning
Service discovery and configuration provisioningService discovery and configuration provisioning
Service discovery and configuration provisioning
Source Ministry
 
Building modular monoliths that could scale to microservices (only if they ne...
Building modular monoliths that could scale to microservices (only if they ne...Building modular monoliths that could scale to microservices (only if they ne...
Building modular monoliths that could scale to microservices (only if they ne...
David Gómez García
 
201410 2 fiware-orion-contextbroker
201410 2 fiware-orion-contextbroker201410 2 fiware-orion-contextbroker
201410 2 fiware-orion-contextbrokerFIWARE
 
Client-side Auth with Ember.js
Client-side Auth with Ember.jsClient-side Auth with Ember.js
Client-side Auth with Ember.js
Matthew Beale
 
Scala and Spring
Scala and SpringScala and Spring
Scala and Spring
Eberhard Wolff
 
Windows 8 metro applications
Windows 8 metro applicationsWindows 8 metro applications
Windows 8 metro applications
Alex Golesh
 
Building Android apps with Parse
Building Android apps with ParseBuilding Android apps with Parse
Building Android apps with Parse
DroidConTLV
 

What's hot (11)

Cassandra Day SV 2014: Fundamentals of Apache Cassandra Data Modeling
Cassandra Day SV 2014: Fundamentals of Apache Cassandra Data ModelingCassandra Day SV 2014: Fundamentals of Apache Cassandra Data Modeling
Cassandra Day SV 2014: Fundamentals of Apache Cassandra Data Modeling
 
HTML5 New and Improved
HTML5   New and ImprovedHTML5   New and Improved
HTML5 New and Improved
 
Cassandra Day Chicago 2015: Advanced Data Modeling
Cassandra Day Chicago 2015: Advanced Data ModelingCassandra Day Chicago 2015: Advanced Data Modeling
Cassandra Day Chicago 2015: Advanced Data Modeling
 
Domain Driven Design 101
Domain Driven Design 101Domain Driven Design 101
Domain Driven Design 101
 
Service discovery and configuration provisioning
Service discovery and configuration provisioningService discovery and configuration provisioning
Service discovery and configuration provisioning
 
Building modular monoliths that could scale to microservices (only if they ne...
Building modular monoliths that could scale to microservices (only if they ne...Building modular monoliths that could scale to microservices (only if they ne...
Building modular monoliths that could scale to microservices (only if they ne...
 
201410 2 fiware-orion-contextbroker
201410 2 fiware-orion-contextbroker201410 2 fiware-orion-contextbroker
201410 2 fiware-orion-contextbroker
 
Client-side Auth with Ember.js
Client-side Auth with Ember.jsClient-side Auth with Ember.js
Client-side Auth with Ember.js
 
Scala and Spring
Scala and SpringScala and Spring
Scala and Spring
 
Windows 8 metro applications
Windows 8 metro applicationsWindows 8 metro applications
Windows 8 metro applications
 
Building Android apps with Parse
Building Android apps with ParseBuilding Android apps with Parse
Building Android apps with Parse
 

Viewers also liked

Crescendo profissionalmente com o apoio comunidade
Crescendo profissionalmente com o apoio comunidadeCrescendo profissionalmente com o apoio comunidade
Crescendo profissionalmente com o apoio comunidade
Felipe Nascimento
 
Desafios de Performance Web - BrazilJS
Desafios de Performance Web - BrazilJSDesafios de Performance Web - BrazilJS
Desafios de Performance Web - BrazilJS
Caelum
 
Como encarar o desenvolvimento front-end
Como encarar o desenvolvimento front-endComo encarar o desenvolvimento front-end
Como encarar o desenvolvimento front-end
Jean Carlo Emer
 
Single Page Application JS Framework Round up
Single Page Application JS Framework Round upSingle Page Application JS Framework Round up
Single Page Application JS Framework Round up
Frank Duan
 
Working with the web and the future
Working with the web and the futureWorking with the web and the future
Working with the web and the future
Sally Lait
 
2014 Future of Open Source - 8th Annual Survey results
2014 Future of Open Source - 8th Annual Survey results2014 Future of Open Source - 8th Annual Survey results
2014 Future of Open Source - 8th Annual Survey results
Michael Skok
 
Javascript State of the Union 2015
Javascript State of the Union 2015Javascript State of the Union 2015
Javascript State of the Union 2015
Huge
 
Progressive Web Apps: o melhor da Web appficada
Progressive Web Apps: o melhor da Web appficadaProgressive Web Apps: o melhor da Web appficada
Progressive Web Apps: o melhor da Web appficada
Caelum
 
Visual Design with Data
Visual Design with DataVisual Design with Data
Visual Design with Data
Seth Familian
 

Viewers also liked (9)

Crescendo profissionalmente com o apoio comunidade
Crescendo profissionalmente com o apoio comunidadeCrescendo profissionalmente com o apoio comunidade
Crescendo profissionalmente com o apoio comunidade
 
Desafios de Performance Web - BrazilJS
Desafios de Performance Web - BrazilJSDesafios de Performance Web - BrazilJS
Desafios de Performance Web - BrazilJS
 
Como encarar o desenvolvimento front-end
Como encarar o desenvolvimento front-endComo encarar o desenvolvimento front-end
Como encarar o desenvolvimento front-end
 
Single Page Application JS Framework Round up
Single Page Application JS Framework Round upSingle Page Application JS Framework Round up
Single Page Application JS Framework Round up
 
Working with the web and the future
Working with the web and the futureWorking with the web and the future
Working with the web and the future
 
2014 Future of Open Source - 8th Annual Survey results
2014 Future of Open Source - 8th Annual Survey results2014 Future of Open Source - 8th Annual Survey results
2014 Future of Open Source - 8th Annual Survey results
 
Javascript State of the Union 2015
Javascript State of the Union 2015Javascript State of the Union 2015
Javascript State of the Union 2015
 
Progressive Web Apps: o melhor da Web appficada
Progressive Web Apps: o melhor da Web appficadaProgressive Web Apps: o melhor da Web appficada
Progressive Web Apps: o melhor da Web appficada
 
Visual Design with Data
Visual Design with DataVisual Design with Data
Visual Design with Data
 

Similar to Making Modern Websites

HTML5 (and friends) - History, overview and current status - jsDay Verona 11....
HTML5 (and friends) - History, overview and current status - jsDay Verona 11....HTML5 (and friends) - History, overview and current status - jsDay Verona 11....
HTML5 (and friends) - History, overview and current status - jsDay Verona 11....Patrick Lauke
 
Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5
Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5
Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5
Sadaaki HIRAI
 
Meego Widget Development using Qt WRT @iRajLal
Meego Widget Development using Qt WRT @iRajLalMeego Widget Development using Qt WRT @iRajLal
Meego Widget Development using Qt WRT @iRajLal
Raj Lal
 
5 x HTML5 worth using in APEX (5)
5 x HTML5 worth using in APEX (5)5 x HTML5 worth using in APEX (5)
5 x HTML5 worth using in APEX (5)
Christian Rokitta
 
Developing your first application using FIWARE
Developing your first application using FIWAREDeveloping your first application using FIWARE
Developing your first application using FIWAREFIWARE
 
OSCON 2014 - API Ecosystem with Scala, Scalatra, and Swagger at Netflix
OSCON 2014 - API Ecosystem with Scala, Scalatra, and Swagger at NetflixOSCON 2014 - API Ecosystem with Scala, Scalatra, and Swagger at Netflix
OSCON 2014 - API Ecosystem with Scala, Scalatra, and Swagger at Netflix
Manish Pandit
 
HTML5 for Rich User Experience
HTML5 for Rich User ExperienceHTML5 for Rich User Experience
HTML5 for Rich User Experience
Mahbubur Rahman
 
HTML5 Refresher
HTML5 RefresherHTML5 Refresher
HTML5 Refresher
Ivano Malavolta
 
Hybrid Apps (Native + Web) via QtWebKit
Hybrid Apps (Native + Web) via QtWebKitHybrid Apps (Native + Web) via QtWebKit
Hybrid Apps (Native + Web) via QtWebKitAriya Hidayat
 
HTML5 and Beyond
HTML5 and BeyondHTML5 and Beyond
HTML5 and Beyond
dynamis
 
Bd conf sencha touch workshop
Bd conf sencha touch workshopBd conf sencha touch workshop
Bd conf sencha touch workshopJames Pearce
 
Repaso rápido a los nuevos estándares web
Repaso rápido a los nuevos estándares webRepaso rápido a los nuevos estándares web
Repaso rápido a los nuevos estándares web
Pablo Garaizar
 
Speak the Web 15.02.2010
Speak the Web 15.02.2010Speak the Web 15.02.2010
Speak the Web 15.02.2010Patrick Lauke
 
Html5 For Jjugccc2009fall
Html5 For Jjugccc2009fallHtml5 For Jjugccc2009fall
Html5 For Jjugccc2009fall
Shumpei Shiraishi
 
It is not HTML5. but ... / HTML5ではないサイトからHTML5を考える
It is not HTML5. but ... / HTML5ではないサイトからHTML5を考えるIt is not HTML5. but ... / HTML5ではないサイトからHTML5を考える
It is not HTML5. but ... / HTML5ではないサイトからHTML5を考える
Sadaaki HIRAI
 
HTML5: An Overview
HTML5: An OverviewHTML5: An Overview
HTML5: An Overview
Nagendra Um
 
Brave new world of HTML5
Brave new world of HTML5Brave new world of HTML5
Brave new world of HTML5
Chris Mills
 
webinale2011_Chris Mills_Brave new world of HTML5Html5
webinale2011_Chris Mills_Brave new world of HTML5Html5webinale2011_Chris Mills_Brave new world of HTML5Html5
webinale2011_Chris Mills_Brave new world of HTML5Html5smueller_sandsmedia
 
Real Time Web - What's that for?
Real Time Web - What's that for?Real Time Web - What's that for?
Real Time Web - What's that for?Martyn Loughran
 
(DEV309) From Asgard to Zuul: How Netflix’s Proven Open Source Tools Can Help...
(DEV309) From Asgard to Zuul: How Netflix’s Proven Open Source Tools Can Help...(DEV309) From Asgard to Zuul: How Netflix’s Proven Open Source Tools Can Help...
(DEV309) From Asgard to Zuul: How Netflix’s Proven Open Source Tools Can Help...
Amazon Web Services
 

Similar to Making Modern Websites (20)

HTML5 (and friends) - History, overview and current status - jsDay Verona 11....
HTML5 (and friends) - History, overview and current status - jsDay Verona 11....HTML5 (and friends) - History, overview and current status - jsDay Verona 11....
HTML5 (and friends) - History, overview and current status - jsDay Verona 11....
 
Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5
Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5
Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5
 
Meego Widget Development using Qt WRT @iRajLal
Meego Widget Development using Qt WRT @iRajLalMeego Widget Development using Qt WRT @iRajLal
Meego Widget Development using Qt WRT @iRajLal
 
5 x HTML5 worth using in APEX (5)
5 x HTML5 worth using in APEX (5)5 x HTML5 worth using in APEX (5)
5 x HTML5 worth using in APEX (5)
 
Developing your first application using FIWARE
Developing your first application using FIWAREDeveloping your first application using FIWARE
Developing your first application using FIWARE
 
OSCON 2014 - API Ecosystem with Scala, Scalatra, and Swagger at Netflix
OSCON 2014 - API Ecosystem with Scala, Scalatra, and Swagger at NetflixOSCON 2014 - API Ecosystem with Scala, Scalatra, and Swagger at Netflix
OSCON 2014 - API Ecosystem with Scala, Scalatra, and Swagger at Netflix
 
HTML5 for Rich User Experience
HTML5 for Rich User ExperienceHTML5 for Rich User Experience
HTML5 for Rich User Experience
 
HTML5 Refresher
HTML5 RefresherHTML5 Refresher
HTML5 Refresher
 
Hybrid Apps (Native + Web) via QtWebKit
Hybrid Apps (Native + Web) via QtWebKitHybrid Apps (Native + Web) via QtWebKit
Hybrid Apps (Native + Web) via QtWebKit
 
HTML5 and Beyond
HTML5 and BeyondHTML5 and Beyond
HTML5 and Beyond
 
Bd conf sencha touch workshop
Bd conf sencha touch workshopBd conf sencha touch workshop
Bd conf sencha touch workshop
 
Repaso rápido a los nuevos estándares web
Repaso rápido a los nuevos estándares webRepaso rápido a los nuevos estándares web
Repaso rápido a los nuevos estándares web
 
Speak the Web 15.02.2010
Speak the Web 15.02.2010Speak the Web 15.02.2010
Speak the Web 15.02.2010
 
Html5 For Jjugccc2009fall
Html5 For Jjugccc2009fallHtml5 For Jjugccc2009fall
Html5 For Jjugccc2009fall
 
It is not HTML5. but ... / HTML5ではないサイトからHTML5を考える
It is not HTML5. but ... / HTML5ではないサイトからHTML5を考えるIt is not HTML5. but ... / HTML5ではないサイトからHTML5を考える
It is not HTML5. but ... / HTML5ではないサイトからHTML5を考える
 
HTML5: An Overview
HTML5: An OverviewHTML5: An Overview
HTML5: An Overview
 
Brave new world of HTML5
Brave new world of HTML5Brave new world of HTML5
Brave new world of HTML5
 
webinale2011_Chris Mills_Brave new world of HTML5Html5
webinale2011_Chris Mills_Brave new world of HTML5Html5webinale2011_Chris Mills_Brave new world of HTML5Html5
webinale2011_Chris Mills_Brave new world of HTML5Html5
 
Real Time Web - What's that for?
Real Time Web - What's that for?Real Time Web - What's that for?
Real Time Web - What's that for?
 
(DEV309) From Asgard to Zuul: How Netflix’s Proven Open Source Tools Can Help...
(DEV309) From Asgard to Zuul: How Netflix’s Proven Open Source Tools Can Help...(DEV309) From Asgard to Zuul: How Netflix’s Proven Open Source Tools Can Help...
(DEV309) From Asgard to Zuul: How Netflix’s Proven Open Source Tools Can Help...
 

Recently uploaded

Enterprise Resource Planning System in Telangana
Enterprise Resource Planning System in TelanganaEnterprise Resource Planning System in Telangana
Enterprise Resource Planning System in Telangana
NYGGS Automation Suite
 
APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)
Boni García
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
Globus
 
Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"
Donna Lenk
 
Nidhi Software Price. Fact , Costs, Tips
Nidhi Software Price. Fact , Costs, TipsNidhi Software Price. Fact , Costs, Tips
Nidhi Software Price. Fact , Costs, Tips
vrstrong314
 
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Crescat
 
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteAI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
Google
 
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, BetterWebinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
XfilesPro
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOMLORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
lorraineandreiamcidl
 
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
Juraj Vysvader
 
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data AnalysisProviding Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Globus
 
Pro Unity Game Development with C-sharp Book
Pro Unity Game Development with C-sharp BookPro Unity Game Development with C-sharp Book
Pro Unity Game Development with C-sharp Book
abdulrafaychaudhry
 
Mobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona InfotechMobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona Infotech
Drona Infotech
 
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Globus
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
Fermin Galan
 
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
Łukasz Chruściel
 
E-commerce Application Development Company.pdf
E-commerce Application Development Company.pdfE-commerce Application Development Company.pdf
E-commerce Application Development Company.pdf
Hornet Dynamics
 
Enhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdfEnhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdf
Globus
 
GraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph TechnologyGraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph Technology
Neo4j
 
May Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdfMay Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdf
Adele Miller
 

Recently uploaded (20)

Enterprise Resource Planning System in Telangana
Enterprise Resource Planning System in TelanganaEnterprise Resource Planning System in Telangana
Enterprise Resource Planning System in Telangana
 
APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)
 
Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024Globus Compute Introduction - GlobusWorld 2024
Globus Compute Introduction - GlobusWorld 2024
 
Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"Navigating the Metaverse: A Journey into Virtual Evolution"
Navigating the Metaverse: A Journey into Virtual Evolution"
 
Nidhi Software Price. Fact , Costs, Tips
Nidhi Software Price. Fact , Costs, TipsNidhi Software Price. Fact , Costs, Tips
Nidhi Software Price. Fact , Costs, Tips
 
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
Introducing Crescat - Event Management Software for Venues, Festivals and Eve...
 
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteAI Pilot Review: The World’s First Virtual Assistant Marketing Suite
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
 
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, BetterWebinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
Webinar: Salesforce Document Management 2.0 - Smarter, Faster, Better
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOMLORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
LORRAINE ANDREI_LEQUIGAN_HOW TO USE ZOOM
 
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
 
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data AnalysisProviding Globus Services to Users of JASMIN for Environmental Data Analysis
Providing Globus Services to Users of JASMIN for Environmental Data Analysis
 
Pro Unity Game Development with C-sharp Book
Pro Unity Game Development with C-sharp BookPro Unity Game Development with C-sharp Book
Pro Unity Game Development with C-sharp Book
 
Mobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona InfotechMobile App Development Company In Noida | Drona Infotech
Mobile App Development Company In Noida | Drona Infotech
 
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
Innovating Inference - Remote Triggering of Large Language Models on HPC Clus...
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
 
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
 
E-commerce Application Development Company.pdf
E-commerce Application Development Company.pdfE-commerce Application Development Company.pdf
E-commerce Application Development Company.pdf
 
Enhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdfEnhancing Research Orchestration Capabilities at ORNL.pdf
Enhancing Research Orchestration Capabilities at ORNL.pdf
 
GraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph TechnologyGraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph Technology
 
May Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdfMay Marketo Masterclass, London MUG May 22 2024.pdf
May Marketo Masterclass, London MUG May 22 2024.pdf
 

Making Modern Websites