SlideShare a Scribd company logo
1 of 155
Download to read offline
PWAs
Where Do I Begin?
Aaron Gustafson
@AaronGustafson
noti.st/AaronGustafson
What exactly is a
PWA?
Progressive Web App?
What exactly is a
What exactly is a
Progressive Web App?
What exactly is a
Progressive Web App?
What exactly is a
Progressive Web App?
“Progressive Web App”
is a marketing term
Progressive Web App
Progressive Web App
Progressive Web App
Game
Gallery
Book
Newspaper
Art Project
Tool
Progressive Web Site
Who’s behind PWAs?
@AaronGustafson
What’s a PWA, technically?
HTTPS
@AaronGustafson
What’s a PWA, technically?
HTTPS Web App
Manifest
@AaronGustafson
What’s a manifest?
{
"lang": "en",
"short_name": "Wash Post",
"name": "The Washington Post",
"icons": [ { "src": "img/launcher-icon-2x.png",
"sizes": "96x96",
"type": "image/png" } ],
"start_url": "/pwa/",
"display": "standalone",
"orientation": "portrait",
"background_color": "black"
}
@AaronGustafson
What’s a PWA, technically?
HTTPS Web App
Manifest
Service
Worker
Should I believe
the hype?
Maybe?
Starbucks:
2x increase in daily
active users
aka.ms/google-io-2018
Tinder:
Core experience
with 90% less code
aka.ms/tinder-pwa-2017
Trivago:
97% increase in
click-outs to
hotel offers
aka.ms/trivago-pwa-2017
West Elm:
15% increase in
time on site
9% increase in
revenue per visit
aka.ms/west-elm-pwa-2017
@AaronGustafson
Let’s talk about Service Worker
@AaronGustafson
Registering a Service Worker
if ( "serviceWorker" in navigator ) {
navigator.serviceWorker.register( "/serviceworker.min.js" );
}
Path is important!
@AaronGustafson
The Service Worker Lifecycle
Browser
Install Activation Ready
aka.ms/pwa-lifecycle
@AaronGustafson
How connections are made
Browser
Internet
@AaronGustafson
Along comes Service Worker
Browser
Internet
Cache
@AaronGustafson
Along comes Service Worker
Browser
Internet
Cache
!
PWAs start with a great web
experience and then enhance
that experience for performance,
resilience, installation,
and engagement
Progressive Web AppProgressive
Enhancement
PWAs start with a great web
experience and then enhance
that experience for performance,
resilience, installation,
and engagement
Progressive Web App
Progressive
/prəˈɡresiv/
happening or developing
gradually or in stages;
proceeding step by step
Patrick Perkins
@AaronGustafson
Consider forbes.com circa 2007
“Mobile first” thinking
isn’t just about mobile
Patrick Perkins
Patrick Perkins
Patrick PerkinsAvinash Arunachalam A M
Step 2

Use markup that supports
the core experience
Avinash Arunachalam A M
@AaronGustafson
What does it mean?
<div class="entry">
<div class="entry__title">Progressive Web Apps and
the Windows Ecosystem</div>
<div class="entry__meta">
<div><b>Published</b> 24 May 2017</div>
<div><b>Reading Time</b> 25 minutes</div>
</div>
<div class="entry__content">
I had the great pleasure of delivering a talk…
<br><br>
I do a lot of traveling and it’s…
</div>
</div>
@AaronGustafson
This is self-contained content
<div class="entry">
<div class="entry__title">Progressive Web Apps and
the Windows Ecosystem</div>
<div class="entry__meta">
<div><b>Published</b> 24 May 2017</div>
<div><b>Reading Time</b> 25 minutes</div>
</div>
<div class="entry__content">
I had the great pleasure of delivering a talk…
<br><br>
I do a lot of traveling and it’s…
</div>
</div>
@AaronGustafson
There’s a tag for that: article
<article class="entry">
<div class="entry__title">Progressive Web Apps and
the Windows Ecosystem</div>
<div class="entry__meta">
<div><b>Published</b> 24 May 2017</div>
<div><b>Reading Time</b> 25 minutes</div>
</div>
<div class="entry__content">
I had the great pleasure of delivering a talk…
<br><br>
I do a lot of traveling and it’s…
</div>
</article>
@AaronGustafson
This is the title of the post
<article class="entry">
<div class="entry__title">Progressive Web Apps and
the Windows Ecosystem</div>
<div class="entry__meta">
<div><b>Published</b> 24 May 2017</div>
<div><b>Reading Time</b> 25 minutes</div>
</div>
<div class="entry__content">
I had the great pleasure of delivering a talk…
<br><br>
I do a lot of traveling and it’s…
</div>
</article>
@AaronGustafson
There’s a tag for that: h1-h6
<article class="entry">
<h1 class="entry__title">Progressive Web Apps and
the Windows Ecosystem</h1>
<div class="entry__meta">
<div><b>Published</b> 24 May 2017</div>
<div><b>Reading Time</b> 25 minutes</div>
</div>
<div class="entry__content">
I had the great pleasure of delivering a talk…
<br><br>
I do a lot of traveling and it’s…
</div>
</article>
@AaronGustafson
Various properties of the post
<article class="entry">
<h1 class="entry__title">Progressive Web Apps and
the Windows Ecosystem</h1>
<div class="entry__meta">
<div><b>Published</b> 24 May 2017</div>
<div><b>Reading Time</b> 25 minutes</div>
</div>
<div class="entry__content">
I had the great pleasure of delivering a talk…
<br><br>
I do a lot of traveling and it’s…
</div>
</article>
@AaronGustafson
There’s an element for that: dl
<article class="entry">
<h1 class="entry__title">Progressive Web Apps and
the Windows Ecosystem</h1>
<dl class="entry__meta">
<dt>Published</dt> <dd>24 May 2017</dd>
<dt>Reading Time</dt> <dd>25 minutes</dd>
</dl>
<div class="entry__content">
I had the great pleasure of delivering a talk…
<br><br>
I do a lot of traveling and it’s…
</div>
</article>
@AaronGustafson
Bonus: time
<article class="entry">
<h1 class="entry__title">Progressive Web Apps and
the Windows Ecosystem</h1>
<dl class="entry__meta">
<dt>Published</dt> <dd><time>24 May 2017</time></dd>
<dt>Reading Time</dt> <dd>25 minutes</dd>
</dl>
<div class="entry__content">
I had the great pleasure of delivering a talk…
<br><br>
I do a lot of traveling and it’s…
</div>
</article>
@AaronGustafson
Bonus: time
<time datetime="2017-05-24">
24 May 2017</time>
<time datetime="2017-05-24T11:13:24">
24 May 2017</time>
<time datetime="2017-05-24T11:13:24-04:00">
24 May 2017</time>
@AaronGustafson
“Flow” content with line breaks
<article class="entry">
<h1 class="entry__title">Progressive Web Apps and
the Windows Ecosystem</h1>
<dl class="entry__meta">
<dt>Published</dt> <dd><time …>24 May 2017</time></dd>
<dt>Reading Time</dt> <dd>25 minutes</dd>
</dl>
<div class="entry__content">
I had the great pleasure of delivering a talk…
<br><br>
I do a lot of traveling and it’s…
</div>
</article>
@AaronGustafson
“Flow” content, divided
<article class="entry">
<h1 class="entry__title">Progressive Web Apps and
the Windows Ecosystem</h1>
<dl class="entry__meta">
<dt>Published</dt> <dd><time …>24 May 2017</time></dd>
<dt>Reading Time</dt> <dd>25 minutes</dd>
</dl>
<div class="entry__content">
<div>I had the great pleasure of delivering a…</div>
<div>I do a lot of traveling and it’s…</div>
</div>
</article>
@AaronGustafson
This is meaningful content
<article class="entry">
<h1 class="entry__title">Progressive Web Apps and
the Windows Ecosystem</h1>
<dl class="entry__meta">
<dt>Published</dt> <dd><time …>24 May 2017</time></dd>
<dt>Reading Time</dt> <dd>25 minutes</dd>
</dl>
<div class="entry__content">
<p>I had the great pleasure of delivering a talk…</p>
<p>I do a lot of traveling and it’s…</p>
</div>
</article>
Avinash Arunachalam A M
@AaronGustafson
Readability
Hey Cortana, read me the top three
headlines in today’s New York Times
@AaronGustafson
Access via semantics:
function extractHeadlines( response ){
var $html = document.createElement('div'),
$headings, i=0, headlines=[];
$html.innerHTML = response.contents;
$headings = $html.querySelector('#top-new')
.querySelectorAll('article h1, article h2, article h3');
heading_count = $headings.length;
while (headlines.length < 3) {
let $link = $headings[i].querySelector('a');
if ($link && $link.href) {
headlines.push({
title: $headings[i].innerText.trim(),
link: $link.href
});
}
i++;
}
console.log( headlines );
}
@AaronGustafson
Access via semantics:
function extractHeadlines( response ){
var $html = document.createElement('div'),
$headings, i=0, headlines=[];
$html.innerHTML = response.contents;
$headings = $html.querySelector('#top-new')
.querySelectorAll('article h1, article h2, article h3');
heading_count = $headings.length;
while (headlines.length < 3) {
let $link = $headings[i].querySelector('a');
if ($link && $link.href) {
headlines.push({
title: $headings[i].innerText.trim(),
link: $link.href
});
}
i++;
}
console.log( headlines );
}
More about semantics
for “headless” UIs
aka.ms/conversational-semantics
aka.ms/dependency-awareness
@AaronGustafson
Let’s say you needed a button…
<input type="submit" value="Sign Up">
<button type="submit">Sign Up</button>
<a class="button" href="#">Sign Up</a>
<div class="button">Sign Up</div>
Sign Up
@AaronGustafson
Let’s compare
Pattern Display Semantics Focusable? Activate By
Submits
Forms
input[type=submit] button button Yes
Mouse, touch,
ENTER, SPACE
Yes
button[type=submit] button button Yes
Mouse, touch,
ENTER, SPACE
Yes
a link
Named
generic
Yes
Mouse, touch,
ENTER
No
div block
Not
exposed
No N/A No
@AaronGustafson
UX gaps that need to be filled
Pattern Display Semantics Focusable? Activate By
Submits
Forms
input[type=submit] button button Yes
Mouse, touch,
ENTER, SPACE
Yes
button[type=submit] button button Yes
Mouse, touch,
ENTER, SPACE
Yes
a link
Named
generic
Yes
Mouse, touch,
ENTER
No
div block
Not
exposed
No N/A No
@AaronGustafson
Moar dependencies
Pattern Display Semantics Focusable? Activate By
Submits
Forms
input[type=submit] None None None None None
button[type=submit] None None None None None
a CSS ARIA None JavaScript JavaScript
div CSS ARIA HTML JavaScript JavaScript
@AaronGustafson
Moar dependencies
Pattern Display Semantics Focusable? Activate By
Submits
Forms
input[type=submit] None None None None None
button[type=submit] None None None None None
a CSS ARIA None JavaScript JavaScript
div CSS ARIA HTML JavaScript JavaScript
@AaronGustafson
Moar dependencies,
moar (potential) problems
Dependencies
Potentialforfailure
@AaronGustafson
Disaster averted
@AaronGustafson
Moar dependencies,
moar (potential) problems
Dependencies
Potentialforfailure
@AaronGustafson
Enhance the experience
Capabilities
UserExperience
@AaronGustafson
Enhancing UX with markup
<input type="email" name="email" id="email"
required aria-required="true">
@AaronGustafson
Enhancing UX with markup
<input type="email" name="email" id="email"
required aria-required="true">
Experience deltas
1. Support for email input type?
2. Validation algorithm implemented?
3. Virtual keyboard?
@AaronGustafson
Enhancing UX with markup
<input type="email" name="email" id="email"
required aria-required="true">
Experience deltas
1. Support for HTML validation?
@AaronGustafson
Enhancing UX with markup
<input type="email" name="email" id="email"
required aria-required="true">
Experience deltas
1. Browser exposure of aria-required property?
2. Assistive tech implementation of aria-required?
@AaronGustafson
Enhance the experience
Capabilities
UserExperience
Avinash Arunachalam A M
Avinash Arunachalam A MChris Grafton
Step 3

Design in support of the
core experience
@AaronGustafson
Enhance the experience
Capabilities
UserExperience
aka.ms/enhanced-css-layouts
Good design is
problem solving.
— Jeff Veen
@AaronGustafson
Tools for graphic design
Alignment
Balance
Contrast
Emphasis
Gestalt
Harmony
Movement
Proportion
Proximity
Repetition
Rhythm
Unity
White Space
@AaronGustafson
Tools for graphic design
Alignment
Balance
Contrast
Emphasis
Gestalt
Harmony
Movement
Proportion
Proximity
Repetition
Rhythm
Unity
White Space
@AaronGustafson
Alignment
@AaronGustafson
Contrast
@AaronGustafson
Proportion
@AaronGustafson
Proximity
@AaronGustafson
Rhythm
aka.ms/vertical-rhythm
@AaronGustafson
Unity
@AaronGustafson
Unique design considerations
Screen size
Resolution
Brightness
Color density
User preference
Network speed & quality
Assistive technology
@AaronGustafson
Unique design considerations
Screen size
Resolution
Brightness
Color density
User preference
Network speed & quality
Assistive technology
☞
☞
☞
☞
☞
@AaronGustafson
Unique design considerations
Screen size
Resolution
Brightness
Color density
User preference
Network speed & quality
Assistive technology
@AaronGustafson
Examples of user preference
Larger or smaller fonts
@media (min-width: 32em) { … }
High contrast colors
@media (-ms-high-contrast: active) { … }
@media (-ms-high-contrast: white-on-black) { … }
@media (-ms-high-contrast: black-on-white) { … }
Reduced motion
@media (prefers-reduced-motion: reduce) { … }
@AaronGustafson
Assistive technologies
๏ Vision
๏ Screen magnifiers
๏ Screen readers
๏ Braille printers & refreshable
braille displays
๏ High contrast settings
๏ Hearing
๏ Captions & subtitles
๏ Motor/mobility
๏ Speech recognition
๏ Mouse settings
๏ Keyboards & keyboard
overlays
๏ Eye tracking
Confirm Cancel
Confirm Cancel
Don’t rely on color
alone to convey
important information
aka.ms/color-contrast
Good contrast
ensures your
content is readable
Explicit connections
ensure everyone can
follow references
<a href="#figure-3-3">Figure
3.3</a> shows the lodging
article in Safari with only the
default browser styles applied.
…
<figure id="figure-3-3">
…
</figure>
Explicit connections
ensure everyone can
follow references
Consider what
your design
leaves unsaid
aria-label="You can
finish reading “The Web
Should Just Work for
Everyone” in less than
10 minutes"
Consider what
your design
leaves unsaid
@AaronGustafson
Enhance the experience
Capabilities
UserExperience
@AaronGustafson
Enhancing design in CSS
p {
color: green;
color: rgba(0, 255, 0, .8);
}
Passwords can be a hassle.
Most people don’t create
strong passwords or make
sure to maintain a different
one for every site. People
create easy-to-remember
passwords and typically use
the same passwords across all
of their accounts.
@AaronGustafson
Enhancing design in CSS
p {
color: green;
color: rgba(0, 255, 0, .8);
}
Older browsers without RGBa
support, ignore the second rule
Passwords can be a hassle.
Most people don’t create
strong passwords or make
sure to maintain a different
one for every site. People
create easy-to-remember
passwords and typically use
the same passwords across all
of their accounts.
@AaronGustafson
Enhancing design in CSS
p {
color: green;
color: rgba(0, 255, 0, .8);
}
Modern browsers with RGBa
support, overwrite the first rule
@AaronGustafson
Enhancing design in CSS
h1:has(+ p) {
color: green;
}
(That selects h1s that have adjacent
sibling paragraphs.)
Passwords can be
a hassle
Most people don’t create
strong passwords or make
sure to maintain a different
one for every site. People
create easy-to-remember
passwords and typically use
the same passwords across all
of their accounts.
@AaronGustafson
Enhancing design in CSS
h1:has(+ p) {
color: green;
}
Browsers that don’t support :has()
ignore the entire rule set
Passwords can be
a hassle
Most people don’t create
strong passwords or make
sure to maintain a different
one for every site. People
create easy-to-remember
passwords and typically use
the same passwords across all
of their accounts.
@AaronGustafson
Beware the comma!
div:hover .extra-stuff,
div:focus-within .extra-stuff {
/* reveal it */
}
@AaronGustafson
Beware the comma!
div:hover .extra-stuff,
div:focus-within .extra-stuff {
/* reveal it */
}
Browsers that don’t support :focus-within
@AaronGustafson
Beware the comma!
div:hover .extra-stuff,
div:focus-within .extra-stuff {
/* reveal it */
}
Browsers that do support :focus-within
@AaronGustafson
Enhancing design in CSS
h1:has(+ p) {
color: green;
}
As browsers support :has(),
matching h1s will turn green
Passwords can be
a hassle
Most people don’t create
strong passwords or make
sure to maintain a different
one for every site. People
create easy-to-remember
passwords and typically use
the same passwords across all
of their accounts.
@AaronGustafson
Enhancing design in CSS
@media only screen {
p {
color: green;
}
}
Passwords can be a hassle.
Most people don’t create
strong passwords or make
sure to maintain a different
one for every site. People
create easy-to-remember
passwords and typically use
the same passwords across all
of their accounts.
@AaronGustafson
Enhancing design in CSS
@media only screen {
p {
color: green;
}
}
Browsers without media query
support ignore the block
Passwords can be a hassle.
Most people don’t create
strong passwords or make
sure to maintain a different
one for every site. People
create easy-to-remember
passwords and typically use
the same passwords across all
of their accounts.
@AaronGustafson
Enhancing design in CSS
@media only screen {
p {
color: green;
}
}
Browsers with media query support
apply it
Passwords can be a hassle.
Most people don’t create
strong passwords or make
sure to maintain a different
one for every site. People
create easy-to-remember
passwords and typically use
the same passwords across all
of their accounts.
@AaronGustafson
Enhancing design in CSS
@supports (display: grid) {
p {
color: green;
}
}
Passwords can be a hassle.
Most people don’t create
strong passwords or make
sure to maintain a different
one for every site. People
create easy-to-remember
passwords and typically use
the same passwords across all
of their accounts.
@AaronGustafson
Enhancing design in CSS
@supports (display: grid) {
p {
color: green;
}
}
Browsers that don’t grok @supports
ignore the block
Passwords can be a hassle.
Most people don’t create
strong passwords or make
sure to maintain a different
one for every site. People
create easy-to-remember
passwords and typically use
the same passwords across all
of their accounts.
@AaronGustafson
Enhancing design in CSS
@supports (display: grid) {
p {
color: green;
}
}
Browsers that understand
@supports, but don’t support grid
ignore it
Passwords can be a hassle.
Most people don’t create
strong passwords or make
sure to maintain a different
one for every site. People
create easy-to-remember
passwords and typically use
the same passwords across all
of their accounts.
@AaronGustafson
Enhancing design in CSS
@supports (display: grid) {
p {
color: green;
}
}
Browsers that understand
@supports and grid apply it
Passwords can be a hassle.
Most people don’t create
strong passwords or make
sure to maintain a different
one for every site. People
create easy-to-remember
passwords and typically use
the same passwords across all
of their accounts.
Chris Grafton
Chris Grafton
aka.ms/enhanced-css-layouts
@AaronGustafson
Enhance the experience
Capabilities
UserExperience
“Mobile first” design
“Desktop first”
.primary {
float: left;
width: 68%;
}
.secondary {
float: right;
width: 32%;
}
“Desktop first”
@media (max-width:599px) {
.primary, .secondary {
float: none;
width: auto;
}
}
“Desktop first”
“Mobile first”
@media (min-width:600px)
“Mobile first”
@AaronGustafson
Also “mobile first”
๏ Selectively deliver advances styles
๏ Isolate large CSS images in min-width
media queries
๏ Don’t hide content images using CSS
๏ Use responsive images
๏ Prefer system fonts
๏ font-display: optional
@AaronGustafson
Enhance the experience
Capabilities
UserExperience
Chris GraftonJacob Creswick
Step 4

Improve the core
experience with JavaScript
Jacob Creswick
Jacob Creswick
@AaronGustafson
Got let?
document.body.innerHTML += '<p>Can I count to four?</p>';
for ( let i=1; i<=4; i++ ) {
document.body.innerHTML += '<p>' + i + '</p>’;
}
document.body.innerHTML += '<p>Success!</p>';
aka.ms/js-let-down
aka.ms/js-let-down
@AaronGustafson
Moar dependencies,
moar (potential) problems
Dependencies
Potentialforfailure
aka.ms/github-removes-jquery
aka.ms/github-removes-jquery
As part of our refined approach to building frontend features
on GitHub.com, we focused on getting away with regular
HTML foundation as much as we could, and only adding
JavaScript behaviors as progressive enhancement. As a result,
even those web forms and other UI elements that were
enhanced using JS would usually also work with JavaScript
disabled in the browser.
aka.ms/github-removes-jquery
As part of our refined approach to building frontend features
on GitHub.com, we focused on getting away with regular
HTML foundation as much as we could, and only adding
JavaScript behaviors as progressive enhancement. As a result,
even those web forms and other UI elements that were
enhanced using JS would usually also work with JavaScript
disabled in the browser.
Jacob Creswick
@AaronGustafson
Enhance the experience
Capabilities
UserExperience
@AaronGustafson
Detecting support
if ( navigator.credentials ) {
// Actual logic goes here
}
@AaronGustafson
Enhance the experience
Capabilities
UserExperience
Jacob Creswick
@AaronGustafson
Registering a Service Worker
if ( navigator.serviceWorker ) {
navigator.serviceWorker.register('/serviceworker.js’)
.then(function(registration) {
console.log('Success!', registration.scope);
})
.catch(function(error) {
console.error('Failure!', error);
});
}
@AaronGustafson
Object detection FTW!
if ( navigator.serviceWorker ) {
navigator.serviceWorker.register('/serviceworker.js’)
.then(function(registration) {
console.log('Success!', registration.scope);
})
.catch(function(error) {
console.error('Failure!', error);
});
}
@AaronGustafson
Enhance the experience
Capabilities
UserExperience
@AaronGustafson
Enhance the experience
Capabilities
UserExperience
@AaronGustafson
Enhance the Service Worker
Capabilities
UserExperience
Jacob Creswick
@AaronGustafson
Enhance the experience
Capabilities
UserExperience
PWAs start with a great web
experience and then enhance
that experience for performance,
resilience, installation,
and engagement
PWAs start with a great web
experience and then enhance
that experience for performance,
resilience, installation,
and engagement
Design
Markup
JavaScript
Focus
Thank you!
@AaronGustafson
aaron-gustafson.com
noti.st/AaronGustafson

More Related Content

Similar to Progressive Web Apps: Where Do I Begin?

Your Custom WordPress Admin Pages Suck
Your Custom WordPress Admin Pages SuckYour Custom WordPress Admin Pages Suck
Your Custom WordPress Admin Pages SuckAnthony Montalbano
 
Slow kinda sucks
Slow kinda sucksSlow kinda sucks
Slow kinda sucksTim Wright
 
Darwin web standards
Darwin web standardsDarwin web standards
Darwin web standardsJustin Avery
 
Introduction to HTML5
Introduction to HTML5Introduction to HTML5
Introduction to HTML5Terry Ryan
 
TOSSUG HTML5 讀書會 新標籤與表單
TOSSUG HTML5 讀書會 新標籤與表單TOSSUG HTML5 讀書會 新標籤與表單
TOSSUG HTML5 讀書會 新標籤與表單偉格 高
 
jQuery Mobile - Desenvolvimento para dispositivos móveis
jQuery Mobile - Desenvolvimento para dispositivos móveisjQuery Mobile - Desenvolvimento para dispositivos móveis
jQuery Mobile - Desenvolvimento para dispositivos móveisPablo Garrido
 
Building beautiful websites with bootstrap a case study (DevelopMentor webcast)
Building beautiful websites with bootstrap  a case study (DevelopMentor webcast)Building beautiful websites with bootstrap  a case study (DevelopMentor webcast)
Building beautiful websites with bootstrap a case study (DevelopMentor webcast)Michael Kennedy
 
HTML5 and the dawn of rich mobile web applications pt 2
HTML5 and the dawn of rich mobile web applications pt 2HTML5 and the dawn of rich mobile web applications pt 2
HTML5 and the dawn of rich mobile web applications pt 2James Pearce
 
2022 HTML5: The future is now
2022 HTML5: The future is now2022 HTML5: The future is now
2022 HTML5: The future is nowGonzalo Cordero
 
Fronttechnieken met HTML5 en de Slice-template
Fronttechnieken met HTML5 en de Slice-templateFronttechnieken met HTML5 en de Slice-template
Fronttechnieken met HTML5 en de Slice-templateInventis Web Architects
 
Jquery presentation
Jquery presentationJquery presentation
Jquery presentationguest5d87aa6
 
Bootstrap PPT by Mukesh
Bootstrap PPT by MukeshBootstrap PPT by Mukesh
Bootstrap PPT by MukeshMukesh Kumar
 
J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012ghnash
 
TURN YOUR CELL PHONE FROM A LIABILITY INTO AN ASSET!
TURN YOUR CELL PHONE FROM A LIABILITY INTO AN ASSET!TURN YOUR CELL PHONE FROM A LIABILITY INTO AN ASSET!
TURN YOUR CELL PHONE FROM A LIABILITY INTO AN ASSET!Coulawrence
 
An Introduction to HTML5
An Introduction to HTML5An Introduction to HTML5
An Introduction to HTML5Steven Chipman
 
Get Structured, Get Sexy... Get Schema!
Get Structured, Get Sexy... Get Schema!Get Structured, Get Sexy... Get Schema!
Get Structured, Get Sexy... Get Schema!Mitch Canter
 

Similar to Progressive Web Apps: Where Do I Begin? (20)

HTML5
HTML5HTML5
HTML5
 
Your Custom WordPress Admin Pages Suck
Your Custom WordPress Admin Pages SuckYour Custom WordPress Admin Pages Suck
Your Custom WordPress Admin Pages Suck
 
Slow kinda sucks
Slow kinda sucksSlow kinda sucks
Slow kinda sucks
 
HTML5 Essentials
HTML5 EssentialsHTML5 Essentials
HTML5 Essentials
 
Darwin web standards
Darwin web standardsDarwin web standards
Darwin web standards
 
Introduction to HTML5
Introduction to HTML5Introduction to HTML5
Introduction to HTML5
 
TOSSUG HTML5 讀書會 新標籤與表單
TOSSUG HTML5 讀書會 新標籤與表單TOSSUG HTML5 讀書會 新標籤與表單
TOSSUG HTML5 讀書會 新標籤與表單
 
jQuery Mobile - Desenvolvimento para dispositivos móveis
jQuery Mobile - Desenvolvimento para dispositivos móveisjQuery Mobile - Desenvolvimento para dispositivos móveis
jQuery Mobile - Desenvolvimento para dispositivos móveis
 
Building beautiful websites with bootstrap a case study (DevelopMentor webcast)
Building beautiful websites with bootstrap  a case study (DevelopMentor webcast)Building beautiful websites with bootstrap  a case study (DevelopMentor webcast)
Building beautiful websites with bootstrap a case study (DevelopMentor webcast)
 
HTML5 and the dawn of rich mobile web applications pt 2
HTML5 and the dawn of rich mobile web applications pt 2HTML5 and the dawn of rich mobile web applications pt 2
HTML5 and the dawn of rich mobile web applications pt 2
 
03DOM.ppt
03DOM.ppt03DOM.ppt
03DOM.ppt
 
2022 HTML5: The future is now
2022 HTML5: The future is now2022 HTML5: The future is now
2022 HTML5: The future is now
 
Fronttechnieken met HTML5 en de Slice-template
Fronttechnieken met HTML5 en de Slice-templateFronttechnieken met HTML5 en de Slice-template
Fronttechnieken met HTML5 en de Slice-template
 
Jquery presentation
Jquery presentationJquery presentation
Jquery presentation
 
Bootstrap PPT by Mukesh
Bootstrap PPT by MukeshBootstrap PPT by Mukesh
Bootstrap PPT by Mukesh
 
J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012
 
TURN YOUR CELL PHONE FROM A LIABILITY INTO AN ASSET!
TURN YOUR CELL PHONE FROM A LIABILITY INTO AN ASSET!TURN YOUR CELL PHONE FROM A LIABILITY INTO AN ASSET!
TURN YOUR CELL PHONE FROM A LIABILITY INTO AN ASSET!
 
An Introduction to HTML5
An Introduction to HTML5An Introduction to HTML5
An Introduction to HTML5
 
Get Structured, Get Sexy... Get Schema!
Get Structured, Get Sexy... Get Schema!Get Structured, Get Sexy... Get Schema!
Get Structured, Get Sexy... Get Schema!
 
Django at the Disco
Django at the DiscoDjango at the Disco
Django at the Disco
 

More from Aaron Gustafson

Delivering Critical Information and Services [JavaScript & Friends 2021]
Delivering Critical Information and Services [JavaScript & Friends 2021]Delivering Critical Information and Services [JavaScript & Friends 2021]
Delivering Critical Information and Services [JavaScript & Friends 2021]Aaron Gustafson
 
Adapting to Reality [Guest Lecture, March 2021]
Adapting to Reality [Guest Lecture, March 2021]Adapting to Reality [Guest Lecture, March 2021]
Adapting to Reality [Guest Lecture, March 2021]Aaron Gustafson
 
Designing the Conversation [Beyond Tellerrand 2019]
Designing the Conversation [Beyond Tellerrand 2019]Designing the Conversation [Beyond Tellerrand 2019]
Designing the Conversation [Beyond Tellerrand 2019]Aaron Gustafson
 
Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]
Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]
Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]Aaron Gustafson
 
Media in the Age of PWAs [ImageCon 2019]
Media in the Age of PWAs [ImageCon 2019]Media in the Age of PWAs [ImageCon 2019]
Media in the Age of PWAs [ImageCon 2019]Aaron Gustafson
 
Adapting to Reality [Starbucks Lunch & Learn]
Adapting to Reality [Starbucks Lunch & Learn]Adapting to Reality [Starbucks Lunch & Learn]
Adapting to Reality [Starbucks Lunch & Learn]Aaron Gustafson
 
Conversational Semantics for the Web [CascadiaJS 2018]
Conversational Semantics for the Web [CascadiaJS 2018]Conversational Semantics for the Web [CascadiaJS 2018]
Conversational Semantics for the Web [CascadiaJS 2018]Aaron Gustafson
 
Better Performance === Greater Accessibility [Inclusive Design 24 2018]
Better Performance === Greater Accessibility [Inclusive Design 24 2018]Better Performance === Greater Accessibility [Inclusive Design 24 2018]
Better Performance === Greater Accessibility [Inclusive Design 24 2018]Aaron Gustafson
 
Designing the Conversation [Concatenate 2018]
Designing the Conversation [Concatenate 2018]Designing the Conversation [Concatenate 2018]
Designing the Conversation [Concatenate 2018]Aaron Gustafson
 
Designing the Conversation [Accessibility DC 2018]
Designing the Conversation [Accessibility DC 2018]Designing the Conversation [Accessibility DC 2018]
Designing the Conversation [Accessibility DC 2018]Aaron Gustafson
 
Performance as User Experience [AEADC 2018]
Performance as User Experience [AEADC 2018]Performance as User Experience [AEADC 2018]
Performance as User Experience [AEADC 2018]Aaron Gustafson
 
The Web Should Just Work for Everyone
The Web Should Just Work for EveryoneThe Web Should Just Work for Everyone
The Web Should Just Work for EveryoneAaron Gustafson
 
Performance as User Experience [AEA SEA 2018]
Performance as User Experience [AEA SEA 2018]Performance as User Experience [AEA SEA 2018]
Performance as User Experience [AEA SEA 2018]Aaron Gustafson
 
Performance as User Experience [An Event Apart Denver 2017]
Performance as User Experience [An Event Apart Denver 2017]Performance as User Experience [An Event Apart Denver 2017]
Performance as User Experience [An Event Apart Denver 2017]Aaron Gustafson
 
Advanced Design Methods 1, Day 2
Advanced Design Methods 1, Day 2Advanced Design Methods 1, Day 2
Advanced Design Methods 1, Day 2Aaron Gustafson
 
Advanced Design Methods 1, Day 1
Advanced Design Methods 1, Day 1Advanced Design Methods 1, Day 1
Advanced Design Methods 1, Day 1Aaron Gustafson
 
Designing the Conversation [Paris Web 2017]
Designing the Conversation [Paris Web 2017]Designing the Conversation [Paris Web 2017]
Designing the Conversation [Paris Web 2017]Aaron Gustafson
 
Exploring Adaptive Interfaces [Generate 2017]
Exploring Adaptive Interfaces [Generate 2017]Exploring Adaptive Interfaces [Generate 2017]
Exploring Adaptive Interfaces [Generate 2017]Aaron Gustafson
 
Progressive Web Apps and the Windows Ecosystem [Build 2017]
Progressive Web Apps and the Windows Ecosystem [Build 2017]Progressive Web Apps and the Windows Ecosystem [Build 2017]
Progressive Web Apps and the Windows Ecosystem [Build 2017]Aaron Gustafson
 
Writing for Engagement [TechReady 22]
Writing for Engagement [TechReady 22]Writing for Engagement [TechReady 22]
Writing for Engagement [TechReady 22]Aaron Gustafson
 

More from Aaron Gustafson (20)

Delivering Critical Information and Services [JavaScript & Friends 2021]
Delivering Critical Information and Services [JavaScript & Friends 2021]Delivering Critical Information and Services [JavaScript & Friends 2021]
Delivering Critical Information and Services [JavaScript & Friends 2021]
 
Adapting to Reality [Guest Lecture, March 2021]
Adapting to Reality [Guest Lecture, March 2021]Adapting to Reality [Guest Lecture, March 2021]
Adapting to Reality [Guest Lecture, March 2021]
 
Designing the Conversation [Beyond Tellerrand 2019]
Designing the Conversation [Beyond Tellerrand 2019]Designing the Conversation [Beyond Tellerrand 2019]
Designing the Conversation [Beyond Tellerrand 2019]
 
Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]
Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]
Getting Started with Progressive Web Apps [Beyond Tellerrand 2019]
 
Media in the Age of PWAs [ImageCon 2019]
Media in the Age of PWAs [ImageCon 2019]Media in the Age of PWAs [ImageCon 2019]
Media in the Age of PWAs [ImageCon 2019]
 
Adapting to Reality [Starbucks Lunch & Learn]
Adapting to Reality [Starbucks Lunch & Learn]Adapting to Reality [Starbucks Lunch & Learn]
Adapting to Reality [Starbucks Lunch & Learn]
 
Conversational Semantics for the Web [CascadiaJS 2018]
Conversational Semantics for the Web [CascadiaJS 2018]Conversational Semantics for the Web [CascadiaJS 2018]
Conversational Semantics for the Web [CascadiaJS 2018]
 
Better Performance === Greater Accessibility [Inclusive Design 24 2018]
Better Performance === Greater Accessibility [Inclusive Design 24 2018]Better Performance === Greater Accessibility [Inclusive Design 24 2018]
Better Performance === Greater Accessibility [Inclusive Design 24 2018]
 
Designing the Conversation [Concatenate 2018]
Designing the Conversation [Concatenate 2018]Designing the Conversation [Concatenate 2018]
Designing the Conversation [Concatenate 2018]
 
Designing the Conversation [Accessibility DC 2018]
Designing the Conversation [Accessibility DC 2018]Designing the Conversation [Accessibility DC 2018]
Designing the Conversation [Accessibility DC 2018]
 
Performance as User Experience [AEADC 2018]
Performance as User Experience [AEADC 2018]Performance as User Experience [AEADC 2018]
Performance as User Experience [AEADC 2018]
 
The Web Should Just Work for Everyone
The Web Should Just Work for EveryoneThe Web Should Just Work for Everyone
The Web Should Just Work for Everyone
 
Performance as User Experience [AEA SEA 2018]
Performance as User Experience [AEA SEA 2018]Performance as User Experience [AEA SEA 2018]
Performance as User Experience [AEA SEA 2018]
 
Performance as User Experience [An Event Apart Denver 2017]
Performance as User Experience [An Event Apart Denver 2017]Performance as User Experience [An Event Apart Denver 2017]
Performance as User Experience [An Event Apart Denver 2017]
 
Advanced Design Methods 1, Day 2
Advanced Design Methods 1, Day 2Advanced Design Methods 1, Day 2
Advanced Design Methods 1, Day 2
 
Advanced Design Methods 1, Day 1
Advanced Design Methods 1, Day 1Advanced Design Methods 1, Day 1
Advanced Design Methods 1, Day 1
 
Designing the Conversation [Paris Web 2017]
Designing the Conversation [Paris Web 2017]Designing the Conversation [Paris Web 2017]
Designing the Conversation [Paris Web 2017]
 
Exploring Adaptive Interfaces [Generate 2017]
Exploring Adaptive Interfaces [Generate 2017]Exploring Adaptive Interfaces [Generate 2017]
Exploring Adaptive Interfaces [Generate 2017]
 
Progressive Web Apps and the Windows Ecosystem [Build 2017]
Progressive Web Apps and the Windows Ecosystem [Build 2017]Progressive Web Apps and the Windows Ecosystem [Build 2017]
Progressive Web Apps and the Windows Ecosystem [Build 2017]
 
Writing for Engagement [TechReady 22]
Writing for Engagement [TechReady 22]Writing for Engagement [TechReady 22]
Writing for Engagement [TechReady 22]
 

Recently uploaded

Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 

Recently uploaded (20)

Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 

Progressive Web Apps: Where Do I Begin?