SlideShare a Scribd company logo
Scalable Vector Ember 
Death to HTML. Long live the DOM.
@mixonic 
httP://madhatted.com 
matt.beale@madhatted.com
201 Created 
We build õ-age apps with Ember.js. We take 
teams from £ to • in no time flat.
1 <svg> 
2 {{#each d in paths}} 
3 <path {{bind-attr d=d}} /> 
4 {{/each}} 
5 </svg>
http://emberjs.jsbin.com/woxes/10/edit 
1.7: http://emberjs.jsbin.com/woxes/9 
! 
1.8: http://emberjs.jsbin.com/woxes/10
Scalable vector ember
Preamble 
Vector Graphics
Scalable vector ember
Raster Graphic (PNG) 
w3.org
Benefits of Raster Graphics 
• Small file-size (photos) 
• Computationally simple to 
render
Vector Graphic (SVG) 
1 <?xml version="1.0" standalone="no"?> 
2 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
3 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
4 <svg width="12cm" height="4cm" viewBox="0 0 1200 400" 
5 xmlns="http://www.w3.org/2000/svg" version="1.1"> 
6 <desc>Example rect01 - rectangle with sharp corners</desc> 
7 
8 <rect x="400" y="100" width="400" height="200" 
9 fill="yellow" stroke="navy" stroke-width="10" /> 
10 </svg> 
w3.org
Benefits of Vector Graphics 
• Small file-size (graphics) 
• Arbitrary resolution
Part I 
Scalable Vector Graphics
Why are we talking about this in 2014?
1998 Vector Markup Language proposed 
by Macromedia, Microsoft. PGML 
proposed by Adobe, Sun. W3C kick off 
SVG. 
2001 SVG 1.0 
2003 SVG 1.1
Benefits of SVG Standard 
• Easy-to-parse metadata 
• Links 
• Animation
1998 Vector Markup Language proposed 
by Macromedia, Microsoft. PGML 
proposed by Adobe, Sun. W3C kick off 
SVG. 
2001 SVG 1.0 
2003 SVG 1.1 
2004 Konqueror 3.2 support 
2005 Gecko (Firefox) support 
2006 WebKit (Chrome, Safari) support
5upmushroom.tumblr.com
1998 Vector Markup Language proposed 
by Macromedia, Microsoft. PGML 
proposed by Adobe, Sun. W3C kick off 
SVG. 
2001 SVG 1.0 
2003 SVG 1.1 
2004 Konqueror 3.2 support 
2005 Gecko (Firefox) support 
2006 WebKit (Chrome, Safari) support 
2011 IE9 is the last platform to support SVG
0.5% Woo! 
(almost) 
w3techs.com
( ๑‾̀◡‾́)σ» 
(´⊙ω⊙`) 
w3techs.com
3 ways to use SVG 
logo.svg 
<svg> 
document.createElementNS
3 ways to use SVG 
logo.svg 
<svg> 
document.createElementNS
Creating elements with a namespace 
1 var svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); 
2 svg.setAttribute("viewBox", "0 0 1200 400"); 
3 svg.setAttribute("width", "12cm"); 
4 svg.setAttribute("height", "4cm"); 
5 var path = document.createElementNS("http://www.w3.org/2000/svg", "path"); 
6 path.setAttribute("x", "400"); 
7 path.setAttribute("y", "100"); 
8 path.setAttribute("width", "400"); 
9 path.setAttribute("height", "200"); 
10 path.setAttribute("fill", "yellow"); 
11 path.setAttribute("stroke", "navy"); 
12 path.setAttribute("stroke-width", "10"); 
13 svg.appendChild(path); 
14 document.body.appendChild(svg);
Setting SVG attributes 
• Attributes are case sensitive 
1 var div = document.createElement("div"); 
2 div.setAttribute("someWacky", "foo"); 
3 div.getAttribute("someWacky"); // => "foo" 
4 div.getAttribute("somewacky"); // => "foo" 
5 
6 var svg = document.createElementNS(svgNS, "svg"); 
7 svg.setAttribute("someWow", "boo") 
8 svg.getAttribute("someWow"); // => "boo" 
9 svg.getAttribute("somewow"); // => null 
• Property values are not primitives 
1 svg.viewBox; // => SVGAnimatedRect {animVal: SVGRect, baseVal: SVGRect} 
2 var viewBox = new SVGAnimatedRect(); // => TypeError: Illegal constructor 
3 svg.viewBox = "0 0 100 100"; 
4 svg.getAttribute("viewBox"); // => null
Changing namespaces 
1 <div> 
2 <span></span> 
3 <svg> 
4 <path></path> 
5 <foreignObject> 
6 <div></div> 
7 </foreignObject> 
8 </svg> 
9 </div> 
Entrance to namespace dictated by next element 
Exit from namespace dictated by previous element
Part II 
Old Man Ember, Young Man Ember
Handlebars 
HTMLBars
THERE CAN ONLY BE ONE
Scalable vector ember
THERE CAN ONLY BE DECK
Scalable vector ember
A template 
1 <section> 
2 {{if isShowing}} 
3 <span>Howdy!</span> 
4 {{/if}} 
5 </section>
Ember.js pre-1.8 
1 var buffer = "<section>n"; 
2 buffer += "<script metamorph-0-start></script>"; 
3 if (isShowing) { 
4 buffer += " <span>Howdy!</span>n"; 
5 } 
6 buffer += "<script metamorph-0-end></script>"; 
7 buffer += "</section>"; 
8 
9 rootElement.innerHTML = buffer;
Ember.js pre-1.8 
1 var 
2 buffer 
3 if (isShowing) { 
4 buffer 
5 } 
6 buffer 
7 buffer 
8 
9 rootElement.innerHTML 
STRINGS, INNERHTML
Ember.js 1.10 
1 var outerChilden = [document.createElement('section')]; 
2 
3 var innerChildren; 
4 if (isShowing) { 
5 innerChildren = [document.createElement('span');] 
6 innerChildren[0].appendChild(document.createTextNode('Howdy!')); 
7 while (innerChildren[0]) { 
8 outerChilden[0].appendChild(innerChildren[0]); 
9 } 
10 } 
11 
12 while (outerChilden[0]) { 
13 rootElement.appendChild(outerChilden[0]); 
14 }
Ember.js 1.10 
1 var 
2 
3 var 
4 if (isShowing) { 
5 innerChildren 
6 innerChildren[ 
7 while (innerChildren[ 
8 outerChilden[ 
9 } 
10 } 
11 
12 while (outerChilden[ 
13 rootElement.appendChild(outerChilden[ 
14 } 
DOM! HTMLBARS! WOOOMG!
Ember.js 1.8-1.9 
1 var buffer, parsingNode; 
2 
3 buffer = "<section>n</section>"; 
4 parsingNode = document.createElement('div'); 
5 parsingNode.innerHTML = buffer; 
6 var outerChilden = parsingNode.childNodes; 
7 
8 if (isShowing) { 
9 buffer = " <span>Howdy!</span>n"; 
10 parsingNode.innerHTML = buffer; 
11 var innerChildren = parsingNode.childNodes; 
12 while (innerChildren[0]) { 
13 outerChilden[0].appendChild(innerChildren[0]); 
14 } 
15 } 
16 
17 while (outerChilden[0]) { 
18 rootElement.appendChild(outerChilden[0]); 
19 }
Ember.js 1.8-1.9 
1 var 
2 
3 buffer 
4 parsingNode 
5 parsingNode.innerHTML 
6 var 
7 
8 if (isShowing) { 
9 buffer 
10 parsingNode.innerHTML 
11 
12 while (innerChildren[ 
13 outerChilden[ 
14 } 
15 } 
16 
17 while (outerChilden[ 
18 rootElement.appendChild(outerChilden[ 
19 } 
STRING TEMPLATES, DOM for stitching
Tricky stuff in 1.8+ 
• managing a context 
• detecting a namespace 
!
Tricky stuff in 1.8+ 
1 var string = handlebarsTemplate(context, options); 
2 var nodes = domHelper.parseHTML(string, morph.contextualElement); 
3 
4 var node; 
5 while (node = nodes[0]) { 
6 rootElement.appendChild(node); 
7 }
HTMLBARS, Tricky stuff in 1.8+ 
1.10 
1 var nodes = htmlbarsTemplate(context, env, morph.contextualElement); 
2 
3 var node; 
4 while (node = nodes[0]) { 
5 rootElement.appendChild(node); 
6 }
Tricky stuff in 1.8+ 
• managing a context 
• detecting a namespace 
!
Tricky stuff in 1.8+ 
1 var root = document.createElement('div'); 
2 
3 root.innerHTML = "<svg><foreignObject><div></div></foreignObject></svg>"; 
4 
5 var svg = div.firstChild; 
6 var foreignObject = svg.firstChild; 
7 var div = foreignObject.firstChild; 
8 
9 svg.namespaceURI; // http://www.w3.org/2000/svg 
10 foreignObject.namespaceURI; // http://www.w3.org/2000/svg 
11 div.namespaceURI; // undefined
Tricky stuff in 1.8+ 
1 var root = document.createElementNS(svgNs, 'svg');! 
2 ! 
3 root.innerHTML = "<foreignObject><div></div></foreignObject>";! 
4 ! 
5 var foreignObject = root.firstChild;! 
6 var div = foreignObject.firstChild;! 
7 ! 
8 svg.namespaceURI; // http://www.w3.org/2000/svg! 
9 foreignObject.namespaceURI; // http://www.w3.org/2000/svg! 
10 div.namespaceURI; // undefined!
Tricky stuff in 1.8+ HTMLBARS, 1.10 
1 var template = htmlbarsCompile( 
2 "<foreignObject><div></div></foreignObject>" 
3 ); 
4 // so long as contextualElement is an SVG tag... 
5 var nodes = template(context, env, morph.contextualElement); 
6 
7 var foreignObject = nodes[0]; 
8 var div = foreignObject.firstChild; 
9 
10 foreignObject.namespaceURI; // http://www.w3.org/2000/svg 
11 div.namespaceURI; // undefined
Part III 
Death to HTML. Long live the DOM.
HTML is transmitted as a string.
• JS String (.jst, Ember <1.10) 
• HTML (Angular, Polymer) 
• JavaScript (React, Ember > 1.9, 
Mithril)
Scalable vector ember
But that doesn’t mean we should process it as a string.
• innerHTML (.jst, Ember <1.10) 
• DOM (Angular, React, Ember > 1.9, 
Polymer, Mithril)
ACTIONS UP 
! 
BINDINGS DOWN
transmit strings 
! 
process DOM
CONTROLLERS LEFT 
! 
YEHUDA’S RIGHT
Thank you

More Related Content

What's hot

HTML5: friend or foe (to Flash)?
HTML5: friend or foe (to Flash)?HTML5: friend or foe (to Flash)?
HTML5: friend or foe (to Flash)?
Remy Sharp
 
Rails, Postgres, Angular, and Bootstrap: The Power Stack
Rails, Postgres, Angular, and Bootstrap: The Power StackRails, Postgres, Angular, and Bootstrap: The Power Stack
Rails, Postgres, Angular, and Bootstrap: The Power Stack
David Copeland
 
FuncUnit
FuncUnitFuncUnit
FuncUnit
Brian Moschel
 
The DOM is a Mess @ Yahoo
The DOM is a Mess @ YahooThe DOM is a Mess @ Yahoo
The DOM is a Mess @ Yahoo
jeresig
 
Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)
Remy Sharp
 
Figaro
FigaroFigaro
Diy frozen snow globe
Diy frozen snow globeDiy frozen snow globe
Diy frozen snow globe
raveenashrynayr03
 
The Dojo Build System
The Dojo Build SystemThe Dojo Build System
The Dojo Build System
klipstein
 
the 5 layers of web accessibility - Open Web Camp II
the 5 layers of web accessibility - Open Web Camp IIthe 5 layers of web accessibility - Open Web Camp II
the 5 layers of web accessibility - Open Web Camp II
Dirk Ginader
 
Browsers with Wings
Browsers with WingsBrowsers with Wings
Browsers with Wings
Remy Sharp
 
jQuery Loves Developers - Oredev 2009
jQuery Loves Developers - Oredev 2009jQuery Loves Developers - Oredev 2009
jQuery Loves Developers - Oredev 2009
Remy Sharp
 
Introduction to HTML5
Introduction to HTML5Introduction to HTML5
Introduction to HTML5
Adrian Olaru
 
Deploying
DeployingDeploying
Deploying
soon
 
jQuery UI and Plugins
jQuery UI and PluginsjQuery UI and Plugins
jQuery UI and Plugins
Marc Grabanski
 
Beyond PHP - it's not (just) about the code
Beyond PHP - it's not (just) about the codeBeyond PHP - it's not (just) about the code
Beyond PHP - it's not (just) about the code
Wim Godden
 
2014 database - course 3 - PHP and MySQL
2014 database - course 3 - PHP and MySQL2014 database - course 3 - PHP and MySQL
2014 database - course 3 - PHP and MySQL
Hung-yu Lin
 
jQuery For Beginners - jQuery Conference 2009
jQuery For Beginners - jQuery Conference 2009jQuery For Beginners - jQuery Conference 2009
jQuery For Beginners - jQuery Conference 2009
Ralph Whitbeck
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC
Alive Kuo
 
JS Lab`16. Владимир Воевидка: "Как рабо��ает браузер"
JS Lab`16. Владимир Воевидка: "Как работает браузер"JS Lab`16. Владимир Воевидка: "Как работает браузер"
JS Lab`16. Владимир Воевидка: "Как работает браузер"
GeeksLab Odessa
 
Google
GoogleGoogle
Google
soon
 

What's hot (20)

HTML5: friend or foe (to Flash)?
HTML5: friend or foe (to Flash)?HTML5: friend or foe (to Flash)?
HTML5: friend or foe (to Flash)?
 
Rails, Postgres, Angular, and Bootstrap: The Power Stack
Rails, Postgres, Angular, and Bootstrap: The Power StackRails, Postgres, Angular, and Bootstrap: The Power Stack
Rails, Postgres, Angular, and Bootstrap: The Power Stack
 
FuncUnit
FuncUnitFuncUnit
FuncUnit
 
The DOM is a Mess @ Yahoo
The DOM is a Mess @ YahooThe DOM is a Mess @ Yahoo
The DOM is a Mess @ Yahoo
 
Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)
 
Figaro
FigaroFigaro
Figaro
 
Diy frozen snow globe
Diy frozen snow globeDiy frozen snow globe
Diy frozen snow globe
 
The Dojo Build System
The Dojo Build SystemThe Dojo Build System
The Dojo Build System
 
the 5 layers of web accessibility - Open Web Camp II
the 5 layers of web accessibility - Open Web Camp IIthe 5 layers of web accessibility - Open Web Camp II
the 5 layers of web accessibility - Open Web Camp II
 
Browsers with Wings
Browsers with WingsBrowsers with Wings
Browsers with Wings
 
jQuery Loves Developers - Oredev 2009
jQuery Loves Developers - Oredev 2009jQuery Loves Developers - Oredev 2009
jQuery Loves Developers - Oredev 2009
 
Introduction to HTML5
Introduction to HTML5Introduction to HTML5
Introduction to HTML5
 
Deploying
DeployingDeploying
Deploying
 
jQuery UI and Plugins
jQuery UI and PluginsjQuery UI and Plugins
jQuery UI and Plugins
 
Beyond PHP - it's not (just) about the code
Beyond PHP - it's not (just) about the codeBeyond PHP - it's not (just) about the code
Beyond PHP - it's not (just) about the code
 
2014 database - course 3 - PHP and MySQL
2014 database - course 3 - PHP and MySQL2014 database - course 3 - PHP and MySQL
2014 database - course 3 - PHP and MySQL
 
jQuery For Beginners - jQuery Conference 2009
jQuery For Beginners - jQuery Conference 2009jQuery For Beginners - jQuery Conference 2009
jQuery For Beginners - jQuery Conference 2009
 
[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC[Coscup 2012] JavascriptMVC
[Coscup 2012] JavascriptMVC
 
JS Lab`16. Владимир Воевидка: "Как работает браузер"
JS Lab`16. Владимир Воевидка: "Как работает браузер"JS Lab`16. Владимир Воевидка: "Как работает браузер"
JS Lab`16. Владимир Воевидка: "Как работает браузер"
 
Google
GoogleGoogle
Google
 

Similar to Scalable vector ember

Everything is Awesome - Cutting the Corners off the Web
Everything is Awesome - Cutting the Corners off the WebEverything is Awesome - Cutting the Corners off the Web
Everything is Awesome - Cutting the Corners off the Web
James Rakich
 
Web Performance Part 4 "Client-side performance"
Web Performance Part 4  "Client-side performance"Web Performance Part 4  "Client-side performance"
Web Performance Part 4 "Client-side performance"
Binary Studio
 
Edge of the Web
Edge of the WebEdge of the Web
Edge of the Web
Todd Anglin
 
Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5
Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5
Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5
Sadaaki HIRAI
 
JavaScript performance patterns
JavaScript performance patternsJavaScript performance patterns
JavaScript performance patterns
Stoyan Stefanov
 
HTML 5 - Overview
HTML 5 - OverviewHTML 5 - Overview
HTML 5 - Overview
Marcelio Leal
 
Html5 drupal7 with mandakini kumari(1)
Html5 drupal7 with mandakini kumari(1)Html5 drupal7 with mandakini kumari(1)
Html5 drupal7 with mandakini kumari(1)
Mandakini Kumari
 
What you need to know bout html5
What you need to know bout html5What you need to know bout html5
What you need to know bout html5
Kevin DeRudder
 
cdac@parag.gajbhiye@test123
cdac@parag.gajbhiye@test123cdac@parag.gajbhiye@test123
cdac@parag.gajbhiye@test123
Parag Gajbhiye
 
SAS_Forum_2015_Data_Visualisation_With_HighCharts_D3
SAS_Forum_2015_Data_Visualisation_With_HighCharts_D3SAS_Forum_2015_Data_Visualisation_With_HighCharts_D3
SAS_Forum_2015_Data_Visualisation_With_HighCharts_D3
Vasilij Nevlev
 
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
 
Introduccion a HTML5
Introduccion a HTML5Introduccion a HTML5
Introduccion a HTML5
Pablo Garaizar
 
html5
html5html5
Html5 For Jjugccc2009fall
Html5 For Jjugccc2009fallHtml5 For Jjugccc2009fall
Html5 For Jjugccc2009fall
Shumpei Shiraishi
 
HTML5
HTML5HTML5
Ember: Guts & Goals
Ember: Guts & GoalsEmber: Guts & Goals
Ember: Guts & Goals
Bob Lail
 
HTML5 on Mobile
HTML5 on MobileHTML5 on Mobile
HTML5 on Mobile
Adam Lu
 
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
ghnash
 
Html5 intro
Html5 introHtml5 intro
Html5 intro
Wilfred Nas
 
From Hacker to Programmer (w/ Webpack, Babel and React)
From Hacker to Programmer (w/ Webpack, Babel and React)From Hacker to Programmer (w/ Webpack, Babel and React)
From Hacker to Programmer (w/ Webpack, Babel and React)
Joseph Chiang
 

Similar to Scalable vector ember (20)

Everything is Awesome - Cutting the Corners off the Web
Everything is Awesome - Cutting the Corners off the WebEverything is Awesome - Cutting the Corners off the Web
Everything is Awesome - Cutting the Corners off the Web
 
Web Performance Part 4 "Client-side performance"
Web Performance Part 4  "Client-side performance"Web Performance Part 4  "Client-side performance"
Web Performance Part 4 "Client-side performance"
 
Edge of the Web
Edge of the WebEdge of the Web
Edge of the Web
 
Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5
Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5
Familiar HTML5 - 事例とサンプルコードから学ぶ 身近で普通に使わているHTML5
 
JavaScript performance patterns
JavaScript performance patternsJavaScript performance patterns
JavaScript performance patterns
 
HTML 5 - Overview
HTML 5 - OverviewHTML 5 - Overview
HTML 5 - Overview
 
Html5 drupal7 with mandakini kumari(1)
Html5 drupal7 with mandakini kumari(1)Html5 drupal7 with mandakini kumari(1)
Html5 drupal7 with mandakini kumari(1)
 
What you need to know bout html5
What you need to know bout html5What you need to know bout html5
What you need to know bout html5
 
cdac@parag.gajbhiye@test123
cdac@parag.gajbhiye@test123cdac@parag.gajbhiye@test123
cdac@parag.gajbhiye@test123
 
SAS_Forum_2015_Data_Visualisation_With_HighCharts_D3
SAS_Forum_2015_Data_Visualisation_With_HighCharts_D3SAS_Forum_2015_Data_Visualisation_With_HighCharts_D3
SAS_Forum_2015_Data_Visualisation_With_HighCharts_D3
 
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....
 
Introduccion a HTML5
Introduccion a HTML5Introduccion a HTML5
Introduccion a HTML5
 
html5
html5html5
html5
 
Html5 For Jjugccc2009fall
Html5 For Jjugccc2009fallHtml5 For Jjugccc2009fall
Html5 For Jjugccc2009fall
 
HTML5
HTML5HTML5
HTML5
 
Ember: Guts & Goals
Ember: Guts & GoalsEmber: Guts & Goals
Ember: Guts & Goals
 
HTML5 on Mobile
HTML5 on MobileHTML5 on Mobile
HTML5 on Mobile
 
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
 
Html5 intro
Html5 introHtml5 intro
Html5 intro
 
From Hacker to Programmer (w/ Webpack, Babel and React)
From Hacker to Programmer (w/ Webpack, Babel and React)From Hacker to Programmer (w/ Webpack, Babel and React)
From Hacker to Programmer (w/ Webpack, Babel and React)
 

More from Matthew Beale

Ember.js Module Loading
Ember.js Module LoadingEmber.js Module Loading
Ember.js Module Loading
Matthew Beale
 
LA Ember.js Meetup, Jan 2017
LA Ember.js Meetup, Jan 2017LA Ember.js Meetup, Jan 2017
LA Ember.js Meetup, Jan 2017
Matthew Beale
 
Interoperable Component Patterns
Interoperable Component PatternsInteroperable Component Patterns
Interoperable Component Patterns
Matthew Beale
 
Ember Community 2016 - Be the Bark
Ember Community 2016 - Be the BarkEmber Community 2016 - Be the Bark
Ember Community 2016 - Be the Bark
Matthew Beale
 
Attribute actions
Attribute actionsAttribute actions
Attribute actions
Matthew Beale
 
The Hidden Power of HTMLBars (or, Scope in Ember.js Templates)
The Hidden Power of HTMLBars (or, Scope in Ember.js Templates)The Hidden Power of HTMLBars (or, Scope in Ember.js Templates)
The Hidden Power of HTMLBars (or, Scope in Ember.js Templates)
Matthew Beale
 
Aligning Ember.js with Web Standards
Aligning Ember.js with Web StandardsAligning Ember.js with Web Standards
Aligning Ember.js with Web Standards
Matthew Beale
 
New Component Patterns in Ember.js
New Component Patterns in Ember.jsNew Component Patterns in Ember.js
New Component Patterns in Ember.js
Matthew Beale
 
Testing Ember Apps: Managing Dependency
Testing Ember Apps: Managing DependencyTesting Ember Apps: Managing Dependency
Testing Ember Apps: Managing Dependency
Matthew Beale
 
Parse Apps with Ember.js
Parse Apps with Ember.jsParse Apps with Ember.js
Parse Apps with Ember.js
Matthew Beale
 
Snappy Means Happy: Performance in Ember Apps
Snappy Means Happy: Performance in Ember AppsSnappy Means Happy: Performance in Ember Apps
Snappy Means Happy: Performance in Ember Apps
Matthew Beale
 
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
 
Containers & Dependency in Ember.js
Containers & Dependency in Ember.jsContainers & Dependency in Ember.js
Containers & Dependency in Ember.js
Matthew Beale
 
Complex Architectures in Ember
Complex Architectures in EmberComplex Architectures in Ember
Complex Architectures in Ember
Matthew Beale
 
Ember and containers
Ember and containersEmber and containers
Ember and containers
Matthew Beale
 

More from Matthew Beale (15)

Ember.js Module Loading
Ember.js Module LoadingEmber.js Module Loading
Ember.js Module Loading
 
LA Ember.js Meetup, Jan 2017
LA Ember.js Meetup, Jan 2017LA Ember.js Meetup, Jan 2017
LA Ember.js Meetup, Jan 2017
 
Interoperable Component Patterns
Interoperable Component PatternsInteroperable Component Patterns
Interoperable Component Patterns
 
Ember Community 2016 - Be the Bark
Ember Community 2016 - Be the BarkEmber Community 2016 - Be the Bark
Ember Community 2016 - Be the Bark
 
Attribute actions
Attribute actionsAttribute actions
Attribute actions
 
The Hidden Power of HTMLBars (or, Scope in Ember.js Templates)
The Hidden Power of HTMLBars (or, Scope in Ember.js Templates)The Hidden Power of HTMLBars (or, Scope in Ember.js Templates)
The Hidden Power of HTMLBars (or, Scope in Ember.js Templates)
 
Aligning Ember.js with Web Standards
Aligning Ember.js with Web StandardsAligning Ember.js with Web Standards
Aligning Ember.js with Web Standards
 
New Component Patterns in Ember.js
New Component Patterns in Ember.jsNew Component Patterns in Ember.js
New Component Patterns in Ember.js
 
Testing Ember Apps: Managing Dependency
Testing Ember Apps: Managing DependencyTesting Ember Apps: Managing Dependency
Testing Ember Apps: Managing Dependency
 
Parse Apps with Ember.js
Parse Apps with Ember.jsParse Apps with Ember.js
Parse Apps with Ember.js
 
Snappy Means Happy: Performance in Ember Apps
Snappy Means Happy: Performance in Ember AppsSnappy Means Happy: Performance in Ember Apps
Snappy Means Happy: Performance in Ember Apps
 
Client-side Auth with Ember.js
Client-side Auth with Ember.jsClient-side Auth with Ember.js
Client-side Auth with Ember.js
 
Containers & Dependency in Ember.js
Containers & Dependency in Ember.jsContainers & Dependency in Ember.js
Containers & Dependency in Ember.js
 
Complex Architectures in Ember
Complex Architectures in EmberComplex Architectures in Ember
Complex Architectures in Ember
 
Ember and containers
Ember and containersEmber and containers
Ember and containers
 

Recently uploaded

Understanding Insider Security Threats: Types, Examples, Effects, and Mitigat...
Understanding Insider Security Threats: Types, Examples, Effects, and Mitigat...Understanding Insider Security Threats: Types, Examples, Effects, and Mitigat...
Understanding Insider Security Threats: Types, Examples, Effects, and Mitigat...
Bert Blevins
 
7 Most Powerful Solar Storms in the History of Earth.pdf
7 Most Powerful Solar Storms in the History of Earth.pdf7 Most Powerful Solar Storms in the History of Earth.pdf
7 Most Powerful Solar Storms in the History of Earth.pdf
Enterprise Wired
 
How Social Media Hackers Help You to See Your Wife's Message.pdf
How Social Media Hackers Help You to See Your Wife's Message.pdfHow Social Media Hackers Help You to See Your Wife's Message.pdf
How Social Media Hackers Help You to See Your Wife's Message.pdf
HackersList
 
Details of description part II: Describing images in practice - Tech Forum 2024
Details of description part II: Describing images in practice - Tech Forum 2024Details of description part II: Describing images in practice - Tech Forum 2024
Details of description part II: Describing images in practice - Tech Forum 2024
BookNet Canada
 
Pigging Solutions Sustainability brochure.pdf
Pigging Solutions Sustainability brochure.pdfPigging Solutions Sustainability brochure.pdf
Pigging Solutions Sustainability brochure.pdf
Pigging Solutions
 
Mitigating the Impact of State Management in Cloud Stream Processing Systems
Mitigating the Impact of State Management in Cloud Stream Processing SystemsMitigating the Impact of State Management in Cloud Stream Processing Systems
Mitigating the Impact of State Management in Cloud Stream Processing Systems
ScyllaDB
 
20240702 Présentation Plateforme GenAI.pdf
20240702 Présentation Plateforme GenAI.pdf20240702 Présentation Plateforme GenAI.pdf
20240702 Présentation Plateforme GenAI.pdf
Sally Laouacheria
 
TrustArc Webinar - 2024 Data Privacy Trends: A Mid-Year Check-In
TrustArc Webinar - 2024 Data Privacy Trends: A Mid-Year Check-InTrustArc Webinar - 2024 Data Privacy Trends: A Mid-Year Check-In
TrustArc Webinar - 2024 Data Privacy Trends: A Mid-Year Check-In
TrustArc
 
RPA In Healthcare Benefits, Use Case, Trend And Challenges 2024.pptx
RPA In Healthcare Benefits, Use Case, Trend And Challenges 2024.pptxRPA In Healthcare Benefits, Use Case, Trend And Challenges 2024.pptx
RPA In Healthcare Benefits, Use Case, Trend And Challenges 2024.pptx
SynapseIndia
 
論文紹介:A Systematic Survey of Prompt Engineering on Vision-Language Foundation ...
論文紹介:A Systematic Survey of Prompt Engineering on Vision-Language Foundation ...論文紹介:A Systematic Survey of Prompt Engineering on Vision-Language Foundation ...
論文紹介:A Systematic Survey of Prompt Engineering on Vision-Language Foundation ...
Toru Tamaki
 
DealBook of Ukraine: 2024 edition
DealBook of Ukraine: 2024 editionDealBook of Ukraine: 2024 edition
DealBook of Ukraine: 2024 edition
Yevgen Sysoyev
 
Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...
Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...
Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...
Chris Swan
 
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdfWhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
ArgaBisma
 
The Increasing Use of the National Research Platform by the CSU Campuses
The Increasing Use of the National Research Platform by the CSU CampusesThe Increasing Use of the National Research Platform by the CSU Campuses
The Increasing Use of the National Research Platform by the CSU Campuses
Larry Smarr
 
Advanced Techniques for Cyber Security Analysis and Anomaly Detection
Advanced Techniques for Cyber Security Analysis and Anomaly DetectionAdvanced Techniques for Cyber Security Analysis and Anomaly Detection
Advanced Techniques for Cyber Security Analysis and Anomaly Detection
Bert Blevins
 
What's New in Copilot for Microsoft365 May 2024.pptx
What's New in Copilot for Microsoft365 May 2024.pptxWhat's New in Copilot for Microsoft365 May 2024.pptx
What's New in Copilot for Microsoft365 May 2024.pptx
Stephanie Beckett
 
20240704 QFM023 Engineering Leadership Reading List June 2024
20240704 QFM023 Engineering Leadership Reading List June 202420240704 QFM023 Engineering Leadership Reading List June 2024
20240704 QFM023 Engineering Leadership Reading List June 2024
Matthew Sinclair
 
find out more about the role of autonomous vehicles in facing global challenges
find out more about the role of autonomous vehicles in facing global challengesfind out more about the role of autonomous vehicles in facing global challenges
find out more about the role of autonomous vehicles in facing global challenges
huseindihon
 
WPRiders Company Presentation Slide Deck
WPRiders Company Presentation Slide DeckWPRiders Company Presentation Slide Deck
WPRiders Company Presentation Slide Deck
Lidia A.
 
Password Rotation in 2024 is still Relevant
Password Rotation in 2024 is still RelevantPassword Rotation in 2024 is still Relevant
Password Rotation in 2024 is still Relevant
Bert Blevins
 

Recently uploaded (20)

Understanding Insider Security Threats: Types, Examples, Effects, and Mitigat...
Understanding Insider Security Threats: Types, Examples, Effects, and Mitigat...Understanding Insider Security Threats: Types, Examples, Effects, and Mitigat...
Understanding Insider Security Threats: Types, Examples, Effects, and Mitigat...
 
7 Most Powerful Solar Storms in the History of Earth.pdf
7 Most Powerful Solar Storms in the History of Earth.pdf7 Most Powerful Solar Storms in the History of Earth.pdf
7 Most Powerful Solar Storms in the History of Earth.pdf
 
How Social Media Hackers Help You to See Your Wife's Message.pdf
How Social Media Hackers Help You to See Your Wife's Message.pdfHow Social Media Hackers Help You to See Your Wife's Message.pdf
How Social Media Hackers Help You to See Your Wife's Message.pdf
 
Details of description part II: Describing images in practice - Tech Forum 2024
Details of description part II: Describing images in practice - Tech Forum 2024Details of description part II: Describing images in practice - Tech Forum 2024
Details of description part II: Describing images in practice - Tech Forum 2024
 
Pigging Solutions Sustainability brochure.pdf
Pigging Solutions Sustainability brochure.pdfPigging Solutions Sustainability brochure.pdf
Pigging Solutions Sustainability brochure.pdf
 
Mitigating the Impact of State Management in Cloud Stream Processing Systems
Mitigating the Impact of State Management in Cloud Stream Processing SystemsMitigating the Impact of State Management in Cloud Stream Processing Systems
Mitigating the Impact of State Management in Cloud Stream Processing Systems
 
20240702 Présentation Plateforme GenAI.pdf
20240702 Présentation Plateforme GenAI.pdf20240702 Présentation Plateforme GenAI.pdf
20240702 Présentation Plateforme GenAI.pdf
 
TrustArc Webinar - 2024 Data Privacy Trends: A Mid-Year Check-In
TrustArc Webinar - 2024 Data Privacy Trends: A Mid-Year Check-InTrustArc Webinar - 2024 Data Privacy Trends: A Mid-Year Check-In
TrustArc Webinar - 2024 Data Privacy Trends: A Mid-Year Check-In
 
RPA In Healthcare Benefits, Use Case, Trend And Challenges 2024.pptx
RPA In Healthcare Benefits, Use Case, Trend And Challenges 2024.pptxRPA In Healthcare Benefits, Use Case, Trend And Challenges 2024.pptx
RPA In Healthcare Benefits, Use Case, Trend And Challenges 2024.pptx
 
論文紹介:A Systematic Survey of Prompt Engineering on Vision-Language Foundation ...
論文紹介:A Systematic Survey of Prompt Engineering on Vision-Language Foundation ...論文紹介:A Systematic Survey of Prompt Engineering on Vision-Language Foundation ...
論文紹介:A Systematic Survey of Prompt Engineering on Vision-Language Foundation ...
 
DealBook of Ukraine: 2024 edition
DealBook of Ukraine: 2024 editionDealBook of Ukraine: 2024 edition
DealBook of Ukraine: 2024 edition
 
Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...
Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...
Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...
 
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdfWhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
 
The Increasing Use of the National Research Platform by the CSU Campuses
The Increasing Use of the National Research Platform by the CSU CampusesThe Increasing Use of the National Research Platform by the CSU Campuses
The Increasing Use of the National Research Platform by the CSU Campuses
 
Advanced Techniques for Cyber Security Analysis and Anomaly Detection
Advanced Techniques for Cyber Security Analysis and Anomaly DetectionAdvanced Techniques for Cyber Security Analysis and Anomaly Detection
Advanced Techniques for Cyber Security Analysis and Anomaly Detection
 
What's New in Copilot for Microsoft365 May 2024.pptx
What's New in Copilot for Microsoft365 May 2024.pptxWhat's New in Copilot for Microsoft365 May 2024.pptx
What's New in Copilot for Microsoft365 May 2024.pptx
 
20240704 QFM023 Engineering Leadership Reading List June 2024
20240704 QFM023 Engineering Leadership Reading List June 202420240704 QFM023 Engineering Leadership Reading List June 2024
20240704 QFM023 Engineering Leadership Reading List June 2024
 
find out more about the role of autonomous vehicles in facing global challenges
find out more about the role of autonomous vehicles in facing global challengesfind out more about the role of autonomous vehicles in facing global challenges
find out more about the role of autonomous vehicles in facing global challenges
 
WPRiders Company Presentation Slide Deck
WPRiders Company Presentation Slide DeckWPRiders Company Presentation Slide Deck
WPRiders Company Presentation Slide Deck
 
Password Rotation in 2024 is still Relevant
Password Rotation in 2024 is still RelevantPassword Rotation in 2024 is still Relevant
Password Rotation in 2024 is still Relevant
 

Scalable vector ember

  • 1. Scalable Vector Ember Death to HTML. Long live the DOM.
  • 3. 201 Created We build õ-age apps with Ember.js. We take teams from £ to • in no time flat.
  • 4. 1 <svg> 2 {{#each d in paths}} 3 <path {{bind-attr d=d}} /> 4 {{/each}} 5 </svg>
  • 10. Benefits of Raster Graphics • Small file-size (photos) • Computationally simple to render
  • 11. Vector Graphic (SVG) 1 <?xml version="1.0" standalone="no"?> 2 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 3 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 4 <svg width="12cm" height="4cm" viewBox="0 0 1200 400" 5 xmlns="http://www.w3.org/2000/svg" version="1.1"> 6 <desc>Example rect01 - rectangle with sharp corners</desc> 7 8 <rect x="400" y="100" width="400" height="200" 9 fill="yellow" stroke="navy" stroke-width="10" /> 10 </svg> w3.org
  • 12. Benefits of Vector Graphics • Small file-size (graphics) • Arbitrary resolution
  • 13. Part I Scalable Vector Graphics
  • 14. Why are we talking about this in 2014?
  • 15. 1998 Vector Markup Language proposed by Macromedia, Microsoft. PGML proposed by Adobe, Sun. W3C kick off SVG. 2001 SVG 1.0 2003 SVG 1.1
  • 16. Benefits of SVG Standard • Easy-to-parse metadata • Links • Animation
  • 17. 1998 Vector Markup Language proposed by Macromedia, Microsoft. PGML proposed by Adobe, Sun. W3C kick off SVG. 2001 SVG 1.0 2003 SVG 1.1 2004 Konqueror 3.2 support 2005 Gecko (Firefox) support 2006 WebKit (Chrome, Safari) support
  • 19. 1998 Vector Markup Language proposed by Macromedia, Microsoft. PGML proposed by Adobe, Sun. W3C kick off SVG. 2001 SVG 1.0 2003 SVG 1.1 2004 Konqueror 3.2 support 2005 Gecko (Firefox) support 2006 WebKit (Chrome, Safari) support 2011 IE9 is the last platform to support SVG
  • 20. 0.5% Woo! (almost) w3techs.com
  • 22. 3 ways to use SVG logo.svg <svg> document.createElementNS
  • 23. 3 ways to use SVG logo.svg <svg> document.createElementNS
  • 24. Creating elements with a namespace 1 var svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); 2 svg.setAttribute("viewBox", "0 0 1200 400"); 3 svg.setAttribute("width", "12cm"); 4 svg.setAttribute("height", "4cm"); 5 var path = document.createElementNS("http://www.w3.org/2000/svg", "path"); 6 path.setAttribute("x", "400"); 7 path.setAttribute("y", "100"); 8 path.setAttribute("width", "400"); 9 path.setAttribute("height", "200"); 10 path.setAttribute("fill", "yellow"); 11 path.setAttribute("stroke", "navy"); 12 path.setAttribute("stroke-width", "10"); 13 svg.appendChild(path); 14 document.body.appendChild(svg);
  • 25. Setting SVG attributes • Attributes are case sensitive 1 var div = document.createElement("div"); 2 div.setAttribute("someWacky", "foo"); 3 div.getAttribute("someWacky"); // => "foo" 4 div.getAttribute("somewacky"); // => "foo" 5 6 var svg = document.createElementNS(svgNS, "svg"); 7 svg.setAttribute("someWow", "boo") 8 svg.getAttribute("someWow"); // => "boo" 9 svg.getAttribute("somewow"); // => null • Property values are not primitives 1 svg.viewBox; // => SVGAnimatedRect {animVal: SVGRect, baseVal: SVGRect} 2 var viewBox = new SVGAnimatedRect(); // => TypeError: Illegal constructor 3 svg.viewBox = "0 0 100 100"; 4 svg.getAttribute("viewBox"); // => null
  • 26. Changing namespaces 1 <div> 2 <span></span> 3 <svg> 4 <path></path> 5 <foreignObject> 6 <div></div> 7 </foreignObject> 8 </svg> 9 </div> Entrance to namespace dictated by next element Exit from namespace dictated by previous element
  • 27. Part II Old Man Ember, Young Man Ember
  • 29. THERE CAN ONLY BE ONE
  • 31. THERE CAN ONLY BE DECK
  • 33. A template 1 <section> 2 {{if isShowing}} 3 <span>Howdy!</span> 4 {{/if}} 5 </section>
  • 34. Ember.js pre-1.8 1 var buffer = "<section>n"; 2 buffer += "<script metamorph-0-start></script>"; 3 if (isShowing) { 4 buffer += " <span>Howdy!</span>n"; 5 } 6 buffer += "<script metamorph-0-end></script>"; 7 buffer += "</section>"; 8 9 rootElement.innerHTML = buffer;
  • 35. Ember.js pre-1.8 1 var 2 buffer 3 if (isShowing) { 4 buffer 5 } 6 buffer 7 buffer 8 9 rootElement.innerHTML STRINGS, INNERHTML
  • 36. Ember.js 1.10 1 var outerChilden = [document.createElement('section')]; 2 3 var innerChildren; 4 if (isShowing) { 5 innerChildren = [document.createElement('span');] 6 innerChildren[0].appendChild(document.createTextNode('Howdy!')); 7 while (innerChildren[0]) { 8 outerChilden[0].appendChild(innerChildren[0]); 9 } 10 } 11 12 while (outerChilden[0]) { 13 rootElement.appendChild(outerChilden[0]); 14 }
  • 37. Ember.js 1.10 1 var 2 3 var 4 if (isShowing) { 5 innerChildren 6 innerChildren[ 7 while (innerChildren[ 8 outerChilden[ 9 } 10 } 11 12 while (outerChilden[ 13 rootElement.appendChild(outerChilden[ 14 } DOM! HTMLBARS! WOOOMG!
  • 38. Ember.js 1.8-1.9 1 var buffer, parsingNode; 2 3 buffer = "<section>n</section>"; 4 parsingNode = document.createElement('div'); 5 parsingNode.innerHTML = buffer; 6 var outerChilden = parsingNode.childNodes; 7 8 if (isShowing) { 9 buffer = " <span>Howdy!</span>n"; 10 parsingNode.innerHTML = buffer; 11 var innerChildren = parsingNode.childNodes; 12 while (innerChildren[0]) { 13 outerChilden[0].appendChild(innerChildren[0]); 14 } 15 } 16 17 while (outerChilden[0]) { 18 rootElement.appendChild(outerChilden[0]); 19 }
  • 39. Ember.js 1.8-1.9 1 var 2 3 buffer 4 parsingNode 5 parsingNode.innerHTML 6 var 7 8 if (isShowing) { 9 buffer 10 parsingNode.innerHTML 11 12 while (innerChildren[ 13 outerChilden[ 14 } 15 } 16 17 while (outerChilden[ 18 rootElement.appendChild(outerChilden[ 19 } STRING TEMPLATES, DOM for stitching
  • 40. Tricky stuff in 1.8+ • managing a context • detecting a namespace !
  • 41. Tricky stuff in 1.8+ 1 var string = handlebarsTemplate(context, options); 2 var nodes = domHelper.parseHTML(string, morph.contextualElement); 3 4 var node; 5 while (node = nodes[0]) { 6 rootElement.appendChild(node); 7 }
  • 42. HTMLBARS, Tricky stuff in 1.8+ 1.10 1 var nodes = htmlbarsTemplate(context, env, morph.contextualElement); 2 3 var node; 4 while (node = nodes[0]) { 5 rootElement.appendChild(node); 6 }
  • 43. Tricky stuff in 1.8+ • managing a context • detecting a namespace !
  • 44. Tricky stuff in 1.8+ 1 var root = document.createElement('div'); 2 3 root.innerHTML = "<svg><foreignObject><div></div></foreignObject></svg>"; 4 5 var svg = div.firstChild; 6 var foreignObject = svg.firstChild; 7 var div = foreignObject.firstChild; 8 9 svg.namespaceURI; // http://www.w3.org/2000/svg 10 foreignObject.namespaceURI; // http://www.w3.org/2000/svg 11 div.namespaceURI; // undefined
  • 45. Tricky stuff in 1.8+ 1 var root = document.createElementNS(svgNs, 'svg');! 2 ! 3 root.innerHTML = "<foreignObject><div></div></foreignObject>";! 4 ! 5 var foreignObject = root.firstChild;! 6 var div = foreignObject.firstChild;! 7 ! 8 svg.namespaceURI; // http://www.w3.org/2000/svg! 9 foreignObject.namespaceURI; // http://www.w3.org/2000/svg! 10 div.namespaceURI; // undefined!
  • 46. Tricky stuff in 1.8+ HTMLBARS, 1.10 1 var template = htmlbarsCompile( 2 "<foreignObject><div></div></foreignObject>" 3 ); 4 // so long as contextualElement is an SVG tag... 5 var nodes = template(context, env, morph.contextualElement); 6 7 var foreignObject = nodes[0]; 8 var div = foreignObject.firstChild; 9 10 foreignObject.namespaceURI; // http://www.w3.org/2000/svg 11 div.namespaceURI; // undefined
  • 47. Part III Death to HTML. Long live the DOM.
  • 48. HTML is transmitted as a string.
  • 49. • JS String (.jst, Ember <1.10) • HTML (Angular, Polymer) • JavaScript (React, Ember > 1.9, Mithril)
  • 51. But that doesn’t mean we should process it as a string.
  • 52. • innerHTML (.jst, Ember <1.10) • DOM (Angular, React, Ember > 1.9, Polymer, Mithril)
  • 53. ACTIONS UP ! BINDINGS DOWN
  • 54. transmit strings ! process DOM
  • 55. CONTROLLERS LEFT ! YEHUDA’S RIGHT