|  | @@ -67,255 +67,6 @@ on: aPresentation
 | 
	
		
			
				|  |  |  		yourself
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -Slide subclass: #FOSDEMSlide
 | 
	
		
			
				|  |  | -	instanceVariableNames: ''
 | 
	
		
			
				|  |  | -	category: 'Presentation'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!FOSDEMSlide methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -codeSnippet
 | 
	
		
			
				|  |  | -	self subclassResponsibility
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!FOSDEMSlide methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderSnippet: aString on: html
 | 
	
		
			
				|  |  | -	(SourceArea new 
 | 
	
		
			
				|  |  | -			renderOn: html;
 | 
	
		
			
				|  |  | -			editor)  setValue: aString.
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderCodeSnippetOn: html
 | 
	
		
			
				|  |  | -	(SourceArea new 
 | 
	
		
			
				|  |  | -			renderOn: html;
 | 
	
		
			
				|  |  | -			editor)  setValue: self codeSnippet.
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -FOSDEMSlide subclass: #FOSDEMREPLSlide
 | 
	
		
			
				|  |  | -	instanceVariableNames: ''
 | 
	
		
			
				|  |  | -	category: 'Presentation'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!FOSDEMREPLSlide methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderSlideOn: html
 | 
	
		
			
				|  |  | -	html h1: 'REPL'.
 | 
	
		
			
				|  |  | -	self renderCodeSnippetOn: html.
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -codeSnippet
 | 
	
		
			
				|  |  | -	^ 
 | 
	
		
			
				|  |  | -'./bin/amber
 | 
	
		
			
				|  |  | -fs := require value: ''fs''.
 | 
	
		
			
				|  |  | -fs readdir: ''/tmp'' do: [:err :file| console log: file]'.
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -FOSDEMSlide subclass: #FOSDEMJSToSmalltalk
 | 
	
		
			
				|  |  | -	instanceVariableNames: ''
 | 
	
		
			
				|  |  | -	category: 'Presentation'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!FOSDEMJSToSmalltalk methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -cssClass
 | 
	
		
			
				|  |  | -	^ 'slide blue3d'
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -codeSnippet
 | 
	
		
			
				|  |  | -	^
 | 
	
		
			
				|  |  | -'var counter = window.smalltalk.Counter._new();
 | 
	
		
			
				|  |  | -counter._appendToJQuery_($(''#jsToSmalltalk''));'.
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!FOSDEMJSToSmalltalk methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderSlideOn: html
 | 
	
		
			
				|  |  | -	html h1: 'Call Smalltalk from Javascript'.
 | 
	
		
			
				|  |  | -	html div
 | 
	
		
			
				|  |  | -		id: 'jsToSmalltalk';
 | 
	
		
			
				|  |  | -		style: 'float: left'.
 | 
	
		
			
				|  |  | -	self renderCodeSnippetOn: html.
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -FOSDEMSlide subclass: #FOSDEMCanvasSlide
 | 
	
		
			
				|  |  | -	instanceVariableNames: 'c2d canvas'
 | 
	
		
			
				|  |  | -	category: 'Presentation'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!FOSDEMCanvasSlide methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -cssClass
 | 
	
		
			
				|  |  | -	^ 'slide red3d'
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!FOSDEMCanvasSlide methodsFor: 'drawing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -drawOnCanvas
 | 
	
		
			
				|  |  | -	|c2d|
 | 
	
		
			
				|  |  | -	c2d := canvas element getContext: '2d'.
 | 
	
		
			
				|  |  | -	c2d 
 | 
	
		
			
				|  |  | -		clearRect: 0 
 | 
	
		
			
				|  |  | -		y: 0 
 | 
	
		
			
				|  |  | -		width: canvas element width 
 | 
	
		
			
				|  |  | -		height: canvas element height.
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -	40 atRandom timesRepeat: [ |rgba|
 | 
	
		
			
				|  |  | -			rgba := ',' join: {255 atRandom. 255 atRandom. 255 atRandom. 10 atRandom / 10}.
 | 
	
		
			
				|  |  | -			c2d	at: 'fillStyle' put: 'rgba(', rgba, ')'.
 | 
	
		
			
				|  |  | -			c2d
 | 
	
		
			
				|  |  | -				fillRect: 600 atRandom 
 | 
	
		
			
				|  |  | -				y: 300 atRandom 
 | 
	
		
			
				|  |  | -				width: 200 atRandom 
 | 
	
		
			
				|  |  | -				height: 200 atRandom ]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!FOSDEMCanvasSlide methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderSlideOn: html
 | 
	
		
			
				|  |  | -	html h1: 'Playing with canvas'.
 | 
	
		
			
				|  |  | -	canvas := html  canvas 
 | 
	
		
			
				|  |  | -				width: 700;
 | 
	
		
			
				|  |  | -				height: 400.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	self updateCanvas.
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!FOSDEMCanvasSlide methodsFor: 'updating'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -updateCanvas
 | 
	
		
			
				|  |  | -	self drawOnCanvas.
 | 
	
		
			
				|  |  | -	window setTimeout: [self updateCanvas] delay: 500.
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -FOSDEMSlide subclass: #FOSDEMJSPlayGroundSlide
 | 
	
		
			
				|  |  | -	instanceVariableNames: ''
 | 
	
		
			
				|  |  | -	category: 'Presentation'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!FOSDEMJSPlayGroundSlide methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -codeSnippet
 | 
	
		
			
				|  |  | -^'|logo|
 | 
	
		
			
				|  |  | -logo:=''img#amberlogo'' asJQuery.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -logo
 | 
	
		
			
				|  |  | -  css:''-webkit-transition'' put:''all 10s ease-in-out''.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -<logo.css(''-webkit-transform'', ''rotateY(360deg)'');>.
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -logo click: [window alert: ''This is cool !!''].
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -logo inspect'.
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!FOSDEMJSPlayGroundSlide methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderSlideOn: html
 | 
	
		
			
				|  |  | -	html div
 | 
	
		
			
				|  |  | -		class: 'section center'; 
 | 
	
		
			
				|  |  | -		with: [
 | 
	
		
			
				|  |  | -			self renderCodeSnippetOn: html.
 | 
	
		
			
				|  |  | -			html img
 | 
	
		
			
				|  |  | -				id: 'amberlogo'; 
 | 
	
		
			
				|  |  | -				src: 'fosdem2012/images/amber.png'	]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -FOSDEMSlide subclass: #FOSDEMAmberBackend
 | 
	
		
			
				|  |  | -	instanceVariableNames: ''
 | 
	
		
			
				|  |  | -	category: 'Presentation'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!FOSDEMAmberBackend methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -cssClass
 | 
	
		
			
				|  |  | -	^ 'slide green3d'
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!FOSDEMAmberBackend methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderSlideOn: html
 | 
	
		
			
				|  |  | -	html div
 | 
	
		
			
				|  |  | -		class: 'section center';
 | 
	
		
			
				|  |  | -		with: [	html h1: 'Need a backend ?'.
 | 
	
		
			
				|  |  | -				{'nodejs.png'. 'php.gif'. 'rails.png'.   'pharo.png'. 'ambrhino.jpg'} do: [:aString |
 | 
	
		
			
				|  |  | -						html img: 'fosdem2012/images/', aString.
 | 
	
		
			
				|  |  | -				]
 | 
	
		
			
				|  |  | -		]
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -FOSDEMSlide subclass: #FOSDEMBookletSlide
 | 
	
		
			
				|  |  | -	instanceVariableNames: ''
 | 
	
		
			
				|  |  | -	category: 'Presentation'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!FOSDEMBookletSlide methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -cssClass
 | 
	
		
			
				|  |  | -	^ 'slide blue3d'
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!FOSDEMBookletSlide methodsFor: 'css'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -style
 | 
	
		
			
				|  |  | -	^ '
 | 
	
		
			
				|  |  | -#book { font-size: 1.4em; }
 | 
	
		
			
				|  |  | -#book .b-load .b-wrap-right { background-color: #DEC3A9;}
 | 
	
		
			
				|  |  | -#book .b-load .b-wrap-left { background-color: #DDD;} 
 | 
	
		
			
				|  |  | -'
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!FOSDEMBookletSlide methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderSlideOn: html
 | 
	
		
			
				|  |  | -	self renderBookOn: html.
 | 
	
		
			
				|  |  | -	html link 
 | 
	
		
			
				|  |  | -		rel:'stylesheet';
 | 
	
		
			
				|  |  | -		href: 'fosdem2012/lib/booklet/jquery.booklet.1.2.0.css'.
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -	html style: self style.
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -	jQuery 
 | 
	
		
			
				|  |  | -		getScript: 'fosdem2012/lib/booklet/jquery.booklet.1.2.0.min.js' 	
 | 
	
		
			
				|  |  | -		do: ['#book' asJQuery booklet: self bookletOptions].
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderBookOn: html
 | 
	
		
			
				|  |  | -	html div 
 | 
	
		
			
				|  |  | -		id: 'book';
 | 
	
		
			
				|  |  | -		with: [	html div
 | 
	
		
			
				|  |  | -					class: 'b-load';
 | 
	
		
			
				|  |  | -					with: [	html 
 | 
	
		
			
				|  |  | -								div: 'Amber makes it easy to plug existing javascript libraires';
 | 
	
		
			
				|  |  | -								div: 'Here is an example with the jQuery Booklet plugin';
 | 
	
		
			
				|  |  | -								div: 'Want to see how ?';
 | 
	
		
			
				|  |  | -								div: [ html button
 | 
	
		
			
				|  |  | -										onClick: [Browser openOn: FOSDEMBookletSlide ];
 | 
	
		
			
				|  |  | -										with: 'Just browse the code :)'.						] 	
 | 
	
		
			
				|  |  | -																							
 | 
	
		
			
				|  |  | -					]	
 | 
	
		
			
				|  |  | -		].
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -bookletOptions
 | 
	
		
			
				|  |  | -	^ #{ 
 | 
	
		
			
				|  |  | -		'arrows' -> true.
 | 
	
		
			
				|  |  | -		'keyboard' -> false.
 | 
	
		
			
				|  |  | -		'pageNumbers' -> false.
 | 
	
		
			
				|  |  | -		'closed' -> true
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -FOSDEMSlide subclass: #FOSDEMIntroSlide
 | 
	
		
			
				|  |  | -	instanceVariableNames: ''
 | 
	
		
			
				|  |  | -	category: 'Presentation'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -!FOSDEMIntroSlide methodsFor: 'not yet classified'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderSlideOn: html
 | 
	
		
			
				|  |  | -	html div class: 'section center animate'; with: [
 | 
	
		
			
				|  |  | -		html img src: 'fosdem2012/images/amber.png'.
 | 
	
		
			
				|  |  | -		html p: self presentation author.
 | 
	
		
			
				|  |  | -          	html p: self presentation description.
 | 
	
		
			
				|  |  | -		html p: [
 | 
	
		
			
				|  |  | -			html with: self presentation email]].
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  Widget subclass: #PresentationNavigator
 | 
	
		
			
				|  |  |  	instanceVariableNames: 'presentationBrush currentPresentation slideSelect'
 | 
	
		
			
				|  |  |  	category: 'Presentation'!
 | 
	
	
		
			
				|  | @@ -519,7 +270,6 @@ open
 | 
	
		
			
				|  |  |  	^ self new open
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  Widget subclass: #Presentation
 | 
	
		
			
				|  |  |  	instanceVariableNames: 'currentSlide slides'
 | 
	
		
			
				|  |  |  	category: 'Presentation'!
 | 
	
	
		
			
				|  | @@ -608,130 +358,309 @@ moveAt: anInteger
 | 
	
		
			
				|  |  |  	next ifNotNil: [currentSlide := next. next show]
 | 
	
		
			
				|  |  |  !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -currentSlideIndex
 | 
	
		
			
				|  |  | -	^ self slides indexOf: self currentSlide ifAbsent: [1]
 | 
	
		
			
				|  |  | +currentSlideIndex
 | 
	
		
			
				|  |  | +	^ self slides indexOf: self currentSlide ifAbsent: [1]
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +!Presentation methodsFor: 'enumerating'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +slidesDo: aBlockWithArg
 | 
	
		
			
				|  |  | +	self slides do: [:aSlide| aBlockWithArg value: aSlide].
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +!Presentation methodsFor: 'initialization'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +initSlides
 | 
	
		
			
				|  |  | +	slides := self slideClasses collect: [:each | each on: self]
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +!Presentation methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +renderOn: html
 | 
	
		
			
				|  |  | +	html style
 | 
	
		
			
				|  |  | +		type: 'text/css';
 | 
	
		
			
				|  |  | +		with: self style.
 | 
	
		
			
				|  |  | +	html div 
 | 
	
		
			
				|  |  | +		id: 'slides';
 | 
	
		
			
				|  |  | +		with: [self renderSlidesOn: html]
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +renderSlidesOn: html
 | 
	
		
			
				|  |  | +	self slides do: [:each | 
 | 
	
		
			
				|  |  | +		each renderOn: html].
 | 
	
		
			
				|  |  | +	currentSlide ifNil: [currentSlide := self slides first].
 | 
	
		
			
				|  |  | +	self showCurrentSlide
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Presentation class instanceVariableNames: 'current'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +!Presentation class methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +concretePresentations
 | 
	
		
			
				|  |  | +	^ self allSubclasses select: [:aPresentationClass| aPresentationClass isConcrete]
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +title
 | 
	
		
			
				|  |  | +	^ 'Slides'
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +!Presentation class methodsFor: 'enumerating'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +concretePresentationsDo: aBlockWithArg
 | 
	
		
			
				|  |  | +	self concretePresentations do: aBlockWithArg.
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +!Presentation class methodsFor: 'testing'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +isConcrete
 | 
	
		
			
				|  |  | +	^false
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Slide subclass: #FOSDEMSlide
 | 
	
		
			
				|  |  | +	instanceVariableNames: ''
 | 
	
		
			
				|  |  | +	category: 'Presentation'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +!FOSDEMSlide methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +codeSnippet
 | 
	
		
			
				|  |  | +	self subclassResponsibility
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +!FOSDEMSlide methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +renderSnippet: aString on: html
 | 
	
		
			
				|  |  | +	(SourceArea new 
 | 
	
		
			
				|  |  | +			renderOn: html;
 | 
	
		
			
				|  |  | +			editor)  setValue: aString.
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +renderCodeSnippetOn: html
 | 
	
		
			
				|  |  | +	(SourceArea new 
 | 
	
		
			
				|  |  | +			renderOn: html;
 | 
	
		
			
				|  |  | +			editor)  setValue: self codeSnippet.
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +FOSDEMSlide subclass: #FOSDEMREPLSlide
 | 
	
		
			
				|  |  | +	instanceVariableNames: ''
 | 
	
		
			
				|  |  | +	category: 'Presentation'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +!FOSDEMREPLSlide methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +renderSlideOn: html
 | 
	
		
			
				|  |  | +	html h1: 'REPL'.
 | 
	
		
			
				|  |  | +	self renderCodeSnippetOn: html.
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +codeSnippet
 | 
	
		
			
				|  |  | +	^ 
 | 
	
		
			
				|  |  | +'./bin/amber
 | 
	
		
			
				|  |  | +fs := require value: ''fs''.
 | 
	
		
			
				|  |  | +fs readdir: ''/tmp'' do: [:err :file| console log: file]'.
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +FOSDEMSlide subclass: #FOSDEMJSToSmalltalk
 | 
	
		
			
				|  |  | +	instanceVariableNames: ''
 | 
	
		
			
				|  |  | +	category: 'Presentation'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +!FOSDEMJSToSmalltalk methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +cssClass
 | 
	
		
			
				|  |  | +	^ 'slide blue3d'
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +codeSnippet
 | 
	
		
			
				|  |  | +	^
 | 
	
		
			
				|  |  | +'var counter = window.smalltalk.Counter._new();
 | 
	
		
			
				|  |  | +counter._appendToJQuery_($(''#jsToSmalltalk''));'.
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +!FOSDEMJSToSmalltalk methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +renderSlideOn: html
 | 
	
		
			
				|  |  | +	html h1: 'Call Smalltalk from Javascript'.
 | 
	
		
			
				|  |  | +	html div
 | 
	
		
			
				|  |  | +		id: 'jsToSmalltalk';
 | 
	
		
			
				|  |  | +		style: 'float: left'.
 | 
	
		
			
				|  |  | +	self renderCodeSnippetOn: html.
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -!Presentation methodsFor: 'enumerating'!
 | 
	
		
			
				|  |  | +FOSDEMSlide subclass: #FOSDEMCanvasSlide
 | 
	
		
			
				|  |  | +	instanceVariableNames: 'c2d canvas'
 | 
	
		
			
				|  |  | +	category: 'Presentation'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -slidesDo: aBlockWithArg
 | 
	
		
			
				|  |  | -	self slides do: [:aSlide| aBlockWithArg value: aSlide].
 | 
	
		
			
				|  |  | +!FOSDEMCanvasSlide methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +cssClass
 | 
	
		
			
				|  |  | +	^ 'slide red3d'
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -!Presentation methodsFor: 'initialization'!
 | 
	
		
			
				|  |  | +!FOSDEMCanvasSlide methodsFor: 'drawing'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -initSlides
 | 
	
		
			
				|  |  | -	slides := self slideClasses collect: [:each | each on: self]
 | 
	
		
			
				|  |  | +drawOnCanvas
 | 
	
		
			
				|  |  | +	|c2d|
 | 
	
		
			
				|  |  | +	c2d := canvas element getContext: '2d'.
 | 
	
		
			
				|  |  | +	c2d 
 | 
	
		
			
				|  |  | +		clearRect: 0 
 | 
	
		
			
				|  |  | +		y: 0 
 | 
	
		
			
				|  |  | +		width: canvas element width 
 | 
	
		
			
				|  |  | +		height: canvas element height.
 | 
	
		
			
				|  |  | +	
 | 
	
		
			
				|  |  | +	40 atRandom timesRepeat: [ |rgba|
 | 
	
		
			
				|  |  | +			rgba := ',' join: {255 atRandom. 255 atRandom. 255 atRandom. 10 atRandom / 10}.
 | 
	
		
			
				|  |  | +			c2d	at: 'fillStyle' put: 'rgba(', rgba, ')'.
 | 
	
		
			
				|  |  | +			c2d
 | 
	
		
			
				|  |  | +				fillRect: 600 atRandom 
 | 
	
		
			
				|  |  | +				y: 300 atRandom 
 | 
	
		
			
				|  |  | +				width: 200 atRandom 
 | 
	
		
			
				|  |  | +				height: 200 atRandom ]
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -!Presentation methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | +!FOSDEMCanvasSlide methodsFor: 'rendering'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -renderOn: html
 | 
	
		
			
				|  |  | -	html style
 | 
	
		
			
				|  |  | -		type: 'text/css';
 | 
	
		
			
				|  |  | -		with: self style.
 | 
	
		
			
				|  |  | -	html div 
 | 
	
		
			
				|  |  | -		id: 'slides';
 | 
	
		
			
				|  |  | -		with: [self renderSlidesOn: html]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | +renderSlideOn: html
 | 
	
		
			
				|  |  | +	html h1: 'Playing with canvas'.
 | 
	
		
			
				|  |  | +	canvas := html  canvas 
 | 
	
		
			
				|  |  | +				width: 700;
 | 
	
		
			
				|  |  | +				height: 400.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -renderSlidesOn: html
 | 
	
		
			
				|  |  | -	self slides do: [:each | 
 | 
	
		
			
				|  |  | -		each renderOn: html].
 | 
	
		
			
				|  |  | -	currentSlide ifNil: [currentSlide := self slides first].
 | 
	
		
			
				|  |  | -	self showCurrentSlide
 | 
	
		
			
				|  |  | +	self updateCanvas.
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -Presentation class instanceVariableNames: 'current'!
 | 
	
		
			
				|  |  | +!FOSDEMCanvasSlide methodsFor: 'updating'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -!Presentation class methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | +updateCanvas
 | 
	
		
			
				|  |  | +	self drawOnCanvas.
 | 
	
		
			
				|  |  | +	window setTimeout: [self updateCanvas] delay: 500.
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -concretePresentations
 | 
	
		
			
				|  |  | -	^ self allSubclasses select: [:aPresentationClass| aPresentationClass isConcrete]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | +FOSDEMSlide subclass: #FOSDEMJSPlayGroundSlide
 | 
	
		
			
				|  |  | +	instanceVariableNames: ''
 | 
	
		
			
				|  |  | +	category: 'Presentation'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -title
 | 
	
		
			
				|  |  | -	^ 'Slides'
 | 
	
		
			
				|  |  | -! !
 | 
	
		
			
				|  |  | +!FOSDEMJSPlayGroundSlide methodsFor: 'accessing'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -!Presentation class methodsFor: 'enumerating'!
 | 
	
		
			
				|  |  | +codeSnippet
 | 
	
		
			
				|  |  | +^'|logo|
 | 
	
		
			
				|  |  | +logo:=''img#amberlogo'' asJQuery.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -concretePresentationsDo: aBlockWithArg
 | 
	
		
			
				|  |  | -	self concretePresentations do: aBlockWithArg.
 | 
	
		
			
				|  |  | +logo
 | 
	
		
			
				|  |  | +  css:''-webkit-transition'' put:''all 10s ease-in-out''.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +<logo.css(''-webkit-transform'', ''rotateY(360deg)'');>.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +logo click: [window alert: ''This is cool !!''].
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +logo inspect'.
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -!Presentation class methodsFor: 'testing'!
 | 
	
		
			
				|  |  | +!FOSDEMJSPlayGroundSlide methodsFor: 'rendering'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -isConcrete
 | 
	
		
			
				|  |  | -	^false
 | 
	
		
			
				|  |  | +renderSlideOn: html
 | 
	
		
			
				|  |  | +	html div
 | 
	
		
			
				|  |  | +		class: 'section center'; 
 | 
	
		
			
				|  |  | +		with: [
 | 
	
		
			
				|  |  | +			self renderCodeSnippetOn: html.
 | 
	
		
			
				|  |  | +			html img
 | 
	
		
			
				|  |  | +				id: 'amberlogo'; 
 | 
	
		
			
				|  |  | +				src: 'fosdem2012/images/amber.png'	]
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -Widget subclass: #Slide
 | 
	
		
			
				|  |  | -	instanceVariableNames: 'presentation'
 | 
	
		
			
				|  |  | +FOSDEMSlide subclass: #FOSDEMAmberBackend
 | 
	
		
			
				|  |  | +	instanceVariableNames: ''
 | 
	
		
			
				|  |  |  	category: 'Presentation'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -!Slide methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | +!FOSDEMAmberBackend methodsFor: 'accessing'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -presentation
 | 
	
		
			
				|  |  | -	^presentation
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | +cssClass
 | 
	
		
			
				|  |  | +	^ 'slide green3d'
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -presentation: aPresentation
 | 
	
		
			
				|  |  | -	presentation := aPresentation
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | +!FOSDEMAmberBackend methodsFor: 'rendering'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -id
 | 
	
		
			
				|  |  | -	^ self class name
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | +renderSlideOn: html
 | 
	
		
			
				|  |  | +	html div
 | 
	
		
			
				|  |  | +		class: 'section center';
 | 
	
		
			
				|  |  | +		with: [	html h1: 'Need a backend ?'.
 | 
	
		
			
				|  |  | +				{'nodejs.png'. 'php.gif'. 'rails.png'.   'pharo.png'. 'ambrhino.jpg'} do: [:aString |
 | 
	
		
			
				|  |  | +						html img: 'fosdem2012/images/', aString.
 | 
	
		
			
				|  |  | +				]
 | 
	
		
			
				|  |  | +		]
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -cssClass
 | 
	
		
			
				|  |  | -	^'slide'
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | +FOSDEMSlide subclass: #FOSDEMBookletSlide
 | 
	
		
			
				|  |  | +	instanceVariableNames: ''
 | 
	
		
			
				|  |  | +	category: 'Presentation'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -backgroundColor
 | 
	
		
			
				|  |  | -	^'#555'
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | +!FOSDEMBookletSlide methodsFor: 'accessing'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -title
 | 
	
		
			
				|  |  | -	^ self id
 | 
	
		
			
				|  |  | +cssClass
 | 
	
		
			
				|  |  | +	^ 'slide blue3d'
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -!Slide methodsFor: 'actions'!
 | 
	
		
			
				|  |  | +!FOSDEMBookletSlide methodsFor: 'css'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -show
 | 
	
		
			
				|  |  | -	self backgroundColor ifNotNil: [
 | 
	
		
			
				|  |  | -		(window jQuery: '#slides') css: 'background' color: self backgroundColor].
 | 
	
		
			
				|  |  | -	(window jQuery: '.slide') hide: self presentation slideTransition options: #() duration: 300.
 | 
	
		
			
				|  |  | -	(window jQuery: '#', self id) show: self presentation slideTransition options: #() duration: 300.
 | 
	
		
			
				|  |  | +style
 | 
	
		
			
				|  |  | +	^ '
 | 
	
		
			
				|  |  | +#book { font-size: 1.4em; }
 | 
	
		
			
				|  |  | +#book .b-load .b-wrap-right { background-color: #DEC3A9;}
 | 
	
		
			
				|  |  | +#book .b-load .b-wrap-left { background-color: #DDD;} 
 | 
	
		
			
				|  |  | +'
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -!Slide methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -renderOn: html
 | 
	
		
			
				|  |  | -	html div class: self cssClass; id: self id; with: [
 | 
	
		
			
				|  |  | -		self renderSlideOn: html.
 | 
	
		
			
				|  |  | -		self renderMetaOn: html]
 | 
	
		
			
				|  |  | -!
 | 
	
		
			
				|  |  | +!FOSDEMBookletSlide methodsFor: 'rendering'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  renderSlideOn: html
 | 
	
		
			
				|  |  | +	self renderBookOn: html.
 | 
	
		
			
				|  |  | +	html link 
 | 
	
		
			
				|  |  | +		rel:'stylesheet';
 | 
	
		
			
				|  |  | +		href: 'fosdem2012/lib/booklet/jquery.booklet.1.2.0.css'.
 | 
	
		
			
				|  |  | +	
 | 
	
		
			
				|  |  | +	html style: self style.
 | 
	
		
			
				|  |  | +	
 | 
	
		
			
				|  |  | +	jQuery 
 | 
	
		
			
				|  |  | +		getScript: 'fosdem2012/lib/booklet/jquery.booklet.1.2.0.min.js' 	
 | 
	
		
			
				|  |  | +		do: ['#book' asJQuery booklet: self bookletOptions].
 | 
	
		
			
				|  |  |  !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -renderMetaOn: html
 | 
	
		
			
				|  |  | +renderBookOn: html
 | 
	
		
			
				|  |  |  	html div 
 | 
	
		
			
				|  |  | -		id: 'meta';
 | 
	
		
			
				|  |  | -		with: [
 | 
	
		
			
				|  |  | -			html p class: 'title'; with: self presentation title.
 | 
	
		
			
				|  |  | -			html p class: 'description'; with: self presentation description.
 | 
	
		
			
				|  |  | -			html a class: 'author'; with: self presentation author; href: 'mailto:', self presentation email.
 | 
	
		
			
				|  |  | -			html a class: 'url'; with: self presentation url; href: self presentation url]
 | 
	
		
			
				|  |  | +		id: 'book';
 | 
	
		
			
				|  |  | +		with: [	html div
 | 
	
		
			
				|  |  | +					class: 'b-load';
 | 
	
		
			
				|  |  | +					with: [	html 
 | 
	
		
			
				|  |  | +								div: 'Amber makes it easy to plug existing javascript libraires';
 | 
	
		
			
				|  |  | +								div: 'Here is an example with the jQuery Booklet plugin';
 | 
	
		
			
				|  |  | +								div: 'Want to see how ?';
 | 
	
		
			
				|  |  | +								div: [ html button
 | 
	
		
			
				|  |  | +										onClick: [Browser openOn: FOSDEMBookletSlide ];
 | 
	
		
			
				|  |  | +										with: 'Just browse the code :)'.						] 	
 | 
	
		
			
				|  |  | +																							
 | 
	
		
			
				|  |  | +					]	
 | 
	
		
			
				|  |  | +		].
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +bookletOptions
 | 
	
		
			
				|  |  | +	^ #{ 
 | 
	
		
			
				|  |  | +		'arrows' -> true.
 | 
	
		
			
				|  |  | +		'keyboard' -> false.
 | 
	
		
			
				|  |  | +		'pageNumbers' -> false.
 | 
	
		
			
				|  |  | +		'closed' -> true
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -!Slide class methodsFor: 'instance creation'!
 | 
	
		
			
				|  |  | +FOSDEMSlide subclass: #FOSDEMIntroSlide
 | 
	
		
			
				|  |  | +	instanceVariableNames: ''
 | 
	
		
			
				|  |  | +	category: 'Presentation'!
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -on: aPresentation
 | 
	
		
			
				|  |  | -	^self new
 | 
	
		
			
				|  |  | -		presentation: aPresentation;
 | 
	
		
			
				|  |  | -		yourself
 | 
	
		
			
				|  |  | +!FOSDEMIntroSlide methodsFor: 'not yet classified'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +renderSlideOn: html
 | 
	
		
			
				|  |  | +	html div class: 'section center animate'; with: [
 | 
	
		
			
				|  |  | +		html img src: 'fosdem2012/images/amber.png'.
 | 
	
		
			
				|  |  | +		html p: self presentation author.
 | 
	
		
			
				|  |  | +          	html p: self presentation description.
 | 
	
		
			
				|  |  | +		html p: [
 | 
	
		
			
				|  |  | +			html with: self presentation email]].
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  Presentation subclass: #ESUG2011Presentation
 | 
	
	
		
			
				|  | @@ -1898,6 +1827,25 @@ body {
 | 
	
		
			
				|  |  |  .slide#ide {
 | 
	
		
			
				|  |  |      background: black url("esug2011/images/ide_star_wars.png") center center no-repeat;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.tweet {
 | 
	
		
			
				|  |  | +	background-color: #aaa;
 | 
	
		
			
				|  |  | +	color: black;
 | 
	
		
			
				|  |  | +	padding: 10px;
 | 
	
		
			
				|  |  | +	border-radius: 10px;
 | 
	
		
			
				|  |  | +	border: 5px solid #eee;
 | 
	
		
			
				|  |  | +	margin: 10px;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.tweet img {
 | 
	
		
			
				|  |  | +	vertical-align: top;
 | 
	
		
			
				|  |  | +	margin-right: 10px;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +.tweet span:first-child {
 | 
	
		
			
				|  |  | +	float: right;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  '
 | 
	
		
			
				|  |  |  !
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1910,6 +1858,7 @@ slideClasses
 | 
	
		
			
				|  |  |  	FOSDEMJSPlayGroundSlide.
 | 
	
		
			
				|  |  |  	FOSDEMJSToSmalltalk.
 | 
	
		
			
				|  |  |  	FOSDEMBookletSlide.
 | 
	
		
			
				|  |  | +	FOSDEMTwitter.
 | 
	
		
			
				|  |  |  	FOSDEMCanvasSlide.
 | 
	
		
			
				|  |  |  	FOSDEMAmberBackend.
 | 
	
		
			
				|  |  |  	FOSDEMREPLSlide
 | 
	
	
		
			
				|  | @@ -1926,3 +1875,52 @@ title
 | 
	
		
			
				|  |  |  	^'Amber'
 | 
	
		
			
				|  |  |  ! !
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +FOSDEMSlide subclass: #FOSDEMTwitter
 | 
	
		
			
				|  |  | +	instanceVariableNames: 'twitterDiv'
 | 
	
		
			
				|  |  | +	category: 'Presentation'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +!FOSDEMTwitter methodsFor: 'accessing'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +cssClass
 | 
	
		
			
				|  |  | +	^ 'slide black'
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +!FOSDEMTwitter methodsFor: 'callback'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +loadTweets
 | 
	
		
			
				|  |  | +	jQuery 
 | 
	
		
			
				|  |  | +		ajax: 'http://search.twitter.com/search.json?rpp=3&q=%40AmberSmalltalk'
 | 
	
		
			
				|  |  | +		options: #{
 | 
	
		
			
				|  |  | +				'type' -> 'GET'.
 | 
	
		
			
				|  |  | +				'success' -> [ :json | self renderTweets: (json results)].
 | 
	
		
			
				|  |  | +				'dataType' -> 'jsonp'
 | 
	
		
			
				|  |  | +			}.
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +!FOSDEMTwitter methodsFor: 'rendering'!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +renderSlideOn: html
 | 
	
		
			
				|  |  | +	html button
 | 
	
		
			
				|  |  | +		onClick: [self loadTweets];
 | 
	
		
			
				|  |  | +		with: 'What about @AmberSmalltalk on Twitter ?'.
 | 
	
		
			
				|  |  | +	twitterDiv := html div.
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +renderTweets: tweets
 | 
	
		
			
				|  |  | +	twitterDiv contents: [	:html|
 | 
	
		
			
				|  |  | +						tweets do: [	:tweet|  
 | 
	
		
			
				|  |  | +									self renderTweet: tweet on: html] ]
 | 
	
		
			
				|  |  | +!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +renderTweet: tweet on: html
 | 
	
		
			
				|  |  | +	html div 
 | 
	
		
			
				|  |  | +		class: 'tweet';
 | 
	
		
			
				|  |  | +		with: [
 | 
	
		
			
				|  |  | +			html 
 | 
	
		
			
				|  |  | +				span: (tweet at: 'created_at');
 | 
	
		
			
				|  |  | +				img: (tweet at: 'profile_image_url');
 | 
	
		
			
				|  |  | +				span: (tweet at: 'from_user');
 | 
	
		
			
				|  |  | +				div: (tweet at: 'text'). 
 | 
	
		
			
				|  |  | +		]
 | 
	
		
			
				|  |  | +! !
 | 
	
		
			
				|  |  | +
 |