├── workshop
├── zengular.js
├── solutions
│ ├── zengular-01-scope.js
│ ├── zengular-02-watch.js
│ ├── zengular-03-digest.js
│ ├── zengular-04-apply.js
│ ├── zengular-05-loop.js
│ ├── zengular-06-dirty.js
│ ├── zengular-07-phase.js
│ ├── zengular-08-directive.js
│ ├── zengular-09-compile.js
│ └── zengular-10-bind.js
├── digest.png
├── tests
│ ├── jasmine-2.0.0
│ │ └── jasmine_favicon.png
│ ├── zengular-tests-01-scope.js
│ ├── zengular-tests-08-directive.js
│ ├── zengular-tests-02-watch.js
│ ├── zengular-tests-04-apply.js
│ ├── zengular-tests-10-bind.js
│ ├── zengular-tests-09-compile.js
│ ├── zengular-tests-06-dirty.js
│ ├── zengular-tests-11-model.js
│ ├── zengular-tests-12-click.js
│ ├── zengular-tests-03-digest.js
│ ├── zengular-tests-05-loop.js
│ └── SpecRunner.html
└── zengular.html
├── .gitignore
├── sessions
├── devoxxfr-16042014
│ ├── zengular.js
│ └── digest.png
├── m6web-25042014
│ ├── slides
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── img
│ │ │ ├── digest.png
│ │ │ ├── lyonjs.png
│ │ │ ├── swiip.jpg
│ │ │ ├── teropa.jpeg
│ │ │ ├── zenika.jpeg
│ │ │ ├── timruffles.jpeg
│ │ │ └── angularjs-logo.png
│ │ ├── lib
│ │ │ ├── font
│ │ │ │ ├── league_gothic_license
│ │ │ │ ├── league_gothic-webfont.eot
│ │ │ │ ├── league_gothic-webfont.ttf
│ │ │ │ └── league_gothic-webfont.woff
│ │ │ ├── js
│ │ │ │ ├── html5shiv.js
│ │ │ │ └── classList.js
│ │ │ └── css
│ │ │ │ └── zenburn.css
│ │ ├── test
│ │ │ ├── examples
│ │ │ │ ├── assets
│ │ │ │ │ ├── image1.png
│ │ │ │ │ └── image2.png
│ │ │ │ ├── barebones.html
│ │ │ │ └── embedded-media.html
│ │ │ ├── test-markdown.js
│ │ │ ├── test-markdown.html
│ │ │ └── test.html
│ │ ├── plugin
│ │ │ ├── markdown
│ │ │ │ └── example.md
│ │ │ ├── multiplex
│ │ │ │ ├── client.js
│ │ │ │ ├── master.js
│ │ │ │ └── index.js
│ │ │ ├── print-pdf
│ │ │ │ └── print-pdf.js
│ │ │ ├── postmessage
│ │ │ │ ├── postmessage.js
│ │ │ │ └── example.html
│ │ │ ├── remotes
│ │ │ │ └── remotes.js
│ │ │ ├── math
│ │ │ │ └── math.js
│ │ │ ├── notes-server
│ │ │ │ ├── client.js
│ │ │ │ └── index.js
│ │ │ └── notes
│ │ │ │ └── notes.js
│ │ ├── css
│ │ │ └── theme
│ │ │ │ ├── template
│ │ │ │ ├── settings.scss
│ │ │ │ └── mixins.scss
│ │ │ │ ├── source
│ │ │ │ ├── night.scss
│ │ │ │ ├── serif.scss
│ │ │ │ ├── simple.scss
│ │ │ │ ├── sky.scss
│ │ │ │ ├── default.scss
│ │ │ │ ├── beige.scss
│ │ │ │ ├── moon.scss
│ │ │ │ ├── solarized.scss
│ │ │ │ └── blood.scss
│ │ │ │ └── README.md
│ │ ├── LICENSE
│ │ └── package.json
│ └── zengular-1h.html
├── breizhcamp-22052014
│ ├── slides
│ │ ├── .gitignore
│ │ ├── img
│ │ │ ├── digest.png
│ │ │ ├── lego.jpeg
│ │ │ ├── lyonjs.png
│ │ │ ├── slide8.jpg
│ │ │ ├── swiip.jpg
│ │ │ ├── jasmine.jpeg
│ │ │ ├── teropa.jpeg
│ │ │ ├── zenika.jpeg
│ │ │ ├── Slide_first.png
│ │ │ ├── Slide_last.png
│ │ │ ├── timruffles.jpeg
│ │ │ ├── angularjs-logo.png
│ │ │ ├── jasmine-screen.png
│ │ │ └── underscore-js.png
│ │ ├── lib
│ │ │ ├── font
│ │ │ │ ├── league_gothic_license
│ │ │ │ ├── league_gothic-webfont.eot
│ │ │ │ ├── league_gothic-webfont.ttf
│ │ │ │ └── league_gothic-webfont.woff
│ │ │ ├── js
│ │ │ │ ├── html5shiv.js
│ │ │ │ └── classList.js
│ │ │ └── css
│ │ │ │ └── zenburn.css
│ │ ├── css
│ │ │ ├── fonts
│ │ │ │ └── Ubuntu
│ │ │ │ │ ├── Ubuntu-Bold.woff
│ │ │ │ │ ├── Ubuntu-Light.woff
│ │ │ │ │ ├── Ubuntu-BoldItalic.woff
│ │ │ │ │ ├── Ubuntu-LightItalic.woff
│ │ │ │ │ └── Ubuntu.css
│ │ │ └── theme
│ │ │ │ ├── template
│ │ │ │ ├── settings.scss
│ │ │ │ └── mixins.scss
│ │ │ │ ├── source
│ │ │ │ ├── night.scss
│ │ │ │ ├── serif.scss
│ │ │ │ ├── simple.scss
│ │ │ │ ├── sky.scss
│ │ │ │ ├── default.scss
│ │ │ │ ├── beige.scss
│ │ │ │ ├── moon.scss
│ │ │ │ ├── solarized.scss
│ │ │ │ └── blood.scss
│ │ │ │ └── README.md
│ │ └── plugin
│ │ │ ├── markdown
│ │ │ └── example.md
│ │ │ ├── multiplex
│ │ │ ├── client.js
│ │ │ ├── master.js
│ │ │ └── index.js
│ │ │ ├── print-pdf
│ │ │ └── print-pdf.js
│ │ │ ├── postmessage
│ │ │ ├── postmessage.js
│ │ │ └── example.html
│ │ │ ├── remotes
│ │ │ └── remotes.js
│ │ │ ├── math
│ │ │ └── math.js
│ │ │ └── notes-server
│ │ │ ├── client.js
│ │ │ └── index.js
│ └── digest.png
├── lyonjs-03042014
│ └── digest.png
├── mixit-30042014
│ └── digest.png
└── zenika-24042014
│ └── zengular-1h.html
├── slides
├── .gitignore
├── img
│ ├── books.jpg
│ ├── ebook.jpg
│ ├── lego.jpeg
│ ├── lyon.jpg
│ ├── magic.jpg
│ ├── swiip.jpg
│ ├── title.jpg
│ ├── chrome.jpg
│ ├── concepts.png
│ ├── digest.png
│ ├── eiffel.jpeg
│ ├── gearing.jpg
│ ├── jasmine.jpeg
│ ├── lyonjs.png
│ ├── teropa.jpeg
│ ├── training.jpg
│ ├── yeoman.png
│ ├── zenika.jpeg
│ ├── complexity.jpg
│ ├── generator.png
│ ├── ng-europe.png
│ ├── training.jpeg
│ ├── whitepage.jpg
│ ├── zenika-big.png
│ ├── olivierhuber.jpeg
│ ├── timruffles.jpeg
│ ├── underscore-js.png
│ ├── angularjs-logo.png
│ └── jasmine-screen.png
├── .travis.yml
├── lib
│ ├── font
│ │ ├── league_gothic_license
│ │ ├── league_gothic-webfont.eot
│ │ ├── league_gothic-webfont.ttf
│ │ └── league_gothic-webfont.woff
│ ├── js
│ │ ├── html5shiv.js
│ │ └── classList.js
│ └── css
│ │ └── zenburn.css
├── test
│ ├── examples
│ │ ├── assets
│ │ │ ├── image1.png
│ │ │ └── image2.png
│ │ ├── barebones.html
│ │ └── embedded-media.html
│ ├── test-markdown.js
│ ├── test-markdown.html
│ └── test.html
├── plugin
│ ├── markdown
│ │ └── example.md
│ ├── multiplex
│ │ ├── client.js
│ │ ├── master.js
│ │ └── index.js
│ ├── print-pdf
│ │ └── print-pdf.js
│ ├── postmessage
│ │ ├── postmessage.js
│ │ └── example.html
│ ├── remotes
│ │ └── remotes.js
│ ├── math
│ │ └── math.js
│ ├── notes-server
│ │ ├── client.js
│ │ └── index.js
│ └── notes
│ │ └── notes.js
├── css
│ └── theme
│ │ ├── template
│ │ ├── settings.scss
│ │ └── mixins.scss
│ │ ├── source
│ │ ├── night.scss
│ │ ├── serif.scss
│ │ ├── simple.scss
│ │ ├── sky.scss
│ │ ├── default.scss
│ │ ├── beige.scss
│ │ ├── moon.scss
│ │ ├── solarized.scss
│ │ └── blood.scss
│ │ └── README.md
├── LICENSE
└── package.json
├── .editorconfig
├── index.html
├── index.css
├── .jshintrc
├── alternatives
├── zengular-workshop.html
├── zengular-1h.html
├── zengular-parse.html
└── zengular-1h.js
├── README.md
├── workout
├── index6.js
├── index5.js
├── index3.js
├── index2.js
└── index4.js
└── index.js
/workshop/zengular.js:
--------------------------------------------------------------------------------
1 | // A vous !
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 | .DS_Store
3 | *.iml
4 | node_modules
--------------------------------------------------------------------------------
/sessions/devoxxfr-16042014/zengular.js:
--------------------------------------------------------------------------------
1 | // A vous !
2 |
--------------------------------------------------------------------------------
/workshop/solutions/zengular-01-scope.js:
--------------------------------------------------------------------------------
1 | function Scope() {
2 |
3 | }
4 |
--------------------------------------------------------------------------------
/slides/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | .svn
3 | log/*.log
4 | tmp/**
5 | node_modules/
6 | .sass-cache
--------------------------------------------------------------------------------
/slides/img/books.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/books.jpg
--------------------------------------------------------------------------------
/slides/img/ebook.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/ebook.jpg
--------------------------------------------------------------------------------
/slides/img/lego.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/lego.jpeg
--------------------------------------------------------------------------------
/slides/img/lyon.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/lyon.jpg
--------------------------------------------------------------------------------
/slides/img/magic.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/magic.jpg
--------------------------------------------------------------------------------
/slides/img/swiip.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/swiip.jpg
--------------------------------------------------------------------------------
/slides/img/title.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/title.jpg
--------------------------------------------------------------------------------
/workshop/digest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/workshop/digest.png
--------------------------------------------------------------------------------
/slides/img/chrome.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/chrome.jpg
--------------------------------------------------------------------------------
/slides/img/concepts.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/concepts.png
--------------------------------------------------------------------------------
/slides/img/digest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/digest.png
--------------------------------------------------------------------------------
/slides/img/eiffel.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/eiffel.jpeg
--------------------------------------------------------------------------------
/slides/img/gearing.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/gearing.jpg
--------------------------------------------------------------------------------
/slides/img/jasmine.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/jasmine.jpeg
--------------------------------------------------------------------------------
/slides/img/lyonjs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/lyonjs.png
--------------------------------------------------------------------------------
/slides/img/teropa.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/teropa.jpeg
--------------------------------------------------------------------------------
/slides/img/training.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/training.jpg
--------------------------------------------------------------------------------
/slides/img/yeoman.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/yeoman.png
--------------------------------------------------------------------------------
/slides/img/zenika.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/zenika.jpeg
--------------------------------------------------------------------------------
/slides/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 | - 0.8
4 | before_script:
5 | - npm install -g grunt-cli
--------------------------------------------------------------------------------
/slides/img/complexity.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/complexity.jpg
--------------------------------------------------------------------------------
/slides/img/generator.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/generator.png
--------------------------------------------------------------------------------
/slides/img/ng-europe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/ng-europe.png
--------------------------------------------------------------------------------
/slides/img/training.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/training.jpeg
--------------------------------------------------------------------------------
/slides/img/whitepage.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/whitepage.jpg
--------------------------------------------------------------------------------
/slides/img/zenika-big.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/zenika-big.png
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | .svn
3 | log/*.log
4 | tmp/**
5 | node_modules/
6 | .sass-cache
--------------------------------------------------------------------------------
/slides/img/olivierhuber.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/olivierhuber.jpeg
--------------------------------------------------------------------------------
/slides/img/timruffles.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/timruffles.jpeg
--------------------------------------------------------------------------------
/slides/img/underscore-js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/underscore-js.png
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | .svn
3 | log/*.log
4 | tmp/**
5 | node_modules/
6 | .sass-cache
--------------------------------------------------------------------------------
/slides/img/angularjs-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/angularjs-logo.png
--------------------------------------------------------------------------------
/slides/img/jasmine-screen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/img/jasmine-screen.png
--------------------------------------------------------------------------------
/sessions/lyonjs-03042014/digest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/lyonjs-03042014/digest.png
--------------------------------------------------------------------------------
/sessions/mixit-30042014/digest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/mixit-30042014/digest.png
--------------------------------------------------------------------------------
/sessions/devoxxfr-16042014/digest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/devoxxfr-16042014/digest.png
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 | - 0.8
4 | before_script:
5 | - npm install -g grunt-cli
--------------------------------------------------------------------------------
/slides/lib/font/league_gothic_license:
--------------------------------------------------------------------------------
1 | SIL Open Font License (OFL)
2 | http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL
3 |
--------------------------------------------------------------------------------
/slides/test/examples/assets/image1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/test/examples/assets/image1.png
--------------------------------------------------------------------------------
/slides/test/examples/assets/image2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/test/examples/assets/image2.png
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/digest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/breizhcamp-22052014/digest.png
--------------------------------------------------------------------------------
/slides/lib/font/league_gothic-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/lib/font/league_gothic-webfont.eot
--------------------------------------------------------------------------------
/slides/lib/font/league_gothic-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/lib/font/league_gothic-webfont.ttf
--------------------------------------------------------------------------------
/slides/lib/font/league_gothic-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/slides/lib/font/league_gothic-webfont.woff
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/img/digest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/m6web-25042014/slides/img/digest.png
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/img/lyonjs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/m6web-25042014/slides/img/lyonjs.png
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/img/swiip.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/m6web-25042014/slides/img/swiip.jpg
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/img/teropa.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/m6web-25042014/slides/img/teropa.jpeg
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/img/zenika.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/m6web-25042014/slides/img/zenika.jpeg
--------------------------------------------------------------------------------
/workshop/tests/jasmine-2.0.0/jasmine_favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/workshop/tests/jasmine-2.0.0/jasmine_favicon.png
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/img/digest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/breizhcamp-22052014/slides/img/digest.png
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/img/lego.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/breizhcamp-22052014/slides/img/lego.jpeg
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/img/lyonjs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/breizhcamp-22052014/slides/img/lyonjs.png
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/img/slide8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/breizhcamp-22052014/slides/img/slide8.jpg
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/img/swiip.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/breizhcamp-22052014/slides/img/swiip.jpg
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/img/timruffles.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/m6web-25042014/slides/img/timruffles.jpeg
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/lib/font/league_gothic_license:
--------------------------------------------------------------------------------
1 | SIL Open Font License (OFL)
2 | http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL
3 |
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/img/jasmine.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/breizhcamp-22052014/slides/img/jasmine.jpeg
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/img/teropa.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/breizhcamp-22052014/slides/img/teropa.jpeg
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/img/zenika.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/breizhcamp-22052014/slides/img/zenika.jpeg
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/lib/font/league_gothic_license:
--------------------------------------------------------------------------------
1 | SIL Open Font License (OFL)
2 | http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL
3 |
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/img/angularjs-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/m6web-25042014/slides/img/angularjs-logo.png
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/img/Slide_first.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/breizhcamp-22052014/slides/img/Slide_first.png
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/img/Slide_last.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/breizhcamp-22052014/slides/img/Slide_last.png
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/img/timruffles.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/breizhcamp-22052014/slides/img/timruffles.jpeg
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/img/angularjs-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/breizhcamp-22052014/slides/img/angularjs-logo.png
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/img/jasmine-screen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/breizhcamp-22052014/slides/img/jasmine-screen.png
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/img/underscore-js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/breizhcamp-22052014/slides/img/underscore-js.png
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/test/examples/assets/image1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/m6web-25042014/slides/test/examples/assets/image1.png
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/test/examples/assets/image2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/m6web-25042014/slides/test/examples/assets/image2.png
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/lib/font/league_gothic-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/m6web-25042014/slides/lib/font/league_gothic-webfont.eot
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/lib/font/league_gothic-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/m6web-25042014/slides/lib/font/league_gothic-webfont.ttf
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/lib/font/league_gothic-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/m6web-25042014/slides/lib/font/league_gothic-webfont.woff
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/css/fonts/Ubuntu/Ubuntu-Bold.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/breizhcamp-22052014/slides/css/fonts/Ubuntu/Ubuntu-Bold.woff
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/css/fonts/Ubuntu/Ubuntu-Light.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/breizhcamp-22052014/slides/css/fonts/Ubuntu/Ubuntu-Light.woff
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/lib/font/league_gothic-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/breizhcamp-22052014/slides/lib/font/league_gothic-webfont.eot
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/lib/font/league_gothic-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/breizhcamp-22052014/slides/lib/font/league_gothic-webfont.ttf
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/lib/font/league_gothic-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/breizhcamp-22052014/slides/lib/font/league_gothic-webfont.woff
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/css/fonts/Ubuntu/Ubuntu-BoldItalic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/breizhcamp-22052014/slides/css/fonts/Ubuntu/Ubuntu-BoldItalic.woff
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/css/fonts/Ubuntu/Ubuntu-LightItalic.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Swiip/angular-from-scratch/HEAD/sessions/breizhcamp-22052014/slides/css/fonts/Ubuntu/Ubuntu-LightItalic.woff
--------------------------------------------------------------------------------
/workshop/tests/zengular-tests-01-scope.js:
--------------------------------------------------------------------------------
1 | describe('the tests of the step 1 of the workshop', function() {
2 |
3 | it('sould be a scope defined', function() {
4 |
5 | expect(_.isFunction(Scope)).toBe(true);
6 |
7 | });
8 |
9 | });
10 |
--------------------------------------------------------------------------------
/slides/lib/js/html5shiv.js:
--------------------------------------------------------------------------------
1 | document.createElement('header');
2 | document.createElement('nav');
3 | document.createElement('section');
4 | document.createElement('article');
5 | document.createElement('aside');
6 | document.createElement('footer');
7 | document.createElement('hgroup');
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # http://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | indent_style = space
6 | indent_size = 2
7 | end_of_line = lf
8 | charset = utf-8
9 | trim_trailing_whitespace = true
10 | insert_final_newline = true
11 |
12 | [*.md]
13 | trim_trailing_whitespace = false
14 |
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/lib/js/html5shiv.js:
--------------------------------------------------------------------------------
1 | document.createElement('header');
2 | document.createElement('nav');
3 | document.createElement('section');
4 | document.createElement('article');
5 | document.createElement('aside');
6 | document.createElement('footer');
7 | document.createElement('hgroup');
--------------------------------------------------------------------------------
/workshop/solutions/zengular-02-watch.js:
--------------------------------------------------------------------------------
1 | function Scope() {
2 | this.$$watchers = [];
3 | }
4 |
5 | Scope.prototype.$watch = function (watcherFn, listenerFn) {
6 | var watch = {
7 | watcherFn: watcherFn,
8 | listenerFn: listenerFn
9 | };
10 | this.$$watchers.push(watch);
11 | };
12 |
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/lib/js/html5shiv.js:
--------------------------------------------------------------------------------
1 | document.createElement('header');
2 | document.createElement('nav');
3 | document.createElement('section');
4 | document.createElement('article');
5 | document.createElement('aside');
6 | document.createElement('footer');
7 | document.createElement('hgroup');
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Angular From Scratch
4 |
5 |
6 |
7 | hello
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/slides/test/test-markdown.js:
--------------------------------------------------------------------------------
1 |
2 |
3 | Reveal.addEventListener( 'ready', function() {
4 |
5 | QUnit.module( 'Markdown' );
6 |
7 | test( 'Vertical separator', function() {
8 | strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 2, 'found two slides' );
9 | });
10 |
11 |
12 | } );
13 |
14 | Reveal.initialize();
15 |
16 |
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/test/test-markdown.js:
--------------------------------------------------------------------------------
1 |
2 |
3 | Reveal.addEventListener( 'ready', function() {
4 |
5 | QUnit.module( 'Markdown' );
6 |
7 | test( 'Vertical separator', function() {
8 | strictEqual( document.querySelectorAll( '.reveal .slides>section>section' ).length, 2, 'found two slides' );
9 | });
10 |
11 |
12 | } );
13 |
14 | Reveal.initialize();
15 |
16 |
--------------------------------------------------------------------------------
/slides/plugin/markdown/example.md:
--------------------------------------------------------------------------------
1 | # Markdown Demo
2 |
3 |
4 |
5 | ## External 1.1
6 |
7 | Content 1.1
8 |
9 | Note: This will only appear in the speaker notes window.
10 |
11 |
12 | ## External 1.2
13 |
14 | Content 1.2
15 |
16 |
17 |
18 | ## External 2
19 |
20 | Content 2.1
21 |
22 |
23 |
24 | ## External 3.1
25 |
26 | Content 3.1
27 |
28 |
29 | ## External 3.2
30 |
31 | Content 3.2
32 |
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/plugin/markdown/example.md:
--------------------------------------------------------------------------------
1 | # Markdown Demo
2 |
3 |
4 |
5 | ## External 1.1
6 |
7 | Content 1.1
8 |
9 | Note: This will only appear in the speaker notes window.
10 |
11 |
12 | ## External 1.2
13 |
14 | Content 1.2
15 |
16 |
17 |
18 | ## External 2
19 |
20 | Content 2.1
21 |
22 |
23 |
24 | ## External 3.1
25 |
26 | Content 3.1
27 |
28 |
29 | ## External 3.2
30 |
31 | Content 3.2
32 |
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/plugin/markdown/example.md:
--------------------------------------------------------------------------------
1 | # Markdown Demo
2 |
3 |
4 |
5 | ## External 1.1
6 |
7 | Content 1.1
8 |
9 | Note: This will only appear in the speaker notes window.
10 |
11 |
12 | ## External 1.2
13 |
14 | Content 1.2
15 |
16 |
17 |
18 | ## External 2
19 |
20 | Content 2.1
21 |
22 |
23 |
24 | ## External 3.1
25 |
26 | Content 3.1
27 |
28 |
29 | ## External 3.2
30 |
31 | Content 3.2
32 |
--------------------------------------------------------------------------------
/slides/plugin/multiplex/client.js:
--------------------------------------------------------------------------------
1 | (function() {
2 | var multiplex = Reveal.getConfig().multiplex;
3 | var socketId = multiplex.id;
4 | var socket = io.connect(multiplex.url);
5 |
6 | socket.on(multiplex.id, function(data) {
7 | // ignore data from sockets that aren't ours
8 | if (data.socketId !== socketId) { return; }
9 | if( window.location.host === 'localhost:1947' ) return;
10 |
11 | Reveal.slide(data.indexh, data.indexv, data.indexf, 'remote');
12 | });
13 | }());
14 |
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/plugin/multiplex/client.js:
--------------------------------------------------------------------------------
1 | (function() {
2 | var multiplex = Reveal.getConfig().multiplex;
3 | var socketId = multiplex.id;
4 | var socket = io.connect(multiplex.url);
5 |
6 | socket.on(multiplex.id, function(data) {
7 | // ignore data from sockets that aren't ours
8 | if (data.socketId !== socketId) { return; }
9 | if( window.location.host === 'localhost:1947' ) return;
10 |
11 | Reveal.slide(data.indexh, data.indexv, data.indexf, 'remote');
12 | });
13 | }());
14 |
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/plugin/multiplex/client.js:
--------------------------------------------------------------------------------
1 | (function() {
2 | var multiplex = Reveal.getConfig().multiplex;
3 | var socketId = multiplex.id;
4 | var socket = io.connect(multiplex.url);
5 |
6 | socket.on(multiplex.id, function(data) {
7 | // ignore data from sockets that aren't ours
8 | if (data.socketId !== socketId) { return; }
9 | if( window.location.host === 'localhost:1947' ) return;
10 |
11 | Reveal.slide(data.indexh, data.indexv, data.indexf, 'remote');
12 | });
13 | }());
14 |
--------------------------------------------------------------------------------
/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | height: 100%;
3 | margin: 0;
4 | background-image: url('slides/img/whitepage.jpg');
5 | display: flex;
6 | flex-direction: column;
7 | justify-content: center;
8 |
9 | }
10 |
11 | h1, h2 {
12 | font-family: 'Cherry Cream Soda', cursive;
13 | font-size: 4em;
14 | text-align: center;
15 | align-items: center;
16 | background-color: rgba(0, 0, 0, 0.5);
17 | color: white;
18 | padding: .2em;
19 | margin: 0;
20 | }
21 |
22 | input {
23 | font-size: .5em;
24 | margin: .5em;
25 | border-radius: .2em;
26 | border: none;
27 | }
28 |
--------------------------------------------------------------------------------
/workshop/solutions/zengular-03-digest.js:
--------------------------------------------------------------------------------
1 | function Scope() {
2 | this.$$watchers = [];
3 | }
4 |
5 | Scope.prototype.$watch = function (watcherFn, listenerFn) {
6 | var watch = {
7 | watcherFn: watcherFn,
8 | listenerFn: listenerFn
9 | };
10 | this.$$watchers.push(watch);
11 | };
12 |
13 | Scope.prototype.$digest = function () {
14 | _.each(this.$$watchers, function (watcher) {
15 | var newValue = watcher.watcherFn(this);
16 | if (watcher.last !== newValue) {
17 | watcher.listenerFn(newValue, watcher.last, this);
18 | watcher.last = newValue;
19 | }
20 | }.bind(this));
21 | };
22 |
--------------------------------------------------------------------------------
/workshop/solutions/zengular-04-apply.js:
--------------------------------------------------------------------------------
1 | function Scope() {
2 | this.$$watchers = [];
3 | }
4 |
5 | Scope.prototype.$watch = function (watcherFn, listenerFn) {
6 | var watch = {
7 | watcherFn: watcherFn,
8 | listenerFn: listenerFn
9 | };
10 | this.$$watchers.push(watch);
11 | };
12 |
13 | Scope.prototype.$digest = function () {
14 | _.each(this.$$watchers, function (watcher) {
15 | var newValue = watcher.watcherFn(this);
16 | if (watcher.last !== newValue) {
17 | watcher.listenerFn(newValue, watcher.last, this);
18 | watcher.last = newValue;
19 | }
20 | }.bind(this));
21 | };
22 |
23 | Scope.prototype.$apply = function (exprFn) {
24 | try {
25 | exprFn();
26 | } finally {
27 | this.$digest();
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/workshop/tests/zengular-tests-08-directive.js:
--------------------------------------------------------------------------------
1 | describe('the tests of the step 8 of the workshop', function() {
2 |
3 | it('sould add an object $$directives and a function $directive', function() {
4 |
5 | expect(_.isObject($$directives)).toBe(true);
6 |
7 | expect(_.isFunction($directive)).toBe(true);
8 |
9 | });
10 |
11 | it('sould register the directive function when using $directive function', function() {
12 |
13 | var directiveName = 'directive-test';
14 | var directiveFunction = function() {};
15 |
16 | $directive(directiveName, directiveFunction);
17 |
18 | expect($$directives[directiveName]).toBe(directiveFunction);
19 |
20 | expect($directive(directiveName)).toBe(directiveFunction);
21 |
22 | });
23 |
24 | });
25 |
--------------------------------------------------------------------------------
/.jshintrc:
--------------------------------------------------------------------------------
1 | {
2 | "browser": true,
3 | "devel": true,
4 | "esnext": true,
5 | "bitwise": true,
6 | "camelcase": true,
7 | "curly": true,
8 | "eqeqeq": true,
9 | "immed": true,
10 | "indent": 2,
11 | "latedef": true,
12 | "newcap": true,
13 | "noarg": true,
14 | "quotmark": "single",
15 | "regexp": true,
16 | "undef": true,
17 | "unused": true,
18 | "strict": true,
19 | "globalstrict": true,
20 | "trailing": true,
21 | "smarttabs": true,
22 | "white": true,
23 | "validthis": true,
24 | "globals": {
25 | /* Angular Mocks */
26 | "inject": false,
27 | /* MOCHA */
28 | "describe": false,
29 | "it": false,
30 | "before": false,
31 | "beforeEach": false,
32 | "after": false,
33 | "afterEach": false
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/workshop/tests/zengular-tests-02-watch.js:
--------------------------------------------------------------------------------
1 | describe('the tests of the step 2 of the workshop', function() {
2 |
3 | var scope;
4 |
5 | beforeEach(function() {
6 | scope = new Scope();
7 | });
8 |
9 | it('sould add a function $watch in the Scope', function() {
10 |
11 | expect(_.isFunction(scope.$watch)).toBe(true);
12 |
13 | });
14 |
15 | it('sould add a watcher object in $$watchers when using $watch', function() {
16 |
17 | var myWatcher = function() {}, myListener = function() {};
18 |
19 | scope.$watch(myWatcher, myListener);
20 |
21 | expect(_.isArray(scope.$$watchers)).toBe(true);
22 | expect(scope.$$watchers.length).toBe(1);
23 | expect(scope.$$watchers[0].watcherFn).toBe(myWatcher);
24 | expect(scope.$$watchers[0].listenerFn).toBe(myListener);
25 |
26 | });
27 |
28 | });
29 |
--------------------------------------------------------------------------------
/workshop/zengular.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Zengular
6 |
7 |
8 |
9 |
10 |
11 |
12 | Cet exercice à pour but de démystifier le schéma suivant :
13 |
14 |
15 | ... en créant tout simplement notre propre AngularJS
16 |
17 | Vous partirez de cette page vierge de tout javascript pour construire petit à petit un mini framework qui à pour
18 | specs le schéma ci-dessus
19 |
20 | Activer (F12) à présent votre concole JavaScript sur cette page, éditer ce même fichier et suivez le guide...
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/alternatives/zengular-workshop.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Zengular
6 |
7 |
8 |
9 |
10 |
11 |
12 | Cet exercice à pour but de démystifier le schéma suivant :
13 |
14 |
15 | ... en créant tout simplement notre propre AngularJS
16 |
17 | Vous partirez de cette page vierge de tout javascript pour construire petit à petit un mini framework qui à pour
18 | specs le schéma ci-dessus
19 |
20 | Activer (F12) à présent votre concole JavaScript sur cette page, éditer ce même fichier et suivez le guide...
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/css/fonts/Ubuntu/Ubuntu.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: 'Ubuntu';
3 | font-style: normal;
4 | font-weight: 300;
5 | src: local('Ubuntu Light'), local('Ubuntu-Light'), url('Ubuntu-Light.woff') format('woff');
6 | }
7 | @font-face {
8 | font-family: 'Ubuntu';
9 | font-style: normal;
10 | font-weight: 700;
11 | src: local('Ubuntu Bold'), local('Ubuntu-Bold'), url('Ubuntu-Bold.woff') format('woff');
12 | }
13 | @font-face {
14 | font-family: 'Ubuntu';
15 | font-style: italic;
16 | font-weight: 300;
17 | src: local('Ubuntu Light Italic'), local('Ubuntu-LightItalic'), url('Ubuntu-LightItalic.woff') format('woff');
18 | }
19 | @font-face {
20 | font-family: 'Ubuntu';
21 | font-style: italic;
22 | font-weight: 700;
23 | src: local('Ubuntu Bold Italic'), local('Ubuntu-BoldItalic'), url('Ubuntu-BoldItalic.woff') format('woff');
24 | }
25 |
--------------------------------------------------------------------------------
/slides/test/examples/barebones.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | reveal.js - Barebones
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | Barebones Presentation
20 | This example contains the bare minimum includes and markup required to run a reveal.js presentation.
21 |
22 |
23 |
24 | No Theme
25 | There's no theme included, so it will fall back on browser defaults.
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/alternatives/zengular-1h.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Zengular
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | Cet exercice à pour but de démystifier le schéma suivant :
14 |
15 |
16 | ... en créant tout simplement notre propre AngularJS
17 |
18 | Vous partirez de cette page vierge de tout javascript pour construire petit à petit un mini framework qui à pour
19 | specs le schéma ci-dessus
20 |
21 | Activer (F12) à présent votre concole JavaScript sur cette page, éditer ce même fichier et suivez le guide...
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/sessions/m6web-25042014/zengular-1h.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Zengular
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | Cet exercice à pour but de démystifier le schéma suivant :
14 |
15 |
16 | ... en créant tout simplement notre propre AngularJS
17 |
18 | Vous partirez de cette page vierge de tout javascript pour construire petit à petit un mini framework qui à pour
19 | specs le schéma ci-dessus
20 |
21 | Activer (F12) à présent votre concole JavaScript sur cette page, éditer ce même fichier et suivez le guide...
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/sessions/zenika-24042014/zengular-1h.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Zengular
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | Cet exercice à pour but de démystifier le schéma suivant :
14 |
15 |
16 | ... en créant tout simplement notre propre AngularJS
17 |
18 | Vous partirez de cette page vierge de tout javascript pour construire petit à petit un mini framework qui à pour
19 | specs le schéma ci-dessus
20 |
21 | Activer (F12) à présent votre concole JavaScript sur cette page, éditer ce même fichier et suivez le guide...
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/test/examples/barebones.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | reveal.js - Barebones
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | Barebones Presentation
20 | This example contains the bare minimum includes and markup required to run a reveal.js presentation.
21 |
22 |
23 |
24 | No Theme
25 | There's no theme included, so it will fall back on browser defaults.
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/workshop/solutions/zengular-05-loop.js:
--------------------------------------------------------------------------------
1 | function Scope() {
2 | this.$$watchers = [];
3 | }
4 |
5 | Scope.prototype.$watch = function (watcherFn, listenerFn) {
6 | var watch = {
7 | watcherFn: watcherFn,
8 | listenerFn: listenerFn
9 | };
10 | this.$$watchers.push(watch);
11 | };
12 |
13 | Scope.prototype.$digest = function () {
14 | var dirty;
15 | var ttl = 10;
16 | do {
17 | dirty = false;
18 | _.each(this.$$watchers, function (watcher) {
19 | var newValue = watcher.watcherFn(this);
20 | if (watcher.last !== newValue) {
21 | dirty = true;
22 | watcher.listenerFn(newValue, watcher.last, this);
23 | watcher.last = newValue;
24 | }
25 | }.bind(this));
26 | if (dirty && !(ttl--)) {
27 | throw "$digest est partie en boucle !"
28 | }
29 | } while (dirty)
30 | };
31 |
32 | Scope.prototype.$apply = function (exprFn) {
33 | try {
34 | exprFn();
35 | } finally {
36 | this.$digest();
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/alternatives/zengular-parse.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Zengular
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | Cet exercice à pour but de démystifier le schéma suivant :
14 |
15 |
16 | ... en créant tout simplement notre propre AngularJS
17 |
18 | Vous partirez de cette page vierge de tout javascript pour construire petit à petit un mini framework qui à pour
19 | specs le schéma ci-dessus
20 |
21 | Activer (F12) à présent votre concole JavaScript sur cette page, éditer ce même fichier et suivez le guide...
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/slides/css/theme/template/settings.scss:
--------------------------------------------------------------------------------
1 | // Base settings for all themes that can optionally be
2 | // overridden by the super-theme
3 |
4 | // Background of the presentation
5 | $backgroundColor: #2b2b2b;
6 |
7 | // Primary/body text
8 | $mainFont: 'Lato', sans-serif;
9 | $mainFontSize: 36px;
10 | $mainColor: #eee;
11 |
12 | // Headings
13 | $headingMargin: 0 0 20px 0;
14 | $headingFont: 'League Gothic', Impact, sans-serif;
15 | $headingColor: #eee;
16 | $headingLineHeight: 0.9em;
17 | $headingLetterSpacing: 0.02em;
18 | $headingTextTransform: uppercase;
19 | $headingTextShadow: 0px 0px 6px rgba(0,0,0,0.2);
20 | $heading1TextShadow: $headingTextShadow;
21 |
22 | // Links and actions
23 | $linkColor: #13DAEC;
24 | $linkColorHover: lighten( $linkColor, 20% );
25 |
26 | // Text selection
27 | $selectionBackgroundColor: #FF5E99;
28 | $selectionColor: #fff;
29 |
30 | // Generates the presentation background, can be overridden
31 | // to return a background image or gradient
32 | @mixin bodyBackground() {
33 | background: $backgroundColor;
34 | }
--------------------------------------------------------------------------------
/slides/plugin/print-pdf/print-pdf.js:
--------------------------------------------------------------------------------
1 | /**
2 | * phantomjs script for printing presentations to PDF.
3 | *
4 | * Example:
5 | * phantomjs print-pdf.js "http://lab.hakim.se/reveal-js?print-pdf" reveal-demo.pdf
6 | *
7 | * By Manuel Bieh (https://github.com/manuelbieh)
8 | */
9 |
10 | // html2pdf.js
11 | var page = new WebPage();
12 | var system = require( 'system' );
13 |
14 | page.viewportSize = {
15 | width: 1024,
16 | height: 768
17 | };
18 |
19 | page.paperSize = {
20 | format: 'letter',
21 | orientation: 'landscape',
22 | margin: {
23 | left: '0',
24 | right: '0',
25 | top: '0',
26 | bottom: '0'
27 | }
28 | };
29 |
30 | var revealFile = system.args[1] || 'index.html?print-pdf';
31 | var slideFile = system.args[2] || 'slides.pdf';
32 |
33 | if( slideFile.match( /\.pdf$/gi ) === null ) {
34 | slideFile += '.pdf';
35 | }
36 |
37 | console.log( 'Printing PDF...' );
38 |
39 | page.open( revealFile, function( status ) {
40 | console.log( 'Printed succesfully' );
41 | page.render( slideFile );
42 | phantom.exit();
43 | } );
44 |
45 |
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/css/theme/template/settings.scss:
--------------------------------------------------------------------------------
1 | // Base settings for all themes that can optionally be
2 | // overridden by the super-theme
3 |
4 | // Background of the presentation
5 | $backgroundColor: #2b2b2b;
6 |
7 | // Primary/body text
8 | $mainFont: 'Lato', sans-serif;
9 | $mainFontSize: 36px;
10 | $mainColor: #eee;
11 |
12 | // Headings
13 | $headingMargin: 0 0 20px 0;
14 | $headingFont: 'League Gothic', Impact, sans-serif;
15 | $headingColor: #eee;
16 | $headingLineHeight: 0.9em;
17 | $headingLetterSpacing: 0.02em;
18 | $headingTextTransform: uppercase;
19 | $headingTextShadow: 0px 0px 6px rgba(0,0,0,0.2);
20 | $heading1TextShadow: $headingTextShadow;
21 |
22 | // Links and actions
23 | $linkColor: #13DAEC;
24 | $linkColorHover: lighten( $linkColor, 20% );
25 |
26 | // Text selection
27 | $selectionBackgroundColor: #FF5E99;
28 | $selectionColor: #fff;
29 |
30 | // Generates the presentation background, can be overridden
31 | // to return a background image or gradient
32 | @mixin bodyBackground() {
33 | background: $backgroundColor;
34 | }
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/css/theme/template/settings.scss:
--------------------------------------------------------------------------------
1 | // Base settings for all themes that can optionally be
2 | // overridden by the super-theme
3 |
4 | // Background of the presentation
5 | $backgroundColor: #2b2b2b;
6 |
7 | // Primary/body text
8 | $mainFont: 'Lato', sans-serif;
9 | $mainFontSize: 36px;
10 | $mainColor: #eee;
11 |
12 | // Headings
13 | $headingMargin: 0 0 20px 0;
14 | $headingFont: 'League Gothic', Impact, sans-serif;
15 | $headingColor: #eee;
16 | $headingLineHeight: 0.9em;
17 | $headingLetterSpacing: 0.02em;
18 | $headingTextTransform: uppercase;
19 | $headingTextShadow: 0px 0px 6px rgba(0,0,0,0.2);
20 | $heading1TextShadow: $headingTextShadow;
21 |
22 | // Links and actions
23 | $linkColor: #13DAEC;
24 | $linkColorHover: lighten( $linkColor, 20% );
25 |
26 | // Text selection
27 | $selectionBackgroundColor: #FF5E99;
28 | $selectionColor: #fff;
29 |
30 | // Generates the presentation background, can be overridden
31 | // to return a background image or gradient
32 | @mixin bodyBackground() {
33 | background: $backgroundColor;
34 | }
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/plugin/print-pdf/print-pdf.js:
--------------------------------------------------------------------------------
1 | /**
2 | * phantomjs script for printing presentations to PDF.
3 | *
4 | * Example:
5 | * phantomjs print-pdf.js "http://lab.hakim.se/reveal-js?print-pdf" reveal-demo.pdf
6 | *
7 | * By Manuel Bieh (https://github.com/manuelbieh)
8 | */
9 |
10 | // html2pdf.js
11 | var page = new WebPage();
12 | var system = require( 'system' );
13 |
14 | page.viewportSize = {
15 | width: 1024,
16 | height: 768
17 | };
18 |
19 | page.paperSize = {
20 | format: 'letter',
21 | orientation: 'landscape',
22 | margin: {
23 | left: '0',
24 | right: '0',
25 | top: '0',
26 | bottom: '0'
27 | }
28 | };
29 |
30 | var revealFile = system.args[1] || 'index.html?print-pdf';
31 | var slideFile = system.args[2] || 'slides.pdf';
32 |
33 | if( slideFile.match( /\.pdf$/gi ) === null ) {
34 | slideFile += '.pdf';
35 | }
36 |
37 | console.log( 'Printing PDF...' );
38 |
39 | page.open( revealFile, function( status ) {
40 | console.log( 'Printed succesfully' );
41 | page.render( slideFile );
42 | phantom.exit();
43 | } );
44 |
45 |
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/plugin/print-pdf/print-pdf.js:
--------------------------------------------------------------------------------
1 | /**
2 | * phantomjs script for printing presentations to PDF.
3 | *
4 | * Example:
5 | * phantomjs print-pdf.js "http://lab.hakim.se/reveal-js?print-pdf" reveal-demo.pdf
6 | *
7 | * By Manuel Bieh (https://github.com/manuelbieh)
8 | */
9 |
10 | // html2pdf.js
11 | var page = new WebPage();
12 | var system = require( 'system' );
13 |
14 | page.viewportSize = {
15 | width: 1024,
16 | height: 768
17 | };
18 |
19 | page.paperSize = {
20 | format: 'letter',
21 | orientation: 'landscape',
22 | margin: {
23 | left: '0',
24 | right: '0',
25 | top: '0',
26 | bottom: '0'
27 | }
28 | };
29 |
30 | var revealFile = system.args[1] || 'index.html?print-pdf';
31 | var slideFile = system.args[2] || 'slides.pdf';
32 |
33 | if( slideFile.match( /\.pdf$/gi ) === null ) {
34 | slideFile += '.pdf';
35 | }
36 |
37 | console.log( 'Printing PDF...' );
38 |
39 | page.open( revealFile, function( status ) {
40 | console.log( 'Printed succesfully' );
41 | page.render( slideFile );
42 | phantom.exit();
43 | } );
44 |
45 |
--------------------------------------------------------------------------------
/workshop/solutions/zengular-06-dirty.js:
--------------------------------------------------------------------------------
1 | function Scope() {
2 | this.$$watchers = [];
3 | }
4 |
5 | Scope.prototype.$watch = function (watcherFn, listenerFn, byValue) {
6 | var watch = {
7 | watcherFn: watcherFn,
8 | listenerFn: listenerFn,
9 | byValue: byValue
10 | };
11 | this.$$watchers.push(watch);
12 | };
13 |
14 | Scope.prototype.$digest = function () {
15 | var dirty;
16 | var ttl = 10;
17 | do {
18 | dirty = false;
19 | _.each(this.$$watchers, function (watcher) {
20 | var newValue = watcher.watcherFn(this);
21 | if (watcher.byValue ? !_.isEqual(watcher.last, newValue) : watcher.last !== newValue) {
22 | dirty = true;
23 | watcher.listenerFn(newValue, watcher.last, this);
24 | watcher.last = watcher.byValue ? _.clone(newValue) : newValue;
25 | }
26 | }.bind(this));
27 | if (dirty && !(ttl--)) {
28 | throw "$digest est partie en boucle !"
29 | }
30 | } while (dirty)
31 | };
32 |
33 | Scope.prototype.$apply = function (exprFn) {
34 | try {
35 | exprFn();
36 | } finally {
37 | this.$digest();
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | #Angular from scratch
2 |
3 | This is the repository of my live coding from [ng-europe](http://ngeurope.org) and [Soft Shake](http://soft-shake.ch).
4 |
5 | It's a fork of the initiative of a Workshop for the [DevoxxFR](http://www.devoxx.fr/) and the [Mix-IT](http://www.mix-it.fr/). You can find more description on the original repository.
6 |
7 | This talk has been inspired by some blog posts on the internet and especially [Make Your Own AngularJS, Part 1: Scopes And Digest](http://teropa.info/blog/2013/11/03/make-your-own-angular-part-1-scopes-and-digest.html). The blogger [@teropa](https://twitter.com/teropa) started the adaptation of the concept on an eBook which can only recommend [Build Your Own AngularJS](http://teropa.info/build-your-own-angular).
8 |
9 | ##Content
10 |
11 | * root directory contains the actual files used on stage
12 | * slides directory contains the slides to support the workshop
13 | * alternatives directory contains some variants of the code
14 | * workout directoy contains my actual repetitions files
15 | * sessions directory contains all files from each sessions of this workshop
16 |
--------------------------------------------------------------------------------
/slides/css/theme/source/night.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Black theme for reveal.js.
3 | *
4 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
5 | */
6 |
7 |
8 | // Default mixins and settings -----------------
9 | @import "../template/mixins";
10 | @import "../template/settings";
11 | // ---------------------------------------------
12 |
13 |
14 | // Include theme-specific fonts
15 | @import url(https://fonts.googleapis.com/css?family=Montserrat:700);
16 | @import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic);
17 |
18 |
19 | // Override theme settings (see ../template/settings.scss)
20 | $backgroundColor: #111;
21 |
22 | $mainFont: 'Open Sans', sans-serif;
23 | $linkColor: #e7ad52;
24 | $linkColorHover: lighten( $linkColor, 20% );
25 | $headingFont: 'Montserrat', Impact, sans-serif;
26 | $headingTextShadow: none;
27 | $headingLetterSpacing: -0.03em;
28 | $headingTextTransform: none;
29 | $selectionBackgroundColor: #e7ad52;
30 | $mainFontSize: 30px;
31 |
32 |
33 | // Theme template ------------------------------
34 | @import "../template/theme";
35 | // ---------------------------------------------
--------------------------------------------------------------------------------
/slides/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (C) 2013 Hakim El Hattab, http://hakim.se
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy
4 | of this software and associated documentation files (the "Software"), to deal
5 | in the Software without restriction, including without limitation the rights
6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 | copies of the Software, and to permit persons to whom the Software is
8 | furnished to do so, subject to the following conditions:
9 |
10 | The above copyright notice and this permission notice shall be included in
11 | all copies or substantial portions of the Software.
12 |
13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 | THE SOFTWARE.
--------------------------------------------------------------------------------
/slides/plugin/postmessage/postmessage.js:
--------------------------------------------------------------------------------
1 | /*
2 |
3 | simple postmessage plugin
4 |
5 | Useful when a reveal slideshow is inside an iframe.
6 | It allows to call reveal methods from outside.
7 |
8 | Example:
9 | var reveal = window.frames[0];
10 |
11 | // Reveal.prev();
12 | reveal.postMessage(JSON.stringify({method: 'prev', args: []}), '*');
13 | // Reveal.next();
14 | reveal.postMessage(JSON.stringify({method: 'next', args: []}), '*');
15 | // Reveal.slide(2, 2);
16 | reveal.postMessage(JSON.stringify({method: 'slide', args: [2,2]}), '*');
17 |
18 | Add to the slideshow:
19 |
20 | dependencies: [
21 | ...
22 | { src: 'plugin/postmessage/postmessage.js', async: true, condition: function() { return !!document.body.classList; } }
23 | ]
24 |
25 | */
26 |
27 | (function (){
28 |
29 | window.addEventListener( "message", function ( event ) {
30 | var data = JSON.parse( event.data ),
31 | method = data.method,
32 | args = data.args;
33 |
34 | if( typeof Reveal[method] === 'function' ) {
35 | Reveal[method].apply( Reveal, data.args );
36 | }
37 | }, false);
38 |
39 | }());
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/slides/test/examples/embedded-media.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | reveal.js - Embedded Media
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | Embedded Media Test
23 |
24 |
25 |
28 |
29 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/css/theme/source/night.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Black theme for reveal.js.
3 | *
4 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
5 | */
6 |
7 |
8 | // Default mixins and settings -----------------
9 | @import "../template/mixins";
10 | @import "../template/settings";
11 | // ---------------------------------------------
12 |
13 |
14 | // Include theme-specific fonts
15 | @import url(https://fonts.googleapis.com/css?family=Montserrat:700);
16 | @import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic);
17 |
18 |
19 | // Override theme settings (see ../template/settings.scss)
20 | $backgroundColor: #111;
21 |
22 | $mainFont: 'Open Sans', sans-serif;
23 | $linkColor: #e7ad52;
24 | $linkColorHover: lighten( $linkColor, 20% );
25 | $headingFont: 'Montserrat', Impact, sans-serif;
26 | $headingTextShadow: none;
27 | $headingLetterSpacing: -0.03em;
28 | $headingTextTransform: none;
29 | $selectionBackgroundColor: #e7ad52;
30 | $mainFontSize: 30px;
31 |
32 |
33 | // Theme template ------------------------------
34 | @import "../template/theme";
35 | // ---------------------------------------------
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/css/theme/source/night.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Black theme for reveal.js.
3 | *
4 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
5 | */
6 |
7 |
8 | // Default mixins and settings -----------------
9 | @import "../template/mixins";
10 | @import "../template/settings";
11 | // ---------------------------------------------
12 |
13 |
14 | // Include theme-specific fonts
15 | @import url(https://fonts.googleapis.com/css?family=Montserrat:700);
16 | @import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic);
17 |
18 |
19 | // Override theme settings (see ../template/settings.scss)
20 | $backgroundColor: #111;
21 |
22 | $mainFont: 'Open Sans', sans-serif;
23 | $linkColor: #e7ad52;
24 | $linkColorHover: lighten( $linkColor, 20% );
25 | $headingFont: 'Montserrat', Impact, sans-serif;
26 | $headingTextShadow: none;
27 | $headingLetterSpacing: -0.03em;
28 | $headingTextTransform: none;
29 | $selectionBackgroundColor: #e7ad52;
30 | $mainFontSize: 30px;
31 |
32 |
33 | // Theme template ------------------------------
34 | @import "../template/theme";
35 | // ---------------------------------------------
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (C) 2013 Hakim El Hattab, http://hakim.se
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy
4 | of this software and associated documentation files (the "Software"), to deal
5 | in the Software without restriction, including without limitation the rights
6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 | copies of the Software, and to permit persons to whom the Software is
8 | furnished to do so, subject to the following conditions:
9 |
10 | The above copyright notice and this permission notice shall be included in
11 | all copies or substantial portions of the Software.
12 |
13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 | THE SOFTWARE.
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/plugin/postmessage/postmessage.js:
--------------------------------------------------------------------------------
1 | /*
2 |
3 | simple postmessage plugin
4 |
5 | Useful when a reveal slideshow is inside an iframe.
6 | It allows to call reveal methods from outside.
7 |
8 | Example:
9 | var reveal = window.frames[0];
10 |
11 | // Reveal.prev();
12 | reveal.postMessage(JSON.stringify({method: 'prev', args: []}), '*');
13 | // Reveal.next();
14 | reveal.postMessage(JSON.stringify({method: 'next', args: []}), '*');
15 | // Reveal.slide(2, 2);
16 | reveal.postMessage(JSON.stringify({method: 'slide', args: [2,2]}), '*');
17 |
18 | Add to the slideshow:
19 |
20 | dependencies: [
21 | ...
22 | { src: 'plugin/postmessage/postmessage.js', async: true, condition: function() { return !!document.body.classList; } }
23 | ]
24 |
25 | */
26 |
27 | (function (){
28 |
29 | window.addEventListener( "message", function ( event ) {
30 | var data = JSON.parse( event.data ),
31 | method = data.method,
32 | args = data.args;
33 |
34 | if( typeof Reveal[method] === 'function' ) {
35 | Reveal[method].apply( Reveal, data.args );
36 | }
37 | }, false);
38 |
39 | }());
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/plugin/postmessage/postmessage.js:
--------------------------------------------------------------------------------
1 | /*
2 |
3 | simple postmessage plugin
4 |
5 | Useful when a reveal slideshow is inside an iframe.
6 | It allows to call reveal methods from outside.
7 |
8 | Example:
9 | var reveal = window.frames[0];
10 |
11 | // Reveal.prev();
12 | reveal.postMessage(JSON.stringify({method: 'prev', args: []}), '*');
13 | // Reveal.next();
14 | reveal.postMessage(JSON.stringify({method: 'next', args: []}), '*');
15 | // Reveal.slide(2, 2);
16 | reveal.postMessage(JSON.stringify({method: 'slide', args: [2,2]}), '*');
17 |
18 | Add to the slideshow:
19 |
20 | dependencies: [
21 | ...
22 | { src: 'plugin/postmessage/postmessage.js', async: true, condition: function() { return !!document.body.classList; } }
23 | ]
24 |
25 | */
26 |
27 | (function (){
28 |
29 | window.addEventListener( "message", function ( event ) {
30 | var data = JSON.parse( event.data ),
31 | method = data.method,
32 | args = data.args;
33 |
34 | if( typeof Reveal[method] === 'function' ) {
35 | Reveal[method].apply( Reveal, data.args );
36 | }
37 | }, false);
38 |
39 | }());
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/test/examples/embedded-media.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | reveal.js - Embedded Media
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 | Embedded Media Test
23 |
24 |
25 |
28 |
29 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/slides/css/theme/source/serif.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * A simple theme for reveal.js presentations, similar
3 | * to the default theme. The accent color is brown.
4 | *
5 | * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed.
6 | */
7 |
8 |
9 | // Default mixins and settings -----------------
10 | @import "../template/mixins";
11 | @import "../template/settings";
12 | // ---------------------------------------------
13 |
14 |
15 |
16 | // Override theme settings (see ../template/settings.scss)
17 | $mainFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
18 | $mainColor: #000;
19 | $headingFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
20 | $headingColor: #383D3D;
21 | $headingTextShadow: none;
22 | $headingTextTransform: none;
23 | $backgroundColor: #F0F1EB;
24 | $linkColor: #51483D;
25 | $linkColorHover: lighten( $linkColor, 20% );
26 | $selectionBackgroundColor: #26351C;
27 |
28 | .reveal a:not(.image) {
29 | line-height: 1.3em;
30 | }
31 |
32 |
33 | // Theme template ------------------------------
34 | @import "../template/theme";
35 | // ---------------------------------------------
36 |
--------------------------------------------------------------------------------
/workshop/tests/zengular-tests-04-apply.js:
--------------------------------------------------------------------------------
1 | describe('the tests of the step 4 of the workshop', function() {
2 |
3 | beforeEach(function() {
4 |
5 | scope = new Scope();
6 |
7 | listenerFn = function () {};
8 |
9 | spyOn(window, 'listenerFn');
10 |
11 | scope.$watch(function (scope) {
12 | return scope.value;
13 | }, listenerFn);
14 |
15 | });
16 |
17 | it('sould add a function $apply in the Scope', function() {
18 |
19 | expect(_.isFunction(scope.$apply)).toBe(true);
20 |
21 | });
22 |
23 | it('should launch the listener when calling $apply and changing something', function() {
24 |
25 | scope.$apply(function() {
26 | scope.value = 'first value';
27 | });
28 |
29 | expect(listenerFn.calls.count()).toBe(1);
30 |
31 | });
32 |
33 | it('should launch the listener when calling $apply even with an exception', function() {
34 |
35 | try {
36 | scope.$apply(function() {
37 | scope.value = 'second value';
38 | throw 'test error';
39 | });
40 | } catch (error) {
41 | //nothing
42 | }
43 |
44 | expect(listenerFn.calls.count()).toBe(1);
45 |
46 | });
47 |
48 | });
49 |
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/css/theme/source/serif.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * A simple theme for reveal.js presentations, similar
3 | * to the default theme. The accent color is brown.
4 | *
5 | * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed.
6 | */
7 |
8 |
9 | // Default mixins and settings -----------------
10 | @import "../template/mixins";
11 | @import "../template/settings";
12 | // ---------------------------------------------
13 |
14 |
15 |
16 | // Override theme settings (see ../template/settings.scss)
17 | $mainFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
18 | $mainColor: #000;
19 | $headingFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
20 | $headingColor: #383D3D;
21 | $headingTextShadow: none;
22 | $headingTextTransform: none;
23 | $backgroundColor: #F0F1EB;
24 | $linkColor: #51483D;
25 | $linkColorHover: lighten( $linkColor, 20% );
26 | $selectionBackgroundColor: #26351C;
27 |
28 | .reveal a:not(.image) {
29 | line-height: 1.3em;
30 | }
31 |
32 |
33 | // Theme template ------------------------------
34 | @import "../template/theme";
35 | // ---------------------------------------------
36 |
--------------------------------------------------------------------------------
/slides/plugin/postmessage/example.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/css/theme/source/serif.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * A simple theme for reveal.js presentations, similar
3 | * to the default theme. The accent color is brown.
4 | *
5 | * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed.
6 | */
7 |
8 |
9 | // Default mixins and settings -----------------
10 | @import "../template/mixins";
11 | @import "../template/settings";
12 | // ---------------------------------------------
13 |
14 |
15 |
16 | // Override theme settings (see ../template/settings.scss)
17 | $mainFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
18 | $mainColor: #000;
19 | $headingFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
20 | $headingColor: #383D3D;
21 | $headingTextShadow: none;
22 | $headingTextTransform: none;
23 | $backgroundColor: #F0F1EB;
24 | $linkColor: #51483D;
25 | $linkColorHover: lighten( $linkColor, 20% );
26 | $selectionBackgroundColor: #26351C;
27 |
28 | .reveal a:not(.image) {
29 | line-height: 1.3em;
30 | }
31 |
32 |
33 | // Theme template ------------------------------
34 | @import "../template/theme";
35 | // ---------------------------------------------
36 |
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/plugin/postmessage/example.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/plugin/postmessage/example.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
37 |
38 |
39 |
40 |
--------------------------------------------------------------------------------
/workshop/tests/zengular-tests-10-bind.js:
--------------------------------------------------------------------------------
1 | describe('the tests of the step 10 of the workshop', function() {
2 |
3 | beforeEach(function() {
4 |
5 | scope = new Scope();
6 |
7 | var elementWithNgBind = document.getElementById('elementWithNgBind');
8 |
9 | elementWithNgBind.innerHTML = 'Test p block';
10 |
11 | });
12 |
13 | it('sould add a directive called ng-bind', function() {
14 |
15 | var directiveNgBind = $directive('ng-bind');
16 |
17 | expect(_.isFunction(directiveNgBind)).toBe(true);
18 |
19 | });
20 |
21 | it('sould replace the content of the element with the data bound', function() {
22 |
23 | var elementRoot = document.getElementById('domStep10');
24 | var elementWithNgBind = document.getElementById('elementWithNgBind');
25 |
26 | //'Test p block' is the initial value in SpecRunner.html
27 | expect(elementWithNgBind.innerHTML).toBe('Test p block');
28 |
29 | $compile(elementRoot, scope);
30 |
31 | scope.$apply(function() {
32 | //'test.bind' is the data bound in SpecRunner.html
33 | scope.test = {
34 | bind: 'first value'
35 | };
36 | });
37 |
38 | expect(elementWithNgBind.innerHTML).toBe(scope.test.bind);
39 |
40 | });
41 |
42 | });
43 |
--------------------------------------------------------------------------------
/workshop/tests/zengular-tests-09-compile.js:
--------------------------------------------------------------------------------
1 | describe('the tests of the step 9 of the workshop', function() {
2 |
3 | beforeEach(function() {
4 |
5 | scope = new Scope();
6 |
7 | });
8 |
9 | it('sould add a function $compile', function() {
10 |
11 | expect(_.isFunction($compile)).toBe(true);
12 |
13 | });
14 |
15 | it('sould $compile recurse on all nodes', function() {
16 |
17 | spyOn(window, '$compile').and.callThrough();
18 |
19 | var element = document.getElementById('domStep09');
20 |
21 | $compile(element, scope);
22 |
23 | expect($compile.calls.count()).toBe(2);
24 |
25 | });
26 |
27 | it('sould $compile recurse on all nodes and launch directives function with the good parameters', function() {
28 |
29 | var elementRoot = document.getElementById('domStep09');
30 | var elementDirective = document.getElementById('elementWithDirective');
31 |
32 | myDirectiveTest = function() {};
33 |
34 | spyOn(window, 'myDirectiveTest');
35 |
36 | $directive('my-directive-test', myDirectiveTest);
37 |
38 | $compile(elementRoot, scope);
39 |
40 | expect(window.myDirectiveTest).toHaveBeenCalledWith(scope, elementDirective, elementDirective.attributes);
41 |
42 | });
43 |
44 | });
45 |
--------------------------------------------------------------------------------
/workshop/tests/zengular-tests-06-dirty.js:
--------------------------------------------------------------------------------
1 | describe('the tests of the step 6 of the workshop', function() {
2 |
3 | beforeEach(function() {
4 |
5 | scope = new Scope();
6 |
7 | });
8 |
9 | it('should not watch a deep change if not watched by value', function() {
10 |
11 | listenerFn = function () {};
12 |
13 | spyOn(window, 'listenerFn');
14 |
15 | scope.$watch(function (scope) {
16 | return scope.value;
17 | }, listenerFn);
18 |
19 | scope.$apply(function() {
20 | scope.value = ['first value'];
21 | });
22 |
23 | scope.$apply(function() {
24 | scope.value.push('second value');
25 | });
26 |
27 | expect(listenerFn.calls.count()).toBe(1);
28 |
29 | });
30 |
31 | it('should watch a deep change if watched by value', function() {
32 |
33 | listenerFn = function () {};
34 |
35 | spyOn(window, 'listenerFn');
36 |
37 | scope.$watch(function (scope) {
38 | return scope.value;
39 | }, listenerFn, true);
40 |
41 | scope.$apply(function() {
42 | scope.value = ['first value'];
43 | });
44 |
45 | scope.$apply(function() {
46 | scope.value.push('second value');
47 | });
48 |
49 | expect(listenerFn.calls.count()).toBe(2);
50 |
51 | });
52 |
53 | });
54 |
--------------------------------------------------------------------------------
/slides/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "reveal.js",
3 | "version": "2.6.1",
4 | "description": "The HTML Presentation Framework",
5 | "homepage": "http://lab.hakim.se/reveal-js",
6 | "subdomain": "revealjs",
7 | "scripts": {
8 | "test": "grunt test",
9 | "start": ""
10 | },
11 | "author": {
12 | "name": "Hakim El Hattab",
13 | "email": "hakim.elhattab@gmail.com",
14 | "web": "http://hakim.se"
15 | },
16 | "repository": {
17 | "type": "git",
18 | "url": "git://github.com/hakimel/reveal.js.git"
19 | },
20 | "engines": {
21 | "node": "~0.8.0"
22 | },
23 | "dependencies": {
24 | "underscore": "~1.5.1",
25 | "express": "~2.5.9",
26 | "mustache": "~0.7.2",
27 | "socket.io": "~0.9.13"
28 | },
29 | "devDependencies": {
30 | "grunt-contrib-qunit": "~0.2.2",
31 | "grunt-contrib-jshint": "~0.6.4",
32 | "grunt-contrib-cssmin": "~0.4.1",
33 | "grunt-contrib-uglify": "~0.2.4",
34 | "grunt-contrib-watch": "~0.5.3",
35 | "grunt-contrib-sass": "~0.5.0",
36 | "grunt-contrib-connect": "~0.4.1",
37 | "grunt-zip": "~0.7.0",
38 | "grunt": "~0.4.0"
39 | },
40 | "licenses": [
41 | {
42 | "type": "MIT",
43 | "url": "https://github.com/hakimel/reveal.js/blob/master/LICENSE"
44 | }
45 | ]
46 | }
47 |
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "reveal.js",
3 | "version": "2.6.1",
4 | "description": "The HTML Presentation Framework",
5 | "homepage": "http://lab.hakim.se/reveal-js",
6 | "subdomain": "revealjs",
7 | "scripts": {
8 | "test": "grunt test",
9 | "start": ""
10 | },
11 | "author": {
12 | "name": "Hakim El Hattab",
13 | "email": "hakim.elhattab@gmail.com",
14 | "web": "http://hakim.se"
15 | },
16 | "repository": {
17 | "type": "git",
18 | "url": "git://github.com/hakimel/reveal.js.git"
19 | },
20 | "engines": {
21 | "node": "~0.8.0"
22 | },
23 | "dependencies": {
24 | "underscore": "~1.5.1",
25 | "express": "~2.5.9",
26 | "mustache": "~0.7.2",
27 | "socket.io": "~0.9.13"
28 | },
29 | "devDependencies": {
30 | "grunt-contrib-qunit": "~0.2.2",
31 | "grunt-contrib-jshint": "~0.6.4",
32 | "grunt-contrib-cssmin": "~0.4.1",
33 | "grunt-contrib-uglify": "~0.2.4",
34 | "grunt-contrib-watch": "~0.5.3",
35 | "grunt-contrib-sass": "~0.5.0",
36 | "grunt-contrib-connect": "~0.4.1",
37 | "grunt-zip": "~0.7.0",
38 | "grunt": "~0.4.0"
39 | },
40 | "licenses": [
41 | {
42 | "type": "MIT",
43 | "url": "https://github.com/hakimel/reveal.js/blob/master/LICENSE"
44 | }
45 | ]
46 | }
47 |
--------------------------------------------------------------------------------
/slides/css/theme/source/simple.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * A simple theme for reveal.js presentations, similar
3 | * to the default theme. The accent color is darkblue.
4 | *
5 | * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed.
6 | * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
7 | */
8 |
9 |
10 | // Default mixins and settings -----------------
11 | @import "../template/mixins";
12 | @import "../template/settings";
13 | // ---------------------------------------------
14 |
15 |
16 |
17 | // Include theme-specific fonts
18 | @import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700);
19 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
20 |
21 |
22 | // Override theme settings (see ../template/settings.scss)
23 | $mainFont: 'Lato', sans-serif;
24 | $mainColor: #000;
25 | $headingFont: 'News Cycle', Impact, sans-serif;
26 | $headingColor: #000;
27 | $headingTextShadow: none;
28 | $headingTextTransform: none;
29 | $backgroundColor: #fff;
30 | $linkColor: #00008B;
31 | $linkColorHover: lighten( $linkColor, 20% );
32 | $selectionBackgroundColor: rgba(0, 0, 0, 0.99);
33 |
34 |
35 |
36 | // Theme template ------------------------------
37 | @import "../template/theme";
38 | // ---------------------------------------------
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/css/theme/source/simple.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * A simple theme for reveal.js presentations, similar
3 | * to the default theme. The accent color is darkblue.
4 | *
5 | * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed.
6 | * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
7 | */
8 |
9 |
10 | // Default mixins and settings -----------------
11 | @import "../template/mixins";
12 | @import "../template/settings";
13 | // ---------------------------------------------
14 |
15 |
16 |
17 | // Include theme-specific fonts
18 | @import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700);
19 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
20 |
21 |
22 | // Override theme settings (see ../template/settings.scss)
23 | $mainFont: 'Lato', sans-serif;
24 | $mainColor: #000;
25 | $headingFont: 'News Cycle', Impact, sans-serif;
26 | $headingColor: #000;
27 | $headingTextShadow: none;
28 | $headingTextTransform: none;
29 | $backgroundColor: #fff;
30 | $linkColor: #00008B;
31 | $linkColorHover: lighten( $linkColor, 20% );
32 | $selectionBackgroundColor: rgba(0, 0, 0, 0.99);
33 |
34 |
35 |
36 | // Theme template ------------------------------
37 | @import "../template/theme";
38 | // ---------------------------------------------
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/css/theme/source/simple.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * A simple theme for reveal.js presentations, similar
3 | * to the default theme. The accent color is darkblue.
4 | *
5 | * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed.
6 | * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
7 | */
8 |
9 |
10 | // Default mixins and settings -----------------
11 | @import "../template/mixins";
12 | @import "../template/settings";
13 | // ---------------------------------------------
14 |
15 |
16 |
17 | // Include theme-specific fonts
18 | @import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700);
19 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
20 |
21 |
22 | // Override theme settings (see ../template/settings.scss)
23 | $mainFont: 'Lato', sans-serif;
24 | $mainColor: #000;
25 | $headingFont: 'News Cycle', Impact, sans-serif;
26 | $headingColor: #000;
27 | $headingTextShadow: none;
28 | $headingTextTransform: none;
29 | $backgroundColor: #fff;
30 | $linkColor: #00008B;
31 | $linkColorHover: lighten( $linkColor, 20% );
32 | $selectionBackgroundColor: rgba(0, 0, 0, 0.99);
33 |
34 |
35 |
36 | // Theme template ------------------------------
37 | @import "../template/theme";
38 | // ---------------------------------------------
--------------------------------------------------------------------------------
/slides/css/theme/source/sky.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Sky theme for reveal.js.
3 | *
4 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
5 | */
6 |
7 |
8 | // Default mixins and settings -----------------
9 | @import "../template/mixins";
10 | @import "../template/settings";
11 | // ---------------------------------------------
12 |
13 |
14 |
15 | // Include theme-specific fonts
16 | @import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic);
17 | @import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700);
18 |
19 |
20 | // Override theme settings (see ../template/settings.scss)
21 | $mainFont: 'Open Sans', sans-serif;
22 | $mainColor: #333;
23 | $headingFont: 'Quicksand', sans-serif;
24 | $headingColor: #333;
25 | $headingLetterSpacing: -0.08em;
26 | $headingTextShadow: none;
27 | $backgroundColor: #f7fbfc;
28 | $linkColor: #3b759e;
29 | $linkColorHover: lighten( $linkColor, 20% );
30 | $selectionBackgroundColor: #134674;
31 |
32 | // Fix links so they are not cut off
33 | .reveal a:not(.image) {
34 | line-height: 1.3em;
35 | }
36 |
37 | // Background generator
38 | @mixin bodyBackground() {
39 | @include radial-gradient( #add9e4, #f7fbfc );
40 | }
41 |
42 |
43 |
44 | // Theme template ------------------------------
45 | @import "../template/theme";
46 | // ---------------------------------------------
47 |
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/css/theme/source/sky.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Sky theme for reveal.js.
3 | *
4 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
5 | */
6 |
7 |
8 | // Default mixins and settings -----------------
9 | @import "../template/mixins";
10 | @import "../template/settings";
11 | // ---------------------------------------------
12 |
13 |
14 |
15 | // Include theme-specific fonts
16 | @import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic);
17 | @import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700);
18 |
19 |
20 | // Override theme settings (see ../template/settings.scss)
21 | $mainFont: 'Open Sans', sans-serif;
22 | $mainColor: #333;
23 | $headingFont: 'Quicksand', sans-serif;
24 | $headingColor: #333;
25 | $headingLetterSpacing: -0.08em;
26 | $headingTextShadow: none;
27 | $backgroundColor: #f7fbfc;
28 | $linkColor: #3b759e;
29 | $linkColorHover: lighten( $linkColor, 20% );
30 | $selectionBackgroundColor: #134674;
31 |
32 | // Fix links so they are not cut off
33 | .reveal a:not(.image) {
34 | line-height: 1.3em;
35 | }
36 |
37 | // Background generator
38 | @mixin bodyBackground() {
39 | @include radial-gradient( #add9e4, #f7fbfc );
40 | }
41 |
42 |
43 |
44 | // Theme template ------------------------------
45 | @import "../template/theme";
46 | // ---------------------------------------------
47 |
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/css/theme/source/sky.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Sky theme for reveal.js.
3 | *
4 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
5 | */
6 |
7 |
8 | // Default mixins and settings -----------------
9 | @import "../template/mixins";
10 | @import "../template/settings";
11 | // ---------------------------------------------
12 |
13 |
14 |
15 | // Include theme-specific fonts
16 | @import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic);
17 | @import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700);
18 |
19 |
20 | // Override theme settings (see ../template/settings.scss)
21 | $mainFont: 'Open Sans', sans-serif;
22 | $mainColor: #333;
23 | $headingFont: 'Quicksand', sans-serif;
24 | $headingColor: #333;
25 | $headingLetterSpacing: -0.08em;
26 | $headingTextShadow: none;
27 | $backgroundColor: #f7fbfc;
28 | $linkColor: #3b759e;
29 | $linkColorHover: lighten( $linkColor, 20% );
30 | $selectionBackgroundColor: #134674;
31 |
32 | // Fix links so they are not cut off
33 | .reveal a:not(.image) {
34 | line-height: 1.3em;
35 | }
36 |
37 | // Background generator
38 | @mixin bodyBackground() {
39 | @include radial-gradient( #add9e4, #f7fbfc );
40 | }
41 |
42 |
43 |
44 | // Theme template ------------------------------
45 | @import "../template/theme";
46 | // ---------------------------------------------
47 |
--------------------------------------------------------------------------------
/slides/test/test-markdown.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | reveal.js - Test Markdown
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/test/test-markdown.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | reveal.js - Test Markdown
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/workshop/tests/zengular-tests-11-model.js:
--------------------------------------------------------------------------------
1 | describe('the tests of the step 11 of the workshop', function() {
2 |
3 | beforeEach(function() {
4 |
5 | scope = new Scope();
6 |
7 | var elementNgModel = document.getElementById('elementWithNgModel');
8 |
9 | elementNgModel.value = '';
10 |
11 | });
12 |
13 | it('sould add a directive called ng-model', function() {
14 |
15 | var directiveNgModel = $directive('ng-model');
16 |
17 | expect(_.isFunction(directiveNgModel)).toBe(true);
18 |
19 | });
20 |
21 | it('sould replace value by the scope value and replace the scope value on keyup events', function() {
22 |
23 | var elementRoot = document.getElementById('domStep11');
24 | var elementWithNgModel = document.getElementById('elementWithNgModel');
25 |
26 | //'Test p block' is the initial value in SpecRunner.html
27 | expect(elementWithNgModel.value).toBe('');
28 |
29 | $compile(elementRoot, scope);
30 |
31 | scope.$apply(function() {
32 | //'test.bind' is the data bound in SpecRunner.html
33 | scope.test = {
34 | bind: 'first value'
35 | };
36 | });
37 |
38 | expect(elementWithNgModel.value).toBe(scope.test.bind);
39 |
40 | elementWithNgModel.value = 'second value';
41 |
42 | var event = new CustomEvent("keyup");
43 | elementWithNgModel.dispatchEvent(event);
44 |
45 | expect(scope.test.bind).toBe(elementWithNgModel.value);
46 |
47 | });
48 |
49 | });
50 |
--------------------------------------------------------------------------------
/workshop/tests/zengular-tests-12-click.js:
--------------------------------------------------------------------------------
1 | describe('the tests of the step 12 of the workshop', function() {
2 |
3 | beforeEach(function() {
4 |
5 | scope = new Scope();
6 |
7 | });
8 |
9 | it('sould add a directive called ng-click', function() {
10 |
11 | var directiveNgClick = $directive('ng-click');
12 |
13 | expect(_.isFunction(directiveNgClick)).toBe(true);
14 |
15 | });
16 |
17 | it('sould execute the contentof ng-click when a click is performed', function() {
18 |
19 | var elementRoot = document.getElementById('domStep12');
20 | var elementWithNgClick = document.getElementById('elementWithNgClick');
21 |
22 | scope.test = {
23 | click: function() {
24 | scope.test.value += '.';
25 | }
26 | }
27 |
28 | scope.$apply(function() {
29 | scope.test.value = 'first value';
30 | });
31 |
32 | listenerFn = function() {}
33 |
34 | spyOn(scope.test, 'click').and.callThrough();
35 | spyOn(window, 'listenerFn');
36 |
37 | scope.$watch(function(scope) {
38 | return scope.test.value;
39 | }, listenerFn);
40 |
41 | $compile(elementRoot, scope);
42 |
43 | expect(scope.test.click.calls.count()).toBe(0);
44 | expect(listenerFn.calls.count()).toBe(0);
45 |
46 | var event = new CustomEvent("click");
47 | elementWithNgClick.dispatchEvent(event);
48 |
49 | expect(scope.test.click.calls.count()).toBe(1);
50 | expect(listenerFn.calls.count()).toBe(1);
51 |
52 | });
53 |
54 | });
55 |
--------------------------------------------------------------------------------
/workshop/solutions/zengular-07-phase.js:
--------------------------------------------------------------------------------
1 | function Scope() {
2 | this.$$watchers = [];
3 | this.$$phase = null;
4 | }
5 |
6 | Scope.prototype.$$beginPhase = function(phase) {
7 | if (this.$$phase) {
8 | throw this.$$phase + " est déjà en cours...";
9 | }
10 | this.$$phase = phase;
11 | };
12 |
13 | Scope.prototype.$$clearPhase = function() {
14 | this.$$phase = null;
15 | };
16 |
17 | Scope.prototype.$watch = function (watcherFn, listenerFn, byValue) {
18 | var watch = {
19 | watcherFn: watcherFn,
20 | listenerFn: listenerFn,
21 | byValue: byValue
22 | };
23 | this.$$watchers.push(watch);
24 | };
25 |
26 | Scope.prototype.$digest = function () {
27 | var dirty;
28 | var ttl = 10;
29 | this.$$beginPhase('$digest');
30 | do {
31 | dirty = false;
32 | _.each(this.$$watchers, function (watcher) {
33 | var newValue = watcher.watcherFn(this);
34 | if (watcher.byValue ? !_.isEqual(watcher.last, newValue) : watcher.last !== newValue) {
35 | dirty = true;
36 | watcher.listenerFn(newValue, watcher.last, this);
37 | watcher.last = watcher.byValue ? _.clone(newValue) : newValue;
38 | }
39 | }.bind(this));
40 | if (dirty && !(ttl--)) {
41 | this.$$clearPhase();
42 | throw "$digest est partie en boucle !"
43 | }
44 | } while (dirty)
45 | this.$$clearPhase();
46 | };
47 |
48 | Scope.prototype.$apply = function (exprFn) {
49 | try {
50 | exprFn();
51 | } finally {
52 | this.$digest();
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/slides/lib/js/classList.js:
--------------------------------------------------------------------------------
1 | /*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/
2 | if(typeof document!=="undefined"&&!("classList" in document.createElement("a"))){(function(j){var a="classList",f="prototype",m=(j.HTMLElement||j.Element)[f],b=Object,k=String[f].trim||function(){return this.replace(/^\s+|\s+$/g,"")},c=Array[f].indexOf||function(q){var p=0,o=this.length;for(;p
2 |
3 |
4 |
5 |
6 |
7 | reveal.js - Tests
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
25 |
26 |
37 |
38 |
39 |
40 | 3.1
41 |
42 | - 4.1
43 | - 4.2
44 | - 4.3
45 |
46 |
47 |
48 |
55 |
56 |
57 | 3.3
58 |
59 | - 3.3.1
60 | - 3.3.2
61 | - 3.3.3
62 |
63 |
64 |
65 |
66 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/plugin/math/math.js:
--------------------------------------------------------------------------------
1 | /**
2 | * A plugin which enables rendering of math equations inside
3 | * of reveal.js slides. Essentially a thin wrapper for MathJax.
4 | *
5 | * @author Hakim El Hattab
6 | */
7 | var RevealMath = window.RevealMath || (function(){
8 |
9 | var options = Reveal.getConfig().math || {};
10 | options.mathjax = options.mathjax || 'http://cdn.mathjax.org/mathjax/latest/MathJax.js';
11 | options.config = options.config || 'TeX-AMS_HTML-full';
12 |
13 | loadScript( options.mathjax + '?config=' + options.config, function() {
14 |
15 | MathJax.Hub.Config({
16 | messageStyle: 'none',
17 | tex2jax: { inlineMath: [['$','$'],['\\(','\\)']] },
18 | skipStartupTypeset: true
19 | });
20 |
21 | // Typeset followed by an immediate reveal.js layout since
22 | // the typesetting process could affect slide height
23 | MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub ] );
24 | MathJax.Hub.Queue( Reveal.layout );
25 |
26 | // Reprocess equations in slides when they turn visible
27 | Reveal.addEventListener( 'slidechanged', function( event ) {
28 |
29 | MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub, event.currentSlide ] );
30 |
31 | } );
32 |
33 | } );
34 |
35 | function loadScript( url, callback ) {
36 |
37 | var head = document.querySelector( 'head' );
38 | var script = document.createElement( 'script' );
39 | script.type = 'text/javascript';
40 | script.src = url;
41 |
42 | // Wrapper for callback to make sure it only fires once
43 | var finish = function() {
44 | if( typeof callback === 'function' ) {
45 | callback.call();
46 | callback = null;
47 | }
48 | }
49 |
50 | script.onload = finish;
51 |
52 | // IE
53 | script.onreadystatechange = function() {
54 | if ( this.readyState === 'loaded' ) {
55 | finish();
56 | }
57 | }
58 |
59 | // Normal browsers
60 | head.appendChild( script );
61 |
62 | }
63 |
64 | })();
65 |
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/plugin/notes-server/client.js:
--------------------------------------------------------------------------------
1 | (function() {
2 | // don't emit events from inside the previews themselves
3 | if ( window.location.search.match( /receiver/gi ) ) { return; }
4 |
5 | var socket = io.connect(window.location.origin);
6 | var socketId = Math.random().toString().slice(2);
7 |
8 | console.log('View slide notes at ' + window.location.origin + '/notes/' + socketId);
9 | window.open(window.location.origin + '/notes/' + socketId, 'notes-' + socketId);
10 |
11 | // Fires when a fragment is shown
12 | Reveal.addEventListener( 'fragmentshown', function( event ) {
13 | var fragmentData = {
14 | fragment : 'next',
15 | socketId : socketId
16 | };
17 | socket.emit('fragmentchanged', fragmentData);
18 | } );
19 |
20 | // Fires when a fragment is hidden
21 | Reveal.addEventListener( 'fragmenthidden', function( event ) {
22 | var fragmentData = {
23 | fragment : 'previous',
24 | socketId : socketId
25 | };
26 | socket.emit('fragmentchanged', fragmentData);
27 | } );
28 |
29 | // Fires when slide is changed
30 | Reveal.addEventListener( 'slidechanged', function( event ) {
31 | var nextindexh;
32 | var nextindexv;
33 | var slideElement = event.currentSlide;
34 |
35 | if (slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION') {
36 | nextindexh = event.indexh;
37 | nextindexv = event.indexv + 1;
38 | } else {
39 | nextindexh = event.indexh + 1;
40 | nextindexv = 0;
41 | }
42 |
43 | var notes = slideElement.querySelector('aside.notes');
44 | var slideData = {
45 | notes : notes ? notes.innerHTML : '',
46 | indexh : event.indexh,
47 | indexv : event.indexv,
48 | nextindexh : nextindexh,
49 | nextindexv : nextindexv,
50 | socketId : socketId,
51 | markdown : notes ? typeof notes.getAttribute('data-markdown') === 'string' : false
52 |
53 | };
54 |
55 | socket.emit('slidechanged', slideData);
56 | } );
57 | }());
58 |
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/plugin/notes-server/client.js:
--------------------------------------------------------------------------------
1 | (function() {
2 | // don't emit events from inside the previews themselves
3 | if ( window.location.search.match( /receiver/gi ) ) { return; }
4 |
5 | var socket = io.connect(window.location.origin);
6 | var socketId = Math.random().toString().slice(2);
7 |
8 | console.log('View slide notes at ' + window.location.origin + '/notes/' + socketId);
9 | window.open(window.location.origin + '/notes/' + socketId, 'notes-' + socketId);
10 |
11 | // Fires when a fragment is shown
12 | Reveal.addEventListener( 'fragmentshown', function( event ) {
13 | var fragmentData = {
14 | fragment : 'next',
15 | socketId : socketId
16 | };
17 | socket.emit('fragmentchanged', fragmentData);
18 | } );
19 |
20 | // Fires when a fragment is hidden
21 | Reveal.addEventListener( 'fragmenthidden', function( event ) {
22 | var fragmentData = {
23 | fragment : 'previous',
24 | socketId : socketId
25 | };
26 | socket.emit('fragmentchanged', fragmentData);
27 | } );
28 |
29 | // Fires when slide is changed
30 | Reveal.addEventListener( 'slidechanged', function( event ) {
31 | var nextindexh;
32 | var nextindexv;
33 | var slideElement = event.currentSlide;
34 |
35 | if (slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION') {
36 | nextindexh = event.indexh;
37 | nextindexv = event.indexv + 1;
38 | } else {
39 | nextindexh = event.indexh + 1;
40 | nextindexv = 0;
41 | }
42 |
43 | var notes = slideElement.querySelector('aside.notes');
44 | var slideData = {
45 | notes : notes ? notes.innerHTML : '',
46 | indexh : event.indexh,
47 | indexv : event.indexv,
48 | nextindexh : nextindexh,
49 | nextindexv : nextindexv,
50 | socketId : socketId,
51 | markdown : notes ? typeof notes.getAttribute('data-markdown') === 'string' : false
52 |
53 | };
54 |
55 | socket.emit('slidechanged', slideData);
56 | } );
57 | }());
58 |
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/test/test.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | reveal.js - Tests
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
25 |
26 |
37 |
38 |
39 |
40 | 3.1
41 |
42 | - 4.1
43 | - 4.2
44 | - 4.3
45 |
46 |
47 |
48 |
55 |
56 |
57 | 3.3
58 |
59 | - 3.3.1
60 | - 3.3.2
61 | - 3.3.3
62 |
63 |
64 |
65 |
66 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
--------------------------------------------------------------------------------
/slides/css/theme/source/moon.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Solarized Dark theme for reveal.js.
3 | * Author: Achim Staebler
4 | */
5 |
6 |
7 | // Default mixins and settings -----------------
8 | @import "../template/mixins";
9 | @import "../template/settings";
10 | // ---------------------------------------------
11 |
12 |
13 |
14 | // Include theme-specific fonts
15 | @font-face {
16 | font-family: 'League Gothic';
17 | src: url('../../lib/font/league_gothic-webfont.eot');
18 | src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'),
19 | url('../../lib/font/league_gothic-webfont.woff') format('woff'),
20 | url('../../lib/font/league_gothic-webfont.ttf') format('truetype'),
21 | url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg');
22 |
23 | font-weight: normal;
24 | font-style: normal;
25 | }
26 |
27 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
28 |
29 | /**
30 | * Solarized colors by Ethan Schoonover
31 | */
32 | html * {
33 | color-profile: sRGB;
34 | rendering-intent: auto;
35 | }
36 |
37 | // Solarized colors
38 | $base03: #002b36;
39 | $base02: #073642;
40 | $base01: #586e75;
41 | $base00: #657b83;
42 | $base0: #839496;
43 | $base1: #93a1a1;
44 | $base2: #eee8d5;
45 | $base3: #fdf6e3;
46 | $yellow: #b58900;
47 | $orange: #cb4b16;
48 | $red: #dc322f;
49 | $magenta: #d33682;
50 | $violet: #6c71c4;
51 | $blue: #268bd2;
52 | $cyan: #2aa198;
53 | $green: #859900;
54 |
55 | // Override theme settings (see ../template/settings.scss)
56 | $mainColor: $base1;
57 | $headingColor: $base2;
58 | $headingTextShadow: none;
59 | $backgroundColor: $base03;
60 | $linkColor: $blue;
61 | $linkColorHover: lighten( $linkColor, 20% );
62 | $selectionBackgroundColor: $magenta;
63 |
64 |
65 |
66 | // Theme template ------------------------------
67 | @import "../template/theme";
68 | // ---------------------------------------------
69 |
--------------------------------------------------------------------------------
/workshop/tests/zengular-tests-05-loop.js:
--------------------------------------------------------------------------------
1 | describe('the tests of the step 5 of the workshop', function() {
2 |
3 | beforeEach(function() {
4 |
5 | scope = new Scope();
6 |
7 | });
8 |
9 | it('should launch the loop on digest and detect listener which trigger new changes', function() {
10 |
11 | firstListenerFn = function() {
12 | scope.secondValue = 'new value';
13 | }
14 |
15 | secondListenerFn = function() {}
16 |
17 | spyOn(window, 'firstListenerFn').and.callThrough();
18 | spyOn(window, 'secondListenerFn');
19 |
20 | scope.$watch(function(scope) {
21 | return scope.value;
22 | }, firstListenerFn);
23 |
24 | scope.$watch(function(scope) {
25 | return scope.secondValue;
26 | }, secondListenerFn);
27 |
28 | scope.$apply(function() {
29 | scope.value = 'first value';
30 | });
31 |
32 | expect(firstListenerFn.calls.count()).toBe(1);
33 | expect(secondListenerFn.calls.count()).toBe(1);
34 |
35 | });
36 |
37 | it('should prevent the digest loop to infinitly loop (maxed at 25)', function() {
38 |
39 | firstListenerFn = function() {
40 | scope.secondValue += '2';
41 | }
42 |
43 | secondListenerFn = function() {
44 | scope.value += '1';
45 | if(secondListenerFn.calls.count() >= 25) {
46 | throw 'listener calls to many times (' + secondListenerFn.calls.count() + ')';
47 | }
48 | }
49 |
50 | spyOn(window, 'firstListenerFn').and.callThrough();
51 | spyOn(window, 'secondListenerFn').and.callThrough();
52 |
53 | scope.$watch(function(scope) {
54 | return scope.value;
55 | }, firstListenerFn);
56 |
57 | scope.$watch(function(scope) {
58 | return scope.secondValue;
59 | }, secondListenerFn);
60 |
61 | try {
62 | scope.$apply(function() {
63 | scope.value = 'first value';
64 | });
65 | } catch (error) {}
66 |
67 | expect(secondListenerFn.calls.count()).not.toBe(25);
68 |
69 | });
70 |
71 | });
72 |
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/css/theme/source/moon.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Solarized Dark theme for reveal.js.
3 | * Author: Achim Staebler
4 | */
5 |
6 |
7 | // Default mixins and settings -----------------
8 | @import "../template/mixins";
9 | @import "../template/settings";
10 | // ---------------------------------------------
11 |
12 |
13 |
14 | // Include theme-specific fonts
15 | @font-face {
16 | font-family: 'League Gothic';
17 | src: url('../../lib/font/league_gothic-webfont.eot');
18 | src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'),
19 | url('../../lib/font/league_gothic-webfont.woff') format('woff'),
20 | url('../../lib/font/league_gothic-webfont.ttf') format('truetype'),
21 | url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg');
22 |
23 | font-weight: normal;
24 | font-style: normal;
25 | }
26 |
27 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
28 |
29 | /**
30 | * Solarized colors by Ethan Schoonover
31 | */
32 | html * {
33 | color-profile: sRGB;
34 | rendering-intent: auto;
35 | }
36 |
37 | // Solarized colors
38 | $base03: #002b36;
39 | $base02: #073642;
40 | $base01: #586e75;
41 | $base00: #657b83;
42 | $base0: #839496;
43 | $base1: #93a1a1;
44 | $base2: #eee8d5;
45 | $base3: #fdf6e3;
46 | $yellow: #b58900;
47 | $orange: #cb4b16;
48 | $red: #dc322f;
49 | $magenta: #d33682;
50 | $violet: #6c71c4;
51 | $blue: #268bd2;
52 | $cyan: #2aa198;
53 | $green: #859900;
54 |
55 | // Override theme settings (see ../template/settings.scss)
56 | $mainColor: $base1;
57 | $headingColor: $base2;
58 | $headingTextShadow: none;
59 | $backgroundColor: $base03;
60 | $linkColor: $blue;
61 | $linkColorHover: lighten( $linkColor, 20% );
62 | $selectionBackgroundColor: $magenta;
63 |
64 |
65 |
66 | // Theme template ------------------------------
67 | @import "../template/theme";
68 | // ---------------------------------------------
69 |
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/css/theme/source/moon.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Solarized Dark theme for reveal.js.
3 | * Author: Achim Staebler
4 | */
5 |
6 |
7 | // Default mixins and settings -----------------
8 | @import "../template/mixins";
9 | @import "../template/settings";
10 | // ---------------------------------------------
11 |
12 |
13 |
14 | // Include theme-specific fonts
15 | @font-face {
16 | font-family: 'League Gothic';
17 | src: url('../../lib/font/league_gothic-webfont.eot');
18 | src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'),
19 | url('../../lib/font/league_gothic-webfont.woff') format('woff'),
20 | url('../../lib/font/league_gothic-webfont.ttf') format('truetype'),
21 | url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg');
22 |
23 | font-weight: normal;
24 | font-style: normal;
25 | }
26 |
27 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
28 |
29 | /**
30 | * Solarized colors by Ethan Schoonover
31 | */
32 | html * {
33 | color-profile: sRGB;
34 | rendering-intent: auto;
35 | }
36 |
37 | // Solarized colors
38 | $base03: #002b36;
39 | $base02: #073642;
40 | $base01: #586e75;
41 | $base00: #657b83;
42 | $base0: #839496;
43 | $base1: #93a1a1;
44 | $base2: #eee8d5;
45 | $base3: #fdf6e3;
46 | $yellow: #b58900;
47 | $orange: #cb4b16;
48 | $red: #dc322f;
49 | $magenta: #d33682;
50 | $violet: #6c71c4;
51 | $blue: #268bd2;
52 | $cyan: #2aa198;
53 | $green: #859900;
54 |
55 | // Override theme settings (see ../template/settings.scss)
56 | $mainColor: $base1;
57 | $headingColor: $base2;
58 | $headingTextShadow: none;
59 | $backgroundColor: $base03;
60 | $linkColor: $blue;
61 | $linkColorHover: lighten( $linkColor, 20% );
62 | $selectionBackgroundColor: $magenta;
63 |
64 |
65 |
66 | // Theme template ------------------------------
67 | @import "../template/theme";
68 | // ---------------------------------------------
69 |
--------------------------------------------------------------------------------
/slides/plugin/notes-server/index.js:
--------------------------------------------------------------------------------
1 | var express = require('express');
2 | var fs = require('fs');
3 | var io = require('socket.io');
4 | var _ = require('underscore');
5 | var Mustache = require('mustache');
6 |
7 | var app = express.createServer();
8 | var staticDir = express.static;
9 |
10 | io = io.listen(app);
11 |
12 | var opts = {
13 | port : 1947,
14 | baseDir : __dirname + '/../../'
15 | };
16 |
17 | io.sockets.on('connection', function(socket) {
18 | socket.on('slidechanged', function(slideData) {
19 | socket.broadcast.emit('slidedata', slideData);
20 | });
21 | socket.on('fragmentchanged', function(fragmentData) {
22 | socket.broadcast.emit('fragmentdata', fragmentData);
23 | });
24 | });
25 |
26 | app.configure(function() {
27 | [ 'css', 'js', 'images', 'plugin', 'lib' ].forEach(function(dir) {
28 | app.use('/' + dir, staticDir(opts.baseDir + dir));
29 | });
30 | });
31 |
32 | app.get("/", function(req, res) {
33 | res.writeHead(200, {'Content-Type': 'text/html'});
34 | fs.createReadStream(opts.baseDir + '/index.html').pipe(res);
35 | });
36 |
37 | app.get("/notes/:socketId", function(req, res) {
38 |
39 | fs.readFile(opts.baseDir + 'plugin/notes-server/notes.html', function(err, data) {
40 | res.send(Mustache.to_html(data.toString(), {
41 | socketId : req.params.socketId
42 | }));
43 | });
44 | // fs.createReadStream(opts.baseDir + 'notes-server/notes.html').pipe(res);
45 | });
46 |
47 | // Actually listen
48 | app.listen(opts.port || null);
49 |
50 | var brown = '\033[33m',
51 | green = '\033[32m',
52 | reset = '\033[0m';
53 |
54 | var slidesLocation = "http://localhost" + ( opts.port ? ( ':' + opts.port ) : '' );
55 |
56 | console.log( brown + "reveal.js - Speaker Notes" + reset );
57 | console.log( "1. Open the slides at " + green + slidesLocation + reset );
58 | console.log( "2. Click on the link your JS console to go to the notes page" );
59 | console.log( "3. Advance through your slides and your notes will advance automatically" );
60 |
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/plugin/notes-server/index.js:
--------------------------------------------------------------------------------
1 | var express = require('express');
2 | var fs = require('fs');
3 | var io = require('socket.io');
4 | var _ = require('underscore');
5 | var Mustache = require('mustache');
6 |
7 | var app = express.createServer();
8 | var staticDir = express.static;
9 |
10 | io = io.listen(app);
11 |
12 | var opts = {
13 | port : 1947,
14 | baseDir : __dirname + '/../../'
15 | };
16 |
17 | io.sockets.on('connection', function(socket) {
18 | socket.on('slidechanged', function(slideData) {
19 | socket.broadcast.emit('slidedata', slideData);
20 | });
21 | socket.on('fragmentchanged', function(fragmentData) {
22 | socket.broadcast.emit('fragmentdata', fragmentData);
23 | });
24 | });
25 |
26 | app.configure(function() {
27 | [ 'css', 'js', 'images', 'plugin', 'lib' ].forEach(function(dir) {
28 | app.use('/' + dir, staticDir(opts.baseDir + dir));
29 | });
30 | });
31 |
32 | app.get("/", function(req, res) {
33 | res.writeHead(200, {'Content-Type': 'text/html'});
34 | fs.createReadStream(opts.baseDir + '/index.html').pipe(res);
35 | });
36 |
37 | app.get("/notes/:socketId", function(req, res) {
38 |
39 | fs.readFile(opts.baseDir + 'plugin/notes-server/notes.html', function(err, data) {
40 | res.send(Mustache.to_html(data.toString(), {
41 | socketId : req.params.socketId
42 | }));
43 | });
44 | // fs.createReadStream(opts.baseDir + 'notes-server/notes.html').pipe(res);
45 | });
46 |
47 | // Actually listen
48 | app.listen(opts.port || null);
49 |
50 | var brown = '\033[33m',
51 | green = '\033[32m',
52 | reset = '\033[0m';
53 |
54 | var slidesLocation = "http://localhost" + ( opts.port ? ( ':' + opts.port ) : '' );
55 |
56 | console.log( brown + "reveal.js - Speaker Notes" + reset );
57 | console.log( "1. Open the slides at " + green + slidesLocation + reset );
58 | console.log( "2. Click on the link your JS console to go to the notes page" );
59 | console.log( "3. Advance through your slides and your notes will advance automatically" );
60 |
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/plugin/notes-server/index.js:
--------------------------------------------------------------------------------
1 | var express = require('express');
2 | var fs = require('fs');
3 | var io = require('socket.io');
4 | var _ = require('underscore');
5 | var Mustache = require('mustache');
6 |
7 | var app = express.createServer();
8 | var staticDir = express.static;
9 |
10 | io = io.listen(app);
11 |
12 | var opts = {
13 | port : 1947,
14 | baseDir : __dirname + '/../../'
15 | };
16 |
17 | io.sockets.on('connection', function(socket) {
18 | socket.on('slidechanged', function(slideData) {
19 | socket.broadcast.emit('slidedata', slideData);
20 | });
21 | socket.on('fragmentchanged', function(fragmentData) {
22 | socket.broadcast.emit('fragmentdata', fragmentData);
23 | });
24 | });
25 |
26 | app.configure(function() {
27 | [ 'css', 'js', 'images', 'plugin', 'lib' ].forEach(function(dir) {
28 | app.use('/' + dir, staticDir(opts.baseDir + dir));
29 | });
30 | });
31 |
32 | app.get("/", function(req, res) {
33 | res.writeHead(200, {'Content-Type': 'text/html'});
34 | fs.createReadStream(opts.baseDir + '/index.html').pipe(res);
35 | });
36 |
37 | app.get("/notes/:socketId", function(req, res) {
38 |
39 | fs.readFile(opts.baseDir + 'plugin/notes-server/notes.html', function(err, data) {
40 | res.send(Mustache.to_html(data.toString(), {
41 | socketId : req.params.socketId
42 | }));
43 | });
44 | // fs.createReadStream(opts.baseDir + 'notes-server/notes.html').pipe(res);
45 | });
46 |
47 | // Actually listen
48 | app.listen(opts.port || null);
49 |
50 | var brown = '\033[33m',
51 | green = '\033[32m',
52 | reset = '\033[0m';
53 |
54 | var slidesLocation = "http://localhost" + ( opts.port ? ( ':' + opts.port ) : '' );
55 |
56 | console.log( brown + "reveal.js - Speaker Notes" + reset );
57 | console.log( "1. Open the slides at " + green + slidesLocation + reset );
58 | console.log( "2. Click on the link your JS console to go to the notes page" );
59 | console.log( "3. Advance through your slides and your notes will advance automatically" );
60 |
--------------------------------------------------------------------------------
/workshop/solutions/zengular-09-compile.js:
--------------------------------------------------------------------------------
1 | function Scope() {
2 | this.$$watchers = [];
3 | this.$$phase = null;
4 | }
5 |
6 | Scope.prototype.$$beginPhase = function(phase) {
7 | if (this.$$phase) {
8 | throw this.$$phase + " est déjà en cours...";
9 | }
10 | this.$$phase = phase;
11 | };
12 |
13 | Scope.prototype.$$clearPhase = function() {
14 | this.$$phase = null;
15 | };
16 |
17 | Scope.prototype.$watch = function (watcherFn, listenerFn, byValue) {
18 | var watch = {
19 | watcherFn: watcherFn,
20 | listenerFn: listenerFn,
21 | byValue: byValue
22 | };
23 | this.$$watchers.push(watch);
24 | };
25 |
26 | Scope.prototype.$digest = function () {
27 | var dirty;
28 | var ttl = 10;
29 | this.$$beginPhase('$digest');
30 | do {
31 | dirty = false;
32 | _.each(this.$$watchers, function (watcher) {
33 | var newValue = watcher.watcherFn(this);
34 | if (watcher.byValue ? !_.isEqual(watcher.last, newValue) : watcher.last !== newValue) {
35 | dirty = true;
36 | watcher.listenerFn(newValue, watcher.last, this);
37 | watcher.last = watcher.byValue ? _.clone(newValue) : newValue;
38 | }
39 | }.bind(this));
40 | if (dirty && !(ttl--)) {
41 | this.$$clearPhase();
42 | throw "$digest est partie en boucle !"
43 | }
44 | } while (dirty)
45 | this.$$clearPhase();
46 | };
47 |
48 | Scope.prototype.$apply = function (exprFn) {
49 | try {
50 | exprFn();
51 | } finally {
52 | this.$digest();
53 | }
54 | }
55 |
56 | var $$directives = {};
57 |
58 | var $directive = function(name, directiveFn) {
59 | if(_.isFunction(directiveFn)) {
60 | $$directives[name] = directiveFn;
61 | }
62 | return $$directives[name];
63 | }
64 |
65 | var $compile = function(element, scope) {
66 | //console.log(element);
67 | _.each(element.children, function(child) {
68 | $compile(child, scope);
69 | });
70 | _.each(element.attributes, function(attribute) {
71 | var directiveFn = $directive(attribute.name);
72 | if(_.isFunction(directiveFn)) {
73 | directiveFn(scope, element, element.attributes);
74 | }
75 | });
76 | }
77 |
--------------------------------------------------------------------------------
/slides/css/theme/source/solarized.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Solarized Light theme for reveal.js.
3 | * Author: Achim Staebler
4 | */
5 |
6 |
7 | // Default mixins and settings -----------------
8 | @import "../template/mixins";
9 | @import "../template/settings";
10 | // ---------------------------------------------
11 |
12 |
13 |
14 | // Include theme-specific fonts
15 | @font-face {
16 | font-family: 'League Gothic';
17 | src: url('../../lib/font/league_gothic-webfont.eot');
18 | src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'),
19 | url('../../lib/font/league_gothic-webfont.woff') format('woff'),
20 | url('../../lib/font/league_gothic-webfont.ttf') format('truetype'),
21 | url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg');
22 |
23 | font-weight: normal;
24 | font-style: normal;
25 | }
26 |
27 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
28 |
29 |
30 | /**
31 | * Solarized colors by Ethan Schoonover
32 | */
33 | html * {
34 | color-profile: sRGB;
35 | rendering-intent: auto;
36 | }
37 |
38 | // Solarized colors
39 | $base03: #002b36;
40 | $base02: #073642;
41 | $base01: #586e75;
42 | $base00: #657b83;
43 | $base0: #839496;
44 | $base1: #93a1a1;
45 | $base2: #eee8d5;
46 | $base3: #fdf6e3;
47 | $yellow: #b58900;
48 | $orange: #cb4b16;
49 | $red: #dc322f;
50 | $magenta: #d33682;
51 | $violet: #6c71c4;
52 | $blue: #268bd2;
53 | $cyan: #2aa198;
54 | $green: #859900;
55 |
56 | // Override theme settings (see ../template/settings.scss)
57 | $mainColor: $base00;
58 | $headingColor: $base01;
59 | $headingTextShadow: none;
60 | $backgroundColor: $base3;
61 | $linkColor: $blue;
62 | $linkColorHover: lighten( $linkColor, 20% );
63 | $selectionBackgroundColor: $magenta;
64 |
65 | // Background generator
66 | // @mixin bodyBackground() {
67 | // @include radial-gradient( rgba($base3,1), rgba(lighten($base3, 20%),1) );
68 | // }
69 |
70 |
71 |
72 | // Theme template ------------------------------
73 | @import "../template/theme";
74 | // ---------------------------------------------
75 |
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/css/theme/source/solarized.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Solarized Light theme for reveal.js.
3 | * Author: Achim Staebler
4 | */
5 |
6 |
7 | // Default mixins and settings -----------------
8 | @import "../template/mixins";
9 | @import "../template/settings";
10 | // ---------------------------------------------
11 |
12 |
13 |
14 | // Include theme-specific fonts
15 | @font-face {
16 | font-family: 'League Gothic';
17 | src: url('../../lib/font/league_gothic-webfont.eot');
18 | src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'),
19 | url('../../lib/font/league_gothic-webfont.woff') format('woff'),
20 | url('../../lib/font/league_gothic-webfont.ttf') format('truetype'),
21 | url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg');
22 |
23 | font-weight: normal;
24 | font-style: normal;
25 | }
26 |
27 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
28 |
29 |
30 | /**
31 | * Solarized colors by Ethan Schoonover
32 | */
33 | html * {
34 | color-profile: sRGB;
35 | rendering-intent: auto;
36 | }
37 |
38 | // Solarized colors
39 | $base03: #002b36;
40 | $base02: #073642;
41 | $base01: #586e75;
42 | $base00: #657b83;
43 | $base0: #839496;
44 | $base1: #93a1a1;
45 | $base2: #eee8d5;
46 | $base3: #fdf6e3;
47 | $yellow: #b58900;
48 | $orange: #cb4b16;
49 | $red: #dc322f;
50 | $magenta: #d33682;
51 | $violet: #6c71c4;
52 | $blue: #268bd2;
53 | $cyan: #2aa198;
54 | $green: #859900;
55 |
56 | // Override theme settings (see ../template/settings.scss)
57 | $mainColor: $base00;
58 | $headingColor: $base01;
59 | $headingTextShadow: none;
60 | $backgroundColor: $base3;
61 | $linkColor: $blue;
62 | $linkColorHover: lighten( $linkColor, 20% );
63 | $selectionBackgroundColor: $magenta;
64 |
65 | // Background generator
66 | // @mixin bodyBackground() {
67 | // @include radial-gradient( rgba($base3,1), rgba(lighten($base3, 20%),1) );
68 | // }
69 |
70 |
71 |
72 | // Theme template ------------------------------
73 | @import "../template/theme";
74 | // ---------------------------------------------
75 |
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/css/theme/source/solarized.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Solarized Light theme for reveal.js.
3 | * Author: Achim Staebler
4 | */
5 |
6 |
7 | // Default mixins and settings -----------------
8 | @import "../template/mixins";
9 | @import "../template/settings";
10 | // ---------------------------------------------
11 |
12 |
13 |
14 | // Include theme-specific fonts
15 | @font-face {
16 | font-family: 'League Gothic';
17 | src: url('../../lib/font/league_gothic-webfont.eot');
18 | src: url('../../lib/font/league_gothic-webfont.eot?#iefix') format('embedded-opentype'),
19 | url('../../lib/font/league_gothic-webfont.woff') format('woff'),
20 | url('../../lib/font/league_gothic-webfont.ttf') format('truetype'),
21 | url('../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular') format('svg');
22 |
23 | font-weight: normal;
24 | font-style: normal;
25 | }
26 |
27 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
28 |
29 |
30 | /**
31 | * Solarized colors by Ethan Schoonover
32 | */
33 | html * {
34 | color-profile: sRGB;
35 | rendering-intent: auto;
36 | }
37 |
38 | // Solarized colors
39 | $base03: #002b36;
40 | $base02: #073642;
41 | $base01: #586e75;
42 | $base00: #657b83;
43 | $base0: #839496;
44 | $base1: #93a1a1;
45 | $base2: #eee8d5;
46 | $base3: #fdf6e3;
47 | $yellow: #b58900;
48 | $orange: #cb4b16;
49 | $red: #dc322f;
50 | $magenta: #d33682;
51 | $violet: #6c71c4;
52 | $blue: #268bd2;
53 | $cyan: #2aa198;
54 | $green: #859900;
55 |
56 | // Override theme settings (see ../template/settings.scss)
57 | $mainColor: $base00;
58 | $headingColor: $base01;
59 | $headingTextShadow: none;
60 | $backgroundColor: $base3;
61 | $linkColor: $blue;
62 | $linkColorHover: lighten( $linkColor, 20% );
63 | $selectionBackgroundColor: $magenta;
64 |
65 | // Background generator
66 | // @mixin bodyBackground() {
67 | // @include radial-gradient( rgba($base3,1), rgba(lighten($base3, 20%),1) );
68 | // }
69 |
70 |
71 |
72 | // Theme template ------------------------------
73 | @import "../template/theme";
74 | // ---------------------------------------------
75 |
--------------------------------------------------------------------------------
/workout/index6.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | // Frameworks
4 |
5 | // Scope
6 |
7 | var Scope = function() {
8 |
9 | this.$$watchers = [];
10 |
11 | this.$watch = function(watcherFn, listenerFn) {
12 | this.$$watchers.push({
13 | watcherFn: watcherFn,
14 | listenerFn: listenerFn
15 | });
16 | };
17 |
18 | this.$digest = function() {
19 | this.$$watchers.forEach(function(watcher) {
20 | var newValue = watcher.watcherFn();
21 | var oldValue = watcher.last;
22 | if(newValue !== oldValue) {
23 | watcher.listenerFn(newValue, oldValue);
24 | watcher.last = newValue;
25 | }
26 | });
27 | };
28 |
29 | this.$apply = function(exprFn) {
30 | try {
31 | exprFn();
32 | } finally {
33 | this.$digest();
34 | }
35 | };
36 |
37 | };
38 |
39 | var $scope = new Scope();
40 |
41 | // Compiler
42 |
43 | var $$directives = {
44 | 'ng-bind': function($scope, $element, $attributes) {
45 | $scope.$watch(function() {
46 | return $scope[$attributes['ng-bind'].value];
47 | }, function(newValue) {
48 | $element.innerHTML = newValue;
49 | });
50 | },
51 | 'ng-model': function($scope, $element, $attributes) {
52 | $scope.$watch(function() {
53 | return $scope[$attributes['ng-model'].value];
54 | }, function(newValue) {
55 | $element.value = newValue;
56 | });
57 |
58 | $element.addEventListener('keyup', function() {
59 | $scope.$apply(function() {
60 | $scope[$attributes['ng-model'].value] = $element.value;
61 | });
62 | });
63 | }
64 | };
65 |
66 | var $compile = function(element, scope) {
67 | Array.prototype.forEach.call(element.children, function(child) {
68 | $compile(child, scope);
69 | });
70 |
71 | Array.prototype.forEach.call(element.attributes, function(attribute) {
72 | var directive = $$directives[attribute.name];
73 | if(directive) {
74 | directive(scope, element, element.attributes);
75 | }
76 | });
77 | };
78 |
79 | $compile(document.body, $scope);
80 |
81 | // Tests & logs
82 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | // framework
4 |
5 | // scope
6 |
7 | var Scope = function() {
8 |
9 | this.$$watchers = [];
10 |
11 | this.$watch = function(watcherFn, listenerFn) {
12 | this.$$watchers.push({
13 | watcherFn: watcherFn,
14 | listenerFn: listenerFn
15 | });
16 | };
17 |
18 | this.$digest = function() {
19 | this.$$watchers.forEach(function(watcher) {
20 | var newValue = watcher.watcherFn();
21 | var oldValue = watcher.last;
22 | if(newValue !== oldValue) {
23 | watcher.listenerFn(newValue, oldValue);
24 | watcher.last = newValue;
25 | }
26 | });
27 | };
28 |
29 | this.$apply = function(exprFn) {
30 | try {
31 | exprFn();
32 | } finally {
33 | this.$digest();
34 | }
35 | };
36 |
37 | };
38 |
39 | var $scope = new Scope();
40 |
41 | // compiler
42 |
43 | var $$directives = {
44 | 'ng-bind': function($scope, $element, $attributes) {
45 | $scope.$watch(function() {
46 | return $scope[$attributes['ng-bind'].value];
47 | }, function(newValue) {
48 | $element.innerHTML = newValue;
49 | });
50 | },
51 | 'ng-model': function($scope, $element, $attributes) {
52 | $scope.$watch(function() {
53 | return $scope[$attributes['ng-model'].value];
54 | }, function(newValue) {
55 | $element.value = newValue;
56 | });
57 |
58 | $element.addEventListener('keyup', function() {
59 | $scope.$apply(function() {
60 | $scope[$attributes['ng-model'].value] = $element.value;
61 | });
62 | });
63 |
64 | }
65 | };
66 |
67 | var $compile = function(element, $scope) {
68 | Array.prototype.forEach.call(element.children, function(child) {
69 | $compile(child, $scope);
70 | });
71 |
72 | Array.prototype.forEach.call(element.attributes, function(attribute) {
73 | var directive = $$directives[attribute.name];
74 | if(directive) {
75 | directive($scope, element, element.attributes);
76 | }
77 | });
78 | };
79 |
80 | $compile(document.body, $scope);
81 |
82 |
83 | // tests & logs
84 |
--------------------------------------------------------------------------------
/workout/index5.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | // Framework
4 |
5 | // Scope
6 |
7 | var Scope = function() {
8 |
9 | this.$$watchers = [];
10 |
11 | this.$watch = function(watcherFn, listenerFn) {
12 | this.$$watchers.push({
13 | watcherFn: watcherFn,
14 | listenerFn: listenerFn
15 | });
16 | };
17 |
18 | this.$digest = function() {
19 | this.$$watchers.forEach(function(watcher) {
20 | var newValue = watcher.watcherFn(this);
21 | var oldValue = watcher.last;
22 | if(newValue !== oldValue) {
23 | watcher.listenerFn(newValue, oldValue);
24 | watcher.last = newValue;
25 | }
26 | }, this);
27 | };
28 |
29 | this.$apply = function(exprFn) {
30 | try {
31 | exprFn();
32 | } finally {
33 | this.$digest();
34 | }
35 | };
36 |
37 | };
38 |
39 | var $scope = new Scope();
40 |
41 | // Compile
42 |
43 | var $$directives = {
44 | 'ng-bind': function($scope, $element, $attributes) {
45 | $scope.$watch(function($scope) {
46 | return $scope[$attributes['ng-bind'].value];
47 | }, function(newValue) {
48 | $element.innerHTML = newValue;
49 | });
50 | },
51 | 'ng-model': function($scope, $element, $attributes) {
52 | $scope.$watch(function($scope) {
53 | return $scope[$attributes['ng-model'].value];
54 | }, function(newValue) {
55 | $element.value = newValue;
56 | });
57 |
58 | $element.addEventListener('keyup', function() {
59 | $scope.$apply(function() {
60 | $scope[$attributes['ng-model'].value] = $element.value;
61 | });
62 | });
63 | }
64 | };
65 |
66 | var $compile = function(element, scope) {
67 |
68 | Array.prototype.forEach.call(element.children, function(child) {
69 | $compile(child, scope);
70 | });
71 |
72 | Array.prototype.forEach.call(element.attributes, function(attribute) {
73 | var directive = $$directives[attribute.name];
74 | if(directive) {
75 | directive(scope, element, element.attributes);
76 | }
77 | });
78 |
79 | };
80 |
81 | $compile(document.body, $scope);
82 |
--------------------------------------------------------------------------------
/workout/index3.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | // Framework
4 |
5 | // Scope
6 |
7 | function Scope() {
8 |
9 | this.$$watchers = [];
10 |
11 | this.$watch = function(watcherFn, listenerFn) {
12 | this.$$watchers.push({
13 | watcherFn: watcherFn,
14 | listenerFn: listenerFn
15 | });
16 | };
17 |
18 | this.$digest = function() {
19 | this.$$watchers.forEach(function(watch) {
20 | var newValue = watch.watcherFn(this);
21 | var oldValue = watch.last;
22 | if(newValue !== oldValue) {
23 | watch.listenerFn(newValue, oldValue, this);
24 | watch.last = newValue;
25 | }
26 | }, this);
27 | };
28 |
29 | this.$apply = function(exprFn) {
30 | try {
31 | exprFn(this);
32 | } finally {
33 | this.$digest();
34 | }
35 | };
36 |
37 | }
38 |
39 | // Compiler
40 |
41 | var $$directives = {};
42 |
43 | var $compile = function(element, scope) {
44 | Array.prototype.forEach.call(element.children, function(child) {
45 | $compile(child, scope);
46 | });
47 |
48 | Array.prototype.forEach.call(element.attributes, function(attribute) {
49 | var directive = $$directives[attribute.name];
50 | if(directive) {
51 | directive(scope, element, element.attributes);
52 | }
53 | });
54 | };
55 |
56 | $$directives['ng-bind'] = function(scope, element, attributes) {
57 | scope.$watch(function(scope) {
58 | return scope[attributes['ng-bind'].value];
59 | }, function(newValue) {
60 | element.innerHTML = newValue;
61 | });
62 | };
63 |
64 | $$directives['ng-model'] = function(scope, element, attributes) {
65 | scope.$watch(function(scope) {
66 | return scope[attributes['ng-model'].value];
67 | }, function(newValue) {
68 | element.value = newValue;
69 | });
70 |
71 | element.addEventListener('keyup', function() {
72 | console.log('help', element.value, attributes['ng-model']);
73 | scope.$apply(function(scope) {
74 | scope[attributes['ng-model'].value] = element.value;
75 | });
76 | });
77 | };
78 |
79 |
80 | // User code
81 |
82 | var scope = new Scope();
83 |
84 | $compile(document.body, scope);
85 |
86 | scope.$apply(function(scope) {
87 | scope.hello = 'Hello ng-europe';
88 | });
89 |
--------------------------------------------------------------------------------
/workout/index2.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | function Scope() {
4 |
5 | this.$$watchers = [];
6 |
7 | this.$watch = function(watcherFn, listenerFn) {
8 | this.$$watchers.push({
9 | watcherFn: watcherFn,
10 | listenerFn: listenerFn
11 | });
12 | };
13 |
14 | this.$digest = function() {
15 | this.$$watchers.forEach(function(watch) {
16 | var newValue = watch.watcherFn(this);
17 | var oldValue = watch.last;
18 | if(newValue !== oldValue) {
19 | watch.listenerFn(newValue, oldValue);
20 | watch.last = newValue;
21 | }
22 | }, this);
23 | };
24 |
25 | this.$apply = function(exprFn) {
26 | try {
27 | exprFn(this);
28 | } finally {
29 | this.$digest();
30 | }
31 | };
32 |
33 | }
34 |
35 | var $$directives = {
36 | 'ng-bind': function(scope, element, attributes) {
37 | scope.$watch(function(scope) {
38 | return scope[attributes['ng-bind'].value];
39 | }, function(newValue) {
40 | element.innerHTML = newValue;
41 | });
42 | },
43 | 'ng-model': function(scope, element, attributes) {
44 | scope.$watch(function(scope) {
45 | return scope[attributes['ng-model'].value];
46 | }, function(newValue) {
47 | element.value = newValue;
48 | });
49 | element.addEventListener('keyup', function() {
50 | scope.$apply(function(scope) {
51 | scope[attributes['ng-model'].value] = element.value;
52 | });
53 | });
54 | }
55 | };
56 |
57 | function $compile(element, scope) {
58 | Array.prototype.forEach.call(element.children, function(child) {
59 | $compile(child, scope);
60 | });
61 |
62 | Array.prototype.forEach.call(element.attributes, function(attribute) {
63 | if($$directives[attribute.name]) {
64 | $$directives[attribute.name](scope, element, element.attributes);
65 | }
66 | });
67 | }
68 |
69 |
70 | var scope = new Scope();
71 |
72 | $compile(document.body, scope);
73 |
74 | scope.$watch(function(scope) {
75 | return scope.hello;
76 | }, function(newValue, oldValue) {
77 | console.log('changed from', oldValue, 'to', newValue);
78 | });
79 |
80 | scope.$apply(function(scope) {
81 | scope.hello = 'Hello ng-europe';
82 | });
83 |
84 | scope.$apply(function(scope) {
85 | scope.hello = 'Hello ng-europe !!';
86 | });
87 |
--------------------------------------------------------------------------------
/workout/index4.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | // Framework
4 |
5 | // Scope
6 |
7 | var Scope = function() {
8 |
9 | this.$$watchers = [];
10 |
11 | this.$watch = function(watcherFn, listenerFn) {
12 | this.$$watchers.push({
13 | watcherFn: watcherFn,
14 | listenerFn: listenerFn
15 | });
16 | };
17 |
18 | this.$digest = function() {
19 | this.$$watchers.forEach(function(watcher) {
20 | var newValue = watcher.watcherFn(this);
21 | var oldValue = watcher.last;
22 | if(newValue !== oldValue) {
23 | watcher.listenerFn(newValue, oldValue);
24 | watcher.last = newValue;
25 | }
26 | }, this);
27 | };
28 |
29 | this.$apply = function(exprFn) {
30 | try {
31 | exprFn(this);
32 | } finally {
33 | this.$digest();
34 | }
35 | };
36 |
37 | };
38 |
39 | var $scope = new Scope();
40 |
41 | // Compile
42 |
43 | var $$directives = {
44 | 'ng-bind': function($scope, $element, $attributes) {
45 | $scope.$watch(function($scope) {
46 | return $scope[$attributes['ng-bind'].value];
47 | }, function(newValue) {
48 | $element.innerHTML = newValue;
49 | });
50 | },
51 | 'ng-model': function($scope, $element, $attributes) {
52 | $scope.$watch(function($scope) {
53 | return $scope[$attributes['ng-model'].value];
54 | }, function(newValue) {
55 | $element.value = newValue;
56 | });
57 |
58 | $element.addEventListener('keyup', function() {
59 | $scope.$apply(function() {
60 | $scope[$attributes['ng-model'].value] = $element.value;
61 | });
62 | });
63 | }
64 | };
65 |
66 | var $compile = function(element, $scope) {
67 |
68 | Array.prototype.forEach.call(element.children, function(child) {
69 | $compile(child, $scope);
70 | });
71 |
72 | Array.prototype.forEach.call(element.attributes, function(attribute) {
73 | var directive = $$directives[attribute.name];
74 | if(directive) {
75 | directive($scope, element, element.attributes);
76 | }
77 | });
78 |
79 | };
80 |
81 | $compile(document.body, $scope);
82 |
83 |
84 | // Tests & Logs
85 |
86 |
87 |
88 | $scope.$apply(function($scope) {
89 | $scope.hello = 'Hello ng-europe';
90 | });
91 |
--------------------------------------------------------------------------------
/slides/lib/css/zenburn.css:
--------------------------------------------------------------------------------
1 | /*
2 |
3 | Zenburn style from voldmar.ru (c) Vladimir Epifanov
4 | based on dark.css by Ivan Sagalaev
5 |
6 | */
7 |
8 | pre code {
9 | display: block; padding: 0.5em;
10 | background: #3F3F3F;
11 | color: #DCDCDC;
12 | }
13 |
14 | pre .keyword,
15 | pre .tag,
16 | pre .css .class,
17 | pre .css .id,
18 | pre .lisp .title,
19 | pre .nginx .title,
20 | pre .request,
21 | pre .status,
22 | pre .clojure .attribute {
23 | color: #E3CEAB;
24 | }
25 |
26 | pre .django .template_tag,
27 | pre .django .variable,
28 | pre .django .filter .argument {
29 | color: #DCDCDC;
30 | }
31 |
32 | pre .number,
33 | pre .date {
34 | color: #8CD0D3;
35 | }
36 |
37 | pre .dos .envvar,
38 | pre .dos .stream,
39 | pre .variable,
40 | pre .apache .sqbracket {
41 | color: #EFDCBC;
42 | }
43 |
44 | pre .dos .flow,
45 | pre .diff .change,
46 | pre .python .exception,
47 | pre .python .built_in,
48 | pre .literal,
49 | pre .tex .special {
50 | color: #EFEFAF;
51 | }
52 |
53 | pre .diff .chunk,
54 | pre .subst {
55 | color: #8F8F8F;
56 | }
57 |
58 | pre .dos .keyword,
59 | pre .python .decorator,
60 | pre .title,
61 | pre .haskell .type,
62 | pre .diff .header,
63 | pre .ruby .class .parent,
64 | pre .apache .tag,
65 | pre .nginx .built_in,
66 | pre .tex .command,
67 | pre .prompt {
68 | color: #efef8f;
69 | }
70 |
71 | pre .dos .winutils,
72 | pre .ruby .symbol,
73 | pre .ruby .symbol .string,
74 | pre .ruby .string {
75 | color: #DCA3A3;
76 | }
77 |
78 | pre .diff .deletion,
79 | pre .string,
80 | pre .tag .value,
81 | pre .preprocessor,
82 | pre .built_in,
83 | pre .sql .aggregate,
84 | pre .javadoc,
85 | pre .smalltalk .class,
86 | pre .smalltalk .localvars,
87 | pre .smalltalk .array,
88 | pre .css .rules .value,
89 | pre .attr_selector,
90 | pre .pseudo,
91 | pre .apache .cbracket,
92 | pre .tex .formula {
93 | color: #CC9393;
94 | }
95 |
96 | pre .shebang,
97 | pre .diff .addition,
98 | pre .comment,
99 | pre .java .annotation,
100 | pre .template_comment,
101 | pre .pi,
102 | pre .doctype {
103 | color: #7F9F7F;
104 | }
105 |
106 | pre .coffeescript .javascript,
107 | pre .javascript .xml,
108 | pre .tex .formula,
109 | pre .xml .javascript,
110 | pre .xml .vbscript,
111 | pre .xml .css,
112 | pre .xml .cdata {
113 | opacity: 0.5;
114 | }
--------------------------------------------------------------------------------
/workshop/solutions/zengular-10-bind.js:
--------------------------------------------------------------------------------
1 | function Scope() {
2 | this.$$watchers = [];
3 | this.$$phase = null;
4 | }
5 |
6 | Scope.prototype.$$beginPhase = function(phase) {
7 | if (this.$$phase) {
8 | throw this.$$phase + " est déjà en cours...";
9 | }
10 | this.$$phase = phase;
11 | };
12 |
13 | Scope.prototype.$$clearPhase = function() {
14 | this.$$phase = null;
15 | };
16 |
17 | Scope.prototype.$watch = function (watcherFn, listenerFn, byValue) {
18 | var watch = {
19 | watcherFn: watcherFn,
20 | listenerFn: listenerFn,
21 | byValue: byValue
22 | };
23 | this.$$watchers.push(watch);
24 | };
25 |
26 | Scope.prototype.$digest = function () {
27 | var dirty;
28 | var ttl = 10;
29 | this.$$beginPhase('$digest');
30 | do {
31 | dirty = false;
32 | _.each(this.$$watchers, function (watcher) {
33 | var newValue = watcher.watcherFn(this);
34 | if (watcher.byValue ? !_.isEqual(watcher.last, newValue) : watcher.last !== newValue) {
35 | dirty = true;
36 | watcher.listenerFn(newValue, watcher.last, this);
37 | watcher.last = watcher.byValue ? _.clone(newValue) : newValue;
38 | }
39 | }.bind(this));
40 | if (dirty && !(ttl--)) {
41 | this.$$clearPhase();
42 | throw "$digest est partie en boucle !"
43 | }
44 | } while (dirty)
45 | this.$$clearPhase();
46 | };
47 |
48 | Scope.prototype.$apply = function (exprFn) {
49 | try {
50 | exprFn();
51 | } finally {
52 | this.$digest();
53 | }
54 | }
55 |
56 | var $$directives = {};
57 |
58 | var $directive = function(name, directiveFn) {
59 | if(_.isFunction(directiveFn)) {
60 | $$directives[name] = directiveFn;
61 | }
62 | return $$directives[name];
63 | }
64 |
65 | var $compile = function(element, scope) {
66 | //console.log(element, scope);
67 | _.each(element.children, function(child) {
68 | $compile(child, scope);
69 | });
70 | _.each(element.attributes, function(attribute) {
71 | var directiveFn = $directive(attribute.name);
72 | if(_.isFunction(directiveFn)) {
73 | directiveFn(scope, element, element.attributes);
74 | }
75 | });
76 | }
77 |
78 | $directive('ng-bind', function(scope, element, attributes) {
79 | scope.$watch(function(scope) {
80 | return eval('scope.' + attributes['ng-bind'].value);
81 | }, function(newValue) {
82 | element.innerHTML = newValue;
83 | });
84 | });
85 |
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/lib/css/zenburn.css:
--------------------------------------------------------------------------------
1 | /*
2 |
3 | Zenburn style from voldmar.ru (c) Vladimir Epifanov
4 | based on dark.css by Ivan Sagalaev
5 |
6 | */
7 |
8 | pre code {
9 | display: block; padding: 0.5em;
10 | background: #3F3F3F;
11 | color: #DCDCDC;
12 | }
13 |
14 | pre .keyword,
15 | pre .tag,
16 | pre .css .class,
17 | pre .css .id,
18 | pre .lisp .title,
19 | pre .nginx .title,
20 | pre .request,
21 | pre .status,
22 | pre .clojure .attribute {
23 | color: #E3CEAB;
24 | }
25 |
26 | pre .django .template_tag,
27 | pre .django .variable,
28 | pre .django .filter .argument {
29 | color: #DCDCDC;
30 | }
31 |
32 | pre .number,
33 | pre .date {
34 | color: #8CD0D3;
35 | }
36 |
37 | pre .dos .envvar,
38 | pre .dos .stream,
39 | pre .variable,
40 | pre .apache .sqbracket {
41 | color: #EFDCBC;
42 | }
43 |
44 | pre .dos .flow,
45 | pre .diff .change,
46 | pre .python .exception,
47 | pre .python .built_in,
48 | pre .literal,
49 | pre .tex .special {
50 | color: #EFEFAF;
51 | }
52 |
53 | pre .diff .chunk,
54 | pre .subst {
55 | color: #8F8F8F;
56 | }
57 |
58 | pre .dos .keyword,
59 | pre .python .decorator,
60 | pre .title,
61 | pre .haskell .type,
62 | pre .diff .header,
63 | pre .ruby .class .parent,
64 | pre .apache .tag,
65 | pre .nginx .built_in,
66 | pre .tex .command,
67 | pre .prompt {
68 | color: #efef8f;
69 | }
70 |
71 | pre .dos .winutils,
72 | pre .ruby .symbol,
73 | pre .ruby .symbol .string,
74 | pre .ruby .string {
75 | color: #DCA3A3;
76 | }
77 |
78 | pre .diff .deletion,
79 | pre .string,
80 | pre .tag .value,
81 | pre .preprocessor,
82 | pre .built_in,
83 | pre .sql .aggregate,
84 | pre .javadoc,
85 | pre .smalltalk .class,
86 | pre .smalltalk .localvars,
87 | pre .smalltalk .array,
88 | pre .css .rules .value,
89 | pre .attr_selector,
90 | pre .pseudo,
91 | pre .apache .cbracket,
92 | pre .tex .formula {
93 | color: #CC9393;
94 | }
95 |
96 | pre .shebang,
97 | pre .diff .addition,
98 | pre .comment,
99 | pre .java .annotation,
100 | pre .template_comment,
101 | pre .pi,
102 | pre .doctype {
103 | color: #7F9F7F;
104 | }
105 |
106 | pre .coffeescript .javascript,
107 | pre .javascript .xml,
108 | pre .tex .formula,
109 | pre .xml .javascript,
110 | pre .xml .vbscript,
111 | pre .xml .css,
112 | pre .xml .cdata {
113 | opacity: 0.5;
114 | }
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/lib/css/zenburn.css:
--------------------------------------------------------------------------------
1 | /*
2 |
3 | Zenburn style from voldmar.ru (c) Vladimir Epifanov
4 | based on dark.css by Ivan Sagalaev
5 |
6 | */
7 |
8 | pre code {
9 | display: block; padding: 0.5em;
10 | background: #3F3F3F;
11 | color: #DCDCDC;
12 | }
13 |
14 | pre .keyword,
15 | pre .tag,
16 | pre .css .class,
17 | pre .css .id,
18 | pre .lisp .title,
19 | pre .nginx .title,
20 | pre .request,
21 | pre .status,
22 | pre .clojure .attribute {
23 | color: #E3CEAB;
24 | }
25 |
26 | pre .django .template_tag,
27 | pre .django .variable,
28 | pre .django .filter .argument {
29 | color: #DCDCDC;
30 | }
31 |
32 | pre .number,
33 | pre .date {
34 | color: #8CD0D3;
35 | }
36 |
37 | pre .dos .envvar,
38 | pre .dos .stream,
39 | pre .variable,
40 | pre .apache .sqbracket {
41 | color: #EFDCBC;
42 | }
43 |
44 | pre .dos .flow,
45 | pre .diff .change,
46 | pre .python .exception,
47 | pre .python .built_in,
48 | pre .literal,
49 | pre .tex .special {
50 | color: #EFEFAF;
51 | }
52 |
53 | pre .diff .chunk,
54 | pre .subst {
55 | color: #8F8F8F;
56 | }
57 |
58 | pre .dos .keyword,
59 | pre .python .decorator,
60 | pre .title,
61 | pre .haskell .type,
62 | pre .diff .header,
63 | pre .ruby .class .parent,
64 | pre .apache .tag,
65 | pre .nginx .built_in,
66 | pre .tex .command,
67 | pre .prompt {
68 | color: #efef8f;
69 | }
70 |
71 | pre .dos .winutils,
72 | pre .ruby .symbol,
73 | pre .ruby .symbol .string,
74 | pre .ruby .string {
75 | color: #DCA3A3;
76 | }
77 |
78 | pre .diff .deletion,
79 | pre .string,
80 | pre .tag .value,
81 | pre .preprocessor,
82 | pre .built_in,
83 | pre .sql .aggregate,
84 | pre .javadoc,
85 | pre .smalltalk .class,
86 | pre .smalltalk .localvars,
87 | pre .smalltalk .array,
88 | pre .css .rules .value,
89 | pre .attr_selector,
90 | pre .pseudo,
91 | pre .apache .cbracket,
92 | pre .tex .formula {
93 | color: #CC9393;
94 | }
95 |
96 | pre .shebang,
97 | pre .diff .addition,
98 | pre .comment,
99 | pre .java .annotation,
100 | pre .template_comment,
101 | pre .pi,
102 | pre .doctype {
103 | color: #7F9F7F;
104 | }
105 |
106 | pre .coffeescript .javascript,
107 | pre .javascript .xml,
108 | pre .tex .formula,
109 | pre .xml .javascript,
110 | pre .xml .vbscript,
111 | pre .xml .css,
112 | pre .xml .cdata {
113 | opacity: 0.5;
114 | }
--------------------------------------------------------------------------------
/workshop/tests/SpecRunner.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Jasmine Spec Runner v2.0.0
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
41 |
42 |
45 |
46 |
47 |
48 |
49 |
50 |
53 |
54 |
55 |
56 |
--------------------------------------------------------------------------------
/alternatives/zengular-1h.js:
--------------------------------------------------------------------------------
1 | function Scope() {
2 | this.$$watchers = [];
3 | }
4 |
5 | Scope.prototype.$watch = function (watcherExp, listenerFn) {
6 | if(typeof watcherExp == 'string') {
7 | var watcherFn = function(scope) {
8 | return scope[watcherExp];
9 | };
10 | } else {
11 | var watcherFn = watcherExp;
12 | }
13 |
14 | var watcher = {
15 | watcherFn: watcherFn,
16 | listenerFn: listenerFn
17 | };
18 |
19 | watcher.last = watcherFn(this);
20 | listenerFn(watcher.last, undefined, this);
21 |
22 | this.$$watchers.push(watcher);
23 | };
24 |
25 | Scope.prototype.$digest = function () {
26 | this.$$watchers.forEach(function (watcher) {
27 | var newValue = watcher.watcherFn(this);
28 | if (watcher.last !== newValue) {
29 | watcher.listenerFn(newValue, watcher.last, this);
30 | watcher.last = newValue;
31 | }
32 | }.bind(this));
33 | };
34 |
35 | Scope.prototype.$apply = function (expressionFn) {
36 | try {
37 | if(expressionFn) {
38 | expressionFn();
39 | }
40 | } finally {
41 | this.$digest();
42 | }
43 | }
44 |
45 | var $$directives = {};
46 |
47 | var $directive = function(name, directiveFn) {
48 | if(directiveFn) {
49 | $$directives[name] = directiveFn;
50 | }
51 | return $$directives[name];
52 | }
53 |
54 | var $compile = function(element, scope) {
55 | element.children.forEach = Array.prototype.forEach;
56 | element.attributes.forEach = Array.prototype.forEach;
57 |
58 | element.children.forEach(function(child) {
59 | $compile(child, scope);
60 | });
61 | element.attributes.forEach(function(attribute) {
62 | var directiveFn = $directive(attribute.name);
63 | if(directiveFn) {
64 | directiveFn(scope, element, element.attributes);
65 | }
66 | });
67 | }
68 |
69 | $directive('ng-bind', function(scope, element, attributes) {
70 | scope.$watch(attributes['ng-bind'].value, function(newValue) {
71 | element.innerHTML = newValue;
72 | });
73 | });
74 |
75 | $directive('ng-model', function(scope, element, attributes) {
76 | var value = attributes['ng-model'].value;
77 |
78 | scope.$watch(value, function(newValue) {
79 | element.value = newValue;
80 | });
81 |
82 | element.addEventListener('keyup', function() {
83 | scope.$apply(function() {
84 | scope[value] = element.value;
85 | });
86 | });
87 | });
88 |
89 | var scope = new Scope();
90 | scope.title = 'toto';
91 |
92 | $compile(document.body, scope);
93 |
--------------------------------------------------------------------------------
/slides/css/theme/source/blood.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Blood theme for reveal.js
3 | * Author: Walther http://github.com/Walther
4 | *
5 | * Designed to be used with highlight.js theme
6 | * "monokai_sublime.css" available from
7 | * https://github.com/isagalaev/highlight.js/
8 | *
9 | * For other themes, change $codeBackground accordingly.
10 | *
11 | */
12 |
13 | // Default mixins and settings -----------------
14 | @import "../template/mixins";
15 | @import "../template/settings";
16 | // ---------------------------------------------
17 |
18 | // Include theme-specific fonts
19 |
20 | @import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic);
21 |
22 | // Colors used in the theme
23 | $blood: #a23;
24 | $coal: #222;
25 | $codeBackground: #23241f;
26 |
27 | // Main text
28 | $mainFont: Ubuntu, 'sans-serif';
29 | $mainFontSize: 36px;
30 | $mainColor: #eee;
31 |
32 | // Headings
33 | $headingFont: Ubuntu, 'sans-serif';
34 | $headingTextShadow: 2px 2px 2px $coal;
35 |
36 | // h1 shadow, borrowed humbly from
37 | // (c) Default theme by Hakim El Hattab
38 | $heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15);
39 |
40 | // Links
41 | $linkColor: $blood;
42 | $linkColorHover: lighten( $linkColor, 20% );
43 |
44 | // Text selection
45 | $selectionBackgroundColor: $blood;
46 | $selectionColor: #fff;
47 |
48 | // Background generator
49 | @mixin bodyBackground() {
50 | @include radial-gradient( $coal, lighten( $coal, 25% ) );
51 | }
52 |
53 | // Theme template ------------------------------
54 | @import "../template/theme";
55 | // ---------------------------------------------
56 |
57 | // some overrides after theme template import
58 |
59 | .reveal p {
60 | font-weight: 300;
61 | text-shadow: 1px 1px $coal;
62 | }
63 |
64 | .reveal h1,
65 | .reveal h2,
66 | .reveal h3,
67 | .reveal h4,
68 | .reveal h5,
69 | .reveal h6 {
70 | font-weight: 700;
71 | }
72 |
73 | .reveal a:not(.image),
74 | .reveal a:not(.image):hover {
75 | text-shadow: 2px 2px 2px #000;
76 | }
77 |
78 | .reveal small a:not(.image),
79 | .reveal small a:not(.image):hover {
80 | text-shadow: 1px 1px 1px #000;
81 | }
82 |
83 | .reveal p code {
84 | background-color: $codeBackground;
85 | display: inline-block;
86 | border-radius: 7px;
87 | }
88 |
89 | .reveal small code {
90 | vertical-align: baseline;
91 | }
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/css/theme/source/blood.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Blood theme for reveal.js
3 | * Author: Walther http://github.com/Walther
4 | *
5 | * Designed to be used with highlight.js theme
6 | * "monokai_sublime.css" available from
7 | * https://github.com/isagalaev/highlight.js/
8 | *
9 | * For other themes, change $codeBackground accordingly.
10 | *
11 | */
12 |
13 | // Default mixins and settings -----------------
14 | @import "../template/mixins";
15 | @import "../template/settings";
16 | // ---------------------------------------------
17 |
18 | // Include theme-specific fonts
19 |
20 | @import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic);
21 |
22 | // Colors used in the theme
23 | $blood: #a23;
24 | $coal: #222;
25 | $codeBackground: #23241f;
26 |
27 | // Main text
28 | $mainFont: Ubuntu, 'sans-serif';
29 | $mainFontSize: 36px;
30 | $mainColor: #eee;
31 |
32 | // Headings
33 | $headingFont: Ubuntu, 'sans-serif';
34 | $headingTextShadow: 2px 2px 2px $coal;
35 |
36 | // h1 shadow, borrowed humbly from
37 | // (c) Default theme by Hakim El Hattab
38 | $heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15);
39 |
40 | // Links
41 | $linkColor: $blood;
42 | $linkColorHover: lighten( $linkColor, 20% );
43 |
44 | // Text selection
45 | $selectionBackgroundColor: $blood;
46 | $selectionColor: #fff;
47 |
48 | // Background generator
49 | @mixin bodyBackground() {
50 | @include radial-gradient( $coal, lighten( $coal, 25% ) );
51 | }
52 |
53 | // Theme template ------------------------------
54 | @import "../template/theme";
55 | // ---------------------------------------------
56 |
57 | // some overrides after theme template import
58 |
59 | .reveal p {
60 | font-weight: 300;
61 | text-shadow: 1px 1px $coal;
62 | }
63 |
64 | .reveal h1,
65 | .reveal h2,
66 | .reveal h3,
67 | .reveal h4,
68 | .reveal h5,
69 | .reveal h6 {
70 | font-weight: 700;
71 | }
72 |
73 | .reveal a:not(.image),
74 | .reveal a:not(.image):hover {
75 | text-shadow: 2px 2px 2px #000;
76 | }
77 |
78 | .reveal small a:not(.image),
79 | .reveal small a:not(.image):hover {
80 | text-shadow: 1px 1px 1px #000;
81 | }
82 |
83 | .reveal p code {
84 | background-color: $codeBackground;
85 | display: inline-block;
86 | border-radius: 7px;
87 | }
88 |
89 | .reveal small code {
90 | vertical-align: baseline;
91 | }
--------------------------------------------------------------------------------
/sessions/breizhcamp-22052014/slides/css/theme/source/blood.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Blood theme for reveal.js
3 | * Author: Walther http://github.com/Walther
4 | *
5 | * Designed to be used with highlight.js theme
6 | * "monokai_sublime.css" available from
7 | * https://github.com/isagalaev/highlight.js/
8 | *
9 | * For other themes, change $codeBackground accordingly.
10 | *
11 | */
12 |
13 | // Default mixins and settings -----------------
14 | @import "../template/mixins";
15 | @import "../template/settings";
16 | // ---------------------------------------------
17 |
18 | // Include theme-specific fonts
19 |
20 | @import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic);
21 |
22 | // Colors used in the theme
23 | $blood: #a23;
24 | $coal: #222;
25 | $codeBackground: #23241f;
26 |
27 | // Main text
28 | $mainFont: Ubuntu, 'sans-serif';
29 | $mainFontSize: 36px;
30 | $mainColor: #eee;
31 |
32 | // Headings
33 | $headingFont: Ubuntu, 'sans-serif';
34 | $headingTextShadow: 2px 2px 2px $coal;
35 |
36 | // h1 shadow, borrowed humbly from
37 | // (c) Default theme by Hakim El Hattab
38 | $heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15);
39 |
40 | // Links
41 | $linkColor: $blood;
42 | $linkColorHover: lighten( $linkColor, 20% );
43 |
44 | // Text selection
45 | $selectionBackgroundColor: $blood;
46 | $selectionColor: #fff;
47 |
48 | // Background generator
49 | @mixin bodyBackground() {
50 | @include radial-gradient( $coal, lighten( $coal, 25% ) );
51 | }
52 |
53 | // Theme template ------------------------------
54 | @import "../template/theme";
55 | // ---------------------------------------------
56 |
57 | // some overrides after theme template import
58 |
59 | .reveal p {
60 | font-weight: 300;
61 | text-shadow: 1px 1px $coal;
62 | }
63 |
64 | .reveal h1,
65 | .reveal h2,
66 | .reveal h3,
67 | .reveal h4,
68 | .reveal h5,
69 | .reveal h6 {
70 | font-weight: 700;
71 | }
72 |
73 | .reveal a:not(.image),
74 | .reveal a:not(.image):hover {
75 | text-shadow: 2px 2px 2px #000;
76 | }
77 |
78 | .reveal small a:not(.image),
79 | .reveal small a:not(.image):hover {
80 | text-shadow: 1px 1px 1px #000;
81 | }
82 |
83 | .reveal p code {
84 | background-color: $codeBackground;
85 | display: inline-block;
86 | border-radius: 7px;
87 | }
88 |
89 | .reveal small code {
90 | vertical-align: baseline;
91 | }
--------------------------------------------------------------------------------
/slides/plugin/notes/notes.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Handles opening of and synchronization with the reveal.js
3 | * notes window.
4 | */
5 | var RevealNotes = (function() {
6 |
7 | function openNotes() {
8 | var jsFileLocation = document.querySelector('script[src$="notes.js"]').src; // this js file path
9 | jsFileLocation = jsFileLocation.replace(/notes\.js(\?.*)?$/, ''); // the js folder path
10 | var notesPopup = window.open( jsFileLocation + 'notes.html', 'reveal.js - Notes', 'width=1120,height=850' );
11 |
12 | // Fires when slide is changed
13 | Reveal.addEventListener( 'slidechanged', post );
14 |
15 | // Fires when a fragment is shown
16 | Reveal.addEventListener( 'fragmentshown', post );
17 |
18 | // Fires when a fragment is hidden
19 | Reveal.addEventListener( 'fragmenthidden', post );
20 |
21 | /**
22 | * Posts the current slide data to the notes window
23 | */
24 | function post() {
25 | var slideElement = Reveal.getCurrentSlide(),
26 | slideIndices = Reveal.getIndices(),
27 | messageData;
28 |
29 | var notes = slideElement.querySelector( 'aside.notes' ),
30 | nextindexh,
31 | nextindexv;
32 |
33 | if( slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION' ) {
34 | nextindexh = slideIndices.h;
35 | nextindexv = slideIndices.v + 1;
36 | } else {
37 | nextindexh = slideIndices.h + 1;
38 | nextindexv = 0;
39 | }
40 |
41 | messageData = {
42 | notes : notes ? notes.innerHTML : '',
43 | indexh : slideIndices.h,
44 | indexv : slideIndices.v,
45 | indexf : slideIndices.f,
46 | nextindexh : nextindexh,
47 | nextindexv : nextindexv,
48 | markdown : notes ? typeof notes.getAttribute( 'data-markdown' ) === 'string' : false
49 | };
50 |
51 | notesPopup.postMessage( JSON.stringify( messageData ), '*' );
52 | }
53 |
54 | // Navigate to the current slide when the notes are loaded
55 | notesPopup.addEventListener( 'load', function( event ) {
56 | post();
57 | }, false );
58 | }
59 |
60 | // If the there's a 'notes' query set, open directly
61 | if( window.location.search.match( /(\?|\&)notes/gi ) !== null ) {
62 | openNotes();
63 | }
64 |
65 | // Open the notes when the 's' key is hit
66 | document.addEventListener( 'keydown', function( event ) {
67 | // Disregard the event if the target is editable or a
68 | // modifier is present
69 | if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
70 |
71 | if( event.keyCode === 83 ) {
72 | event.preventDefault();
73 | openNotes();
74 | }
75 | }, false );
76 |
77 | return { open: openNotes };
78 | })();
79 |
--------------------------------------------------------------------------------
/sessions/m6web-25042014/slides/plugin/notes/notes.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Handles opening of and synchronization with the reveal.js
3 | * notes window.
4 | */
5 | var RevealNotes = (function() {
6 |
7 | function openNotes() {
8 | var jsFileLocation = document.querySelector('script[src$="notes.js"]').src; // this js file path
9 | jsFileLocation = jsFileLocation.replace(/notes\.js(\?.*)?$/, ''); // the js folder path
10 | var notesPopup = window.open( jsFileLocation + 'notes.html', 'reveal.js - Notes', 'width=1120,height=850' );
11 |
12 | // Fires when slide is changed
13 | Reveal.addEventListener( 'slidechanged', post );
14 |
15 | // Fires when a fragment is shown
16 | Reveal.addEventListener( 'fragmentshown', post );
17 |
18 | // Fires when a fragment is hidden
19 | Reveal.addEventListener( 'fragmenthidden', post );
20 |
21 | /**
22 | * Posts the current slide data to the notes window
23 | */
24 | function post() {
25 | var slideElement = Reveal.getCurrentSlide(),
26 | slideIndices = Reveal.getIndices(),
27 | messageData;
28 |
29 | var notes = slideElement.querySelector( 'aside.notes' ),
30 | nextindexh,
31 | nextindexv;
32 |
33 | if( slideElement.nextElementSibling && slideElement.parentNode.nodeName == 'SECTION' ) {
34 | nextindexh = slideIndices.h;
35 | nextindexv = slideIndices.v + 1;
36 | } else {
37 | nextindexh = slideIndices.h + 1;
38 | nextindexv = 0;
39 | }
40 |
41 | messageData = {
42 | notes : notes ? notes.innerHTML : '',
43 | indexh : slideIndices.h,
44 | indexv : slideIndices.v,
45 | indexf : slideIndices.f,
46 | nextindexh : nextindexh,
47 | nextindexv : nextindexv,
48 | markdown : notes ? typeof notes.getAttribute( 'data-markdown' ) === 'string' : false
49 | };
50 |
51 | notesPopup.postMessage( JSON.stringify( messageData ), '*' );
52 | }
53 |
54 | // Navigate to the current slide when the notes are loaded
55 | notesPopup.addEventListener( 'load', function( event ) {
56 | post();
57 | }, false );
58 | }
59 |
60 | // If the there's a 'notes' query set, open directly
61 | if( window.location.search.match( /(\?|\&)notes/gi ) !== null ) {
62 | openNotes();
63 | }
64 |
65 | // Open the notes when the 's' key is hit
66 | document.addEventListener( 'keydown', function( event ) {
67 | // Disregard the event if the target is editable or a
68 | // modifier is present
69 | if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
70 |
71 | if( event.keyCode === 83 ) {
72 | event.preventDefault();
73 | openNotes();
74 | }
75 | }, false );
76 |
77 | return { open: openNotes };
78 | })();
79 |
--------------------------------------------------------------------------------