├── .gitignore ├── INSTRUCTIONS-pandoc-ebooks.md ├── Makefile ├── README.md ├── _config.yml ├── backbone-fundamentals.epub ├── backbone-fundamentals.md ├── backbone-fundamentals.mobi ├── backbone-fundamentals.pdf ├── backbone-fundamentals.rtf ├── build ├── INSTRUCTIONS-pandoc-ebooks.md ├── author.html ├── head.html ├── metadata.xml ├── share.html ├── stats.html └── title.txt ├── chapters ├── 00-prelude.md ├── 01-introduction.md ├── 02-fundamentals.md ├── 03-internals.md ├── 04-exercise-1.md ├── 05-exercise-2.md ├── 06-extensions.md ├── 07-common-problems.md ├── 08-modular-development.md ├── 09-exercise-3.md ├── 10-pagination.md ├── 11-bbb.md ├── 12-mobile-applications.md ├── 13-unit-testing.md ├── 14-qunit.md ├── 15-sinonjs.md ├── 16-resources.md ├── 17-conclusions.md └── 18-appendix.md ├── epub.css ├── img ├── 3e5545.png ├── 7d4de12.png ├── 9df4.png ├── airbnb.png ├── backbone_mvc.fw.png ├── backbone_mvc.png ├── backbonejsorg.jpg ├── bbb.png ├── bbdevtools.jpg ├── bower.png ├── chapter10-1-1-1.png ├── chapter10-1-1.png ├── chapter10-1-2.png ├── chapter10-2-1.png ├── chapter10-2-2.png ├── chapter10-3-1.png ├── chapter10-3-2.png ├── chapter10-3-3.png ├── chapter10-3-4.png ├── chapter5-1.png ├── chapter5-10.png ├── chapter5-11.png ├── chapter5-12.png ├── chapter5-2.png ├── chapter5-3.png ├── chapter5-4.png ├── chapter5-5.png ├── chapter5-6.png ├── chapter5-7.png ├── chapter5-8.png ├── chapter5-9.png ├── clientPager.png ├── code-school.png ├── cover.jpg ├── devtools.png ├── disqus.png ├── flow.png ├── helpful.png ├── infinitepager.png ├── khan-academy.png ├── logo.jpg ├── marionette_todo0.png ├── marionette_todo1.png ├── oreilly.jpg ├── paginator-classes.png ├── paginator-client.png ├── paginator-dia.png ├── paginator-request.png ├── paginator-styling.png ├── paginator-styling2.png ├── paginator-ui.png ├── placeholder.png ├── rails_mvc.fw.png ├── rails_mvc.png ├── requestPager.png ├── todoapp.png ├── todocompleted.png ├── todoconsole.png ├── todoconsole2.png ├── todorouting.png ├── todos_a.png ├── todos_b.png ├── todos_c.png ├── todos_d.png ├── todos_e.png ├── todoview.png ├── walmart-mobile.png ├── webmvcflow_bacic.png ├── wireframe_e_commerce.png └── yeoman.png ├── index.html ├── index.md ├── metadata.xml ├── package.json ├── practicals ├── exercise-2 │ ├── package.json │ ├── server.js │ └── site │ │ ├── css │ │ ├── cupertino │ │ │ ├── images │ │ │ │ ├── ui-bg_diagonals-thick_90_eeeeee_40x40.png │ │ │ │ ├── ui-bg_flat_15_cd0a0a_40x100.png │ │ │ │ ├── ui-bg_glass_100_e4f1fb_1x400.png │ │ │ │ ├── ui-bg_glass_50_3baae3_1x400.png │ │ │ │ ├── ui-bg_glass_80_d7ebf9_1x400.png │ │ │ │ ├── ui-bg_highlight-hard_100_f2f5f7_1x100.png │ │ │ │ ├── ui-bg_highlight-hard_70_000000_1x100.png │ │ │ │ ├── ui-bg_highlight-soft_100_deedf7_1x100.png │ │ │ │ ├── ui-bg_highlight-soft_25_ffef8f_1x100.png │ │ │ │ ├── ui-icons_2694e8_256x240.png │ │ │ │ ├── ui-icons_2e83ff_256x240.png │ │ │ │ ├── ui-icons_3d80b3_256x240.png │ │ │ │ ├── ui-icons_72a7cf_256x240.png │ │ │ │ └── ui-icons_ffffff_256x240.png │ │ │ ├── jquery-ui-1.10.0.custom.css │ │ │ └── jquery-ui-1.10.0.custom.min.css │ │ └── screen.css │ │ ├── img │ │ └── placeholder.png │ │ ├── index.html │ │ └── js │ │ ├── app.js │ │ ├── collections │ │ └── library.js │ │ ├── lib │ │ ├── backbone.js │ │ ├── jquery-1.9.0.js │ │ ├── jquery-dateFormat-1.0.js │ │ ├── jquery-ui-1.10.0.custom.js │ │ └── underscore.js │ │ ├── models │ │ └── book.js │ │ └── views │ │ ├── book.js │ │ └── library.js ├── jasmine-koans │ ├── README.md │ ├── css │ │ ├── bootstrap.css │ │ ├── koansReporter.css │ │ └── todos.css │ ├── images │ │ └── destroy.png │ ├── index.html │ ├── js │ │ ├── ext │ │ │ ├── backbone.js │ │ │ ├── backbone.localStorage.js │ │ │ ├── jasmine-html.js │ │ │ ├── jasmine.css │ │ │ ├── jasmine.js │ │ │ ├── jquery.js │ │ │ ├── template.js │ │ │ └── underscore.js │ │ ├── koans │ │ │ ├── aboutCollections.js │ │ │ ├── aboutEvents.js │ │ │ ├── aboutModels.js │ │ │ ├── aboutViews.js │ │ │ └── finalSteps.js │ │ ├── koansReporter.js │ │ └── todos.js │ ├── specrunner.html │ ├── templates │ │ ├── app.html │ │ ├── item.html │ │ └── stats.html │ └── tooterApp.js ├── modular-mobile-app │ ├── app │ │ ├── app-build.js │ │ ├── app.js │ │ ├── libs │ │ │ ├── AMDbackbone-0.5.3.js │ │ │ ├── jQuery.ui.datepicker.js │ │ │ ├── jquery-1.7.1.js │ │ │ ├── jquery.mobile-1.0.js │ │ │ ├── jquery.ui.datepicker.mobile.js │ │ │ ├── json2.js │ │ │ ├── require │ │ │ │ ├── require-1.0.2.min.js │ │ │ │ └── text.js │ │ │ └── underscore-1.2.2.js │ │ ├── main.js │ │ ├── models │ │ │ ├── PhotoCollection.js │ │ │ ├── ResultCollection.js │ │ │ └── ResultEntry.js │ │ ├── routers │ │ │ └── workspace.js │ │ ├── templates │ │ │ ├── listview.html │ │ │ └── photoview.html │ │ ├── ui.js │ │ ├── utils.js │ │ └── views │ │ │ ├── appview.js │ │ │ ├── photoList.js │ │ │ └── resultList.js │ ├── css │ │ ├── custom_mobile_theme.css │ │ ├── jquery.ui.datepicker.css │ │ ├── style.css │ │ └── theme.css │ ├── img │ │ ├── bg_header.png │ │ ├── flickly.jpg │ │ ├── icons │ │ │ ├── 01-refresh.png │ │ │ ├── 02-redo.png │ │ │ ├── 03-loopback.png │ │ │ ├── 04-squiggle.png │ │ │ ├── 05-shuffle.png │ │ │ ├── 06-magnify.png │ │ │ ├── 07-map-marker.png │ │ │ ├── 08-chat.png │ │ │ ├── 09-chat-2.png │ │ │ ├── 10-medical.png │ │ │ ├── 100-coffee.png │ │ │ ├── 101-gameplan.png │ │ │ ├── 102-walk.png │ │ │ ├── 103-map.png │ │ │ ├── 104-index-cards.png │ │ │ ├── 105-piano.png │ │ │ ├── 106-sliders.png │ │ │ ├── 107-widescreen.png │ │ │ ├── 108-badge.png │ │ │ ├── 109-chicken.png │ │ │ ├── 11-clock.png │ │ │ ├── 110-bug.png │ │ │ ├── 111-user.png │ │ │ ├── 112-group.png │ │ │ ├── 113-navigation.png │ │ │ ├── 114-balloon.png │ │ │ ├── 115-bow-and-arrow.png │ │ │ ├── 116-controller.png │ │ │ ├── 117-todo.png │ │ │ ├── 118-coat-hanger.png │ │ │ ├── 119-piggy-bank.png │ │ │ ├── 12-eye.png │ │ │ ├── 120-headphones.png │ │ │ ├── 121-landscape.png │ │ │ ├── 122-stats.png │ │ │ ├── 123-id-card.png │ │ │ ├── 124-bullhorn.png │ │ │ ├── 125-food.png │ │ │ ├── 126-moon.png │ │ │ ├── 127-sock.png │ │ │ ├── 128-bone.png │ │ │ ├── 129-golf.png │ │ │ ├── 13-target.png │ │ │ ├── 130-dice.png │ │ │ ├── 131-tower.png │ │ │ ├── 132-ghost.png │ │ │ ├── 133-ufo.png │ │ │ ├── 134-viking.png │ │ │ ├── 135-hockeymask.png │ │ │ ├── 136-tractor.png │ │ │ ├── 137-presentation.png │ │ │ ├── 138-scales.png │ │ │ ├── 139-flags.png │ │ │ ├── 14-tag.png │ │ │ ├── 140-gradhat.png │ │ │ ├── 141-lamp.png │ │ │ ├── 142-wine-bottle.png │ │ │ ├── 143-liquor-bottle.png │ │ │ ├── 144-martini.png │ │ │ ├── 145-persondot.png │ │ │ ├── 146-gavel.png │ │ │ ├── 147-popsicle.png │ │ │ ├── 148-doghouse.png │ │ │ ├── 149-windmill.png │ │ │ ├── 15-tags.png │ │ │ ├── 150-sailboat.png │ │ │ ├── 151-telescope.png │ │ │ ├── 152-rolodex.png │ │ │ ├── 153-guitar.png │ │ │ ├── 154-necktie.png │ │ │ ├── 155-bowtie.png │ │ │ ├── 156-controlpad.png │ │ │ ├── 157-wrench.png │ │ │ ├── 158-wrench-2.png │ │ │ ├── 159-voicemail.png │ │ │ ├── 16-line-chart.png │ │ │ ├── 160-voicemail-2.png │ │ │ ├── 161-calculator.png │ │ │ ├── 162-receipt.png │ │ │ ├── 163-glasses-1.png │ │ │ ├── 164-glasses-2.png │ │ │ ├── 165-glasses-3.png │ │ │ ├── 166-newspaper.png │ │ │ ├── 167-upload-photo.png │ │ │ ├── 168-upload-photo-2.png │ │ │ ├── 169-8ball.png │ │ │ ├── 17-bar-chart.png │ │ │ ├── 170-butterfly.png │ │ │ ├── 171-sun.png │ │ │ ├── 172-pricetag.png │ │ │ ├── 173-eyedropper.png │ │ │ ├── 174-imac.png │ │ │ ├── 175-macbook.png │ │ │ ├── 176-ipad.png │ │ │ ├── 177-building.png │ │ │ ├── 178-city.png │ │ │ ├── 179-notepad.png │ │ │ ├── 18-envelope.png │ │ │ ├── 180-stickynote.png │ │ │ ├── 181-hammer.png │ │ │ ├── 182-messenger-bag.png │ │ │ ├── 183-genie-lamp.png │ │ │ ├── 184-warning.png │ │ │ ├── 185-printer.png │ │ │ ├── 186-ruler.png │ │ │ ├── 187-pencil.png │ │ │ ├── 188-paint-roller.png │ │ │ ├── 189-plant.png │ │ │ ├── 19-gear.png │ │ │ ├── 190-bank.png │ │ │ ├── 191-collection.png │ │ │ ├── 192-credit-card.png │ │ │ ├── 193-location-arrow.png │ │ │ ├── 194-note-2.png │ │ │ ├── 195-barcode.png │ │ │ ├── 196-radiation.png │ │ │ ├── 197-card-diamonds.png │ │ │ ├── 198-card-spades.png │ │ │ ├── 199-card-hearts.png │ │ │ ├── 20-gear2.png │ │ │ ├── 200-card-clubs.png │ │ │ ├── 21-skull.png │ │ │ ├── 22-skull-n-bones.png │ │ │ ├── 23-bird.png │ │ │ ├── 24-gift.png │ │ │ ├── 25-weather.png │ │ │ ├── 26-bandaid.png │ │ │ ├── 27-planet.png │ │ │ ├── 28-star.png │ │ │ ├── 29-heart.png │ │ │ ├── 30-key.png │ │ │ ├── 31-ipod.png │ │ │ ├── 32-iphone.png │ │ │ ├── 33-cabinet.png │ │ │ ├── 34-coffee.png │ │ │ ├── 35-shopping.png │ │ │ ├── 36-toolbox.png │ │ │ ├── 37-suitcase.png │ │ │ ├── 38-airplane.png │ │ │ ├── 39-spraycan.png │ │ │ ├── 40-inbox.png │ │ │ ├── 41-picture-frame.png │ │ │ ├── 42-photos.png │ │ │ ├── 43-film-roll.png │ │ │ ├── 44-shoebox.png │ │ │ ├── 45-movie-1.png │ │ │ ├── 46-movie-2.png │ │ │ ├── 47-fuel.png │ │ │ ├── 48-fork-and-knife.png │ │ │ ├── 49-battery.png │ │ │ ├── 50-beaker.png │ │ │ ├── 51-outlet.png │ │ │ ├── 52-pine-tree.png │ │ │ ├── 53-house.png │ │ │ ├── 54-lock.png │ │ │ ├── 55-network.png │ │ │ ├── 56-cloud.png │ │ │ ├── 57-download.png │ │ │ ├── 58-bookmark.png │ │ │ ├── 59-flag.png │ │ │ ├── 60-signpost.png │ │ │ ├── 61-brightness.png │ │ │ ├── 62-contrast.png │ │ │ ├── 63-runner.png │ │ │ ├── 64-zap.png │ │ │ ├── 65-note.png │ │ │ ├── 66-microphone.png │ │ │ ├── 67-tshirt.png │ │ │ ├── 68-paperclip.png │ │ │ ├── 69-display.png │ │ │ ├── 70-tv.png │ │ │ ├── 71-compass.png │ │ │ ├── 72-pin.png │ │ │ ├── 73-radar.png │ │ │ ├── 74-location.png │ │ │ ├── 75-phone.png │ │ │ ├── 76-baby.png │ │ │ ├── 77-ekg.png │ │ │ ├── 78-stopwatch.png │ │ │ ├── 79-medical-bag.png │ │ │ ├── 80-shopping-cart.png │ │ │ ├── 81-dashboard.png │ │ │ ├── 82-dog-paw.png │ │ │ ├── 83-calendar.png │ │ │ ├── 84-lightbulb.png │ │ │ ├── 85-trophy.png │ │ │ ├── 86-camera.png │ │ │ ├── 87-wine-glass.png │ │ │ ├── 88-beer-mug.png │ │ │ ├── 89-dumbell.png │ │ │ ├── 90-life-buoy.png │ │ │ ├── 91-beaker-2.png │ │ │ ├── 92-test-tube.png │ │ │ ├── 93-thermometer.png │ │ │ ├── 94-pill.png │ │ │ ├── 95-equalizer.png │ │ │ ├── 96-book.png │ │ │ ├── 97-puzzle.png │ │ │ ├── 98-palette.png │ │ │ ├── 99-umbrella.png │ │ │ ├── demo.png │ │ │ ├── facebook.png │ │ │ ├── github.png │ │ │ └── twitter.png │ │ ├── loader.gif │ │ └── ribbon.png │ └── index.html ├── modular-todo-app │ ├── css │ │ ├── destroy.png │ │ └── todos.css │ ├── index.html │ └── js │ │ ├── collections │ │ └── todos.js │ │ ├── libs │ │ ├── backbone │ │ │ ├── backbone-min.js │ │ │ ├── backbone-optamd3-min.js │ │ │ ├── backbone.js │ │ │ ├── backbone.localStorage.js │ │ │ └── localstorage.js │ │ ├── jquery │ │ │ └── jquery-min.js │ │ ├── require │ │ │ ├── require.js │ │ │ └── text.js │ │ └── underscore │ │ │ └── underscore-min.js │ │ ├── main.js │ │ ├── models │ │ └── todo.js │ │ ├── templates │ │ ├── stats.html │ │ └── todos.html │ │ └── views │ │ ├── app.js │ │ └── todo.js ├── qunit-koans │ ├── css │ │ ├── bootstrap.css │ │ ├── koansReporter.css │ │ └── todos.css │ ├── images │ │ └── destroy.png │ ├── index.html │ ├── js │ │ ├── ext │ │ │ ├── backbone.js │ │ │ ├── backbone.localStorage.js │ │ │ ├── jquery.js │ │ │ ├── template.js │ │ │ └── underscore.js │ │ ├── koans │ │ │ ├── aboutApps.js │ │ │ ├── aboutCollections.js │ │ │ ├── aboutEvents.js │ │ │ ├── aboutModels.js │ │ │ └── aboutViews.js │ │ └── todos.js │ ├── specrunner.html │ └── templates │ │ ├── app.html │ │ ├── item.html │ │ └── stats.html ├── stacks │ ├── README.md │ ├── option1 │ │ ├── app.js │ │ ├── install.sh │ │ └── public │ │ │ ├── 404.html │ │ │ ├── crossdomain.xml │ │ │ ├── css │ │ │ └── style.css │ │ │ ├── favicon.ico │ │ │ ├── humans.txt │ │ │ ├── img │ │ │ ├── .gitignore │ │ │ └── destroy.png │ │ │ ├── js │ │ │ ├── libs │ │ │ │ ├── jquery-1.6.2.js │ │ │ │ ├── jquery-1.6.2.min.js │ │ │ │ └── modernizr-2.0.6.min.js │ │ │ ├── mylibs │ │ │ │ ├── .gitignore │ │ │ │ ├── backbone-min.js │ │ │ │ ├── backbone.js │ │ │ │ ├── underscore-min.js │ │ │ │ └── underscore.js │ │ │ ├── plugins.js │ │ │ └── script.js │ │ │ ├── robots.txt │ │ │ ├── static.html │ │ │ └── test │ │ │ ├── index.html │ │ │ ├── qunit │ │ │ ├── qunit.css │ │ │ └── qunit.js │ │ │ └── tests.js │ ├── option2 │ │ ├── app.js │ │ ├── install.sh │ │ ├── public │ │ │ ├── 404.html │ │ │ ├── crossdomain.xml │ │ │ ├── css │ │ │ │ └── style.css │ │ │ ├── favicon.ico │ │ │ ├── humans.txt │ │ │ ├── img │ │ │ │ ├── .gitignore │ │ │ │ └── destroy.png │ │ │ ├── js │ │ │ │ ├── libs │ │ │ │ │ ├── jquery-1.6.2.js │ │ │ │ │ ├── jquery-1.6.2.min.js │ │ │ │ │ └── modernizr-2.0.6.min.js │ │ │ │ ├── mylibs │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── backbone-min.js │ │ │ │ │ ├── backbone.js │ │ │ │ │ ├── underscore-min.js │ │ │ │ │ └── underscore.js │ │ │ │ ├── plugins.js │ │ │ │ └── script.js │ │ │ ├── robots.txt │ │ │ └── test │ │ │ │ ├── index.html │ │ │ │ ├── qunit │ │ │ │ ├── qunit.css │ │ │ │ └── qunit.js │ │ │ │ └── tests.js │ │ └── views │ │ │ ├── layout.jade │ │ │ └── todo.jade │ └── option3 │ │ ├── Gemfile │ │ ├── app.rb │ │ ├── public │ │ ├── 404.html │ │ ├── crossdomain.xml │ │ ├── css │ │ │ └── style.css │ │ ├── favicon.ico │ │ ├── humans.txt │ │ ├── img │ │ │ ├── .gitignore │ │ │ └── destroy.png │ │ ├── js │ │ │ ├── libs │ │ │ │ ├── jquery-1.6.2.js │ │ │ │ ├── jquery-1.6.2.min.js │ │ │ │ └── modernizr-2.0.6.min.js │ │ │ ├── mylibs │ │ │ │ ├── .gitignore │ │ │ │ ├── backbone-min.js │ │ │ │ ├── backbone.js │ │ │ │ ├── underscore-min.js │ │ │ │ └── underscore.js │ │ │ ├── plugins.js │ │ │ └── script.js │ │ └── robots.txt │ │ └── views │ │ ├── index.haml │ │ ├── layout.haml │ │ └── todo.haml └── todo-jqm-app │ ├── .gitignore │ ├── .project │ ├── Gruntfile.js │ ├── app │ ├── common.js │ ├── config.js │ ├── handlebars_helpers.js │ ├── initialize.config.js │ ├── jquerymobile.config.js │ ├── main.js │ ├── modules │ │ ├── TodoModel.js │ │ ├── TodosCollection.js │ │ └── view │ │ │ ├── EditTodoPage.js │ │ │ ├── SingleTodoView.js │ │ │ ├── TodosView.js │ │ │ └── abstract │ │ │ └── BasicView.js │ └── templates │ │ ├── abstract │ │ ├── basic_page_simple.template │ │ └── basic_popup.template │ │ ├── todos │ │ ├── editTodoView.template_partial │ │ ├── singleTodo.template │ │ ├── todosPage.template_partial │ │ └── todosStatisticsAndBulkFooter.template_partial │ │ └── welcome.template_partial │ ├── assets │ ├── css │ │ ├── base.css │ │ ├── bg.png │ │ ├── h5bp.css │ │ ├── images │ │ │ ├── ajax-loader.gif │ │ │ ├── icons-18-black.png │ │ │ ├── icons-18-white.png │ │ │ ├── icons-36-black.png │ │ │ └── icons-36-white.png │ │ ├── index.css │ │ └── jquerymobile.css │ └── js │ │ └── libs │ │ ├── almond.js │ │ ├── backbone.js │ │ ├── backbone_super.js │ │ ├── handlebars.js │ │ ├── jquery.js │ │ ├── jquerymobile.js │ │ ├── localstorage.js │ │ ├── lodash.js │ │ ├── require.js │ │ └── underscore.js │ ├── compile │ ├── favicon.ico │ ├── index.html │ ├── package.js │ ├── readme.md │ └── test │ ├── jasmine │ ├── index.html │ ├── spec │ │ └── example.js │ └── vendor │ │ ├── MIT.LICENSE │ │ ├── jasmine-html.js │ │ ├── jasmine.css │ │ ├── jasmine.js │ │ └── jasmine_favicon.png │ └── qunit │ ├── index.html │ ├── tests │ └── example.js │ └── vendor │ ├── qunit.css │ └── qunit.js └── style.css /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | node_modules/ 3 | npm-debug.log* 4 | yarn-debug.log* 5 | yarn-error.log* 6 | package-lock.json 7 | yarn.lock 8 | 9 | # Build outputs 10 | *.epub 11 | *.mobi 12 | *.pdf 13 | *.rtf 14 | backbone-fundamentals.md 15 | 16 | # OS files 17 | .DS_Store 18 | .DS_Store? 19 | ._* 20 | .Spotlight-V100 21 | .Trashes 22 | ehthumbs.db 23 | Thumbs.db 24 | 25 | # Editor directories and files 26 | .idea 27 | .vscode 28 | *.swp 29 | *.swo 30 | *~ 31 | -------------------------------------------------------------------------------- /INSTRUCTIONS-pandoc-ebooks.md: -------------------------------------------------------------------------------- 1 | Kindlegen requires title and author metadata. To generate a mobi file from 2 | a pandoc ebook, first generate an epub file using the metadata.xml file 3 | included: 4 | 5 | ``` 6 | pandoc -f markdown -t epub --epub-metadata=metadata.xml -o backbone-fundamentals.epub index.md 7 | ``` 8 | 9 | then use the kindlegen tool to make a mobi from that epub: 10 | 11 | ``` 12 | kindlegen backbone-fundamentals.epub 13 | ``` 14 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | include_dir=build 2 | source=chapters/*.md 3 | title='Developing Backbone.js Applications' 4 | filename='backbone-fundamentals' 5 | 6 | 7 | all: html epub rtf pdf mobi 8 | 9 | markdown: 10 | awk 'FNR==1{print ""}{print}' $(source) > $(filename).md 11 | 12 | html: markdown 13 | pandoc -s $(filename).md -f markdown+smart -t html5 -o index.html -c style.css \ 14 | --include-in-header $(include_dir)/head.html \ 15 | --include-before-body $(include_dir)/author.html \ 16 | --include-before-body $(include_dir)/share.html \ 17 | --include-after-body $(include_dir)/stats.html \ 18 | --title-prefix $(title) \ 19 | --toc 20 | 21 | epub: markdown 22 | pandoc -s $(filename).md -f markdown+smart -t epub -o $(filename).epub \ 23 | --epub-metadata $(include_dir)/metadata.xml \ 24 | --css epub.css \ 25 | --epub-cover-image img/cover.jpg \ 26 | --title-prefix $(title) \ 27 | --toc 28 | 29 | rtf: markdown 30 | pandoc -s $(filename).md -f markdown+smart -o $(filename).rtf \ 31 | --title-prefix $(title) 32 | 33 | pdf: markdown 34 | # You need `pdflatex` 35 | # OS X: http://www.tug.org/mactex/ 36 | # Then find its path: find /usr/ -name "pdflatex" 37 | # Then symlink it: ln -s /path/to/pdflatex /usr/local/bin 38 | pandoc -s $(filename).md -f markdown+smart -o $(filename).pdf \ 39 | --title-prefix $(title) \ 40 | --toc \ 41 | --pdf-engine=xelatex 42 | 43 | mobi: epub 44 | # Download: http://www.amazon.com/gp/feature.html?ie=UTF8&docId=1000765211 45 | # Symlink bin: ln -s /path/to/kindlegen /usr/local/bin 46 | kindlegen $(filename).epub 47 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | title: Developing Backbone.js Applications 2 | description: A comprehensive guide to building Backbone.js applications 3 | baseurl: "/backbone-fundamentals" 4 | url: "https://addyosmani.github.io" 5 | 6 | # Build settings 7 | markdown: kramdown 8 | kramdown: 9 | input: GFM 10 | syntax_highlighter: rouge 11 | 12 | # Exclude from processing 13 | exclude: 14 | - node_modules 15 | - Makefile 16 | - package.json 17 | - package-lock.json 18 | - README.md 19 | - .gitignore 20 | - practicals/ 21 | - build/ 22 | 23 | plugins: 24 | - jekyll-relative-links 25 | - jekyll-seo-tag 26 | 27 | # Default front matter 28 | defaults: 29 | - 30 | scope: 31 | path: "" 32 | values: 33 | layout: "default" 34 | -------------------------------------------------------------------------------- /backbone-fundamentals.epub: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/backbone-fundamentals.epub -------------------------------------------------------------------------------- /backbone-fundamentals.mobi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/backbone-fundamentals.mobi -------------------------------------------------------------------------------- /backbone-fundamentals.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/backbone-fundamentals.pdf -------------------------------------------------------------------------------- /build/INSTRUCTIONS-pandoc-ebooks.md: -------------------------------------------------------------------------------- 1 | Kindlegen requires title and author metadata. To generate a mobi file from 2 | a pandoc ebook, first generate an epub file using the metadata.xml file 3 | included: 4 | 5 | ``` 6 | pandoc -f markdown -t epub --epub-metadata=metadata.xml -o backbone-fundamentals.epub index.md 7 | ``` 8 | 9 | then use the kindlegen tool to make a mobi from that epub: 10 | 11 | ``` 12 | kindlegen backbone-fundamentals.epub 13 | ``` -------------------------------------------------------------------------------- /build/author.html: -------------------------------------------------------------------------------- 1 |

2 |

Developing Backbone.js Applications

3 |

By Addy Osmani (@addyosmani)

4 |

5 | -------------------------------------------------------------------------------- /build/head.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /build/metadata.xml: -------------------------------------------------------------------------------- 1 | Developing Backbone.js Applications 2 | Addy Osmani 3 | Creative Commons Attribution Non-Commercial Share Alike 3.0 4 | en-US 5 | -------------------------------------------------------------------------------- /build/share.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 5 | 6 | 7 | 8 | 9 |

 

10 |
11 | 12 |

Available free for open-source reading below or for purchase via the O'Reilly store.
Pull requests
and comments always welcome.

13 |

14 | 15 | Was this helpful? We'd love you to write a review. -------------------------------------------------------------------------------- /build/stats.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /build/title.txt: -------------------------------------------------------------------------------- 1 | % Developing Backbone.js Applications 2 | % Addy Osmani -------------------------------------------------------------------------------- /chapters/16-resources.md: -------------------------------------------------------------------------------- 1 | # Resources 2 | 3 | ## Books & Courses 4 | 5 | * [PeepCode: Backbone.js Basics](https://peepcode.com/products/backbone-js) 6 | * [CodeSchool: Anatomy Of Backbone](http://www.codeschool.com/courses/anatomy-of-backbonejs) 7 | * [Recipes With Backbone](http://recipeswithbackbone.com/) 8 | * [Backbone Patterns](http://ricostacruz.com/backbone-patterns/) 9 | * [Backbone On Rails](https://learn.thoughtbot.com/products/1-backbone-js-on-rails) 10 | * [MVC In JavaScript With Backbone](http://www.integralist.co.uk/posts/backbone.html) 11 | * [Backbone Tutorials](http://backbonetutorials.com/) 12 | * [Derick Bailey's Resources For Learning Backbone](http://lostechies.com/derickbailey/2011/09/13/resources-for-and-how-i-learned-backbone-js/) 13 | 14 | ## Extensions/Libraries 15 | 16 | * [MarionetteJS](http://marionettejs.com/) 17 | * [AuraJS](https://github.com/aurajs/aura) 18 | * [Thorax](http://thoraxjs.org) 19 | * [Lumbar](http://walmartlabs.github.com/lumbar) 20 | * [Backbone Layout Manager](https://github.com/tbranyen/backbone.layoutmanager) 21 | * [Backbone Boilerplate](https://github.com/backbone-boilerplate/backbone-boilerplate) 22 | * [Backbone.ModelBinder](https://github.com/theironcook/Backbone.ModelBinder) 23 | * [Backbone Relational - for model relationships](https://github.com/PaulUithol/Backbone-relational) 24 | * [Backbone CouchDB](https://github.com/janmonschke/backbone-couchdb) 25 | * [Backbone Validations - HTML5 inspired validations](https://github.com/n-time/backbone.validations) 26 | -------------------------------------------------------------------------------- /img/3e5545.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/3e5545.png -------------------------------------------------------------------------------- /img/7d4de12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/7d4de12.png -------------------------------------------------------------------------------- /img/9df4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/9df4.png -------------------------------------------------------------------------------- /img/airbnb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/airbnb.png -------------------------------------------------------------------------------- /img/backbone_mvc.fw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/backbone_mvc.fw.png -------------------------------------------------------------------------------- /img/backbone_mvc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/backbone_mvc.png -------------------------------------------------------------------------------- /img/backbonejsorg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/backbonejsorg.jpg -------------------------------------------------------------------------------- /img/bbb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/bbb.png -------------------------------------------------------------------------------- /img/bbdevtools.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/bbdevtools.jpg -------------------------------------------------------------------------------- /img/bower.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/bower.png -------------------------------------------------------------------------------- /img/chapter10-1-1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/chapter10-1-1-1.png -------------------------------------------------------------------------------- /img/chapter10-1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/chapter10-1-1.png -------------------------------------------------------------------------------- /img/chapter10-1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/chapter10-1-2.png -------------------------------------------------------------------------------- /img/chapter10-2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/chapter10-2-1.png -------------------------------------------------------------------------------- /img/chapter10-2-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/chapter10-2-2.png -------------------------------------------------------------------------------- /img/chapter10-3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/chapter10-3-1.png -------------------------------------------------------------------------------- /img/chapter10-3-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/chapter10-3-2.png -------------------------------------------------------------------------------- /img/chapter10-3-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/chapter10-3-3.png -------------------------------------------------------------------------------- /img/chapter10-3-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/chapter10-3-4.png -------------------------------------------------------------------------------- /img/chapter5-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/chapter5-1.png -------------------------------------------------------------------------------- /img/chapter5-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/chapter5-10.png -------------------------------------------------------------------------------- /img/chapter5-11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/chapter5-11.png -------------------------------------------------------------------------------- /img/chapter5-12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/chapter5-12.png -------------------------------------------------------------------------------- /img/chapter5-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/chapter5-2.png -------------------------------------------------------------------------------- /img/chapter5-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/chapter5-3.png -------------------------------------------------------------------------------- /img/chapter5-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/chapter5-4.png -------------------------------------------------------------------------------- /img/chapter5-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/chapter5-5.png -------------------------------------------------------------------------------- /img/chapter5-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/chapter5-6.png -------------------------------------------------------------------------------- /img/chapter5-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/chapter5-7.png -------------------------------------------------------------------------------- /img/chapter5-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/chapter5-8.png -------------------------------------------------------------------------------- /img/chapter5-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/chapter5-9.png -------------------------------------------------------------------------------- /img/clientPager.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/clientPager.png -------------------------------------------------------------------------------- /img/code-school.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/code-school.png -------------------------------------------------------------------------------- /img/cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/cover.jpg -------------------------------------------------------------------------------- /img/devtools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/devtools.png -------------------------------------------------------------------------------- /img/disqus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/disqus.png -------------------------------------------------------------------------------- /img/flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/flow.png -------------------------------------------------------------------------------- /img/helpful.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/helpful.png -------------------------------------------------------------------------------- /img/infinitepager.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/infinitepager.png -------------------------------------------------------------------------------- /img/khan-academy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/khan-academy.png -------------------------------------------------------------------------------- /img/logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/logo.jpg -------------------------------------------------------------------------------- /img/marionette_todo0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/marionette_todo0.png -------------------------------------------------------------------------------- /img/marionette_todo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/marionette_todo1.png -------------------------------------------------------------------------------- /img/oreilly.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/oreilly.jpg -------------------------------------------------------------------------------- /img/paginator-classes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/paginator-classes.png -------------------------------------------------------------------------------- /img/paginator-client.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/paginator-client.png -------------------------------------------------------------------------------- /img/paginator-dia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/paginator-dia.png -------------------------------------------------------------------------------- /img/paginator-request.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/paginator-request.png -------------------------------------------------------------------------------- /img/paginator-styling.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/paginator-styling.png -------------------------------------------------------------------------------- /img/paginator-styling2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/paginator-styling2.png -------------------------------------------------------------------------------- /img/paginator-ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/paginator-ui.png -------------------------------------------------------------------------------- /img/placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/placeholder.png -------------------------------------------------------------------------------- /img/rails_mvc.fw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/rails_mvc.fw.png -------------------------------------------------------------------------------- /img/rails_mvc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/rails_mvc.png -------------------------------------------------------------------------------- /img/requestPager.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/requestPager.png -------------------------------------------------------------------------------- /img/todoapp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/todoapp.png -------------------------------------------------------------------------------- /img/todocompleted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/todocompleted.png -------------------------------------------------------------------------------- /img/todoconsole.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/todoconsole.png -------------------------------------------------------------------------------- /img/todoconsole2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/todoconsole2.png -------------------------------------------------------------------------------- /img/todorouting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/todorouting.png -------------------------------------------------------------------------------- /img/todos_a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/todos_a.png -------------------------------------------------------------------------------- /img/todos_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/todos_b.png -------------------------------------------------------------------------------- /img/todos_c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/todos_c.png -------------------------------------------------------------------------------- /img/todos_d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/todos_d.png -------------------------------------------------------------------------------- /img/todos_e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/todos_e.png -------------------------------------------------------------------------------- /img/todoview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/todoview.png -------------------------------------------------------------------------------- /img/walmart-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/walmart-mobile.png -------------------------------------------------------------------------------- /img/webmvcflow_bacic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/webmvcflow_bacic.png -------------------------------------------------------------------------------- /img/wireframe_e_commerce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/wireframe_e_commerce.png -------------------------------------------------------------------------------- /img/yeoman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/img/yeoman.png -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | * [Prelude](chapters/00-prelude.md) 2 | * [Introduction](chapters/01-introduction.md) 3 | * [Fundamentals](chapters/02-fundamentals.md) 4 | * [The Internals](chapters/03-internals.md) 5 | * [Exercise 1: Todos - Your First Backbone.js App](chapters/04-exercise-1.md) 6 | * [Exercise 2: Book Library - Your first RESTful Backbone.js app](chapters/05-exercise-2.md) 7 | * [Backbone Boilerplate And Grunt-BBB](chapters/06-bbb.md) 8 | * [Common Problems & Solutions](chapters/07-common-problems.md) 9 | * [Backbone Extensions](chapters/08-extensions.md) 10 | * [Modular Development](chapters/09-modular-development.md) 11 | * [Mobile Applications](chapters/10-mobile-applications.md) 12 | * [Unit Testing](chapters/11-unit-testing.md) 13 | * [QUnit](chapters/12-qunit.md) 14 | * [SinonJS](chapters/13-sinonjs.md) 15 | * [Resources](chapters/14-resources.md) 16 | * [Conclusions](chapters/15-conclusions.md) 17 | * [Appendix](chapters/16-appendix.md) 18 | -------------------------------------------------------------------------------- /metadata.xml: -------------------------------------------------------------------------------- 1 | Developing Backbone.js Applications 2 | Addy Osmani 3 | Creative Commons Attribution Non-Commercial Share Alike 3.0 4 | en-US 5 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "backbone-fundamentals", 3 | "version": "1.3.0", 4 | "description": "Developing Backbone.js Applications book", 5 | "main": "index.html", 6 | "repository": { 7 | "type": "git", 8 | "url": "https://github.com/addyosmani/backbone-fundamentals.git" 9 | }, 10 | "keywords": [ 11 | "backbone", 12 | "backbone.js" 13 | ], 14 | "author": "Addy Osmani", 15 | "license": "Creative Commons Attribution-Noncommercial-No Derivative Works 3.0", 16 | "bugs": { 17 | "url": "https://github.com/addyosmani/backbone-fundamentals/issues" 18 | }, 19 | "homepage": "https://github.com/addyosmani/backbone-fundamentals", 20 | "dependencies": { 21 | "backbone": "^1.5.0", 22 | "jquery": "^3.7.1", 23 | "underscore": "^1.13.6" 24 | }, 25 | "devDependencies": { 26 | "pandoc": "^0.2.0" 27 | }, 28 | "scripts": { 29 | "build": "make all" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /practicals/exercise-2/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "backbone-library", 3 | "version": "0.0.1", 4 | "description": "A simple library application using the Backbone framework", 5 | "dependencies": { 6 | "express": "~3.1.0", 7 | "path": "~0.4.9", 8 | "mongoose": "~3.5.5" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /practicals/exercise-2/site/css/cupertino/images/ui-bg_diagonals-thick_90_eeeeee_40x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/exercise-2/site/css/cupertino/images/ui-bg_diagonals-thick_90_eeeeee_40x40.png -------------------------------------------------------------------------------- /practicals/exercise-2/site/css/cupertino/images/ui-bg_flat_15_cd0a0a_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/exercise-2/site/css/cupertino/images/ui-bg_flat_15_cd0a0a_40x100.png -------------------------------------------------------------------------------- /practicals/exercise-2/site/css/cupertino/images/ui-bg_glass_100_e4f1fb_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/exercise-2/site/css/cupertino/images/ui-bg_glass_100_e4f1fb_1x400.png -------------------------------------------------------------------------------- /practicals/exercise-2/site/css/cupertino/images/ui-bg_glass_50_3baae3_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/exercise-2/site/css/cupertino/images/ui-bg_glass_50_3baae3_1x400.png -------------------------------------------------------------------------------- /practicals/exercise-2/site/css/cupertino/images/ui-bg_glass_80_d7ebf9_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/exercise-2/site/css/cupertino/images/ui-bg_glass_80_d7ebf9_1x400.png -------------------------------------------------------------------------------- /practicals/exercise-2/site/css/cupertino/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/exercise-2/site/css/cupertino/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png -------------------------------------------------------------------------------- /practicals/exercise-2/site/css/cupertino/images/ui-bg_highlight-hard_70_000000_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/exercise-2/site/css/cupertino/images/ui-bg_highlight-hard_70_000000_1x100.png -------------------------------------------------------------------------------- /practicals/exercise-2/site/css/cupertino/images/ui-bg_highlight-soft_100_deedf7_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/exercise-2/site/css/cupertino/images/ui-bg_highlight-soft_100_deedf7_1x100.png -------------------------------------------------------------------------------- /practicals/exercise-2/site/css/cupertino/images/ui-bg_highlight-soft_25_ffef8f_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/exercise-2/site/css/cupertino/images/ui-bg_highlight-soft_25_ffef8f_1x100.png -------------------------------------------------------------------------------- /practicals/exercise-2/site/css/cupertino/images/ui-icons_2694e8_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/exercise-2/site/css/cupertino/images/ui-icons_2694e8_256x240.png -------------------------------------------------------------------------------- /practicals/exercise-2/site/css/cupertino/images/ui-icons_2e83ff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/exercise-2/site/css/cupertino/images/ui-icons_2e83ff_256x240.png -------------------------------------------------------------------------------- /practicals/exercise-2/site/css/cupertino/images/ui-icons_3d80b3_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/exercise-2/site/css/cupertino/images/ui-icons_3d80b3_256x240.png -------------------------------------------------------------------------------- /practicals/exercise-2/site/css/cupertino/images/ui-icons_72a7cf_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/exercise-2/site/css/cupertino/images/ui-icons_72a7cf_256x240.png -------------------------------------------------------------------------------- /practicals/exercise-2/site/css/cupertino/images/ui-icons_ffffff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/exercise-2/site/css/cupertino/images/ui-icons_ffffff_256x240.png -------------------------------------------------------------------------------- /practicals/exercise-2/site/css/screen.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #eee; 3 | } 4 | 5 | .bookContainer { 6 | outline: 1px solid #aaa; 7 | width: 350px; 8 | height: 130px; 9 | background-color: #fff; 10 | float: left; 11 | margin: 5px; 12 | } 13 | 14 | .bookContainer img { 15 | float: left; 16 | margin: 10px; 17 | } 18 | 19 | .bookContainer ul { 20 | list-style-type: none; 21 | margin-bottom: 0; 22 | } 23 | 24 | .bookContainer button { 25 | float: right; 26 | margin: 10px; 27 | } 28 | 29 | #addBook label { 30 | width: 100px; 31 | margin-right: 10px; 32 | text-align: right; 33 | line-height: 25px; 34 | } 35 | 36 | #addBook label, #addBook input { 37 | display: block; 38 | margin-bottom: 10px; 39 | float: left; 40 | } 41 | 42 | #addBook label[for="title"], #addBook label[for="releaseDate"] { 43 | clear: both; 44 | } 45 | 46 | #addBook button { 47 | display: block; 48 | margin: 5px 20px 10px 10px; 49 | float: right; 50 | clear: both; 51 | } 52 | 53 | #addBook div { 54 | width: 550px; 55 | } 56 | 57 | #addBook div:after { 58 | content: ""; 59 | display: block; 60 | height: 0; 61 | visibility: hidden; 62 | clear: both; 63 | font-size: 0; 64 | line-height: 0; 65 | } 66 | -------------------------------------------------------------------------------- /practicals/exercise-2/site/img/placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/exercise-2/site/img/placeholder.png -------------------------------------------------------------------------------- /practicals/exercise-2/site/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Backbone.js Library 6 | 7 | 8 | 9 | 10 |
11 |
12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 |
21 |
22 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /practicals/exercise-2/site/js/app.js: -------------------------------------------------------------------------------- 1 | var app = app || {}; 2 | 3 | 4 | $(function() { 5 | $( '#releaseDate' ).datepicker(); 6 | new app.LibraryView(); 7 | }); 8 | -------------------------------------------------------------------------------- /practicals/exercise-2/site/js/collections/library.js: -------------------------------------------------------------------------------- 1 | var app = app || {}; 2 | 3 | app.Library = Backbone.Collection.extend({ 4 | model: app.Book, 5 | url: '/api/books' 6 | }); 7 | -------------------------------------------------------------------------------- /practicals/exercise-2/site/js/models/book.js: -------------------------------------------------------------------------------- 1 | var app = app || {}; 2 | 3 | app.Book = Backbone.Model.extend({ 4 | defaults: { 5 | coverImage: 'img/placeholder.png', 6 | title: 'No title', 7 | author: 'Unknown', 8 | releaseDate: 'Unknown', 9 | keywords: 'None' 10 | }, 11 | 12 | idAttribute: '_id' 13 | }); 14 | -------------------------------------------------------------------------------- /practicals/exercise-2/site/js/views/book.js: -------------------------------------------------------------------------------- 1 | var app = app || {}; 2 | 3 | app.BookView = Backbone.View.extend({ 4 | tagName: 'div', 5 | className: 'bookContainer', 6 | template: $( '#bookTemplate' ).html(), 7 | 8 | events: { 9 | 'click .delete': 'deleteBook' 10 | }, 11 | 12 | deleteBook: function() { 13 | //Delete model 14 | this.model.destroy(); 15 | 16 | //Delete view 17 | this.remove(); 18 | }, 19 | 20 | render: function() { 21 | //tmpl is a function that takes a JSON object and returns html 22 | var tmpl = _.template( this.template ); 23 | 24 | //this.el is what we defined in tagName. use $el to get access to jQuery html() function 25 | this.$el.html( tmpl( this.model.toJSON() ) ); 26 | 27 | return this; 28 | } 29 | }); 30 | -------------------------------------------------------------------------------- /practicals/exercise-2/site/js/views/library.js: -------------------------------------------------------------------------------- 1 | var app = app || {}; 2 | 3 | app.LibraryView = Backbone.View.extend({ 4 | el: $( '#books' ), 5 | 6 | initialize: function() { 7 | this.collection = new app.Library(); 8 | this.collection.fetch(); 9 | this.render(); 10 | 11 | this.listenTo( this.collection, 'add', this.renderBook ); 12 | this.listenTo( this.collection, 'reset', this.render ); 13 | }, 14 | 15 | events: { 16 | 'click #add': 'addBook' 17 | }, 18 | 19 | addBook: function( e ) { 20 | e.preventDefault(); 21 | 22 | var formData = {}; 23 | 24 | $( '#addBook div' ).children( 'input' ).each( function( i, el ) { 25 | if( $( el ).val() != "" ) 26 | { 27 | if( el.id === 'keywords' ) { 28 | formData[ el.id ] = []; 29 | _.each( $( el ).val().split( ' ' ), function( keyword ) { 30 | formData[ el.id ].push({ 'keyword': keyword }); 31 | }); 32 | } else if( el.id === 'releaseDate' ) { 33 | formData[ el.id ] = new Date($( '#releaseDate' ).val()); 34 | } else { 35 | formData[ el.id ] = $( el ).val(); 36 | } 37 | } 38 | }); 39 | 40 | this.collection.create( formData ); 41 | }, 42 | 43 | // render library by rendering each book in its collection 44 | render: function() { 45 | this.collection.each(function( item ) { 46 | this.renderBook( item ); 47 | }, this ); 48 | }, 49 | 50 | // render a book by creating a BookView and appending the 51 | // element it renders to the library's element 52 | renderBook: function( item ) { 53 | var bookView = new app.BookView({ 54 | model: item 55 | }); 56 | this.$el.append( bookView.render().el ); 57 | } 58 | }); 59 | -------------------------------------------------------------------------------- /practicals/jasmine-koans/README.md: -------------------------------------------------------------------------------- 1 | # Backbone Koans 2 | 3 | A set of jasmine powered koans for learning [Backbone.js](http://http://documentcloud.github.com/backbone). 4 | 5 | The koans verify behavior of a Todo list app, a modified version of the original Todos app 6 | created by [Jérôme Gravel-Niquet](http://jgn.me/). 7 | 8 | ## How to Run 9 | 10 | cp -R js/koans koans 11 | 12 | This gets you a fresh set of failing specs to start with. 13 | 14 | Open your favorite browser, and load the specrunner.html file. You should see many failing specs. 15 | 16 | If you have python on your machine, here's an easy way to do that: 17 | 18 | python -m SimpleHTTPServer 19 | http://localhost:8000/ 20 | 21 | Work your way through the jasmine specs in the koans/ directory, and when you finish you should have 22 | a better understanding of how to create and test a Backbone app. 23 | 24 | -------------------------------------------------------------------------------- /practicals/jasmine-koans/css/koansReporter.css: -------------------------------------------------------------------------------- 1 | html { 2 | margin: 20px; 3 | } 4 | 5 | h2 { 6 | margin: 18px 0; 7 | } 8 | 9 | #summary { 10 | font-size: 18px; 11 | } 12 | 13 | .alert-message { 14 | margin-bottom: 6px; 15 | } -------------------------------------------------------------------------------- /practicals/jasmine-koans/images/destroy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/jasmine-koans/images/destroy.png -------------------------------------------------------------------------------- /practicals/jasmine-koans/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Backbone Demo: Todos 5 | 6 | 7 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | To the Koans »  32 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /practicals/jasmine-koans/js/ext/template.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | var cache = {}; 3 | 4 | function _render(elt, template, data, callback) { 5 | var data = data || {}, 6 | callback = callback || function() {}, 7 | html = template(data); 8 | 9 | elt.append(html); 10 | callback(); 11 | } 12 | 13 | /** 14 | * Fetches the Underscore.js template at the given path, 15 | * processes it with the provided data object, and appends the 16 | * resulting html to the matched DOM elements. 17 | * 18 | * Templates will only be fetched once from the server, 19 | * preprocessed template are cached in the DOM. 20 | */ 21 | $.fn.template = function(path, obj, callback) { 22 | var self = this; 23 | 24 | if (cache[path]) { 25 | _render(self, cache[path], obj, callback); 26 | return self; 27 | } 28 | 29 | $.get(path, function(data) { 30 | cache[path] = _.template(data); 31 | _render(self, cache[path], obj, callback); 32 | }); 33 | 34 | return self; 35 | }; 36 | })(jQuery); -------------------------------------------------------------------------------- /practicals/jasmine-koans/js/koans/aboutCollections.js: -------------------------------------------------------------------------------- 1 | describe('About Backbone.Collection', function() { 2 | it('Can add Model instances as objects and arrays.', function() { 3 | var todos = new TodoList(); 4 | 5 | expect(todos.length).toBe(0); 6 | 7 | todos.add({ text: 'Clean the kitchen' }); 8 | 9 | expect(todos.length).toBe("How many models are in the collection now?"); 10 | 11 | todos.add([ 12 | { text: 'Do the laundry', done: true }, 13 | { text: 'Go to the gym'} 14 | ]); 15 | 16 | expect(todos.length).toBe("How many models are in the collection now?"); 17 | }); 18 | 19 | it('Can have a url property to define the basic url structure for all contained models.', function() { 20 | var todos = new TodoList(); 21 | 22 | expect(todos.url).toBe('what goes here?'); 23 | }); 24 | 25 | it('Fires custom named events when the models change.', function() { 26 | var todos = new TodoList(); 27 | 28 | var addModelCallback = jasmine.createSpy('-add model callback-'); 29 | todos.bind('add', addModelCallback); 30 | 31 | // How would you get the 'add' event to trigger? 32 | 33 | expect(addModelCallback).toHaveBeenCalled(); 34 | 35 | var removeModelCallback = jasmine.createSpy('-remove model callback-'); 36 | todos.bind('remove', removeModelCallback); 37 | 38 | // How would you get the 'remove' callback to trigger? 39 | 40 | expect(removeModelCallback).toHaveBeenCalled(); 41 | }); 42 | }); -------------------------------------------------------------------------------- /practicals/jasmine-koans/js/koans/finalSteps.js: -------------------------------------------------------------------------------- 1 | describe('Bringing It All Together', function() { 2 | 3 | }); -------------------------------------------------------------------------------- /practicals/jasmine-koans/specrunner.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Backbone Koans 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |

Backbone Koans

25 | 26 | 27 |
28 | 29 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /practicals/jasmine-koans/templates/app.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Todos

4 |
5 | 6 |
7 |
8 | 9 | 10 |
11 | 12 |
13 |
    14 |
    15 | 16 |
    17 |
    18 |
    -------------------------------------------------------------------------------- /practicals/jasmine-koans/templates/item.html: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | /> 4 |
    5 | 6 |
    7 |
    8 | 9 |
    10 |
    -------------------------------------------------------------------------------- /practicals/jasmine-koans/templates/stats.html: -------------------------------------------------------------------------------- 1 | <% if (total) { %> 2 | 3 | <%= remaining %> 4 | <%= remaining == 1 ? 'item' : 'items' %> left. 5 | 6 | <% } %> 7 | <% if (done) { %> 8 | 9 | 10 | Clear <%= done %> 11 | completed <%= done == 1 ? 'item' : 'items' %> 12 | 13 | 14 | <% } %> -------------------------------------------------------------------------------- /practicals/modular-mobile-app/app/app-build.js: -------------------------------------------------------------------------------- 1 | ({ 2 | appDir: "./", 3 | baseUrl: "./", 4 | dir: "../release", 5 | paths: { 6 | 'backbone': 'libs/AMDbackbone-0.5.3', 7 | 'underscore': 'libs/underscore-1.2.2', 8 | 'jquery': 'libs/jQuery-1.7.1', 9 | 'json2': 'libs/json2', 10 | 'datepicker': 'libs/jQuery.ui.datepicker', 11 | 'datepickermobile': 'libs/jquery.ui.datepicker.mobile', 12 | 'jquerymobile': 'libs/jquery.mobile-1.0' 13 | }, 14 | optimize: "uglify", 15 | modules: [ 16 | { 17 | name: "app", 18 | exclude: [ 19 | // If you prefer not to include certain libs exclude them here 20 | ] 21 | } 22 | ] 23 | }) 24 | -------------------------------------------------------------------------------- /practicals/modular-mobile-app/app/app.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Flickly - Backbone jQuery Mobile demo 3 | * http://addyosmani.com 4 | * Copyright (c) 2011 Addy Osmani 5 | * Dual licensed under the MIT and GPL licenses. 6 | * 7 | */ 8 | define( ['backbone', 'views/appview', 'routers/workspace', 'utils', 'ui'], 9 | function( Backbone, AppView, Workspace, utils, ui ) { 10 | // Using ECMAScript 5 strict mode during development. By default r.js will ignore that. 11 | "use strict"; 12 | 13 | $(function(){ 14 | 15 | window.mobileSearch = window.mobileSearch || { 16 | views: { 17 | appview: new AppView 18 | }, 19 | routers:{ 20 | workspace:new Workspace() 21 | }, 22 | utils: utils, 23 | ui: ui, 24 | defaults:{ 25 | resultsPerPage: 16, 26 | safeSearch: 2, 27 | maxDate:'', 28 | minDate:'01/01/1970' 29 | } 30 | } 31 | 32 | 33 | window.mobileSearch.utils.toggleNavigation( false ); 34 | Backbone.history.start(); 35 | }); 36 | 37 | } ); 38 | -------------------------------------------------------------------------------- /practicals/modular-mobile-app/app/main.js: -------------------------------------------------------------------------------- 1 | require.config( { 2 | paths: { 3 | 'backbone': 'libs/AMDbackbone-0.5.3', 4 | 'underscore': 'libs/underscore-1.2.2', 5 | 'text': 'libs/require/text', 6 | 'jquery': 'libs/jquery-1.7.1', 7 | 'json2': 'libs/json2', 8 | 'datepicker': 'libs/jQuery.ui.datepicker', 9 | 'datepickermobile': 'libs/jquery.ui.datepicker.mobile', 10 | 'jquerymobile': 'libs/jquery.mobile-1.0' 11 | }, 12 | baseUrl: 'app' 13 | } ); 14 | 15 | require( 16 | ['require', 'underscore', 'backbone', 'jquery'], 17 | function( require, _, Backbone, $ ) { 18 | // framework loaded 19 | require( 20 | ['require', 'jquerymobile', 'json2', 'datepicker', 'datepickermobile', 21 | 'app'], 22 | function( require ) { 23 | 24 | // Global overrides to disable hashchange listening 25 | // (as opposed to using urlHistory.listeningEnabled) 26 | // This makes it easier to focus on using Backbone's own 27 | // routing: 28 | 29 | $.mobile.hashListeningEnabled = false; 30 | $.mobile.pushStateEnabled = false; 31 | $.mobile.page.prototype.options.degradeInputs.date = true; 32 | $( '#date-min, #date-max' ).datepicker(); 33 | 34 | } ); 35 | } ); 36 | -------------------------------------------------------------------------------- /practicals/modular-mobile-app/app/models/PhotoCollection.js: -------------------------------------------------------------------------------- 1 | define( ['jquery', 'backbone', 'models/ResultEntry'], 2 | function( $, Backbone, ResultEntry ) { 3 | // Using ECMAScript 5 strict mode during development. By default r.js will ignore that. 4 | "use strict"; 5 | 6 | 7 | var PhotoCollection = Backbone.Collection.extend( { 8 | model: ResultEntry 9 | } ); 10 | 11 | return PhotoCollection; 12 | } ); 13 | -------------------------------------------------------------------------------- /practicals/modular-mobile-app/app/models/ResultCollection.js: -------------------------------------------------------------------------------- 1 | define( ['jquery', 'backbone', 'models/ResultEntry'], 2 | function( $, Backbone, ResultEntry ) { 3 | // Using ECMAScript 5 strict mode during development. By default r.js will ignore that. 4 | "use strict"; 5 | 6 | var ResultCollection = Backbone.Collection.extend( { 7 | model: ResultEntry, 8 | parse: function( response ) { 9 | return response; 10 | } 11 | } ); 12 | 13 | return ResultCollection; 14 | } ); 15 | 16 | -------------------------------------------------------------------------------- /practicals/modular-mobile-app/app/models/ResultEntry.js: -------------------------------------------------------------------------------- 1 | define( ['backbone'], 2 | function( Backbone ) { 3 | // Using ECMAScript 5 strict mode during development. By default r.js will ignore that. 4 | "use strict"; 5 | 6 | var ResultEntry = Backbone.Model.extend( { 7 | } ); 8 | 9 | return ResultEntry; 10 | } ); 11 | -------------------------------------------------------------------------------- /practicals/modular-mobile-app/app/routers/workspace.js: -------------------------------------------------------------------------------- 1 | define( ['jquery', 'backbone'], 2 | function( $, Backbone ) { 3 | // Using ECMAScript 5 strict mode during development. By default r.js will ignore that. 4 | "use strict"; 5 | 6 | var Workspace = Backbone.Router.extend( { 7 | q:'', 8 | p:1, 9 | s:'relevance', 10 | bookmarkMode:false, 11 | routes: { 12 | "search/:query": "search", // #search/kiwis 13 | "search/:query/s:sort/p:page": "search", // #search/kiwis/srelevance/p7 14 | "photo/:id": "photo", //#photo/93839 15 | "" : "root" // 16 | }, 17 | search: function( query, sort, page ) { 18 | mobileSearch.utils.dfdQuery( 'search', mobileSearch.views.appview, query, sort, page ); 19 | }, 20 | photo: function ( id ) { 21 | mobileSearch.utils.dfdQuery( 'photo', mobileSearch.views.appview, id ); 22 | }, 23 | root: function() { 24 | this.bookmarkMode = true; 25 | mobileSearch.utils.changePage( "#index", "slide", false, false ); 26 | } 27 | } ); 28 | 29 | return Workspace; 30 | } ); 31 | -------------------------------------------------------------------------------- /practicals/modular-mobile-app/app/templates/listview.html: -------------------------------------------------------------------------------- 1 | <% _.each( results, function( item, i ){ %> 2 |
  • 3 | "> 4 | " src="<%= 'http://farm' + item.get("farm") + '.static.flickr.com/' + item.get("server") + '/' + item.get("id") + '_' + item.get("secret") + '_s.jpg' %>"/> 5 |

    <%= item.get("title") %>

    6 |
    7 |
  • 8 | <% }); %> -------------------------------------------------------------------------------- /practicals/modular-mobile-app/app/templates/photoview.html: -------------------------------------------------------------------------------- 1 | <% _.each( results, function( item, i ){ %> 2 | 3 | <%= item.get(" title="<%= item.get("title")._content %>" src="<%= 'http://farm' + item.get("farm") + '.static.flickr.com/' + item.get("server") + '/' + item.get("id") + '_' + item.get("secret") + '_m.jpg' %>"/> 4 | 5 | 18 | 19 | <% }); %> -------------------------------------------------------------------------------- /practicals/modular-mobile-app/app/ui.js: -------------------------------------------------------------------------------- 1 | define( ['jquery', 'utils' ], 2 | function( $, utils ) { 3 | // Using ECMAScript 5 strict mode during development. By default r.js will ignore that. 4 | "use strict"; 5 | 6 | var ui = {}; 7 | ui.nextOption = $( '#nextSet' ); 8 | ui.prevOption = $( '#prevSet' ); 9 | 10 | ui.nextOption.on( 'click', function( e ) { 11 | e.preventDefault(); 12 | utils.historySwitch( 'next' ); 13 | } ); 14 | 15 | ui.prevOption.on( 'click', function( e ) { 16 | e.preventDefault(); 17 | utils.historySwitch( 'prev' ); 18 | } ); 19 | 20 | return ui; 21 | } ); -------------------------------------------------------------------------------- /practicals/modular-mobile-app/app/views/appview.js: -------------------------------------------------------------------------------- 1 | define( ['jquery', 'backbone', 'utils', 'views/resultList', 'views/photoList'], 2 | function( $, Backbone, utils, ResultList, PhotoList ) { 3 | // Using ECMAScript 5 strict mode during development. By default r.js will ignore that. 4 | "use strict"; 5 | 6 | 7 | var AppView = Backbone.View.extend( { 8 | el: $( "#appview" ), 9 | 10 | events: { 11 | "submit #queryForm" : "keyLoadResults", 12 | "change #sortBy": "keyLoadResults", 13 | "keydown #searchbox" : "handleKey" 14 | }, 15 | 16 | setView: function( option ) { 17 | if ( option == 'search' ) { 18 | this.result_view = new ResultList; 19 | } 20 | else { 21 | this.photo_view = new PhotoList; 22 | } 23 | }, 24 | 25 | handleKey : function( event ) { 26 | }, 27 | 28 | keyLoadResults: function( event ) { 29 | var query = $( '#searchbox' ).val(); 30 | 31 | if ( query ) { 32 | 33 | var sort = $( '#sortBy' ).val(), 34 | endpoint = mobileSearch.utils.queryConstructor( query, sort, 1 ); 35 | location.hash = endpoint; 36 | 37 | } 38 | else { 39 | mobileSearch.utils.loadPrompt( 'Please enter a search query to continue' ); 40 | } 41 | return false; 42 | } 43 | } ); 44 | 45 | return AppView; 46 | } ); 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /practicals/modular-mobile-app/app/views/photoList.js: -------------------------------------------------------------------------------- 1 | define( ['jquery', 'backbone', 'underscore', 'models/PhotoCollection', 'text!templates/photoview.html'], 2 | function( $, Backbone, _ , PhotoCollection, photoTemplate) { 3 | // Using ECMAScript 5 strict mode during development. By default r.js will ignore that. 4 | "use strict"; 5 | 6 | var PhotoList = Backbone.View.extend( { 7 | el: $( "#photoviewholder" ), 8 | 9 | initialize: function() { 10 | this.collection = new PhotoCollection; 11 | _.bindAll(this, "renderList"); 12 | this.collection.bind( "reset", this.renderList ); 13 | }, 14 | 15 | renderList: function( collection ) { 16 | 17 | var compiled_template = _.template(photoTemplate), 18 | collection = this.collection, 19 | $el = $(this.el); 20 | 21 | mobileSearch.utils.loadPrompt( "Loading photo..." ); 22 | $( '#photo .ui-title' ).html( 'Photo view' ); 23 | $el.html( compiled_template( { results: collection.models } ) ); 24 | 25 | setTimeout( function() { 26 | $el.listview('refresh'); 27 | }, 0 ); 28 | 29 | } 30 | } ); 31 | 32 | return PhotoList; 33 | } ); 34 | -------------------------------------------------------------------------------- /practicals/modular-mobile-app/app/views/resultList.js: -------------------------------------------------------------------------------- 1 | define( ['jquery', 'backbone', 'underscore', 'models/ResultCollection', 'text!templates/listview.html'], 2 | function( $, Backbone, _, ResultCollection, listTemplate ) { 3 | // Using ECMAScript 5 strict mode during development. By default r.js will ignore that. 4 | "use strict"; 5 | 6 | var ResultList = Backbone.View.extend( { 7 | el: $( "#listviewholder" ), 8 | 9 | initialize: function() { 10 | this.collection = new ResultCollection; 11 | _.bindAll(this, "renderList"); 12 | this.collection.bind( "reset", this.renderList ); 13 | }, 14 | 15 | renderList: function() { 16 | 17 | var compiled_template = _.template( listTemplate ), 18 | collection = this.collection, 19 | $el = $(this.el); 20 | 21 | mobileSearch.utils.loadPrompt( "Loading results..." ); 22 | mobileSearch.utils.toggleNavigation( true ); 23 | $el.html( compiled_template( { results: collection.models } ) ); 24 | 25 | setTimeout( function() { 26 | $el.listview('refresh'); 27 | }, 0 ); 28 | 29 | } 30 | } ); 31 | 32 | return ResultList; 33 | }); 34 | -------------------------------------------------------------------------------- /practicals/modular-mobile-app/css/jquery.ui.datepicker.css: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI Datepicker @VERSION 3 | * 4 | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI/Datepicker#theming 9 | */ 10 | div.hasDatepicker{ display: block; padding: 0; overflow: visible; margin: 8px 0; } 11 | .ui-datepicker { overflow: visible; margin: 0; max-width: 500px; } 12 | .ui-datepicker .ui-datepicker-header { position:relative; padding:.4em 0; border-bottom: 0; font-weight: bold; } 13 | .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { padding: 1px 0 1px 2px; position:absolute; top: .5em; margin-top: 0; text-indent: -9999px; } 14 | 15 | .ui-datepicker .ui-datepicker-prev { left:6px; } 16 | .ui-datepicker .ui-datepicker-next { right:6px; } 17 | .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } 18 | .ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } 19 | .ui-datepicker select.ui-datepicker-month-year {width: 100%;} 20 | .ui-datepicker select.ui-datepicker-month, 21 | .ui-datepicker select.ui-datepicker-year { width: 49%;} 22 | .ui-datepicker table {width: 100%; border-collapse: collapse; margin:0; } 23 | .ui-datepicker td { border-width: 1px; padding: 0; text-align: center; } 24 | .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em 0; font-weight: bold; margin: 0; border-width: 0; text-align: center; text-decoration: none; } 25 | 26 | .ui-datepicker-calendar th { padding-top: .3em; padding-bottom: .3em; } 27 | .ui-datepicker-calendar th span, .ui-datepicker-calendar span.ui-state-default { opacity: .3; } 28 | .ui-datepicker-calendar td a { padding-top: .5em; padding-bottom: .5em; } 29 | 30 | .min-width-480px div.hasDatepicker { width: 63%; display: inline-block; margin: 0; } -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/bg_header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/bg_header.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/flickly.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/flickly.jpg -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/01-refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/01-refresh.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/02-redo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/02-redo.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/03-loopback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/03-loopback.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/04-squiggle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/04-squiggle.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/05-shuffle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/05-shuffle.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/06-magnify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/06-magnify.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/07-map-marker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/07-map-marker.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/08-chat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/08-chat.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/09-chat-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/09-chat-2.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/10-medical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/10-medical.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/100-coffee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/100-coffee.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/101-gameplan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/101-gameplan.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/102-walk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/102-walk.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/103-map.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/103-map.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/104-index-cards.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/104-index-cards.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/105-piano.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/105-piano.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/106-sliders.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/106-sliders.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/107-widescreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/107-widescreen.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/108-badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/108-badge.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/109-chicken.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/109-chicken.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/11-clock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/11-clock.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/110-bug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/110-bug.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/111-user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/111-user.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/112-group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/112-group.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/113-navigation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/113-navigation.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/114-balloon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/114-balloon.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/115-bow-and-arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/115-bow-and-arrow.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/116-controller.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/116-controller.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/117-todo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/117-todo.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/118-coat-hanger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/118-coat-hanger.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/119-piggy-bank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/119-piggy-bank.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/12-eye.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/12-eye.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/120-headphones.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/120-headphones.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/121-landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/121-landscape.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/122-stats.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/122-stats.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/123-id-card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/123-id-card.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/124-bullhorn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/124-bullhorn.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/125-food.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/125-food.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/126-moon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/126-moon.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/127-sock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/127-sock.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/128-bone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/128-bone.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/129-golf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/129-golf.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/13-target.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/13-target.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/130-dice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/130-dice.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/131-tower.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/131-tower.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/132-ghost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/132-ghost.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/133-ufo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/133-ufo.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/134-viking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/134-viking.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/135-hockeymask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/135-hockeymask.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/136-tractor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/136-tractor.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/137-presentation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/137-presentation.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/138-scales.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/138-scales.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/139-flags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/139-flags.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/14-tag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/14-tag.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/140-gradhat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/140-gradhat.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/141-lamp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/141-lamp.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/142-wine-bottle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/142-wine-bottle.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/143-liquor-bottle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/143-liquor-bottle.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/144-martini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/144-martini.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/145-persondot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/145-persondot.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/146-gavel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/146-gavel.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/147-popsicle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/147-popsicle.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/148-doghouse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/148-doghouse.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/149-windmill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/149-windmill.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/15-tags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/15-tags.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/150-sailboat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/150-sailboat.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/151-telescope.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/151-telescope.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/152-rolodex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/152-rolodex.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/153-guitar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/153-guitar.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/154-necktie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/154-necktie.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/155-bowtie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/155-bowtie.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/156-controlpad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/156-controlpad.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/157-wrench.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/157-wrench.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/158-wrench-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/158-wrench-2.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/159-voicemail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/159-voicemail.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/16-line-chart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/16-line-chart.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/160-voicemail-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/160-voicemail-2.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/161-calculator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/161-calculator.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/162-receipt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/162-receipt.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/163-glasses-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/163-glasses-1.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/164-glasses-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/164-glasses-2.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/165-glasses-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/165-glasses-3.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/166-newspaper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/166-newspaper.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/167-upload-photo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/167-upload-photo.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/168-upload-photo-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/168-upload-photo-2.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/169-8ball.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/169-8ball.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/17-bar-chart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/17-bar-chart.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/170-butterfly.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/170-butterfly.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/171-sun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/171-sun.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/172-pricetag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/172-pricetag.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/173-eyedropper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/173-eyedropper.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/174-imac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/174-imac.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/175-macbook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/175-macbook.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/176-ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/176-ipad.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/177-building.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/177-building.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/178-city.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/178-city.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/179-notepad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/179-notepad.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/18-envelope.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/18-envelope.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/180-stickynote.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/180-stickynote.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/181-hammer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/181-hammer.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/182-messenger-bag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/182-messenger-bag.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/183-genie-lamp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/183-genie-lamp.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/184-warning.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/184-warning.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/185-printer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/185-printer.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/186-ruler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/186-ruler.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/187-pencil.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/187-pencil.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/188-paint-roller.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/188-paint-roller.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/189-plant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/189-plant.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/19-gear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/19-gear.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/190-bank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/190-bank.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/191-collection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/191-collection.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/192-credit-card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/192-credit-card.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/193-location-arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/193-location-arrow.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/194-note-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/194-note-2.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/195-barcode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/195-barcode.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/196-radiation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/196-radiation.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/197-card-diamonds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/197-card-diamonds.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/198-card-spades.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/198-card-spades.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/199-card-hearts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/199-card-hearts.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/20-gear2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/20-gear2.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/200-card-clubs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/200-card-clubs.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/21-skull.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/21-skull.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/22-skull-n-bones.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/22-skull-n-bones.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/23-bird.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/23-bird.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/24-gift.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/24-gift.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/25-weather.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/25-weather.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/26-bandaid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/26-bandaid.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/27-planet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/27-planet.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/28-star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/28-star.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/29-heart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/29-heart.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/30-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/30-key.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/31-ipod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/31-ipod.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/32-iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/32-iphone.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/33-cabinet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/33-cabinet.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/34-coffee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/34-coffee.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/35-shopping.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/35-shopping.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/36-toolbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/36-toolbox.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/37-suitcase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/37-suitcase.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/38-airplane.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/38-airplane.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/39-spraycan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/39-spraycan.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/40-inbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/40-inbox.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/41-picture-frame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/41-picture-frame.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/42-photos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/42-photos.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/43-film-roll.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/43-film-roll.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/44-shoebox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/44-shoebox.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/45-movie-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/45-movie-1.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/46-movie-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/46-movie-2.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/47-fuel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/47-fuel.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/48-fork-and-knife.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/48-fork-and-knife.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/49-battery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/49-battery.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/50-beaker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/50-beaker.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/51-outlet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/51-outlet.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/52-pine-tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/52-pine-tree.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/53-house.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/53-house.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/54-lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/54-lock.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/55-network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/55-network.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/56-cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/56-cloud.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/57-download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/57-download.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/58-bookmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/58-bookmark.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/59-flag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/59-flag.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/60-signpost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/60-signpost.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/61-brightness.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/61-brightness.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/62-contrast.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/62-contrast.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/63-runner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/63-runner.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/64-zap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/64-zap.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/65-note.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/65-note.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/66-microphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/66-microphone.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/67-tshirt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/67-tshirt.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/68-paperclip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/68-paperclip.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/69-display.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/69-display.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/70-tv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/70-tv.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/71-compass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/71-compass.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/72-pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/72-pin.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/73-radar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/73-radar.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/74-location.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/74-location.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/75-phone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/75-phone.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/76-baby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/76-baby.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/77-ekg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/77-ekg.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/78-stopwatch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/78-stopwatch.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/79-medical-bag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/79-medical-bag.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/80-shopping-cart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/80-shopping-cart.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/81-dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/81-dashboard.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/82-dog-paw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/82-dog-paw.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/83-calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/83-calendar.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/84-lightbulb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/84-lightbulb.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/85-trophy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/85-trophy.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/86-camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/86-camera.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/87-wine-glass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/87-wine-glass.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/88-beer-mug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/88-beer-mug.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/89-dumbell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/89-dumbell.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/90-life-buoy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/90-life-buoy.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/91-beaker-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/91-beaker-2.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/92-test-tube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/92-test-tube.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/93-thermometer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/93-thermometer.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/94-pill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/94-pill.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/95-equalizer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/95-equalizer.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/96-book.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/96-book.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/97-puzzle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/97-puzzle.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/98-palette.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/98-palette.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/99-umbrella.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/99-umbrella.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/demo.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/facebook.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/github.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/icons/twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/icons/twitter.png -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/loader.gif -------------------------------------------------------------------------------- /practicals/modular-mobile-app/img/ribbon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-mobile-app/img/ribbon.png -------------------------------------------------------------------------------- /practicals/modular-todo-app/css/destroy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/modular-todo-app/css/destroy.png -------------------------------------------------------------------------------- /practicals/modular-todo-app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Modular Todo App 5 | 6 | 7 | 8 | 9 | 10 |
    11 | 12 |
    13 |

    Todos

    14 |
    15 | 16 |
    17 | 18 |
    19 | 20 | 21 |
    22 | 23 |
    24 |
      25 |
      26 | 27 |
      28 | 29 |
      30 |
      31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /practicals/modular-todo-app/js/collections/todos.js: -------------------------------------------------------------------------------- 1 | define([ 2 | 'underscore', 3 | 'backbone', 4 | 'storage', 5 | 'models/todo' 6 | ], function(_, Backbone, Store, Todo){ 7 | 8 | var TodosCollection = Backbone.Collection.extend({ 9 | 10 | // Reference to this collection's model. 11 | model: Todo, 12 | 13 | // Save all of the todo items under the `"todos"` namespace. 14 | localStorage: new Store('todos'), 15 | 16 | // Filter down the list of all todo items that are finished. 17 | done: function() { 18 | return this.filter(function(todo){ return todo.get('done'); }); 19 | }, 20 | 21 | // Filter down the list to only todo items that are still not finished. 22 | remaining: function() { 23 | return this.without.apply(this, this.done()); 24 | }, 25 | 26 | // We keep the Todos in sequential order, despite being saved by unordered 27 | // GUID in the database. This generates the next order number for new items. 28 | nextOrder: function() { 29 | if (!this.length) return 1; 30 | return this.last().get('order') + 1; 31 | }, 32 | 33 | // Todos are sorted by their original insertion order. 34 | comparator: function(todo) { 35 | return todo.get('order'); 36 | } 37 | 38 | }); 39 | return new TodosCollection(); 40 | }); 41 | -------------------------------------------------------------------------------- /practicals/modular-todo-app/js/main.js: -------------------------------------------------------------------------------- 1 | // Filename: main.js 2 | 3 | // Require.js allows us to configure mappings to paths 4 | // as demonstrated below: 5 | require.config({ 6 | paths: { 7 | jquery: 'libs/jquery/jquery-min', 8 | underscore: 'libs/underscore/underscore-min', 9 | backbone: 'libs/backbone/backbone', 10 | 11 | // storage has built in support for requirejs 12 | // hence, it doesn't need to configured in 'shim' 13 | storage: 'libs/backbone/backbone.localStorage', 14 | text: 'libs/require/text' 15 | }, 16 | 17 | shim: { 18 | 19 | underscore: { 20 | exports: '_' 21 | }, 22 | 23 | backbone: { 24 | deps: [ 'underscore', 'jquery' ], 25 | exports: 'Backbone' 26 | } 27 | } 28 | 29 | }); 30 | 31 | require([ 'views/app', 'collections/todos' ], function(AppView, AppCollection){ 32 | var app_view = new AppView({ 33 | collection: AppCollection 34 | }); 35 | }); 36 | -------------------------------------------------------------------------------- /practicals/modular-todo-app/js/models/todo.js: -------------------------------------------------------------------------------- 1 | define(['underscore', 'backbone'], function(_, Backbone) { 2 | var TodoModel = Backbone.Model.extend({ 3 | 4 | // Default attributes for the todo. 5 | defaults: { 6 | content: 'empty todo...', 7 | done: false 8 | }, 9 | 10 | // Ensure that each todo created has `content`. 11 | initialize: function() { 12 | if (!this.get('content')) { 13 | this.set({'content': this.defaults.content}); 14 | } 15 | }, 16 | 17 | // Toggle the `done` state of this todo item. 18 | toggle: function() { 19 | this.save({done: !this.get('done')}); 20 | }, 21 | 22 | // Remove this Todo from *localStorage* 23 | clear: function() { 24 | this.destroy(); 25 | } 26 | 27 | }); 28 | return TodoModel; 29 | }); 30 | -------------------------------------------------------------------------------- /practicals/modular-todo-app/js/templates/stats.html: -------------------------------------------------------------------------------- 1 | <% if (total) { %> 2 | 3 | <%= remaining %> 4 | <%= remaining == 1 ? 'item' : 'items' %> left. 5 | 6 | <% } %> 7 | <% if (done) { %> 8 | 9 | 10 | Clear <%= done %> 11 | completed <%= done == 1 ? 'item' : 'items' %> 12 | 13 | 14 | <% } %> 15 | -------------------------------------------------------------------------------- /practicals/modular-todo-app/js/templates/todos.html: -------------------------------------------------------------------------------- 1 |
      2 |
      3 | /> 4 |
      <%- content %>
      5 | 6 |
      7 |
      8 | 9 |
      10 |
      11 | -------------------------------------------------------------------------------- /practicals/qunit-koans/css/koansReporter.css: -------------------------------------------------------------------------------- 1 | html { 2 | margin: 20px; 3 | } 4 | 5 | h2 { 6 | margin: 18px 0; 7 | } 8 | 9 | #summary { 10 | font-size: 18px; 11 | } 12 | 13 | .alert-message { 14 | margin-bottom: 6px; 15 | } -------------------------------------------------------------------------------- /practicals/qunit-koans/images/destroy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/qunit-koans/images/destroy.png -------------------------------------------------------------------------------- /practicals/qunit-koans/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Backbone Demo: Todos 5 | 6 | 7 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | To the Koans »  32 | 33 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /practicals/qunit-koans/js/ext/template.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | var cache = {}; 3 | 4 | function _render(elt, template, data, callback) { 5 | var data = data || {}, 6 | callback = callback || function() {}, 7 | html = template(data); 8 | 9 | elt.append(html); 10 | callback(); 11 | } 12 | 13 | /** 14 | * Fetches the Underscore.js template at the given path, 15 | * processes it with the provided data object, and appends the 16 | * resulting html to the matched DOM elements. 17 | * 18 | * Templates will only be fetched once from the server, 19 | * preprocessed template are cached in the DOM. 20 | */ 21 | $.fn.template = function(path, obj, callback) { 22 | var self = this; 23 | 24 | if (cache[path]) { 25 | _render(self, cache[path], obj, callback); 26 | return self; 27 | } 28 | 29 | $.get(path, function(data) { 30 | cache[path] = _.template(data); 31 | _render(self, cache[path], obj, callback); 32 | }); 33 | 34 | return self; 35 | }; 36 | })(jQuery); -------------------------------------------------------------------------------- /practicals/qunit-koans/js/koans/aboutApps.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | module('About Backbone Applications', { 4 | 5 | setup: function() { 6 | Backbone.localStorageDB = new Store('testTodos'); 7 | $('#qunit-fixture').append('
      '); 8 | this.App = new TodoApp({ appendTo: $('#app') }); 9 | }, 10 | 11 | teardown: function() { 12 | this.App.todos.reset(); 13 | $('#app').remove(); 14 | } 15 | 16 | }); 17 | 18 | test('Should bootstrap the application by initializing the Collection.', function() { 19 | expect(2); 20 | notEqual(this.App.todos, undefined); 21 | equal(this.App.todos.length, 0); 22 | }); 23 | 24 | /* 25 | test('Should bind Collection events to View creation.', function() { 26 | $('#new-todo').val('Foo'); 27 | $('#new-todo').trigger(new $.Event('keypress', { keyCode: 13 })); 28 | equal(this.App.todos.length, 1); 29 | }); 30 | 31 | */ -------------------------------------------------------------------------------- /practicals/qunit-koans/js/koans/aboutCollections.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | module('About Backbone.Collection'); 4 | 5 | test('Can add Model instances as objects and arrays.', function() { 6 | 7 | expect(3); 8 | 9 | var todos = new TodoList(); 10 | 11 | equal(todos.length, 0); 12 | 13 | todos.add({ text: 'Clean the kitchen' }); 14 | 15 | console.log(todos); 16 | 17 | equal(todos.length, 1); 18 | 19 | todos.add([ 20 | { text: 'Do the laundry', done: true }, 21 | { text: 'Go to the gym'} 22 | ]); 23 | 24 | equal(todos.length, 3); 25 | }); 26 | 27 | test('Can have a url property to define the basic url structure for all contained models.', function() { 28 | expect(1); 29 | var todos = new TodoList(); 30 | equal(todos.url, '/todos/'); 31 | }); 32 | 33 | test('Fires custom named events when the models change.', function() { 34 | 35 | expect(2); 36 | var todos = new TodoList(); 37 | 38 | var addModelCallback = function(){ 39 | ok( true, 'add model callback called'); 40 | start(); 41 | } 42 | 43 | stop(); 44 | todos.bind('add', addModelCallback); 45 | 46 | // How would you get the 'add' event to trigger? 47 | todos.add({text:"New todo"}); 48 | 49 | var removeModelCallback = function(){ 50 | ok( true, 'remove model callback called'); 51 | start(); 52 | } 53 | 54 | stop(); 55 | todos.bind('remove', removeModelCallback); 56 | 57 | // How would you get the 'remove' callback to trigger? 58 | todos.remove(todos.last()); 59 | 60 | }); 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /practicals/qunit-koans/specrunner.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Backbone Koans 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |

      Backbone Koans

      25 | 26 |

      QUnit Test Suite

      27 |

      28 |
      29 |

      30 |
        31 |
        test markup, will be hidden
        32 | 33 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /practicals/qunit-koans/templates/app.html: -------------------------------------------------------------------------------- 1 |
        2 |
        3 |

        Todos

        4 |
        5 | 6 |
        7 |
        8 | 9 | 10 |
        11 | 12 |
        13 |
          14 |
          15 | 16 |
          17 |
          18 |
          -------------------------------------------------------------------------------- /practicals/qunit-koans/templates/item.html: -------------------------------------------------------------------------------- 1 |
          2 |
          3 | /> 4 |
          5 | 6 |
          7 |
          8 | 9 |
          10 |
          -------------------------------------------------------------------------------- /practicals/qunit-koans/templates/stats.html: -------------------------------------------------------------------------------- 1 | <% if (total) { %> 2 | 3 | <%= remaining %> 4 | <%= remaining == 1 ? 'item' : 'items' %> left. 5 | 6 | <% } %> 7 | <% if (done) { %> 8 | 9 | 10 | Clear <%= done %> 11 | completed <%= done == 1 ? 'item' : 'items' %> 12 | 13 | 14 | <% } %> -------------------------------------------------------------------------------- /practicals/stacks/option1/install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | npm install express 3 | npm install mongodb --mongodb:native 4 | npm install mongoose 5 | npm install jade 6 | -------------------------------------------------------------------------------- /practicals/stacks/option1/public/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Page Not Found :( 6 | 18 | 19 | 20 |
          21 |

          Not found :(

          22 |
          23 |

          Sorry, but the page you were trying to view does not exist.

          24 |

          It looks like this was the result of either:

          25 | 29 |
          30 | 31 | 35 | 36 |
          37 | 38 | -------------------------------------------------------------------------------- /practicals/stacks/option1/public/crossdomain.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 19 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /practicals/stacks/option1/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/stacks/option1/public/favicon.ico -------------------------------------------------------------------------------- /practicals/stacks/option1/public/humans.txt: -------------------------------------------------------------------------------- 1 | /* the humans responsible & colophon */ 2 | /* humanstxt.org */ 3 | 4 | 5 | /* TEAM */ 6 | : 7 | Site: 8 | Twitter: 9 | Location: 10 | 11 | /* THANKS */ 12 | Names (& URL): 13 | 14 | /* SITE */ 15 | Standards: HTML5, CSS3 16 | Components: Modernizr, jQuery 17 | Software: 18 | 19 | 20 | 21 | -o/- 22 | +oo//- 23 | :ooo+//: 24 | -ooooo///- 25 | /oooooo//: 26 | :ooooooo+//- 27 | -+oooooooo///- 28 | -://////////////+oooooooooo++////////////:: 29 | :+ooooooooooooooooooooooooooooooooooooo+:::- 30 | -/+ooooooooooooooooooooooooooooooo+/::////:- 31 | -:+oooooooooooooooooooooooooooo/::///////:- 32 | --/+ooooooooooooooooooooo+::://////:- 33 | -:+ooooooooooooooooo+:://////:-- 34 | /ooooooooooooooooo+//////:- 35 | -ooooooooooooooooooo////- 36 | /ooooooooo+oooooooooo//: 37 | :ooooooo+/::/+oooooooo+//- 38 | -oooooo/::///////+oooooo///- 39 | /ooo+::://////:---:/+oooo//: 40 | -o+/::///////:- -:/+o+//- 41 | :-:///////:- -:/:// 42 | -////:- --//: 43 | -- -: 44 | -------------------------------------------------------------------------------- /practicals/stacks/option1/public/img/.gitignore: -------------------------------------------------------------------------------- 1 | !.gitignore 2 | 3 | -------------------------------------------------------------------------------- /practicals/stacks/option1/public/img/destroy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/stacks/option1/public/img/destroy.png -------------------------------------------------------------------------------- /practicals/stacks/option1/public/js/mylibs/.gitignore: -------------------------------------------------------------------------------- 1 | !.gitignore 2 | 3 | -------------------------------------------------------------------------------- /practicals/stacks/option1/public/js/plugins.js: -------------------------------------------------------------------------------- 1 | window.log=function(){log.history=log.history||[];log.history.push(arguments);if(this.console){arguments.callee=arguments.callee.caller;var a=[].slice.call(arguments);(typeof console.log==="object"?log.apply.call(console.log,console,a):console.log.apply(console,a))}}; 2 | (function(b){function c(){}for(var d="assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,timeStamp,profile,profileEnd,time,timeEnd,trace,warn".split(","),a;a=d.pop();){b[a]=b[a]||c}})((function(){try 3 | {console.log();return window.console;}catch(err){return window.console={};}})()); 4 | 5 | 6 | -------------------------------------------------------------------------------- /practicals/stacks/option1/public/robots.txt: -------------------------------------------------------------------------------- 1 | # www.robotstxt.org/ 2 | # www.google.com/support/webmasters/bin/answer.py?hl=en&answer=156449 3 | 4 | User-agent: * 5 | 6 | -------------------------------------------------------------------------------- /practicals/stacks/option1/public/test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | QUnit Tests 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |

          QUnit Test Suite

          25 |

          26 |
          27 |

          28 |
            29 |
            test markup
            30 | 31 | 32 | -------------------------------------------------------------------------------- /practicals/stacks/option1/public/test/tests.js: -------------------------------------------------------------------------------- 1 | 2 | // documentation on writing tests here: http://docs.jquery.com/QUnit 3 | // example tests: https://github.com/jquery/qunit/blob/master/test/same.js 4 | 5 | // below are some general tests but feel free to delete them. 6 | 7 | module("example tests"); 8 | test("HTML5 Boilerplate is sweet",function(){ 9 | expect(1); 10 | equals("boilerplate".replace("boilerplate","sweet"),"sweet","Yes. HTML5 Boilerplate is, in fact, sweet"); 11 | 12 | }) 13 | 14 | // these test things from plugins.js 15 | test("Environment is good",function(){ 16 | expect(3); 17 | ok( !!window.log, "log function present"); 18 | 19 | var history = log.history && log.history.length || 0; 20 | log("logging from the test suite.") 21 | equals( log.history.length - history, 1, "log history keeps track" ) 22 | 23 | ok( !!window.Modernizr, "Modernizr global is present") 24 | }) 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /practicals/stacks/option2/install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | npm install express 3 | npm install mongodb --mongodb:native 4 | npm install mongoose 5 | npm install jade 6 | -------------------------------------------------------------------------------- /practicals/stacks/option2/public/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Page Not Found :( 6 | 18 | 19 | 20 |
            21 |

            Not found :(

            22 |
            23 |

            Sorry, but the page you were trying to view does not exist.

            24 |

            It looks like this was the result of either:

            25 |
              26 |
            • a mistyped address
            • 27 |
            • an out-of-date link
            • 28 |
            29 |
            30 | 31 | 35 | 36 |
            37 | 38 | -------------------------------------------------------------------------------- /practicals/stacks/option2/public/crossdomain.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 19 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /practicals/stacks/option2/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/stacks/option2/public/favicon.ico -------------------------------------------------------------------------------- /practicals/stacks/option2/public/humans.txt: -------------------------------------------------------------------------------- 1 | /* the humans responsible & colophon */ 2 | /* humanstxt.org */ 3 | 4 | 5 | /* TEAM */ 6 | : 7 | Site: 8 | Twitter: 9 | Location: 10 | 11 | /* THANKS */ 12 | Names (& URL): 13 | 14 | /* SITE */ 15 | Standards: HTML5, CSS3 16 | Components: Modernizr, jQuery 17 | Software: 18 | 19 | 20 | 21 | -o/- 22 | +oo//- 23 | :ooo+//: 24 | -ooooo///- 25 | /oooooo//: 26 | :ooooooo+//- 27 | -+oooooooo///- 28 | -://////////////+oooooooooo++////////////:: 29 | :+ooooooooooooooooooooooooooooooooooooo+:::- 30 | -/+ooooooooooooooooooooooooooooooo+/::////:- 31 | -:+oooooooooooooooooooooooooooo/::///////:- 32 | --/+ooooooooooooooooooooo+::://////:- 33 | -:+ooooooooooooooooo+:://////:-- 34 | /ooooooooooooooooo+//////:- 35 | -ooooooooooooooooooo////- 36 | /ooooooooo+oooooooooo//: 37 | :ooooooo+/::/+oooooooo+//- 38 | -oooooo/::///////+oooooo///- 39 | /ooo+::://////:---:/+oooo//: 40 | -o+/::///////:- -:/+o+//- 41 | :-:///////:- -:/:// 42 | -////:- --//: 43 | -- -: 44 | -------------------------------------------------------------------------------- /practicals/stacks/option2/public/img/.gitignore: -------------------------------------------------------------------------------- 1 | !.gitignore 2 | 3 | -------------------------------------------------------------------------------- /practicals/stacks/option2/public/img/destroy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/stacks/option2/public/img/destroy.png -------------------------------------------------------------------------------- /practicals/stacks/option2/public/js/mylibs/.gitignore: -------------------------------------------------------------------------------- 1 | !.gitignore 2 | 3 | -------------------------------------------------------------------------------- /practicals/stacks/option2/public/js/plugins.js: -------------------------------------------------------------------------------- 1 | window.log=function(){log.history=log.history||[];log.history.push(arguments);if(this.console){arguments.callee=arguments.callee.caller;var a=[].slice.call(arguments);(typeof console.log==="object"?log.apply.call(console.log,console,a):console.log.apply(console,a))}}; 2 | (function(b){function c(){}for(var d="assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,timeStamp,profile,profileEnd,time,timeEnd,trace,warn".split(","),a;a=d.pop();){b[a]=b[a]||c}})((function(){try 3 | {console.log();return window.console;}catch(err){return window.console={};}})()); 4 | 5 | 6 | -------------------------------------------------------------------------------- /practicals/stacks/option2/public/robots.txt: -------------------------------------------------------------------------------- 1 | # www.robotstxt.org/ 2 | # www.google.com/support/webmasters/bin/answer.py?hl=en&answer=156449 3 | 4 | User-agent: * 5 | 6 | -------------------------------------------------------------------------------- /practicals/stacks/option2/public/test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | QUnit Tests 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |

            QUnit Test Suite

            25 |

            26 |
            27 |

            28 |
              29 |
              test markup
              30 | 31 | 32 | -------------------------------------------------------------------------------- /practicals/stacks/option2/public/test/tests.js: -------------------------------------------------------------------------------- 1 | 2 | // documentation on writing tests here: http://docs.jquery.com/QUnit 3 | // example tests: https://github.com/jquery/qunit/blob/master/test/same.js 4 | 5 | // below are some general tests but feel free to delete them. 6 | 7 | module("example tests"); 8 | test("HTML5 Boilerplate is sweet",function(){ 9 | expect(1); 10 | equals("boilerplate".replace("boilerplate","sweet"),"sweet","Yes. HTML5 Boilerplate is, in fact, sweet"); 11 | 12 | }) 13 | 14 | // these test things from plugins.js 15 | test("Environment is good",function(){ 16 | expect(3); 17 | ok( !!window.log, "log function present"); 18 | 19 | var history = log.history && log.history.length || 0; 20 | log("logging from the test suite.") 21 | equals( log.history.length - history, 1, "log history keeps track" ) 22 | 23 | ok( !!window.Modernizr, "Modernizr global is present") 24 | }) 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /practicals/stacks/option2/views/layout.jade: -------------------------------------------------------------------------------- 1 | !!! 5 2 | //if lt IE 8 3 | 4 | //if IE 7 5 | 6 | //if IE 8 7 | 8 | //if gt IE 8 9 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 19 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /practicals/stacks/option3/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/stacks/option3/public/favicon.ico -------------------------------------------------------------------------------- /practicals/stacks/option3/public/humans.txt: -------------------------------------------------------------------------------- 1 | /* the humans responsible & colophon */ 2 | /* humanstxt.org */ 3 | 4 | 5 | /* TEAM */ 6 | : 7 | Site: 8 | Twitter: 9 | Location: 10 | 11 | /* THANKS */ 12 | Names (& URL): 13 | 14 | /* SITE */ 15 | Standards: HTML5, CSS3 16 | Components: Modernizr, jQuery 17 | Software: 18 | 19 | 20 | 21 | -o/- 22 | +oo//- 23 | :ooo+//: 24 | -ooooo///- 25 | /oooooo//: 26 | :ooooooo+//- 27 | -+oooooooo///- 28 | -://////////////+oooooooooo++////////////:: 29 | :+ooooooooooooooooooooooooooooooooooooo+:::- 30 | -/+ooooooooooooooooooooooooooooooo+/::////:- 31 | -:+oooooooooooooooooooooooooooo/::///////:- 32 | --/+ooooooooooooooooooooo+::://////:- 33 | -:+ooooooooooooooooo+:://////:-- 34 | /ooooooooooooooooo+//////:- 35 | -ooooooooooooooooooo////- 36 | /ooooooooo+oooooooooo//: 37 | :ooooooo+/::/+oooooooo+//- 38 | -oooooo/::///////+oooooo///- 39 | /ooo+::://////:---:/+oooo//: 40 | -o+/::///////:- -:/+o+//- 41 | :-:///////:- -:/:// 42 | -////:- --//: 43 | -- -: 44 | -------------------------------------------------------------------------------- /practicals/stacks/option3/public/img/.gitignore: -------------------------------------------------------------------------------- 1 | !.gitignore 2 | 3 | -------------------------------------------------------------------------------- /practicals/stacks/option3/public/img/destroy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/stacks/option3/public/img/destroy.png -------------------------------------------------------------------------------- /practicals/stacks/option3/public/js/mylibs/.gitignore: -------------------------------------------------------------------------------- 1 | !.gitignore 2 | 3 | -------------------------------------------------------------------------------- /practicals/stacks/option3/public/js/plugins.js: -------------------------------------------------------------------------------- 1 | window.log=function(){log.history=log.history||[];log.history.push(arguments);if(this.console){arguments.callee=arguments.callee.caller;var a=[].slice.call(arguments);(typeof console.log==="object"?log.apply.call(console.log,console,a):console.log.apply(console,a))}}; 2 | (function(b){function c(){}for(var d="assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,timeStamp,profile,profileEnd,time,timeEnd,trace,warn".split(","),a;a=d.pop();){b[a]=b[a]||c}})((function(){try 3 | {console.log();return window.console;}catch(err){return window.console={};}})()); 4 | 5 | 6 | -------------------------------------------------------------------------------- /practicals/stacks/option3/public/robots.txt: -------------------------------------------------------------------------------- 1 | # www.robotstxt.org/ 2 | # www.google.com/support/webmasters/bin/answer.py?hl=en&answer=156449 3 | 4 | User-agent: * 5 | 6 | -------------------------------------------------------------------------------- /practicals/stacks/option3/views/index.haml: -------------------------------------------------------------------------------- 1 | Welcome -------------------------------------------------------------------------------- /practicals/stacks/option3/views/todo.haml: -------------------------------------------------------------------------------- 1 | / Todo App Interface 2 | 3 | %div#todoapp 4 | %div.title 5 | %h1 6 | Todos 7 | %div.content 8 | %div#create-todo 9 | %input#new-todo{"placeholder" => "What needs to be done?", "type" => "text"}/ 10 | %span.ui-tooltip-top{"style" => "display:none;"} Press Enter to save this task 11 | %div#todos 12 | %ul#todo-list 13 | %div#todo-stats 14 | 15 | / Templates 16 | 17 | / Can't figure out how to tell HAML not to escape the raw HTML lines 18 | %script#item-template{"type" => "text/template"} 19 |
              20 | %div.display 21 | /> 22 | %div.todo-text 23 | %span#todo-destroy 24 | %div.edit 25 | %input.todo-input{"type" => "text", "value" =>""}/ 26 |
              27 | 28 | %script#stats-template{"type" => "text/template"} 29 | <% if (total) { %> 30 | %span.todo-count 31 | %span.number <%= remaining %> 32 | %span.word <%= remaining == 1 ? 'item' : 'items' %> 33 | left. 34 | <% } %> 35 | <% if (done) { %> 36 | %span.todo-clear 37 | %a{"href" => "#"} 38 | Clear 39 | %span.number-done <%= done %> 40 | completed 41 | %span.word-done <%= done == 1 ? 'item' : 'items' %> 42 | <% } %> 43 | -------------------------------------------------------------------------------- /practicals/todo-jqm-app/.gitignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | .idea/ 3 | npm-debug.log 4 | .lock-wscript 5 | 6 | -------------------------------------------------------------------------------- /practicals/todo-jqm-app/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | backbone.js-jquerymobile-boilerplate-template 4 | 5 | 6 | 7 | 8 | 9 | com.aptana.ide.core.unifiedBuilder 10 | 11 | 12 | 13 | 14 | 15 | com.aptana.ruby.core.rubynature 16 | 17 | 18 | -------------------------------------------------------------------------------- /practicals/todo-jqm-app/app/common.js: -------------------------------------------------------------------------------- 1 | define([], function() { 2 | return { 3 | TodoFilter: '', 4 | ENTER_KEY: 13 5 | }; 6 | }); 7 | -------------------------------------------------------------------------------- /practicals/todo-jqm-app/app/config.js: -------------------------------------------------------------------------------- 1 | require.config({ 2 | deps : ["main"], 3 | //dir: "../app-build", 4 | paths : { 5 | // JavaScript folders 6 | libs : "../assets/js/libs", 7 | plugins : "../assets/js/plugins", 8 | 9 | //Uncompressed Libraries 10 | jquery : "../assets/js/libs/jquery", // 1.8.3 11 | 'jquerymobile.config' : 'jquerymobile.config', 12 | jquerymobile : "../assets/js/libs/jquerymobile", // jquery.mobile-1.3.0-rc.1.js with default template 13 | lodash : "../assets/js/libs/lodash", 14 | // underscore : "../assets/js/libs/underscore", 15 | backbone : "../assets/js/libs/backbone", 16 | backbone_super : "../assets/js/libs/backbone_super", 17 | localstorage : "../assets/js/libs/localstorage", 18 | handlebars : "../assets/js/libs/handlebars", 19 | 'handlebars.compiled' : "../dist/debug/handlebars_packaged" 20 | 21 | }, 22 | 23 | shim : { 24 | backbone : { 25 | deps : ["lodash", "jquery"], 26 | exports : "Backbone" 27 | }, 28 | backbone_super : { 29 | deps : ["backbone"], 30 | exports : "_super" 31 | }, 32 | handlebars : { 33 | exports : "Handlebars" 34 | }, 35 | 'handlebars.compiled' : ['handlebars'], 36 | 'jquerymobile.config' : ['jquery'], 37 | jquerymobile : { 38 | deps : ["jquery", 'jquerymobile.config'] 39 | }, 40 | // lodash : { 41 | // deps : ["backbone"], 42 | // exports : "_" 43 | // }, 44 | } 45 | }); 46 | -------------------------------------------------------------------------------- /practicals/todo-jqm-app/app/handlebars_helpers.js: -------------------------------------------------------------------------------- 1 | define(['handlebars'], function (Handlebars) { 2 | 3 | return function () { 4 | Handlebars.registerHelper('whatis', function (param) { 5 | console.log(param); 6 | }); 7 | 8 | // https://github.com/wycats/handlebars.js/issues/182 9 | Handlebars.registerHelper('$', function ( child, options ) { 10 | if ( typeof child !== 'object' ) { 11 | return ''; 12 | } 13 | child['$_'] = this; 14 | return options.fn( child ); 15 | }); 16 | 17 | Handlebars.registerHelper('ifequal', function (val1, val2, fn, elseFn) { 18 | if (val1 === val2) { 19 | return fn(); 20 | } 21 | else if (elseFn) { 22 | return elseFn(); 23 | } 24 | }); 25 | }(); 26 | }); 27 | 28 | 29 | -------------------------------------------------------------------------------- /practicals/todo-jqm-app/app/initialize.config.js: -------------------------------------------------------------------------------- 1 | define(['jquery', 'handlebars'], function ($, Handlebars) { 2 | var settings = {}; 3 | settings.init = function () { 4 | Handlebars.templates = window.JST; 5 | // Handlebars.partials = Handlebars.templates; 6 | 7 | // All navigation that is relative should be passed through the navigate 8 | // method, to be processed by the router. If the link has a `data-bypass` 9 | // attribute, bypass the delegation completely. 10 | $(document).on("click", "a:not([data-bypass])", function (evt) { 11 | // Get the anchor href and protcol 12 | var href = $(this).attr("href"); 13 | var protocol = this.protocol + "//"; 14 | 15 | // Ensure the protocol is not part of URL, meaning it's relative. 16 | if (href && href.slice(0, protocol.length) !== protocol && 17 | href.indexOf("javascript:") !== 0) { 18 | // Stop the default event to ensure the link will not cause a page 19 | // refresh. 20 | evt.preventDefault(); 21 | 22 | // `Backbone.history.navigate` is sufficient for all Routers and will 23 | // trigger the correct events. The Router's internal `navigate` method 24 | // calls this anyways. 25 | Backbone.history.navigate(href, true); 26 | } 27 | }); 28 | }; 29 | return settings; 30 | }); 31 | -------------------------------------------------------------------------------- /practicals/todo-jqm-app/app/jquerymobile.config.js: -------------------------------------------------------------------------------- 1 | define(['jquery'], function ($) { 2 | 3 | $(document).on("mobileinit", function () { 4 | 5 | // disable hash-routing 6 | $.mobile.hashListeningEnabled = false; 7 | // disable anchor-control 8 | $.mobile.linkBindingEnabled = false; 9 | // can cause calling object creation twice and back button issues are solved 10 | $.mobile.ajaxEnabled = false; 11 | // Otherwise on first page load, it needs to be a page present 12 | // $.mobile.autoInitializePage = false; 13 | // we want to handle caching and cleaning the DOM ourselves 14 | $.mobile.page.prototype.options.domCache = false; 15 | 16 | // consider due to performance & compatibility issues 17 | // not always supported by browsers 18 | $.mobile.pushStateEnabled = false; 19 | $.mobile.defaultPageTransition = "none"; 20 | $.mobile.defaultDialogTransition = "none"; 21 | $.mobile.page.prototype.options.degradeInputs.date = true; 22 | // Solving phonegap issues with back button 23 | $.mobile.phonegapNavigationEnabled = true; 24 | 25 | 26 | }); 27 | 28 | }); -------------------------------------------------------------------------------- /practicals/todo-jqm-app/app/main.js: -------------------------------------------------------------------------------- 1 | require([ 2 | "jquery", 3 | "backbone", 4 | "backbone_super", 5 | "lodash", 6 | "handlebars", 7 | "initialize.config", 8 | "handlebars.compiled", 9 | "jquerymobile", 10 | "modules/view/TodosView", 11 | "modules/TodosCollection", 12 | "common", 13 | "modules/view/EditTodoPage" 14 | ], 15 | // jqValidationUnused 16 | function ($, Backbone, bbsuperUnused, _, Handlebars, initializeSettings, handlebarscompUnused, jqmUnused, TodosView, TodosCollection, Common, EditTodoPage) { // ExampleDialog 17 | initializeSettings.init(); 18 | 19 | var Router = Backbone.Router.extend({ 20 | routes : { 21 | "" : "index", 22 | "todo" : "index", 23 | "todo/:filter" : "filter", 24 | "editTodo/:id" : "editTodo", 25 | '*path' : 'index' 26 | }, 27 | index : function () { 28 | new TodosView(); 29 | }, 30 | filter : function (filter) { 31 | Common.TodoFilter = filter.trim() === 'all' ? '' : filter.trim() || ''; 32 | TodosCollection.trigger('filter'); 33 | }, 34 | editTodo : function (id){ 35 | new EditTodoPage({ 36 | model : TodosCollection.getByCid(id) 37 | }); 38 | } 39 | }); 40 | 41 | $(function () { 42 | window.BackboneRouter = new Router(); 43 | Backbone.history.start({ pushState : false }); 44 | }); 45 | }); 46 | -------------------------------------------------------------------------------- /practicals/todo-jqm-app/app/modules/TodoModel.js: -------------------------------------------------------------------------------- 1 | define([ 2 | 'lodash', 3 | 'backbone' 4 | ], function (_, Backbone) { 5 | 6 | var TodoModel = Backbone.Model.extend({ 7 | defaults : { 8 | title : '', 9 | completed : false, 10 | order : 0 11 | }, 12 | toggle : function () { 13 | this.save({ 14 | completed : !this.get('completed') 15 | }); 16 | } 17 | }); 18 | return TodoModel; 19 | }); -------------------------------------------------------------------------------- /practicals/todo-jqm-app/app/modules/TodosCollection.js: -------------------------------------------------------------------------------- 1 | define([ 2 | 'lodash', 3 | 'backbone', 4 | 'localstorage', 5 | 'modules/TodoModel' 6 | ], function (_, Backbone, Store, TodoModel) { 7 | 8 | var TodosCollection = Backbone.Collection.extend({ 9 | model : TodoModel, 10 | localStorage : new Store('todos-backbone'), 11 | events : { 12 | 13 | }, 14 | completed : function () { 15 | return this.filter(function (todo) { 16 | return todo.get('completed'); 17 | }); 18 | }, 19 | remaining : function () { 20 | return this.without.apply(this, this.completed()); 21 | }, 22 | // We keep the Todos in sequential order, despite being saved by unordered 23 | // GUID in the database. This generates the next order number for new items. 24 | nextOrder : function () { 25 | if (!this.length) { 26 | return 1; 27 | } 28 | return this.last().get('order') + 1; 29 | }, 30 | 31 | // Todos are sorted by their original insertion order. 32 | comparator : function (todo) { 33 | return todo.get('order'); 34 | } 35 | }); 36 | 37 | var instance = new TodosCollection(); 38 | return instance; 39 | }); -------------------------------------------------------------------------------- /practicals/todo-jqm-app/app/modules/view/EditTodoPage.js: -------------------------------------------------------------------------------- 1 | define([ 2 | "backbone", "modules/view/abstract/BasicView"], 3 | function (Backbone, BasicView) { 4 | return BasicView.extend({ 5 | id : "editTodoView", 6 | getHeaderTitle : function () { 7 | return "Edit Todo"; 8 | }, 9 | getSpecificTemplateValues : function () { 10 | return this.model.toJSON(); 11 | }, 12 | events : function () { 13 | return _.extend({ 14 | 'click #saveDescription' : 'saveDescription' 15 | }, this.constructor.__super__.events); 16 | }, 17 | saveDescription : function (clickEvent) { 18 | // this.model.save({ 19 | // title : $("#todoDescription", this.el).val() 20 | // }, 21 | // { 22 | // success : function (model, response) { 23 | // window.BackboneRouter.navigate("#", {trigger : true}); 24 | // } 25 | // } 26 | // ); 27 | // 28 | // clickEvent.preventDefault(); 29 | // return false; 30 | } 31 | }); 32 | }); 33 | -------------------------------------------------------------------------------- /practicals/todo-jqm-app/app/templates/abstract/basic_page_simple.template: -------------------------------------------------------------------------------- 1 |
              2 | {{whatis "Specific loaded Handlebars parameters:"}} 3 | {{whatis this}} 4 |

              {{headerTitle}}

              5 | back 6 |
              7 |
              8 | {{whatis "Template page trying to load:"}} 9 | {{whatis templatePartialPageID}} 10 | {{> templatePartialPageID}} 11 |
              12 |
              13 | Footer 14 |
              15 | -------------------------------------------------------------------------------- /practicals/todo-jqm-app/app/templates/abstract/basic_popup.template: -------------------------------------------------------------------------------- 1 |

              Popup

              2 | -------------------------------------------------------------------------------- /practicals/todo-jqm-app/app/templates/todos/editTodoView.template_partial: -------------------------------------------------------------------------------- 1 |
              2 | 3 | 4 |
              5 | Save 6 | -------------------------------------------------------------------------------- /practicals/todo-jqm-app/app/templates/todos/singleTodo.template: -------------------------------------------------------------------------------- 1 |
              2 |
              3 | 7 |
              8 |
              9 | 12 |
              13 |
              -------------------------------------------------------------------------------- /practicals/todo-jqm-app/app/templates/todos/todosPage.template_partial: -------------------------------------------------------------------------------- 1 |
              2 | 3 | 6 |
              7 |
              8 | 9 |
              10 |
              11 | 12 |
              13 |
              14 | 15 |
              16 | 17 | 18 |
                19 | 20 |
              21 |
              22 | 23 |
              {{> todosStatisticsAndBulkFooter}}
              24 |
              25 |
              26 |

              Click to edit a todo

              27 | 28 |

              Written by David Amend

              29 | 30 |

              Part of TodoMVC

              31 |
              32 | -------------------------------------------------------------------------------- /practicals/todo-jqm-app/app/templates/todos/todosStatisticsAndBulkFooter.template_partial: -------------------------------------------------------------------------------- 1 | {{remaining}} {{#if isAnyOrOneRemaining}}items{{else}}item{{/if}} 2 | 18 | -------------------------------------------------------------------------------- /practicals/todo-jqm-app/app/templates/welcome.template_partial: -------------------------------------------------------------------------------- 1 |

              Welcome

              2 | -------------------------------------------------------------------------------- /practicals/todo-jqm-app/assets/css/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/todo-jqm-app/assets/css/bg.png -------------------------------------------------------------------------------- /practicals/todo-jqm-app/assets/css/images/ajax-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/todo-jqm-app/assets/css/images/ajax-loader.gif -------------------------------------------------------------------------------- /practicals/todo-jqm-app/assets/css/images/icons-18-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/todo-jqm-app/assets/css/images/icons-18-black.png -------------------------------------------------------------------------------- /practicals/todo-jqm-app/assets/css/images/icons-18-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/todo-jqm-app/assets/css/images/icons-18-white.png -------------------------------------------------------------------------------- /practicals/todo-jqm-app/assets/css/images/icons-36-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/todo-jqm-app/assets/css/images/icons-36-black.png -------------------------------------------------------------------------------- /practicals/todo-jqm-app/assets/css/images/icons-36-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/todo-jqm-app/assets/css/images/icons-36-white.png -------------------------------------------------------------------------------- /practicals/todo-jqm-app/assets/css/index.css: -------------------------------------------------------------------------------- 1 | @import "h5bp.css"; 2 | 3 | .toggleAllCheckbox{ 4 | width: 160px !important; 5 | padding-left:0.8% !important; 6 | } 7 | 8 | .newTodoText{ 9 | padding-left: 3% !important; 10 | } 11 | 12 | #todo-list li label { 13 | display: block !important; 14 | } 15 | 16 | .singleTodoDescription{ 17 | padding-left: 2.2% !important; 18 | } 19 | 20 | .singleTodoCompletedToggle{ 21 | width: 135px !important; 22 | margin-left:1% !important; 23 | } 24 | 25 | #todo-list li label { 26 | margin-left: 0; 27 | 28 | /* 29 | word-break: break-word; 30 | padding: 15px; 31 | display: block; 32 | line-height: 1.2; 33 | */ 34 | } 35 | 36 | 37 | .ui-slider{ 38 | display:inline; 39 | } 40 | 41 | input.ui-input-text{ 42 | display:inline; 43 | width:60%; 44 | } 45 | 46 | #todoapp h1 { 47 | top: -180px; 48 | } 49 | 50 | #todo-list li label{ 51 | display:inline; 52 | } 53 | 54 | #footer:before { 55 | height: 70px; 56 | box-shadow: 0 1px 1px rgba(0, 0, 0, 0.3), 57 | 0 6px 0 -3px rgba(255, 255, 255, 0.8), 58 | 0 7px 1px -3px rgba(0, 0, 0, 0.3), 59 | 0 63px 0 -6px rgba(255, 255, 255, 0.8), 60 | 0 64px 2px -6px rgba(0, 0, 0, 0.2); 61 | } 62 | 63 | #filters{ 64 | left: 40%; 65 | top: -20%; 66 | } 67 | 68 | #filters li a{ 69 | margin: 0; 70 | } -------------------------------------------------------------------------------- /practicals/todo-jqm-app/assets/js/libs/localstorage.js: -------------------------------------------------------------------------------- 1 | define(["lodash","backbone"],function(_,Backbone){function S4(){return((1+Math.random())*65536|0).toString(16).substring(1)}function guid(){return S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4()}var Store=function(name){this.name=name;var store=localStorage.getItem(this.name);this.data=store&&JSON.parse(store)||{}};_.extend(Store.prototype,{save:function(){localStorage.setItem(this.name,JSON.stringify(this.data))},create:function(model){if(!model.id)model.id=model.attributes.id=guid(); 2 | this.data[model.id]=model;this.save();return model},update:function(model){this.data[model.id]=model;this.save();return model},find:function(model){return this.data[model.id]},findAll:function(){return _.values(this.data)},destroy:function(model){delete this.data[model.id];this.save();return model}});Backbone.sync=function(method,model,options){var resp;var store=model.localStorage||model.collection.localStorage;switch(method){case "read":resp=model.id?store.find(model):store.findAll();break;case "create":resp= 3 | store.create(model);break;case "update":resp=store.update(model);break;case "delete":resp=store.destroy(model);break}if(resp)options.success(resp);else options.error("Record not found")};return Store}); 4 | -------------------------------------------------------------------------------- /practicals/todo-jqm-app/compile: -------------------------------------------------------------------------------- 1 | this['JST'] = this['JST'] || {}; 2 | 3 | -------------------------------------------------------------------------------- /practicals/todo-jqm-app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/todo-jqm-app/favicon.ico -------------------------------------------------------------------------------- /practicals/todo-jqm-app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | TodoMVC Jquery Mobile 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /practicals/todo-jqm-app/package.js: -------------------------------------------------------------------------------- 1 | { 2 | "name": "todo-jqm-app", 3 | "version": "1.0.2", 4 | "dependencies": {}, 5 | "devDependencies": { 6 | "grunt": "~0.4.1", 7 | "grunt-contrib-copy": "~0.4.0", 8 | "grunt-contrib-concat": "~0.1.2", 9 | "grunt-contrib-coffee": "~0.4.0", 10 | "grunt-contrib-uglify": "~0.1.1", 11 | "grunt-contrib-compass": "~0.1.2", 12 | "grunt-contrib-jshint": "~0.1.1", 13 | "grunt-contrib-cssmin": "~0.4.1", 14 | "grunt-contrib-connect": "0.1.2", 15 | "grunt-contrib-clean": "0.4.0", 16 | "grunt-contrib-htmlmin": "0.1.1", 17 | "grunt-contrib-imagemin": "0.1.2", 18 | "grunt-contrib-livereload": "0.1.1", 19 | "grunt-release": "0.3.2", 20 | "grunt-bower-hooks": "~0.2.0", 21 | "grunt-usemin": "~0.1.9", 22 | "grunt-regarde": "~0.1.1", 23 | "grunt-requirejs": "~0.3.2", 24 | "grunt-mocha": "~0.2.2", 25 | "grunt-open": "~0.2.0", 26 | "matchdep": "~0.1.1" 27 | }, 28 | "engines": { 29 | "node": ">=0.8.0" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /practicals/todo-jqm-app/test/jasmine/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Backbone Boilerplate Jasmine Test Suite 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 27 | 28 | 29 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /practicals/todo-jqm-app/test/jasmine/spec/example.js: -------------------------------------------------------------------------------- 1 | describe("one tautology", function() { 2 | it("is a tautology", function() { 3 | expect(true).toBeTruthy(); 4 | }); 5 | 6 | describe("is awesome", function() { 7 | it("is awesome", function() { 8 | expect(1).toBe(1); 9 | }); 10 | }); 11 | }); 12 | 13 | describe("simple tests", function() { 14 | it("increments", function() { 15 | var mike = 0; 16 | 17 | expect(mike++ === 0).toBeTruthy(); 18 | expect(mike === 1).toBeTruthy(); 19 | }); 20 | 21 | it("increments (improved)", function() { 22 | var mike = 0; 23 | 24 | expect(mike++).toBe(0); 25 | expect(mike).toBe(1); 26 | }); 27 | }); 28 | 29 | describe("setUp/tearDown", function() { 30 | beforeEach(function() { 31 | console.log("Before"); 32 | }); 33 | 34 | afterEach(function() { 35 | console.log("After"); 36 | }); 37 | 38 | it("example", function() { 39 | console.log("During"); 40 | }); 41 | 42 | describe("setUp/tearDown", function() { 43 | beforeEach(function() { 44 | console.log("Before2"); 45 | }); 46 | 47 | afterEach(function() { 48 | console.log("After2"); 49 | }); 50 | 51 | it("example", function() { 52 | console.log("During Nested"); 53 | }); 54 | }); 55 | }); 56 | 57 | describe("async", function() { 58 | it("multiple async", function() { 59 | var semaphore = 2; 60 | 61 | setTimeout(function() { 62 | expect(true).toBeTruthy(); 63 | semaphore--; 64 | }, 500); 65 | 66 | setTimeout(function() { 67 | expect(true).toBeTruthy(); 68 | semaphore--; 69 | }, 500); 70 | 71 | waitsFor(function() { return semaphore === 0 }); 72 | }); 73 | }); 74 | -------------------------------------------------------------------------------- /practicals/todo-jqm-app/test/jasmine/vendor/MIT.LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2008-2011 Pivotal Labs 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /practicals/todo-jqm-app/test/jasmine/vendor/jasmine_favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/addyosmani/backbone-fundamentals/72793b31b2dc22788c64f5b8820e61110a7723f5/practicals/todo-jqm-app/test/jasmine/vendor/jasmine_favicon.png -------------------------------------------------------------------------------- /practicals/todo-jqm-app/test/qunit/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Backbone Boilerplate QUnit Test Suite 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
              17 |

              Backbone Boilerplate QUnit Test Suite

              18 |

              19 |

              20 |
                21 |
                22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 34 | 35 | 36 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /practicals/todo-jqm-app/test/qunit/tests/example.js: -------------------------------------------------------------------------------- 1 | test("one tautology", function() { 2 | ok(true); 3 | }); 4 | 5 | module("simple tests"); 6 | 7 | test("increments", function() { 8 | var mike = 0; 9 | 10 | ok(mike++ === 0); 11 | ok(mike === 1); 12 | }); 13 | 14 | test("increments (improved)", function() { 15 | var mike = 0; 16 | 17 | equal(mike++, 0); 18 | equal(mike, 1); 19 | }); 20 | 21 | 22 | module("setUp/tearDown", { 23 | setup: function() { 24 | //console.log("Before"); 25 | }, 26 | 27 | teardown: function() { 28 | //console.log("After"); 29 | } 30 | }); 31 | 32 | test("example", function() { 33 | //console.log("During"); 34 | }); 35 | 36 | module("async"); 37 | 38 | test("multiple async", function() { 39 | expect(2); 40 | 41 | stop(); 42 | 43 | setTimeout( function( ) { 44 | ok(true, "async operation completed"); 45 | start(); 46 | }, 500); 47 | 48 | stop(); 49 | 50 | setTimeout(function() { 51 | ok(true, "async operation completed"); 52 | start(); 53 | }, 500); 54 | }); 55 | --------------------------------------------------------------------------------