├── .editorconfig ├── .gitignore ├── 10.jpg ├── 13.jpg ├── 14.jpg ├── 9.jpg ├── README.md ├── app ├── .editorconfig ├── .gitattributes ├── .jscsrc ├── .jshintrc ├── .travis.yml ├── app.html ├── app.js ├── background.js ├── config.json ├── env.js ├── hello_world │ ├── hello_universe.js │ ├── hello_universe.spec.js │ ├── hello_world.js │ └── hello_world.spec.js ├── images │ └── drag_and_drop.png ├── lightgallery │ ├── css │ │ ├── lg-fb-comment-box.css │ │ ├── lg-fb-comment-box.css.map │ │ ├── lg-transitions.css │ │ ├── lg-transitions.css.map │ │ ├── lightgallery.css │ │ └── lightgallery.css.map │ ├── fonts │ │ ├── lg.eot │ │ ├── lg.svg │ │ ├── lg.ttf │ │ └── lg.woff │ ├── img │ │ ├── lg-default.png │ │ ├── loading.gif │ │ ├── video-play.png │ │ ├── vimeo-play.png │ │ └── youtube-play.png │ ├── js │ │ ├── .jshintrc │ │ ├── lg-autoplay.js │ │ ├── lg-pager.js │ │ ├── lg-thumbnail.js │ │ ├── lg-video.js │ │ ├── lg-zoom.js │ │ ├── lightgallery.js │ │ └── mousewheel.js │ └── sass │ │ ├── lg-animations.scss │ │ ├── lg-autoplay.scss │ │ ├── lg-fb-comment-box.scss │ │ ├── lg-fonts.scss │ │ ├── lg-fullscreen.scss │ │ ├── lg-mixins.scss │ │ ├── lg-pager.scss │ │ ├── lg-theme-default.scss │ │ ├── lg-thumbnail.scss │ │ ├── lg-transitions.scss │ │ ├── lg-variables.scss │ │ ├── lg-video.scss │ │ ├── lg-zoom.scss │ │ ├── lightgallery.scss │ │ └── prepros.cfg ├── package.json ├── spec.html ├── stylesheets │ └── main.less └── vendor │ ├── electron_boilerplate │ ├── context_menu.js │ ├── dev_helper.js │ ├── external_links.js │ └── window_state.js │ └── jasmine │ ├── boot.js │ ├── jasmine-html.js │ ├── jasmine.css │ └── jasmine.js ├── config ├── env_development.json ├── env_production.json └── env_test.json ├── gulpfile.js ├── lg-desktop.sublime-project ├── lg-desktop.sublime-workspace ├── package.json ├── resources ├── icon.png ├── linux │ ├── DEBIAN │ │ └── control │ └── app.desktop ├── osx │ ├── Info.plist │ ├── appdmg.json │ ├── dmg-background.png │ ├── dmg-background@2x.png │ ├── dmg-icon.icns │ ├── helper_apps │ │ ├── Info EH.plist │ │ ├── Info NP.plist │ │ └── Info.plist │ └── icon.icns └── windows │ ├── icon.ico │ ├── installer.nsi │ ├── setup-banner.bmp │ └── setup-icon.ico └── tasks ├── build.js ├── generate_specs_import.js ├── release.js ├── release_linux.js ├── release_osx.js ├── release_windows.js ├── start.js └── utils.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 4 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.json] 13 | indent_size = 2 14 | 15 | [*.md] 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log 3 | .DS_Store 4 | Thumbs.db 5 | 6 | /app/spec.js 7 | /build/ 8 | /releases/ 9 | /tmp/ 10 | -------------------------------------------------------------------------------- /10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachinchoolur/lightgallery-desktop/46ace840e0fdc03e79f864ad4b47c7057237ac6e/10.jpg -------------------------------------------------------------------------------- /13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachinchoolur/lightgallery-desktop/46ace840e0fdc03e79f864ad4b47c7057237ac6e/13.jpg -------------------------------------------------------------------------------- /14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachinchoolur/lightgallery-desktop/46ace840e0fdc03e79f864ad4b47c7057237ac6e/14.jpg -------------------------------------------------------------------------------- /9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachinchoolur/lightgallery-desktop/46ace840e0fdc03e79f864ad4b47c7057237ac6e/9.jpg -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # lightGallery 2 | A modern, electron and nodejs based image viewer for Mac, Windows and Linux. 3 | ![lightgallery](http://sachinchoolur.github.io/electron-gallery/lightgallery.png) 4 | 5 | Main features 6 | --- 7 | 8 | * Built with Electron. 9 | * LightGallery uses HTML, CSS, and JavaScript with Chromium and Node.js to build the app. 10 | * Cross-platform. 11 | * LightGallery works across operating systems. You can use it on OS X, Windows, or Linux. 12 | * 20+ Animations 13 | * LightGallery comes with numerous number of beautiful in-built animations. 14 | * Animated thumbnails 15 | * You also have the option to enable animated thumbnails from the settings. 16 | * Zoom & Fullscreen 17 | * You can double-click on the image to see its actual size. Zoom-in and zoom-out controls can be used for changing the zoom values of the image. 18 | * Mouse Drag & keyboard Navigations 19 | * LightGallery allows users to navigate between slides via mouse drag and keyboard arrows. 20 | * Pagers 21 | * Auto slideshow 22 | * Support various kind of image formats (jpg, png, gif, webp). 23 | * Highly customizable 24 | * And many more. 25 | 26 | ##### Watch :star: this repository. More features are coming 27 | 28 | Settings 29 | --- 30 | 31 | 32 | | Name | Default | Description | 33 | | ------------- |:-------------:| -----| 34 | |mode|`'lg-slide'`|Type of transition between images. lightGallery comes with lots of transition effects such as `'lg-slide'`, `'lg-fade'`, `'lg-zoom-in'`, `'lg-zoom-in-big'`, `'lg-zoom-out'`, `'lg-zoom-out-big'`, `'lg-zoom-out-in'`, `'lg-zoom-in-out'`, `'lg-soft-zoom'`, `'lg-scale-up'`, `'lg-slide-circular'`, `'lg-slide-circular-vertical'`, `'lg-slide-vertical'`, `'lg-slide-vertical-growth'`, `'lg-slide-skew-only'`, `'lg-slide-skew-only-rev'`, `'lg-slide-skew-only-y'`, `'lg-slide-skew-only-y-rev'`, `'lg-slide-skew'`, `'lg-slide-skew-rev'`, `'lg-slide-skew-cross'`, `'lg-slide-skew-cross-rev'`, `'lg-slide-skew-ver'`, `'lg-slide-skew-ver-rev'`, `'lg-slide-skew-ver-cross'`, `'lg-slide-skew-ver-cross-rev'`, `'lg-lollipop'`, `'lg-lollipop-rev'`, `'lg-rotate'`, `'lg-rotate-rev'`, `'lg-tube'`| 35 | |cssEasing|`'ease'`|Type of easing to be used for animations| 36 | |speed|`600`|Transition duration (in ms).| 37 | |hideBarsDelay|`6000`|Delay for hiding gallery controls in ms| 38 | |useLeft|`false`|force lightgallery to use css left property instead of transform.| 39 | |closable|`true`|allows clicks on dimmer to close gallery.| 40 | |loop|`true`|If `false`, will disable the ability to loop back to the beginning of the gallery when on the last element.| 41 | |keyPress|`true`|Enable keyboard navigation| 42 | |controls|`true`|If `false`, prev/next buttons will not be displayed.| 43 | |slideEndAnimatoin|`true`|Enable slideEnd animation| 44 | |hideControlOnEnd|`false`|If `true`, prev/next button will be hidden on first/last image.| 45 | |mousewheel|`true`|Change slide on mousewheel| 46 | |preload|`1`|Number of preload slides. will exicute only after the current slide is fully loaded. ex:// you clicked on 4th image and if preload = 1 then 3rd slide and 5th slide will be loaded in the background after the 4th slide is fully loaded.. if preload is 2 then 2nd 3rd 5th 6th slides will be preloaded| 47 | |showAfterLoad|`true`|Show Content once it is fully loaded| 48 | |counter|`true`|Whether to show total number of images and index number of currently displayed image.| 49 | |swipeThreshold|`50`|By setting the swipeThreshold (in px) you can set how far the user must swipe for the next/prev image.| 50 | |enableDrag|`true`|Enables desktop mouse drag support| 51 | |thumbnail|`true`|Enable thumbnails for the gallery| 52 | |animateThumb|`true`|Enable thumbnail animation.| 53 | |currentPagerPosition |`'middle'`|Position of selected thumbnail. `'left'` or `'middle'` or `'right'`| 54 | |thumbWidth|`100`|Width of each thumbnails.| 55 | |thumbContHeight|`100`|Height of the thumbnail container including padding and border| 56 | |thumbMargin|`5`|Spacing between each thumbnails| 57 | |toogleThumb|true|Whether to display thumbnail toggle button.| 58 | |enableThumbDrag|`true`|Enables desktop mouse drag support for thumbnails.| 59 | |swipeThreshold|`50`|By setting the swipeThreshold (in px) you can set how far the user must swipe for the next/prev slide.| 60 | |autoplay|`true`|Enable gallery autoplay| 61 | |pause|`5000`|The time (in ms) between each auto transition.| 62 | |progressBar |`true`|Enable autoplay progress bar| 63 | |fourceAutoplay|`false`|If `false` autoplay will be stopped after first user action| 64 | |autoplayControls|`true`|Show/hide autoplay controls.| 65 | |pager|`true`|Enable/Disable pager| 66 | |zoom|`true`|Enable/Disable zoom option| 67 | |scale|`1`|Value of zoom should be incremented/decremented| 68 | 69 | 70 | 71 | Development 72 | --- 73 | #### Project's folders 74 | 75 | - `app` - code of your application goes here. 76 | - `config` - place for you to declare environment specific stuff. 77 | - `build` - in this folder lands built, runnable application. 78 | - `releases` - ready for distribution installers will land here. 79 | - `resources` - resources for particular operating system. 80 | - `tasks` - build and development environment scripts. 81 | 82 | 83 | #### Installation 84 | 85 | ``` 86 | npm install 87 | ``` 88 | It will also download Electron runtime, and install dependencies for second `package.json` file inside `app` folder. 89 | 90 | #### Starting the app 91 | 92 | ``` 93 | npm start 94 | ``` 95 | 96 | 97 | 98 | 99 | Making a release 100 | ---- 101 | 102 | To make ready for distribution installer use command: 103 | ``` 104 | npm run release 105 | ``` 106 | It will start the packaging process for the operating system you are running this command on. The file which is ready for distribution will be outputted to `releases` directory. 107 | 108 | You can create Windows installer only when running on Windows, the same is true for Linux and OSX. So to generate all three installers you need all three operating systems. 109 | 110 | 111 | Other Projects 112 | ---- 113 | 114 | ##### [LightGallery for web](https://github.com/sachinchoolur/lightGallery) 115 | > A customizable, modular, responsive, lightbox gallery plugin. 116 | 117 | ##### [jQuery lightslider](https://github.com/sachinchoolur/lightslider) 118 | > lightSlider is a lightweight responsive Content slider with carousel thumbnails navigation. 119 | 120 | ##### [Angular flash](https://github.com/sachinchoolur/angular-flash) 121 | > A simple lightweight flash message module for angularjs 122 | 123 | ##### [ngclipboard](https://github.com/sachinchoolur/ngclipboard) 124 | > An angularjs directive to copy text to clipboard without using flash 125 | 126 | ##### [Angular trix](http://sachinchoolur.github.io/angular-trix/) 127 | > A rich WYSIWYG text editor directive for angularjs. 128 | 129 | ##### [ladda-angular](https://github.com/sachinchoolur/ladda-angular) 130 | > Ladda button directive for angularjs 131 | 132 | ##### [Teamwave](http://www.teamwave.com/?kid=676V2) 133 | > Integrated Suite of Business Applications.. (Not an open source project but free for the first 1,000 Companies!) 134 | 135 | Follow me on twitter [@sachinchoolur](https://twitter.com/sachinchoolur) for the latest news, updates about this project. 136 | 137 | Special thanks to [Jakub Szwacz](https://github.com/szwacz) for electron boilerplate 138 | 139 | ### License 140 | 141 | MIT License 142 | -------------------------------------------------------------------------------- /app/.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | 8 | [*] 9 | 10 | # Change these settings to your own preference 11 | indent_style = space 12 | indent_size = 4 13 | 14 | # We recommend you to keep these unchanged 15 | end_of_line = lf 16 | charset = utf-8 17 | trim_trailing_whitespace = true 18 | insert_final_newline = true 19 | 20 | [*.md] 21 | trim_trailing_whitespace = false 22 | -------------------------------------------------------------------------------- /app/.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto -------------------------------------------------------------------------------- /app/.jscsrc: -------------------------------------------------------------------------------- 1 | { 2 | "preset": "airbnb", 3 | "validateIndentation": 4, 4 | "disallowTrailingComma": true, 5 | "requireTrailingComma": false, 6 | "excludeFiles": ["node_modules/**", "bower_components/**"] 7 | } 8 | -------------------------------------------------------------------------------- /app/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "node": true, 3 | "browser": true, 4 | "esnext": true, 5 | "bitwise": true, 6 | "camelcase": false, 7 | "curly": true, 8 | "eqeqeq": true, 9 | "immed": true, 10 | "indent": 2, 11 | "latedef": true, 12 | "newcap": true, 13 | "noarg": true, 14 | "quotmark": "single", 15 | "undef": true, 16 | "unused": true, 17 | "strict": true, 18 | "trailing": true, 19 | "smarttabs": true, 20 | "globals": { 21 | "angular": true, 22 | "jQuery": true, 23 | "$": true, 24 | "swal": true, 25 | "sweetAlert": true, 26 | "alert" : true, 27 | "API_URL": true, 28 | "MEDIA_URL": true, 29 | "SOCKET_URL": true, 30 | "PM_URL": true, 31 | "HRM_URL": true, 32 | "ROOT_URL": true, 33 | "CRM_URL": true, 34 | "moment" : true, 35 | "confirm" : true, 36 | "NOTIFY_URL": true, 37 | "io": true 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '0.10' 4 | before_script: 5 | - 'npm install -g bower grunt-cli' 6 | - 'bower install' 7 | -------------------------------------------------------------------------------- /app/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | lightGallery 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |

Drag and drop images here

32 |
33 |
34 | 35 | 36 | -------------------------------------------------------------------------------- /app/app.js: -------------------------------------------------------------------------------- 1 | import { remote, ipcRenderer } from 'electron'; 2 | import fs from 'fs'; 3 | import path from 'path'; 4 | 5 | // Lightgallery components 6 | import { lightGallery } from './lightGallery/js/lightgallery.js'; 7 | import { Thumbnail } from './lightGallery/js/lg-thumbnail.js'; 8 | import { Zoom } from './lightGallery/js/lg-zoom.js'; 9 | import { Autoplay } from './lightGallery/js/lg-autoplay.js'; 10 | import { Pager } from './lightGallery/js/lg-pager.js'; 11 | import { mousewheel } from './lightGallery/js/mousewheel.js'; 12 | 13 | import env from './env'; 14 | 15 | var app = remote.app; 16 | var lg; 17 | 18 | // Lightgallery default settings 19 | // Write to config file only once 20 | var defaults = { 21 | 22 | mode: 'lg-slide', 23 | 24 | // Ex : 'ease' 25 | cssEasing: 'ease', 26 | 27 | //'for jquery animation' 28 | easing: 'linear', 29 | speed: 600, 30 | height: '100%', 31 | width: '100%', 32 | addClass: '', 33 | startClass: 'lg-start-zoom', 34 | backdropDuration: 0, 35 | hideBarsDelay: 6000, 36 | 37 | useLeft: false, 38 | 39 | closable: false, 40 | loop: true, 41 | escKey: false, 42 | keyPress: true, 43 | controls: true, 44 | slideEndAnimatoin: true, 45 | hideControlOnEnd: false, 46 | mousewheel: true, 47 | 48 | // .lg-item || '.lg-sub-html' 49 | appendSubHtmlTo: '.lg-sub-html', 50 | 51 | /** 52 | * @desc number of preload slides 53 | * will exicute only after the current slide is fully loaded. 54 | * 55 | * @ex you clicked on 4th image and if preload = 1 then 3rd slide and 5th 56 | * slide will be loaded in the background after the 4th slide is fully loaded.. 57 | * if preload is 2 then 2nd 3rd 5th 6th slides will be preloaded.. ... ... 58 | * 59 | */ 60 | preload: 1, 61 | showAfterLoad: true, 62 | selector: '', 63 | selectWithin: '', 64 | nextHtml: '', 65 | prevHtml: '', 66 | 67 | // 0, 1 68 | index: false, 69 | 70 | iframeMaxWidth: '100%', 71 | 72 | download: false, 73 | counter: true, 74 | appendCounterTo: '.lg-toolbar', 75 | 76 | swipeThreshold: 50, 77 | enableSwipe: true, 78 | enableDrag: true, 79 | 80 | dynamic: true, 81 | dynamicEl: [], 82 | galleryId: 1, 83 | scale: 1, 84 | zoom: true, 85 | enableZoomAfter: 300, 86 | autoplay: false, 87 | pause: 5000, 88 | progressBar: true, 89 | fourceAutoplay: false, 90 | autoplayControls: true, 91 | appendAutoplayControlsTo: '.lg-toolbar', 92 | pager: false, 93 | thumbnail: true, 94 | 95 | animateThumb: true, 96 | currentPagerPosition: 'middle', 97 | 98 | thumbWidth: 100, 99 | thumbContHeight: 100, 100 | thumbMargin: 5, 101 | 102 | exThumbImage: false, 103 | showThumbByDefault: true, 104 | toogleThumb: true, 105 | pullCaptionUp: true, 106 | 107 | enableThumbDrag: true, 108 | enableThumbSwipe: true, 109 | swipeThreshold: 50, 110 | 111 | loadYoutubeThumbnail: true, 112 | youtubeThumbSize: 1, 113 | 114 | loadVimeoThumbnail: true, 115 | vimeoThumbSize: 'thumbnail_small', 116 | 117 | loadDailymotionThumbnail: true 118 | }; 119 | 120 | // Write settings to config file 121 | fs.readFile(app.getPath('userData') + '/lg-config.json', function(err, data) { 122 | if (err) { 123 | fs.writeFile(app.getPath('userData') + '/lg-config.json', JSON.stringify(defaults), function(err) { 124 | if (err) throw err; 125 | }); 126 | } else { 127 | defaults = JSON.parse(data); 128 | } 129 | }); 130 | 131 | var el = []; 132 | 133 | /** 134 | * @desc Create dynamic elements and initiate lightgallery 135 | * @param {string} dir - the directory from where lightgallery is opened 136 | * @param {string} file - filename from path; only used for development for opening image in the gallery 137 | * */ 138 | var loadFiles = function(dir, file) { 139 | fs.readdir(dir, function(err, files) { 140 | var _images = []; 141 | if (files && files.length) { 142 | for (var i = 0; i < files.length; i++) { 143 | if (path.extname(files[i]).toLowerCase() === '.jpg' || path.extname(files[i]).toLowerCase() === '.png' || path.extname(files[i]).toLowerCase() === '.gif' || path.extname(files[i]).toLowerCase() === '.webp') { 144 | el.push({ 145 | src: dir + '\\' + files[i], 146 | thumb: './lightgallery/img/lg-default.png' 147 | }); 148 | _images.push(files[i]); 149 | } 150 | }; 151 | }; 152 | 153 | var _index = file ? _images.indexOf(file) : 0; 154 | if (env.name !== 'production') { 155 | _index = 0; 156 | } 157 | 158 | if ($.isArray(el) && el.length) { 159 | 160 | if ($('.lightgallery').data('lightGallery')) { 161 | $('.lightgallery').data('lightGallery').destroy(true); 162 | } 163 | 164 | setTimeout(function() { 165 | $('.lightgallery').lightGallery($.extend({}, defaults, { 166 | dynamicEl: el, 167 | index: _index 168 | })); 169 | }, 100); 170 | }; 171 | }); 172 | }; 173 | 174 | var getFiles = function(files) { 175 | el = []; 176 | if (files && files.length) { 177 | for (var i = 0; i < files.length; i++) { 178 | if (path.extname(files[i].path || files[i]).toLowerCase() === '.jpg' || path.extname(files[i].path || files[i]).toLowerCase() === '.png' || path.extname(files[i].path || files[i]).toLowerCase() === '.gif' || path.extname(files[i].path || files[i]).toLowerCase() === '.webp') { 179 | el.push({ 180 | src: files[i].path || files[i], 181 | thumb: './lightgallery/img/lg-default.png' 182 | }); 183 | } 184 | }; 185 | }; 186 | 187 | if ($.isArray(el) && el.length) { 188 | if ($('.lightgallery').data('lightGallery')) { 189 | $('.lightgallery').data('lightGallery').destroy(true); 190 | } 191 | 192 | setTimeout(function() { 193 | $('.lightgallery').lightGallery($.extend({}, defaults, { 194 | dynamicEl: el, 195 | index: 0 196 | })); 197 | }, 100); 198 | }; 199 | }; 200 | 201 | /** 202 | * @desc reload lightgallery when user changes the settings 203 | */ 204 | var reload = function() { 205 | 206 | // Store the current index 207 | var _index = $('.lightgallery').data('lightGallery').index; 208 | 209 | // Destroy the gallery 210 | $('.lightgallery').data('lightGallery').destroy(true); 211 | 212 | // Read settings from config file and rebuild lightgallery 213 | fs.readFile(app.getPath('userData') + '/lg-config.json', function(err, data) { 214 | if (err) throw err; 215 | defaults = JSON.parse(data); 216 | 217 | setTimeout(function() { 218 | $('.lightgallery').lightGallery($.extend({}, defaults, { 219 | dynamicEl: el, 220 | index: _index 221 | })); 222 | }, 100); 223 | }); 224 | }; 225 | 226 | document.addEventListener('dragover', function(event) { 227 | event.preventDefault(); 228 | $('body').addClass('lg-drag-over'); 229 | return false; 230 | }, false); 231 | 232 | document.addEventListener('drop', function(event) { 233 | event.preventDefault(); 234 | getFiles(event.dataTransfer.files); 235 | $('body').removeClass('lg-drag-over'); 236 | return false; 237 | }, false); 238 | 239 | document.addEventListener('dragleave', function(event) { 240 | event.preventDefault(); 241 | $('body').removeClass('lg-drag-over'); 242 | return false; 243 | }, false); 244 | 245 | document.addEventListener('dragexit', function(event) { 246 | event.preventDefault(); 247 | $('body').removeClass('lg-drag-over'); 248 | return false; 249 | }, false); 250 | 251 | // Listen opened events from main process 252 | ipcRenderer.on('opened', function(event, arg) { 253 | if (arg) { 254 | var dir = path.parse(arg).dir; 255 | var _file = path.basename(arg); 256 | loadFiles(dir, _file); 257 | } 258 | }); 259 | 260 | ipcRenderer.on('openDirectory', function(event, directory) { 261 | if (directory && directory.length) { 262 | loadFiles(directory[0]); 263 | } 264 | }); 265 | 266 | ipcRenderer.on('openedFiles', function(event, arg) { 267 | if (arg && arg.length) { 268 | getFiles(arg); 269 | } 270 | }); 271 | 272 | // Listen opened events from main process and reload gallery 273 | ipcRenderer.on('refresh', function(event, arg) { 274 | reload(); 275 | }); 276 | -------------------------------------------------------------------------------- /app/config.json: -------------------------------------------------------------------------------- 1 | {"mode":"lg-zoom-in","cssEasing":"cubic-bezier(0.250, 0.100, 0.250, 1.000)","easing":"linear","speed":500,"height":"100%","width":"100%","addClass":"","startClass":"lg-start-zoom","backdropDuration":0,"hideBarsDelay":4000,"useLeft":false,"closable":false,"loop":false,"escKey":false,"keyPress":true,"controls":true,"slideEndAnimatoin":true,"hideControlOnEnd":false,"mousewheel":true,"appendSubHtmlTo":".lg-sub-html","preload":1,"showAfterLoad":true,"selector":"","selectWithin":"","nextHtml":"","prevHtml":"","index":false,"iframeMaxWidth":"100%","download":false,"counter":false,"appendCounterTo":".lg-toolbar","swipeThreshold":50,"enableSwipe":true,"enableDrag":true,"dynamic":true,"dynamicEl":[],"galleryId":1,"thumbnail":true,"animateThumb":true,"currentPagerPosition":"middle","thumbWidth":100,"thumbContHeight":100,"thumbMargin":5,"exThumbImage":false,"showThumbByDefault":true,"toogleThumb":true,"pullCaptionUp":true,"enableThumbDrag":true,"enableThumbSwipe":true,"loadYoutubeThumbnail":true,"youtubeThumbSize":1,"loadVimeoThumbnail":true,"vimeoThumbSize":"thumbnail_small","loadDailymotionThumbnail":true,"scale":1,"zoom":true,"enableZoomAfter":300,"autoplay":false,"pause":4500,"progressBar":true,"fourceAutoplay":true,"autoplayControls":true,"appendAutoplayControlsTo":".lg-toolbar","pager":false} -------------------------------------------------------------------------------- /app/env.js: -------------------------------------------------------------------------------- 1 | // Simple module exposes environment variables to rest of the code. 2 | 3 | import jetpack from 'fs-jetpack'; 4 | 5 | var app; 6 | if (process.type === 'renderer') { 7 | app = require('electron').remote.app; 8 | } else { 9 | app = require('electron').app; 10 | } 11 | 12 | var appDir = jetpack.cwd(app.getAppPath()); 13 | 14 | var manifest = appDir.read('package.json', 'json'); 15 | 16 | export default manifest.env; 17 | -------------------------------------------------------------------------------- /app/hello_world/hello_universe.js: -------------------------------------------------------------------------------- 1 | var greet = function () { 2 | return 'Hello Universe!'; 3 | }; 4 | 5 | export default greet; 6 | -------------------------------------------------------------------------------- /app/hello_world/hello_universe.spec.js: -------------------------------------------------------------------------------- 1 | // Default imports test 2 | import greet from './hello_universe'; 3 | 4 | describe("hello universe", function () { 5 | 6 | it("greets better than hello world", function () { 7 | expect(greet()).toBe('Hello Universe!'); 8 | }); 9 | 10 | }); 11 | -------------------------------------------------------------------------------- /app/hello_world/hello_world.js: -------------------------------------------------------------------------------- 1 | export var greet = function () { 2 | return 'Hello World!'; 3 | }; 4 | 5 | export var bye = function () { 6 | return 'See ya!'; 7 | }; 8 | -------------------------------------------------------------------------------- /app/hello_world/hello_world.spec.js: -------------------------------------------------------------------------------- 1 | // Named imports test 2 | import { greet, bye } from './hello_world'; 3 | 4 | describe("hello world", function () { 5 | 6 | it("greets", function () { 7 | expect(greet()).toBe('Hello World!'); 8 | }); 9 | 10 | it("says goodbye", function () { 11 | expect(bye()).toBe('See ya!'); 12 | }); 13 | 14 | }); 15 | -------------------------------------------------------------------------------- /app/images/drag_and_drop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachinchoolur/lightgallery-desktop/46ace840e0fdc03e79f864ad4b47c7057237ac6e/app/images/drag_and_drop.png -------------------------------------------------------------------------------- /app/lightgallery/css/lg-fb-comment-box.css: -------------------------------------------------------------------------------- 1 | .lg-outer.fb-comments .lg-img-wrap { 2 | padding-right: 400px !important; } 3 | .lg-outer.fb-comments .fb-comments { 4 | height: 100%; 5 | overflow-y: auto; 6 | position: absolute; 7 | right: 0; 8 | top: 0; 9 | width: 420px; 10 | z-index: 99999; 11 | background: #fff url("../img/loading.gif") no-repeat scroll center center; } 12 | .lg-outer.fb-comments .fb-comments.fb_iframe_widget { 13 | background-image: none; } 14 | .lg-outer.fb-comments .fb-comments.fb_iframe_widget.fb_iframe_widget_loader { 15 | background: #fff url("../img/loading.gif") no-repeat scroll center center; } 16 | .lg-outer.fb-comments .lg-toolbar { 17 | right: 420px; 18 | width: auto; } 19 | .lg-outer.fb-comments .lg-actions .lg-next { 20 | right: 420px; } 21 | .lg-outer.fb-comments .lg-item { 22 | background-image: none; } 23 | .lg-outer.fb-comments .lg-item.lg-complete .lg-img-wrap { 24 | background-image: none; } 25 | .lg-outer.fb-comments .lg-img-wrap { 26 | background: url(../img/loading.gif) no-repeat scroll center center transparent; } 27 | .lg-outer.fb-comments .lg-sub-html { 28 | padding: 0; 29 | position: static; } 30 | 31 | /*# sourceMappingURL=lg-fb-comment-box.css.map */ 32 | -------------------------------------------------------------------------------- /app/lightgallery/css/lg-fb-comment-box.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "mappings": "AAGI,kCAAa;EACT,aAAa,EAAE,gBAAgB;AAEnC,kCAAa;EACT,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,CAAC;EACR,GAAG,EAAE,CAAC;EACN,KAAK,EAAE,KAAK;EACZ,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,6DAA6D;EACzE,mDAAmB;IACf,gBAAgB,EAAE,IAAI;IACtB,2EAAyB;MACrB,UAAU,EAAE,6DAA6D;AAIrF,iCAAY;EACR,KAAK,EAAE,KAAK;EACZ,KAAK,EAAE,IAAI;AAEf,0CAAqB;EACjB,KAAK,EAAE,KAAK;AAEhB,8BAAS;EACL,gBAAgB,EAAE,IAAI;EAElB,uDAAY;IACR,gBAAgB,EAAE,IAAI;AAIlC,kCAAa;EACT,UAAU,EAAE,kEAAkE;AAGlF,kCAAa;EACT,OAAO,EAAE,CAAC;EACV,QAAQ,EAAE,MAAM", 4 | "sources": ["../sass/lg-fb-comment-box.scss"], 5 | "names": [], 6 | "file": "lg-fb-comment-box.css" 7 | } 8 | -------------------------------------------------------------------------------- /app/lightgallery/css/lg-transitions.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "mappings": "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", 4 | "sources": ["../sass/lg-transitions.scss","../sass/lg-mixins.scss"], 5 | "names": [], 6 | "file": "lg-transitions.css" 7 | } 8 | -------------------------------------------------------------------------------- /app/lightgallery/css/lightgallery.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "mappings": "AACA,UAMC;EALG,WAAW,EAAE,IAAI;EACjB,GAAG,EAAE,6BAA6B;EAClC,GAAG,EAAE,gNAAgN;EACrN,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;AAItB,QAAS;EACL,WAAW,EAAE,IAAI;EACjB,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,MAAM;EACnB,YAAY,EAAE,MAAM;EACpB,cAAc,EAAE,IAAI;EACpB,WAAW,EAAE,CAAC;EACd,uCAAuC;EACvC,sBAAsB,EAAE,WAAW;EACnC,uBAAuB,EAAE,SAAS;;AClBlC,0CAAmB;EACf,gBAAgB,ECaN,mBAAW;EDZrB,aAAa,ECFG,GAAG;EDGnB,KAAK,ECiCW,IAAc;EDhC9B,MAAM,EAAE,OAAO;EACf,OAAO,EAAE,KAAK;EACd,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,KAAK;EACjB,OAAO,EAAE,YAAY;EACrB,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,GAAG;EACR,OAAO,ECgCG,IAAI;ED9Bd,4DAAW;IACP,cAAc,EAAE,IAAI;IACpB,OAAO,EAAE,GAAG;EAGhB,sDAAQ;IACJ,KAAK,ECkBa,IAAoB;ADd9C,oBAAS;EACL,KAAK,EAAE,IAAI;EAEX,2BAAS;IACL,OAAO,EAAE,OAAO;AAIxB,oBAAS;EACL,IAAI,EAAE,IAAI;EAEV,0BAAQ;IACJ,OAAO,EAAE,OAAO;;AEuBxB,+BAEC;EFnBD,EAAG;IACC,IAAI,EAAE,CAAC;EAGX,GAAI;IACA,IAAI,EAAE,KAAK;EAGf,IAAK;IACD,IAAI,EAAE,CAAC;AEYX,4BAEC;EFvBD,EAAG;IACC,IAAI,EAAE,CAAC;EAGX,GAAI;IACA,IAAI,EAAE,KAAK;EAGf,IAAK;IACD,IAAI,EAAE,CAAC;AEgBX,2BAEC;EF3BD,EAAG;IACC,IAAI,EAAE,CAAC;EAGX,GAAI;IACA,IAAI,EAAE,KAAK;EAGf,IAAK;IACD,IAAI,EAAE,CAAC;AEoBX,uBAEC;EF/BD,EAAG;IACC,IAAI,EAAE,CAAC;EAGX,GAAI;IACA,IAAI,EAAE,KAAK;EAGf,IAAK;IACD,IAAI,EAAE,CAAC;AEQX,8BAEC;EFJD,EAAG;IACC,IAAI,EAAE,CAAC;EAGX,GAAI;IACA,IAAI,EAAE,IAAI;EAGd,IAAK;IACD,IAAI,EAAE,CAAC;AEHX,2BAEC;EFRD,EAAG;IACC,IAAI,EAAE,CAAC;EAGX,GAAI;IACA,IAAI,EAAE,IAAI;EAGd,IAAK;IACD,IAAI,EAAE,CAAC;AECX,0BAEC;EFZD,EAAG;IACC,IAAI,EAAE,CAAC;EAGX,GAAI;IACA,IAAI,EAAE,IAAI;EAGd,IAAK;IACD,IAAI,EAAE,CAAC;AEKX,sBAEC;EFhBD,EAAG;IACC,IAAI,EAAE,CAAC;EAGX,GAAI;IACA,IAAI,EAAE,IAAI;EAGd,IAAK;IACD,IAAI,EAAE,CAAC;AAOP,iCAAW;EEvDf,iBAAiB,EFwDU,iBAAiB;EEvD5C,YAAY,EFuDe,iBAAiB;EEtD5C,SAAS,EFsDkB,iBAAiB;EACpC,QAAQ,EAAE,QAAQ;AAKtB,gCAAW;EE9Df,iBAAiB,EF+DU,gBAAgB;EE9D3C,YAAY,EF8De,gBAAgB;EE7D3C,SAAS,EF6DkB,gBAAgB;EACnC,QAAQ,EAAE,QAAQ;;AAM9B,WAAY;EACR,OAAO,EC5CM,IAAI;ED6CjB,IAAI,EAAE,CAAC;EACP,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,CAAC;EACN,KAAK,EAAE,IAAI;EACX,gBAAgB,EC9FJ,mBAAmB;EDgG/B,oBAAS;IACL,KAAK,EC5DW,IAAc;ID6D9B,MAAM,EAAE,OAAO;IACf,KAAK,EAAE,KAAK;IACZ,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,IAAI;IACZ,WAAW,EAAE,IAAI;IACjB,OAAO,EAAE,MAAM;IACf,UAAU,EAAE,MAAM;IAClB,KAAK,EAAE,IAAI;IACX,eAAe,EAAE,eAAe;IAChC,OAAO,EAAE,WAAW;IAEpB,0BAAQ;MACJ,KAAK,ECxEa,IAAoB;ED6E1C,2BAAQ;IACJ,OAAO,EAAE,OAAO;EAKpB,8BAAQ;IACJ,OAAO,EAAE,OAAO;;AAM5B,YAAa;EACT,gBAAgB,ECjGH,mBAAmB;EDkGhC,MAAM,EAAE,CAAC;EACT,KAAK,EClGW,IAAI;EDmGpB,SAAS,EAAE,IAAI;EACf,IAAI,EAAE,CAAC;EACP,OAAO,EAAE,SAAS;EAClB,QAAQ,EAAE,KAAK;EACf,KAAK,EAAE,CAAC;EACR,UAAU,EAAE,MAAM;EAClB,OAAO,EC5FM,IAAI;ED8FjB,eAAG;IACC,MAAM,EAAE,CAAC;IACT,SAAS,EAAE,IAAI;IACf,WAAW,EAAE,IAAI;EAGrB,cAAE;IACE,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,OAAO;;AAKvB,WAAY;EACR,KAAK,ECrHe,IAAc;EDsHlC,OAAO,EAAE,YAAY;EACrB,SAAS,EChJU,IAAI;EDiJvB,YAAY,EAAE,IAAI;EAClB,WAAW,EAAE,IAAI;EACjB,cAAc,EAAE,MAAM;;AAI1B,+BAAgC;EAC5B,OAAO,EAAE,CAAC;EEiIV,kBAAkB,EAnBH,oGAAsD;EAoBrE,eAAe,EApBA,iGAAsD;EAqBrE,aAAa,EArBE,+FAAsD;EAsBrE,UAAU,EAAE,4FAAO;;AF/HnB,uBAAS;EACL,OAAO,EAAE,CAAC;EEVd,iBAAiB,EAAE,wBAAuB;EAC1C,SAAS,EAAE,wBAAuB;AFalC,uBAAS;EACL,OAAO,EAAE,CAAC;EEfd,iBAAiB,EAAE,uBAAuB;EAC1C,SAAS,EAAE,uBAAuB;AFkBlC,0BAAY;EACR,OAAO,EAAE,CAAC;EEpBd,iBAAiB,EAAE,wBAAuB;EAC1C,SAAS,EAAE,wBAAuB;;AF4B1B,0DAAU;EExBlB,iBAAiB,EAAE,sBAAmB;EACtC,SAAS,EAAE,sBAAmB;EFyBlB,OAAO,EAAE,CAAC;EEsGtB,kBAAkB,EAnBH,yDAAsD;EAoBrE,eAAe,EApBA,sDAAsD;EAqBrE,aAAa,EArBE,oDAAsD;EAsBrE,UAAU,EAAE,iDAAO;EA7FnB,wBAAwB,EFVc,OAAO;EEW7C,qBAAqB,EFXiB,OAAO;EEY7C,oBAAoB,EFZkB,OAAO;EEa7C,gBAAgB,EFbsB,OAAO;AAGjC,+EAAU;EE/BtB,iBAAiB,EAAE,gBAAmB;EACtC,SAAS,EAAE,gBAAmB;EFgCd,OAAO,EAAE,CAAC;;AGtM1B,yBAAgB;EACZ,gBAAgB,EFsCV,OAAO;EErCb,MAAM,EAAE,CAAC;EACT,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,IAAI;EACX,OAAO,EF0CI,IAAI;EEzCf,UAAU,EAAE,KAAK;ED0JrB,iBAAiB,EAAE,uBAAuB;EAC1C,SAAS,EAAE,uBAAuB;EAoIlC,kBAAkB,EAnBH,sDAAsD;EAoBrE,eAAe,EApBA,mDAAsD;EAqBrE,aAAa,EArBE,iDAAsD;EAsBrE,UAAU,EAAE,8CAAO;EC7RX,gDAAe;ID6SvB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,OAAO;IACf,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,IAAI;EC3SJ,oDAAe;ID+SvB,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,gBAAgB;IACxB,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,QAAQ;EC9SR,+CAAU;IDqNlB,2BAA2B,EAAE,aAAoB;IACjD,mBAAmB,EAAE,aAAoB;AChNrC,uCAAgB;EDmIpB,iBAAiB,EAAE,qBAAuB;EAC1C,SAAS,EAAE,qBAAuB;AC/HlC,mBAAU;EACN,OAAO,EAAE,MAAM;EACf,MAAM,EAAE,IAAI;EACZ,aAAa,EAAE,IAAI;AAGvB,wBAAe;EACX,aAAa,EAAE,GAAG;EAClB,MAAM,EAAE,OAAO;EACf,KAAK,EAAE,IAAI;EACX,QAAQ,EAAE,MAAM;EAChB,MAAM,EAAE,IAAI;EACZ,MAAM,EAAE,cAAc;EACtB,aAAa,EAAE,GAAG;EAClB,aAAa,EAAE,GAAG;EAClB,0BAA2B;IAT/B,wBAAe;MDoLf,kBAAkB,EAAE,uBAAW;MAC/B,aAAa,EAAE,uBAAW;MAC1B,UAAU,EAAE,uBAAW;ECzKnB,+DAAkB;IACd,YAAY,EF7BI,OAAmB;EEgCvC,4BAAI;IACA,KAAK,EAAE,IAAI;AAKf,+BAAS;EACL,cAAc,EAAE,KAAK;AAKzB,gCAAS;EACL,cAAc,EAAE,CAAC;AAIrB,yCAAa;EDkJjB,kBAAkB,EAAE,iBAAW;EAC/B,aAAa,EAAE,iBAAW;EAC1B,UAAU,EAAE,iBAAW;AChJf,uDAAa;EACT,MAAM,EAAE,KAAK;AAKzB,0BAAiB;EACb,gBAAgB,EFjDH,OAAO;EEkDpB,aAAa,EAAE,WAAiD;EAChE,KAAK,EFlDW,IAAc;EEmD9B,MAAM,EAAE,OAAO;EACf,SAAS,EAAE,IAAI;EACf,MAAM,EAAE,IAAI;EACZ,WAAW,EAAE,IAAI;EACjB,OAAO,EAAE,KAAK;EACd,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,IAAI;EACX,UAAU,EAAE,MAAM;EAClB,GAAG,EAAE,KAAK;EACV,KAAK,EAAE,IAAI;EAEX,gCAAQ;IACJ,OAAO,EAAE,OAAO;EAGpB,gCAAQ;IACJ,KAAK,EFlEa,IAAoB;;AGtC9C,wBAAe;EACX,OAAO,EAAE,YAAY;EACrB,cAAc,EAAE,MAAM;EACtB,SAAS,EAAE,MAAM;EACjB,UAAU,EAAE,IAAI;EAChB,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,KAAK;AAGlB,mBAAU;EACN,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,CAAC;EACT,cAAc,EAAE,MAAM;EACtB,QAAQ,EAAE,MAAM;EAChB,QAAQ,EAAE,QAAQ;EAElB,8BAAW;IACP,OAAO,EAAE,YAAY;IACrB,QAAQ,EAAE,QAAQ;IAClB,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,eAAe;IACtB,MAAM,EAAE,eAAe;EAG3B,kCAAe;IACX,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,GAAG;IACT,GAAG,EAAE,GAAG;IACR,WAAW,EAAE,KAAK;IAClB,UAAU,EAAE,KAAK;IACjB,OAAO,EHgBC,IAAI;IGfZ,MAAM,EAAE,OAAO;AAKnB,sCAAc;EACV,UAAU,EAAE,6DAA6D;AAGzE,4CAAc;EACV,UAAU,EAAE,iEAAiE;AAOrF,sCAAc;EACV,UAAU,EAAE,6DAA6D;EACzE,MAAM,EAAE,IAAI;EACZ,WAAW,EAAE,KAAK;EAClB,UAAU,EAAE,KAAK;EACjB,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,GAAG;AAGZ,4CAAc;EACV,OAAO,EAAE,CAAC;AAOlB,wCAAc;EACV,UAAU,EAAE,+DAA+D;AAG3E,8CAAc;EACV,UAAU,EAAE,mEAAmE;AAK3F,0BAAiB;EACb,KAAK,EAAE,eAAe;EACtB,MAAM,EAAE,eAAe;EACvB,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,CAAC;EACN,IAAI,EAAE,CAAC;AAIP,wCAAiB;EACb,UAAU,EAAE,MAAM;AAIlB,4GAA2B;EACvB,OAAO,EAAE,IAAI;AAGjB,yDAAiB;EACb,UAAU,EAAE,OAAO;;AClGnC,gBAAiB;EACb,gBAAgB,EJwBC,IAAI;EIvBrB,MAAM,EJyBe,GAAG;EIxBxB,IAAI,EAAE,CAAC;EACP,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,CAAC;EACN,KAAK,EAAE,IAAI;EACX,OAAO,EJqCU,IAAI;EIpCrB,OAAO,EAAE,CAAC;EH8RV,kBAAkB,EAnBH,qBAAsD;EAoBrE,eAAe,EApBA,qBAAsD;EAqBrE,aAAa,EArBE,qBAAsD;EAsBrE,UAAU,EAAE,qBAAO;EG9RnB,6BAAa;IACT,gBAAgB,EJcI,OAAmB;IIbvC,MAAM,EJcW,GAAG;IIbpB,KAAK,EAAE,CAAC;EAIR,sCAAa;IACT,KAAK,EAAE,IAAI;EAInB,kCAAoB;IAChB,OAAO,EAAE,CAAC;;AAKd,yBAAQ;EAIJ,OAAO,EAAE,OAAO;EAHhB,2CAAoB;IAChB,OAAO,EAAE,OAAO;;AC3BhB,+JAAwB;EJyOhC,2BAA2B,EAAE,EAAoB;EACjD,mBAAmB,EAAE,EAAoB;AIlOrC,uDAAa;EJ0RjB,kBAAkB,EAnBH,8BAAsD;EAoBrE,eAAe,EApBA,2BAAsD;EAqBrE,aAAa,EArBE,yBAAsD;EAsBrE,UAAU,EAAE,sBAAO;EAxInB,iBAAiB,EAAE,oBAAuB;EAC1C,SAAS,EAAE,oBAAuB;EAhFlC,2BAA2B,EInEU,MAAM;EJoE3C,wBAAwB,EIpEa,MAAM;EJqE3C,mBAAmB,EIrEkB,MAAM;AAGvC,oDAAU;EJoJd,iBAAiB,EAAE,gBAAmB;EACtC,SAAS,EAAE,gBAAmB;EA+H9B,kBAAkB,EAnBH,wDAAsD;EAoBrE,eAAe,EApBA,qDAAsD;EAqBrE,aAAa,EArBE,mDAAsD;EAsBrE,UAAU,EAAE,gDAAO;EA7FnB,wBAAwB,EItLU,GAAG;EJuLrC,qBAAqB,EIvLa,GAAG;EJwLrC,oBAAoB,EIxLc,GAAG;EJyLrC,gBAAgB,EIzLkB,GAAG;EJ4DrC,2BAA2B,EI3DU,MAAM;EJ4D3C,wBAAwB,EI5Da,MAAM;EJ6D3C,mBAAmB,EI7DkB,MAAM;;AAQ3C,iBAAQ;EACJ,OAAO,EAAE,OAAO;;AAIxB,YAAa;EACT,OAAO,EAAE,GAAG;EACZ,cAAc,EAAE,IAAI;EAEpB,kBAAQ;IACJ,OAAO,EAAE,OAAO;EAGpB,uBAAa;IACT,OAAO,EAAE,CAAC;IACV,cAAc,EAAE,IAAI;;AC7CxB,yBAAgB;EACZ,MAAM,EAAE,IAAI;EACZ,IAAI,EAAE,CAAC;EACP,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,CAAC;EACR,UAAU,EAAE,MAAM;EAClB,OAAO,EN0CA,IAAI;EMzCX,MAAM,EAAE,IAAI;EAGR,uDAAe;IACX,QAAQ,EAAE,OAAO;AAK7B,wBAAe;EACX,MAAM,EAAE,OAAO;EACf,OAAO,EAAE,YAAY;EACrB,QAAQ,EAAE,MAAM;EAChB,QAAQ,EAAE,QAAQ;EAClB,cAAc,EAAE,GAAG;EACnB,MAAM,EAAE,KAAK;EAGT,mDAAqB;IACjB,OAAO,EAAE,CAAC;ILsItB,iBAAiB,EAAE,oBAAuB;IAC1C,SAAS,EAAE,oBAAuB;EKjI1B,kDAAU;IACN,UAAU,EAAE,qBAAqB;AAK7C,8BAAqB;EACjB,gBAAgB,EAAE,IAAI;EACtB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,MAAM,EAAE,IAAI;EACZ,IAAI,EAAE,CAAC;EACP,aAAa,EAAE,IAAI;EACnB,WAAW,EAAE,KAAK;EAClB,OAAO,EAAE,CAAC;EACV,OAAO,EAAE,GAAG;EACZ,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,KAAK;EACZ,aAAa,EAAE,GAAG;ELmPtB,kBAAkB,EAnBH,sDAAsD;EAoBrE,eAAe,EApBA,mDAAsD;EAqBrE,aAAa,EArBE,iDAAsD;EAsBrE,UAAU,EAAE,8CAAO;EAxInB,iBAAiB,EAAE,sBAAuB;EAC1C,SAAS,EAAE,sBAAuB;EK3G9B,kCAAI;IACA,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;AAIpB,mBAAU;EACN,gBAAgB,EAAE,wBAAwB;EAC1C,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,wCAAwC;EACpD,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,IAAI;EL2JhB,kBAAkB,EAAE,uBAAW;EAC/B,aAAa,EAAE,uBAAW;EAC1B,UAAU,EAAE,uBAAW;EK3JnB,KAAK,EAAE,IAAI;EAEX,oDAAiB;IACb,UAAU,EAAE,qBAAqB;AAIzC,mBAAU;EACN,WAAW,EAAE,sBAAsB;EACnC,YAAY,EAAE,sBAAsB;EACpC,UAAU,EAAE,WAAW;EACvB,MAAM,EAAE,KAAK;EACb,OAAO,EAAE,YAAY;EACrB,MAAM,EAAE,CAAC;EACT,IAAI,EAAE,GAAG;EACT,WAAW,EAAE,IAAI;EACjB,QAAQ,EAAE,QAAQ;EAClB,cAAc,EAAE,MAAM;EACtB,KAAK,EAAE,CAAC;;ACrFZ,oBAAQ;EACJ,OAAO,EAAE,OAAO;EAEhB,sCAAoB;IAChB,OAAO,EAAE,OAAO;;ACQ5B,MAAO;EACH,KAAK,EAAE,CAAC;;AAGZ,2BAA4B;EACxB,OAAO,EAAE,KAAK;EACd,OAAO,EAAE,EAAE;EACX,WAAW,EAAE,CAAC;;AAGlB,YAAa;EACT,KAAK,EAAE,IAAI;;AAIf,SAAU;EACN,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,QAAQ,EAAE,KAAK;EACf,GAAG,EAAE,CAAC;EACN,IAAI,EAAE,CAAC;EACP,OAAO,ERSI,IAAI;EQRf,OAAO,EAAE,CAAC;EP0LV,kBAAkB,EAAE,qBAAW;EAC/B,aAAa,EAAE,qBAAW;EAC1B,UAAU,EAAE,qBAAW;EOxLvB,WAAE;IP4DF,kBAAkB,EO3DM,UAAU;IP4DlC,eAAe,EO5DS,UAAU;IP6DlC,UAAU,EO7Dc,UAAU;EAGlC,oBAAa;IACT,OAAO,EAAE,CAAC;EAMN,yHAA+C;IP2LvD,2BAA2B,EAAE,kBAAoB;IACjD,mBAAmB,EAAE,kBAAoB;IAIzC,kCAAkC,EO9Lc,kBAAkB;IP+LlE,0BAA0B,EO/LsB,kBAAkB;EAQ1D,6JAA+C;IPiLvD,2BAA2B,EAAE,aAAoB;IACjD,mBAAmB,EAAE,aAAoB;IOhL7B,OAAO,EAAE,CAAC;EAOlB,+BAAc;IPoPlB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,OAAO;IACf,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,IAAI;EOlPR,mCAAc;IPsPlB,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,gBAAgB;IACxB,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,QAAQ;EOtPhB,aAAI;IACA,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE,MAAM;IAChB,WAAW,EAAE,IAAI;IACjB,YAAY,EAAE,IAAI;IAClB,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,IAAI;EAGpB,mBAAU;IACN,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,CAAC;IACP,GAAG,EAAE,CAAC;IACN,WAAW,EAAE,MAAM;EAGvB,kBAAS;IACL,UAAU,EAAE,kEAAkE;IAC9E,OAAO,EAAE,eAAe;EAGxB,iGAA2C;IACvC,OAAO,EAAE,uBAAuB;EAIpC,4BAAW;IACP,OAAO,EAAE,uBAAuB;EAIxC,0CAAuB;IACnB,OAAO,EAAE,YAAY;IACrB,UAAU,EAAE,MAAM;IAClB,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IAEZ,wDAAS;MACL,OAAO,EAAE,EAAE;MACX,OAAO,EAAE,YAAY;MACrB,MAAM,EAAE,GAAG;MACX,KAAK,EAAE,GAAG;MACV,YAAY,EAAE,IAAI;EAI1B,sBAAa;IACT,GAAG,EAAE,CAAC;IACN,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,KAAK;EAId,8BAAc;IACV,gBAAgB,EAAE,IAAI;EAG1B,6BAAa;IACT,OAAO,ER9FL,IAAI;EQkGd,mBAAU;IACN,OAAO,EAAE,YAAY;IACrB,cAAc,EAAE,MAAM;IACtB,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,IAAI;IAChB,KAAK,EAAE,eAAe;IACtB,MAAM,EAAE,eAAe;EAKnB,sGAA2B;IACvB,OAAO,EAAE,CAAC;IP4DtB,kBAAkB,EAAE,qBAAW;IAC/B,aAAa,EAAE,qBAAW;IAC1B,UAAU,EAAE,qBAAW;EOzDX,8HAA2B;IACvB,OAAO,EAAE,CAAC;EAO1B,wBAAe;IACX,OAAO,EAAE,IAAI;;AAGrB,YAAY;EACR,QAAQ,EAAE,KAAK;EACf,GAAG,EAAE,CAAC;EACN,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,CAAC;EACR,MAAM,EAAE,CAAC;EACT,OAAO,ERpIO,IAAI;EQqIlB,gBAAgB,EAAE,IAAI;EACtB,OAAO,EAAE,CAAC;EPmCV,kBAAkB,EAAE,qBAAW;EAC/B,aAAa,EAAE,qBAAW;EAC1B,UAAU,EAAE,qBAAW;EOnCvB,eAAI;IACA,OAAO,ER7LI,CAAC;;AQsMZ,0GAA4C;EPgGhD,kBAAkB,EAnBH,0BAAsD;EAoBrE,eAAe,EApBA,0BAAsD;EAqBrE,aAAa,EArBE,0BAAsD;EAsBrE,UAAU,EAAE,0BAAO;AO7Ff,6BAAS;EP1Hb,2BAA2B,EO2HU,MAAM;EP1H3C,wBAAwB,EO0Ha,MAAM;EPzH3C,mBAAmB,EOyHkB,MAAM;AAKvC,6BAAS;EPhIb,2BAA2B,EOiIU,MAAM;EPhI3C,wBAAwB,EOgIa,MAAM;EP/H3C,mBAAmB,EO+HkB,MAAM;AAMvC,yBAAS;EACL,OAAO,EAAE,CAAC;EAEV,oCAAa;IACT,OAAO,EAAE,CAAC;EAId,sHAA+C;IPqEvD,kBAAkB,EAnBH,oBAAsD;IAoBrE,eAAe,EApBA,oBAAsD;IAqBrE,aAAa,EArBE,oBAAsD;IAsBrE,UAAU,EAAE,oBAAO;AOhEX,sCAAS;EACL,OAAO,EAAE,CAAC;EAEV,oDAAgB;IP3E5B,iBAAiB,EAAE,wBAAuB;IAC1C,SAAS,EAAE,wBAAuB;EO8EtB,oDAAgB;IP/E5B,iBAAiB,EAAE,uBAAuB;IAC1C,SAAS,EAAE,uBAAuB;EOkFtB,iDAAa;IPnFzB,iBAAiB,EAAE,oBAAuB;IAC1C,SAAS,EAAE,oBAAuB;IOoFlB,OAAO,EAAE,CAAC;EAId,6JAA+C;IP4C3D,kBAAkB,EAnBH,yEAAsD;IAoBrE,eAAe,EApBA,sEAAsD;IAqBrE,aAAa,EArBE,oEAAsD;IAsBrE,UAAU,EAAE,iEAAO;AOxCX,sCAAS;EACL,OAAO,EAAE,CAAC;EACV,QAAQ,EAAE,QAAQ;EAClB,IAAI,EAAE,CAAC;EAEP,oDAAgB;IACZ,IAAI,EAAE,KAAK;EAGf,oDAAgB;IACZ,IAAI,EAAE,IAAI;EAGd,iDAAa;IACT,IAAI,EAAE,CAAC;IACP,OAAO,EAAE,CAAC;EAId,6JAA+C;IPkB3D,kBAAkB,EAnBH,4DAAsD;IAoBrE,eAAe,EApBA,4DAAsD;IAqBrE,aAAa,EArBE,4DAAsD;IAsBrE,UAAU,EAAE,4DAAO", 4 | "sources": ["file:///C:/wamp/www/lg-desktop/lightgallery-desktop/app/lightgallery/sass/lg-fonts.scss","file:///C:/wamp/www/lg-desktop/lightgallery-desktop/app/lightgallery/sass/lg-theme-default.scss","file:///C:/wamp/www/lg-desktop/lightgallery-desktop/app/lightgallery/sass/lg-variables.scss","file:///C:/wamp/www/lg-desktop/lightgallery-desktop/app/lightgallery/sass/lg-mixins.scss","file:///C:/wamp/www/lg-desktop/lightgallery-desktop/app/lightgallery/sass/lg-thumbnail.scss","file:///C:/wamp/www/lg-desktop/lightgallery-desktop/app/lightgallery/sass/lg-video.scss","file:///C:/wamp/www/lg-desktop/lightgallery-desktop/app/lightgallery/sass/lg-autoplay.scss","file:///C:/wamp/www/lg-desktop/lightgallery-desktop/app/lightgallery/sass/lg-zoom.scss","file:///C:/wamp/www/lg-desktop/lightgallery-desktop/app/lightgallery/sass/lg-pager.scss","file:///C:/wamp/www/lg-desktop/lightgallery-desktop/app/lightgallery/sass/lg-fullscreen.scss","file:///C:/wamp/www/lg-desktop/lightgallery-desktop/app/lightgallery/sass/lightgallery.scss"], 5 | "names": [], 6 | "file": "lightgallery.css" 7 | } 8 | -------------------------------------------------------------------------------- /app/lightgallery/fonts/lg.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachinchoolur/lightgallery-desktop/46ace840e0fdc03e79f864ad4b47c7057237ac6e/app/lightgallery/fonts/lg.eot -------------------------------------------------------------------------------- /app/lightgallery/fonts/lg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | { 8 | "fontFamily": "lg", 9 | "majorVersion": 1, 10 | "minorVersion": 0, 11 | "fontURL": "https://github.com/sachinchoolur/lightGallery", 12 | "copyright": "sachin", 13 | "license": "MLT", 14 | "licenseURL": "http://opensource.org/licenses/MIT", 15 | "version": "Version 1.0", 16 | "fontId": "lg", 17 | "psName": "lg", 18 | "subFamily": "Regular", 19 | "fullName": "lg", 20 | "description": "Font generated by IcoMoon." 21 | } 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /app/lightgallery/fonts/lg.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachinchoolur/lightgallery-desktop/46ace840e0fdc03e79f864ad4b47c7057237ac6e/app/lightgallery/fonts/lg.ttf -------------------------------------------------------------------------------- /app/lightgallery/fonts/lg.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachinchoolur/lightgallery-desktop/46ace840e0fdc03e79f864ad4b47c7057237ac6e/app/lightgallery/fonts/lg.woff -------------------------------------------------------------------------------- /app/lightgallery/img/lg-default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachinchoolur/lightgallery-desktop/46ace840e0fdc03e79f864ad4b47c7057237ac6e/app/lightgallery/img/lg-default.png -------------------------------------------------------------------------------- /app/lightgallery/img/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachinchoolur/lightgallery-desktop/46ace840e0fdc03e79f864ad4b47c7057237ac6e/app/lightgallery/img/loading.gif -------------------------------------------------------------------------------- /app/lightgallery/img/video-play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachinchoolur/lightgallery-desktop/46ace840e0fdc03e79f864ad4b47c7057237ac6e/app/lightgallery/img/video-play.png -------------------------------------------------------------------------------- /app/lightgallery/img/vimeo-play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachinchoolur/lightgallery-desktop/46ace840e0fdc03e79f864ad4b47c7057237ac6e/app/lightgallery/img/vimeo-play.png -------------------------------------------------------------------------------- /app/lightgallery/img/youtube-play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachinchoolur/lightgallery-desktop/46ace840e0fdc03e79f864ad4b47c7057237ac6e/app/lightgallery/img/youtube-play.png -------------------------------------------------------------------------------- /app/lightgallery/js/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "curly": true, 3 | "eqeqeq": true, 4 | "immed": true, 5 | "latedef": true, 6 | "newcap": true, 7 | "noarg": true, 8 | "sub": true, 9 | "undef": true, 10 | "unused": true, 11 | "boss": true, 12 | "eqnull": true, 13 | "browser": true, 14 | "predef": [ 15 | "jQuery", 16 | "console", 17 | "$f", 18 | "picturefill", 19 | "videojs" 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /app/lightgallery/js/lg-autoplay.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Autoplay Plugin 3 | * @version 1.2.0 4 | * @author Sachin N - @sachinchoolur 5 | * @license MIT License (MIT) 6 | */ 7 | 8 | (function($, window, document, undefined) { 9 | 10 | 'use strict'; 11 | 12 | var defaults = { 13 | autoplay: false, 14 | pause: 5000, 15 | progressBar: true, 16 | fourceAutoplay: false, 17 | autoplayControls: true, 18 | appendAutoplayControlsTo: '.lg-toolbar' 19 | }; 20 | 21 | /** 22 | * Creates the autoplay plugin. 23 | * @param {object} element - lightGallery element 24 | */ 25 | var Autoplay = function(element) { 26 | 27 | this.core = $(element).data('lightGallery'); 28 | 29 | this.$el = $(element); 30 | 31 | // Exicute only if items are above 1 32 | if (this.core.$items.length < 2) { 33 | return false; 34 | } 35 | 36 | this.core.s = $.extend({}, defaults, this.core.s); 37 | this.interval = false; 38 | 39 | // Identify if slide happened from autoplay 40 | this.fromAuto = true; 41 | 42 | // Identify if autoplay canceled from touch/drag 43 | this.canceledOnTouch = false; 44 | 45 | // save fourceautoplay value 46 | this.fourceAutoplayTemp = this.core.s.fourceAutoplay; 47 | 48 | // do not allow progress bar if browser does not support css3 transitions 49 | if (!this.core.doCss()) { 50 | this.core.s.progressBar = false; 51 | } 52 | 53 | this.init(); 54 | 55 | return this; 56 | }; 57 | 58 | Autoplay.prototype.init = function() { 59 | var _this = this; 60 | 61 | // append autoplay controls 62 | if (_this.core.s.autoplayControls) { 63 | _this.controls(); 64 | } 65 | 66 | // Create progress bar 67 | if (_this.core.s.progressBar) { 68 | _this.core.$outer.find('.lg').append('
'); 69 | } 70 | 71 | // set progress 72 | _this.progress(); 73 | 74 | // Start autoplay 75 | if (_this.core.s.autoplay) { 76 | _this.startlAuto(); 77 | } 78 | 79 | // cancel interval on touchstart and dragstart 80 | _this.$el.on('onDragstart.lg.tm touchstart.lg.tm', function() { 81 | if (_this.interval) { 82 | _this.cancelAuto(); 83 | _this.canceledOnTouch = true; 84 | } 85 | }); 86 | 87 | // restore autoplay if autoplay canceled from touchstart / dragstart 88 | _this.$el.on('onDragend.lg.tm touchend.lg.tm onSlideClick.lg.tm', function() { 89 | if (!_this.interval && _this.canceledOnTouch) { 90 | _this.startlAuto(); 91 | _this.canceledOnTouch = false; 92 | } 93 | }); 94 | 95 | }; 96 | 97 | Autoplay.prototype.progress = function() { 98 | 99 | var _this = this; 100 | var _$progressBar; 101 | var _$progress; 102 | 103 | _this.$el.on('onBeforeSlide.lg.tm', function() { 104 | 105 | // start progress bar animation 106 | if (_this.core.s.progressBar && _this.fromAuto) { 107 | _$progressBar = _this.core.$outer.find('.lg-progress-bar'); 108 | _$progress = _this.core.$outer.find('.lg-progress'); 109 | if (_this.interval) { 110 | _$progress.removeAttr('style'); 111 | _$progressBar.removeClass('lg-start'); 112 | setTimeout(function() { 113 | _$progress.css('transition', 'width ' + (_this.core.s.speed + _this.core.s.pause) + 'ms ease 0s'); 114 | _$progressBar.addClass('lg-start'); 115 | }, 20); 116 | } 117 | } 118 | 119 | // Remove setinterval if slide is trigered manualy and fourceautoplay is false 120 | if (!_this.fromAuto && !_this.core.s.fourceAutoplay) { 121 | _this.cancelAuto(); 122 | } 123 | 124 | _this.fromAuto = false; 125 | 126 | }); 127 | }; 128 | 129 | // Manage autoplay via play/stop buttons 130 | Autoplay.prototype.controls = function() { 131 | var _this = this; 132 | var _html = ''; 133 | 134 | // Append autoplay controls 135 | $(this.core.s.appendAutoplayControlsTo).append(_html); 136 | 137 | _this.core.$outer.find('.lg-autoplay-button').on('click.lg', function() { 138 | if ($(_this.core.$outer).hasClass('lg-show-autoplay')) { 139 | _this.cancelAuto(); 140 | _this.core.s.fourceAutoplay = false; 141 | } else { 142 | if (!_this.interval) { 143 | _this.startlAuto(); 144 | _this.core.s.fourceAutoplay = _this.fourceAutoplayTemp; 145 | } 146 | } 147 | }); 148 | }; 149 | 150 | // Autostart gallery 151 | Autoplay.prototype.startlAuto = function() { 152 | var _this = this; 153 | 154 | _this.core.$outer.find('.lg-progress').css('transition', 'width ' + (_this.core.s.speed + _this.core.s.pause) + 'ms ease 0s'); 155 | _this.core.$outer.addClass('lg-show-autoplay'); 156 | _this.core.$outer.find('.lg-progress-bar').addClass('lg-start'); 157 | 158 | _this.interval = setInterval(function() { 159 | if (_this.core.index + 1 < _this.core.$items.length) { 160 | _this.core.index = _this.core.index; 161 | } else { 162 | _this.core.index = -1; 163 | } 164 | 165 | _this.core.index++; 166 | _this.fromAuto = true; 167 | _this.core.slide(_this.core.index, false, false); 168 | }, _this.core.s.speed + _this.core.s.pause); 169 | }; 170 | 171 | // cancel Autostart 172 | Autoplay.prototype.cancelAuto = function() { 173 | clearInterval(this.interval); 174 | this.interval = false; 175 | this.core.$outer.find('.lg-progress').removeAttr('style'); 176 | this.core.$outer.removeClass('lg-show-autoplay'); 177 | this.core.$outer.find('.lg-progress-bar').removeClass('lg-start'); 178 | }; 179 | 180 | Autoplay.prototype.destroy = function() { 181 | 182 | this.cancelAuto(); 183 | this.core.$outer.find('.lg-progress-bar').remove(); 184 | }; 185 | 186 | $.fn.lightGallery.modules.autoplay = Autoplay; 187 | 188 | })(jQuery, window, document); 189 | -------------------------------------------------------------------------------- /app/lightgallery/js/lg-pager.js: -------------------------------------------------------------------------------- 1 | (function($, window, document, undefined) { 2 | 3 | 'use strict'; 4 | 5 | var defaults = { 6 | pager: false 7 | }; 8 | 9 | var Pager = function(element) { 10 | 11 | this.core = $(element).data('lightGallery'); 12 | 13 | this.$el = $(element); 14 | this.core.s = $.extend({}, defaults, this.core.s); 15 | if (this.core.s.pager && this.core.$items.length > 1) { 16 | this.init(); 17 | } 18 | 19 | return this; 20 | }; 21 | 22 | Pager.prototype.getPager = function(file, index) { 23 | var _this = this; 24 | var _canvas = document.createElement('canvas'); 25 | var _img = new Image(); 26 | _img.src = file; 27 | _img.onload = function() { 28 | _canvas.width = Number(100); 29 | _canvas.height = Number(100); 30 | if (_canvas.getContext) { 31 | var _cntxt = _canvas.getContext('2d'); 32 | _cntxt.drawImage(_img, 0, 0, _canvas.width, _canvas.height); 33 | var _dataURL = _canvas.toDataURL(); 34 | _this.core.$outer.find('.lg-pager-cont').eq(index).find('img').attr('src', _dataURL); 35 | } 36 | }; 37 | }; 38 | 39 | Pager.prototype.init = function() { 40 | var _this = this; 41 | var pagerList = ''; 42 | var $pagerCont; 43 | var $pagerOuter; 44 | var timeout; 45 | 46 | _this.core.$outer.find('.lg').append('
'); 47 | 48 | if (_this.core.s.dynamic) { 49 | for (var i = 0; i < _this.core.s.dynamicEl.length; i++) { 50 | pagerList += '
'; 51 | } 52 | } else { 53 | _this.core.$items.each(function() { 54 | 55 | if (!_this.core.s.exThumbImage) { 56 | pagerList += '
'; 57 | } else { 58 | pagerList += '
'; 59 | } 60 | 61 | }); 62 | } 63 | 64 | $pagerOuter = _this.core.$outer.find('.lg-pager-outer'); 65 | 66 | $pagerOuter.html(pagerList); 67 | 68 | $pagerCont = _this.core.$outer.find('.lg-pager-cont'); 69 | $pagerCont.on('click.lg touchend.lg', function() { 70 | var _$this = $(this); 71 | _this.core.index = _$this.index(); 72 | _this.core.slide(_this.core.index, false, false); 73 | }); 74 | 75 | $pagerOuter.on('mouseover.lg', function() { 76 | clearTimeout(timeout); 77 | $pagerOuter.addClass('lg-pager-hover'); 78 | }); 79 | 80 | $pagerOuter.on('mouseout.lg', function() { 81 | timeout = setTimeout(function() { 82 | $pagerOuter.removeClass('lg-pager-hover'); 83 | }); 84 | }); 85 | 86 | _this.core.$el.on('onBeforeSlide.lg.tm', function(e, prevIndex, index) { 87 | $pagerCont.removeClass('lg-pager-active'); 88 | $pagerCont.eq(index).addClass('lg-pager-active'); 89 | }); 90 | 91 | 92 | _this.core.$outer.find('.lg-pager-cont').each(function(index) { 93 | _this.getPager(_this.core.s.dynamicEl[index].src, index); 94 | }); 95 | 96 | }; 97 | 98 | Pager.prototype.destroy = function() { 99 | 100 | }; 101 | 102 | $.fn.lightGallery.modules.pager = Pager; 103 | 104 | })(jQuery, window, document); 105 | -------------------------------------------------------------------------------- /app/lightgallery/js/lg-video.js: -------------------------------------------------------------------------------- 1 | (function($, window, document, undefined) { 2 | 3 | 'use strict'; 4 | 5 | var defaults = { 6 | videoMaxWidth: '855px', 7 | youtubePlayerParams: false, 8 | vimeoPlayerParams: false, 9 | dailymotionPlayerParams: false, 10 | videojs: false 11 | }; 12 | 13 | var Video = function(element) { 14 | 15 | this.core = $(element).data('lightGallery'); 16 | 17 | this.$el = $(element); 18 | this.core.s = $.extend({}, defaults, this.core.s); 19 | this.videoLoaded = false; 20 | 21 | this.init(); 22 | 23 | return this; 24 | }; 25 | 26 | Video.prototype.init = function() { 27 | var _this = this; 28 | 29 | // Event triggered when video url found without poster 30 | _this.core.$el.on('hasVideo.lg.tm', function(event, index, src, html) { 31 | _this.core.$slide.eq(index).find('.lg-video').append(_this.loadVideo(src, 'lg-object', true, index, html)); 32 | if (html) { 33 | if (_this.core.s.videojs) { 34 | try { 35 | videojs(_this.core.$slide.eq(index).find('.lg-html5').get(0), {}, function() { 36 | if (!_this.videoLoaded) { 37 | this.play(); 38 | } 39 | }); 40 | } catch (e) { 41 | console.error('Make sure you have included videojs'); 42 | } 43 | } else { 44 | _this.core.$slide.eq(index).find('.lg-html5').get(0).play(); 45 | } 46 | } 47 | }); 48 | 49 | // Set max width for video 50 | _this.core.$el.on('onAferAppendSlide.lg.tm', function(event, index) { 51 | _this.core.$slide.eq(index).find('.lg-video-cont').css('max-width', _this.core.s.videoMaxWidth); 52 | _this.videoLoaded = true; 53 | }); 54 | 55 | var loadOnClick = function($el) { 56 | // check slide has poster 57 | if ($el.find('.lg-object').hasClass('lg-has-poster') && $el.find('.lg-object').is(':visible')) { 58 | 59 | // chack already video element present 60 | if (!$el.hasClass('lg-has-video')) { 61 | 62 | $el.addClass('lg-video-palying lg-has-video'); 63 | 64 | var _src; 65 | var _html; 66 | var _loadVideo = function(_src, _html) { 67 | 68 | $el.find('.lg-video').append(_this.loadVideo(_src, '', false, _this.core.index, _html)); 69 | 70 | if (_html) { 71 | if (_this.core.s.videojs) { 72 | try { 73 | videojs(_this.core.$slide.eq(_this.core.index).find('.lg-html5').get(0), {}, function() { 74 | this.play(); 75 | }); 76 | } catch (e) { 77 | console.error('Make sure you have included videojs'); 78 | } 79 | } else { 80 | _this.core.$slide.eq(_this.core.index).find('.lg-html5').get(0).play(); 81 | } 82 | } 83 | 84 | }; 85 | 86 | if (_this.core.s.dynamic) { 87 | 88 | _src = _this.core.s.dynamicEl[_this.core.index].src; 89 | _html = _this.core.s.dynamicEl[_this.core.index].html; 90 | 91 | _loadVideo(_src, _html); 92 | 93 | } else { 94 | 95 | _src = _this.core.$items.eq(_this.core.index).attr('href') || _this.core.$items.eq(_this.core.index).attr('data-src'); 96 | _html = _this.core.$items.eq(_this.core.index).attr('data-html'); 97 | 98 | _loadVideo(_src, _html); 99 | 100 | } 101 | 102 | var $tempImg = $el.find('.lg-object'); 103 | $el.find('.lg-video').append($tempImg); 104 | 105 | // @todo loading icon for html5 videos also 106 | // for showing the loading indicator while loading video 107 | if (!$el.find('.lg-video-object').hasClass('lg-html5')) { 108 | $el.removeClass('lg-complete'); 109 | $el.find('.lg-video-object').on('load.lg error.lg', function() { 110 | $el.addClass('lg-complete'); 111 | }); 112 | } 113 | 114 | } else { 115 | 116 | var youtubePlayer = $el.find('.lg-youtube').get(0); 117 | var vimeoPlayer = $el.find('.lg-vimeo').get(0); 118 | var dailymotionPlayer = $el.find('.lg-dailymotion').get(0); 119 | var html5Player = $el.find('.lg-html5').get(0); 120 | if (youtubePlayer) { 121 | youtubePlayer.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}', '*'); 122 | } else if (vimeoPlayer) { 123 | try { 124 | $f(vimeoPlayer).api('play'); 125 | } catch (e) { 126 | console.error('Make sure you have included froogaloop2 js'); 127 | } 128 | } else if (dailymotionPlayer) { 129 | dailymotionPlayer.contentWindow.postMessage('play', '*'); 130 | 131 | } else if (html5Player) { 132 | if (_this.core.s.videojs) { 133 | try { 134 | videojs(html5Player).play(); 135 | } catch (e) { 136 | console.error('Make sure you have included videojs'); 137 | } 138 | } else { 139 | html5Player.play(); 140 | } 141 | } 142 | 143 | $el.addClass('lg-video-palying'); 144 | 145 | } 146 | } 147 | }; 148 | 149 | if (_this.core.doCss() && _this.core.$items.length > 1 && ((_this.core.s.enableSwipe && _this.core.isTouch) || (_this.core.s.enableDrag && !_this.core.isTouch))) { 150 | _this.core.$el.on('onSlideClick.lg.tm', function() { 151 | var $el = _this.core.$slide.eq(_this.core.index); 152 | loadOnClick($el); 153 | }); 154 | } else { 155 | 156 | // For IE 9 and bellow 157 | _this.core.$slide.on('click.lg', function() { 158 | loadOnClick($(this)); 159 | }); 160 | } 161 | 162 | _this.core.$el.on('onBeforeSlide.lg.tm', function(event, prevIndex) { 163 | 164 | var $videoSlide = _this.core.$slide.eq(prevIndex); 165 | var youtubePlayer = $videoSlide.find('.lg-youtube').get(0); 166 | var vimeoPlayer = $videoSlide.find('.lg-vimeo').get(0); 167 | var dailymotionPlayer = $videoSlide.find('.lg-dailymotion').get(0); 168 | var html5Player = $videoSlide.find('.lg-html5').get(0); 169 | if (youtubePlayer) { 170 | youtubePlayer.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}', '*'); 171 | } else if (vimeoPlayer) { 172 | try { 173 | $f(vimeoPlayer).api('pause'); 174 | } catch (e) { 175 | console.error('Make sure you have included froogaloop2 js'); 176 | } 177 | } else if (dailymotionPlayer) { 178 | dailymotionPlayer.contentWindow.postMessage('pause', '*'); 179 | 180 | } else if (html5Player) { 181 | if (_this.core.s.videojs) { 182 | try { 183 | videojs(html5Player).pause(); 184 | } catch (e) { 185 | console.error('Make sure you have included videojs'); 186 | } 187 | } else { 188 | html5Player.pause(); 189 | } 190 | } 191 | 192 | //$videoSlide.addClass('lg-complete'); 193 | 194 | }); 195 | 196 | _this.core.$el.on('onAfterSlide.lg.tm', function(event, prevIndex) { 197 | _this.core.$slide.eq(prevIndex).removeClass('lg-video-palying'); 198 | }); 199 | }; 200 | 201 | Video.prototype.loadVideo = function(src, addClass, noposter, index, html) { 202 | var video = ''; 203 | var autoplay = 1; 204 | var a = ''; 205 | var isVideo = this.core.isVideo(src, index) || {}; 206 | 207 | // Enable autoplay for first video if poster doesn't exist 208 | if (noposter) { 209 | if (this.videoLoaded) { 210 | autoplay = 0; 211 | } else { 212 | autoplay = 1; 213 | } 214 | } 215 | 216 | if (isVideo.youtube) { 217 | 218 | a = '?wmode=opaque&autoplay=' + autoplay + '&enablejsapi=1'; 219 | if (this.core.s.youtubePlayerParams) { 220 | a = a + '&' + $.param(this.core.s.youtubePlayerParams); 221 | } 222 | 223 | video = ''; 224 | 225 | } else if (isVideo.vimeo) { 226 | 227 | a = '?autoplay=' + autoplay + '&api=1'; 228 | if (this.core.s.vimeoPlayerParams) { 229 | a = a + '&' + $.param(this.core.s.vimeoPlayerParams); 230 | } 231 | 232 | video = ''; 233 | 234 | } else if (isVideo.dailymotion) { 235 | 236 | a = '?wmode=opaque&autoplay=' + autoplay + '&api=postMessage'; 237 | if (this.core.s.dailymotionPlayerParams) { 238 | a = a + '&' + $.param(this.core.s.dailymotionPlayerParams); 239 | } 240 | 241 | video = ''; 242 | 243 | } else if (isVideo.html5) { 244 | var fL = html.substring(0, 1); 245 | if (fL === '.' || fL === '#') { 246 | html = $(html).html(); 247 | } 248 | 249 | video = html; 250 | } 251 | 252 | return video; 253 | }; 254 | 255 | Video.prototype.destroy = function() { 256 | this.videoLoaded = false; 257 | }; 258 | 259 | $.fn.lightGallery.modules.video = Video; 260 | 261 | })(jQuery, window, document); 262 | -------------------------------------------------------------------------------- /app/lightgallery/js/lg-zoom.js: -------------------------------------------------------------------------------- 1 | /*! lightgallery - v1.2.9 - 2015-12-18 2 | * http://sachinchoolur.github.io/lightGallery/ 3 | * Copyright (c) 2015 Sachin N; Licensed Apache 2.0 */ 4 | /** 5 | * Zoom Plugin 6 | * @version 1.2.0 7 | * @author Sachin N - @sachinchoolur 8 | * @license MIT License (MIT) 9 | */ 10 | (function($, window, document, undefined) { 11 | 12 | 'use strict'; 13 | 14 | var defaults = { 15 | scale: 1, 16 | zoom: true, 17 | enableZoomAfter: 300 18 | }; 19 | 20 | var Zoom = function(element) { 21 | 22 | this.core = $(element).data('lightGallery'); 23 | 24 | this.core.s = $.extend({}, defaults, this.core.s); 25 | 26 | if (this.core.s.zoom && this.core.doCss()) { 27 | this.init(); 28 | 29 | // Store the zoomable timeout value just to clear it while closing 30 | this.zoomabletimeout = false; 31 | 32 | // Set the initial value center 33 | this.pageX = $(window).width() / 2; 34 | this.pageY = ($(window).height() / 2) + $(window).scrollTop(); 35 | } 36 | 37 | return this; 38 | }; 39 | 40 | Zoom.prototype.init = function() { 41 | 42 | var _this = this; 43 | var zoomIcons = ''; 44 | 45 | this.core.$outer.find('.lg-toolbar').append(zoomIcons); 46 | 47 | // Add zoomable class 48 | _this.core.$el.on('onSlideItemLoad.lg.tm.zoom', function(event, index, delay) { 49 | 50 | // delay will be 0 except first time 51 | var _speed = _this.core.s.enableZoomAfter + delay; 52 | 53 | // set _speed value 0 if gallery opened from direct url and if it is first slide 54 | if ($('body').hasClass('lg-from-hash') && delay) { 55 | 56 | // will execute only once 57 | _speed = 0; 58 | } else { 59 | 60 | // Remove lg-from-hash to enable starting animation. 61 | $('body').removeClass('lg-from-hash'); 62 | } 63 | _this.zoomabletimeout = setTimeout(function() { 64 | _this.core.$slide.eq(index).addClass('lg-zoomable'); 65 | }, _speed + 1200); 66 | }); 67 | 68 | var scale = 1; 69 | /** 70 | * @desc Image zoom 71 | * Translate the wrap and scale the image to get better user experience 72 | * 73 | * @param {String} scaleVal - Zoom decrement/increment value 74 | */ 75 | var zoom = function(scaleVal) { 76 | 77 | var $image = _this.core.$outer.find('.lg-current .lg-image'); 78 | var _x; 79 | var _y; 80 | 81 | // Find offset manually to avoid issue after zoom 82 | var offsetX = ($(window).width() - $image.width()) / 2; 83 | var offsetY = (($(window).height() - $image.height()) / 2) + $(window).scrollTop(); 84 | 85 | _x = _this.pageX - offsetX; 86 | _y = _this.pageY - offsetY; 87 | 88 | var x = (scaleVal - 1) * (_x); 89 | var y = (scaleVal - 1) * (_y); 90 | 91 | $image.css('transform', 'scale3d(' + scaleVal + ', ' + scaleVal + ', 1)').attr('data-scale', scaleVal); 92 | 93 | $image.parent().css('transform', 'translate3d(-' + x + 'px, -' + y + 'px, 0)').attr('data-x', x).attr('data-y', y); 94 | }; 95 | 96 | var callScale = function() { 97 | if (scale > 1) { 98 | _this.core.$outer.addClass('lg-zoomed'); 99 | } else { 100 | _this.resetZoom(); 101 | } 102 | 103 | if (scale < 1) { 104 | scale = 1; 105 | } 106 | 107 | zoom(scale); 108 | }; 109 | 110 | // event triggered after appending slide content 111 | _this.core.$el.on('onAferAppendSlide.lg.tm.zoom', function(event, index) { 112 | 113 | // Get the current element 114 | var $image = _this.core.$slide.eq(index).find('.lg-image'); 115 | 116 | $image.dblclick(function(event) { 117 | if (_this.core.$outer.find('.lg-current').hasClass('lg-zoomable')) { 118 | var w = $image.width(); 119 | var nw; 120 | if (_this.core.s.dynamic) { 121 | nw = _this.core.s.dynamicEl[index].width || $image[0].naturalWidth || w; 122 | } else { 123 | nw = _this.core.$items.eq(index).attr('data-width') || $image[0].naturalWidth || w; 124 | } 125 | 126 | var _scale; 127 | 128 | if (_this.core.$outer.hasClass('lg-zoomed')) { 129 | scale = 1; 130 | } else { 131 | if (nw > w) { 132 | _scale = nw / w; 133 | scale = _scale || 2; 134 | } 135 | } 136 | 137 | _this.pageX = event.pageX; 138 | _this.pageY = event.pageY; 139 | callScale(); 140 | setTimeout(function() { 141 | _this.core.$outer.removeClass('lg-grabbing').addClass('lg-grab'); 142 | }, 10); 143 | } 144 | }); 145 | 146 | }); 147 | 148 | // Update zoom on resize and orientationchange 149 | $(window).on('resize.lg.zoom scroll.lg.zoom orientationchange.lg.zoom', function() { 150 | _this.pageX = $(window).width() / 2; 151 | _this.pageY = ($(window).height() / 2) + $(window).scrollTop(); 152 | zoom(scale); 153 | }); 154 | 155 | $('#lg-zoom-out').on('click.lg', function() { 156 | if (_this.core.$outer.find('.lg-current').hasClass('lg-zoomable')) { 157 | if (_this.core.$outer.find('.lg-current .lg-image').length) { 158 | scale -= _this.core.s.scale; 159 | callScale(); 160 | } 161 | } 162 | }); 163 | 164 | $('#lg-zoom-in').on('click.lg', function() { 165 | if (_this.core.$outer.find('.lg-current').hasClass('lg-zoomable')) { 166 | if (_this.core.$outer.find('.lg-current .lg-image').length) { 167 | scale += _this.core.s.scale; 168 | callScale(); 169 | } 170 | } 171 | }); 172 | 173 | // Reset zoom on slide change 174 | _this.core.$el.on('onBeforeSlide.lg.tm', function() { 175 | _this.resetZoom(); 176 | }); 177 | 178 | // Drag option after zoom 179 | if (!_this.core.isTouch) { 180 | _this.zoomDrag(); 181 | } 182 | 183 | if (_this.core.isTouch) { 184 | _this.zoomSwipe(); 185 | } 186 | 187 | }; 188 | 189 | // Reset zoom effect 190 | Zoom.prototype.resetZoom = function() { 191 | this.core.$outer.removeClass('lg-zoomed'); 192 | this.core.$slide.find('.lg-img-wrap').removeAttr('style data-x data-y'); 193 | this.core.$slide.find('.lg-image').removeAttr('style data-scale'); 194 | 195 | // Reset pagx pagy values to center 196 | this.pageX = $(window).width() / 2; 197 | this.pageY = ($(window).height() / 2) + $(window).scrollTop(); 198 | }; 199 | 200 | Zoom.prototype.zoomSwipe = function() { 201 | var _this = this; 202 | var startCoords = {}; 203 | var endCoords = {}; 204 | var isMoved = false; 205 | 206 | // Allow x direction drag 207 | var allowX = false; 208 | 209 | // Allow Y direction drag 210 | var allowY = false; 211 | 212 | _this.core.$slide.on('touchstart.lg', function(e) { 213 | 214 | if (_this.core.$outer.hasClass('lg-zoomed')) { 215 | var $image = _this.core.$slide.eq(_this.core.index).find('.lg-object'); 216 | 217 | allowY = $image.outerHeight() * $image.attr('data-scale') > _this.core.$outer.find('.lg').height(); 218 | allowX = $image.outerWidth() * $image.attr('data-scale') > _this.core.$outer.find('.lg').width(); 219 | if ((allowX || allowY)) { 220 | e.preventDefault(); 221 | startCoords = { 222 | x: e.originalEvent.targetTouches[0].pageX, 223 | y: e.originalEvent.targetTouches[0].pageY 224 | }; 225 | } 226 | } 227 | 228 | }); 229 | 230 | _this.core.$slide.on('touchmove.lg', function(e) { 231 | 232 | if (_this.core.$outer.hasClass('lg-zoomed')) { 233 | 234 | var _$el = _this.core.$slide.eq(_this.core.index).find('.lg-img-wrap'); 235 | var distanceX; 236 | var distanceY; 237 | 238 | e.preventDefault(); 239 | isMoved = true; 240 | 241 | endCoords = { 242 | x: e.originalEvent.targetTouches[0].pageX, 243 | y: e.originalEvent.targetTouches[0].pageY 244 | }; 245 | 246 | // reset opacity and transition duration 247 | _this.core.$outer.addClass('lg-zoom-dragging'); 248 | 249 | if (allowY) { 250 | distanceY = (-Math.abs(_$el.attr('data-y'))) + (endCoords.y - startCoords.y); 251 | } else { 252 | distanceY = -Math.abs(_$el.attr('data-y')); 253 | } 254 | 255 | if (allowX) { 256 | distanceX = (-Math.abs(_$el.attr('data-x'))) + (endCoords.x - startCoords.x); 257 | } else { 258 | distanceX = -Math.abs(_$el.attr('data-x')); 259 | } 260 | 261 | _$el.css('transform', 'translate3d(' + distanceX + 'px, ' + distanceY + 'px, 0)'); 262 | 263 | } 264 | 265 | }); 266 | 267 | _this.core.$slide.on('touchend.lg', function() { 268 | if (_this.core.$outer.hasClass('lg-zoomed')) { 269 | if (isMoved) { 270 | isMoved = false; 271 | _this.core.$outer.removeClass('lg-zoom-dragging'); 272 | _this.touchendZoom(startCoords, endCoords, allowX, allowY); 273 | 274 | } 275 | } 276 | }); 277 | 278 | }; 279 | 280 | Zoom.prototype.zoomDrag = function() { 281 | 282 | var _this = this; 283 | var startCoords = {}; 284 | var endCoords = {}; 285 | var isDraging = false; 286 | var isMoved = false; 287 | 288 | // Allow x direction drag 289 | var allowX = false; 290 | 291 | // Allow Y direction drag 292 | var allowY = false; 293 | 294 | _this.core.$slide.on('mousedown.lg.zoom', function(e) { 295 | 296 | // execute only on .lg-object 297 | var $image = _this.core.$slide.eq(_this.core.index).find('.lg-object'); 298 | 299 | allowY = $image.outerHeight() * $image.attr('data-scale') > _this.core.$outer.find('.lg').height(); 300 | allowX = $image.outerWidth() * $image.attr('data-scale') > _this.core.$outer.find('.lg').width(); 301 | 302 | if (_this.core.$outer.hasClass('lg-zoomed')) { 303 | if ($(e.target).hasClass('lg-object') && (allowX || allowY)) { 304 | e.preventDefault(); 305 | startCoords = { 306 | x: e.pageX, 307 | y: e.pageY 308 | }; 309 | 310 | isDraging = true; 311 | 312 | // ** Fix for webkit cursor issue https://code.google.com/p/chromium/issues/detail?id=26723 313 | _this.core.$outer.scrollLeft += 1; 314 | _this.core.$outer.scrollLeft -= 1; 315 | 316 | _this.core.$outer.removeClass('lg-grab').addClass('lg-grabbing'); 317 | } 318 | } 319 | }); 320 | 321 | $(window).on('mousemove.lg.zoom', function(e) { 322 | if (isDraging) { 323 | var _$el = _this.core.$slide.eq(_this.core.index).find('.lg-img-wrap'); 324 | var distanceX; 325 | var distanceY; 326 | 327 | isMoved = true; 328 | endCoords = { 329 | x: e.pageX, 330 | y: e.pageY 331 | }; 332 | 333 | // reset opacity and transition duration 334 | _this.core.$outer.addClass('lg-zoom-dragging'); 335 | 336 | if (allowY) { 337 | distanceY = (-Math.abs(_$el.attr('data-y'))) + (endCoords.y - startCoords.y); 338 | } else { 339 | distanceY = -Math.abs(_$el.attr('data-y')); 340 | } 341 | 342 | if (allowX) { 343 | distanceX = (-Math.abs(_$el.attr('data-x'))) + (endCoords.x - startCoords.x); 344 | } else { 345 | distanceX = -Math.abs(_$el.attr('data-x')); 346 | } 347 | 348 | _$el.css('transform', 'translate3d(' + distanceX + 'px, ' + distanceY + 'px, 0)'); 349 | } 350 | }); 351 | 352 | $(window).on('mouseup.lg.zoom', function(e) { 353 | 354 | if (isDraging) { 355 | isDraging = false; 356 | _this.core.$outer.removeClass('lg-zoom-dragging'); 357 | 358 | // Fix for chrome mouse move on click 359 | if (isMoved && ((startCoords.x !== endCoords.x) || (startCoords.y !== endCoords.y))) { 360 | endCoords = { 361 | x: e.pageX, 362 | y: e.pageY 363 | }; 364 | _this.touchendZoom(startCoords, endCoords, allowX, allowY); 365 | 366 | } 367 | 368 | isMoved = false; 369 | } 370 | 371 | _this.core.$outer.removeClass('lg-grabbing').addClass('lg-grab'); 372 | 373 | }); 374 | }; 375 | 376 | Zoom.prototype.touchendZoom = function(startCoords, endCoords, allowX, allowY) { 377 | 378 | var _this = this; 379 | var _$el = _this.core.$slide.eq(_this.core.index).find('.lg-img-wrap'); 380 | var $image = _this.core.$slide.eq(_this.core.index).find('.lg-object'); 381 | var distanceX = (-Math.abs(_$el.attr('data-x'))) + (endCoords.x - startCoords.x); 382 | var distanceY = (-Math.abs(_$el.attr('data-y'))) + (endCoords.y - startCoords.y); 383 | var minY = (_this.core.$outer.find('.lg').height() - $image.outerHeight()) / 2; 384 | var maxY = Math.abs(($image.outerHeight() * Math.abs($image.attr('data-scale'))) - _this.core.$outer.find('.lg').height() + minY); 385 | var minX = (_this.core.$outer.find('.lg').width() - $image.outerWidth()) / 2; 386 | var maxX = Math.abs(($image.outerWidth() * Math.abs($image.attr('data-scale'))) - _this.core.$outer.find('.lg').width() + minX); 387 | 388 | if (allowY) { 389 | if (distanceY <= -maxY) { 390 | distanceY = -maxY; 391 | } else if (distanceY >= -minY) { 392 | distanceY = -minY; 393 | } 394 | } 395 | 396 | if (allowX) { 397 | if (distanceX <= -maxX) { 398 | distanceX = -maxX; 399 | } else if (distanceX >= -minX) { 400 | distanceX = -minX; 401 | } 402 | } 403 | 404 | if (allowY) { 405 | _$el.attr('data-y', Math.abs(distanceY)); 406 | } else { 407 | distanceY = -Math.abs(_$el.attr('data-y')); 408 | } 409 | 410 | if (allowX) { 411 | _$el.attr('data-x', Math.abs(distanceX)); 412 | } else { 413 | distanceX = -Math.abs(_$el.attr('data-x')); 414 | } 415 | 416 | _$el.css('transform', 'translate3d(' + distanceX + 'px, ' + distanceY + 'px, 0)'); 417 | }; 418 | 419 | Zoom.prototype.destroy = function() { 420 | 421 | var _this = this; 422 | 423 | // Unbind all events added by lightGallery zoom plugin 424 | _this.core.$el.off('.lg.zoom'); 425 | $(window).off('.lg.zoom'); 426 | _this.core.$slide.off('.lg.zoom'); 427 | _this.core.$el.off('.lg.tm.zoom'); 428 | _this.resetZoom(); 429 | clearTimeout(_this.zoomabletimeout); 430 | _this.zoomabletimeout = false; 431 | }; 432 | 433 | $.fn.lightGallery.modules.zoom = Zoom; 434 | 435 | })(jQuery, window, document); -------------------------------------------------------------------------------- /app/lightgallery/js/mousewheel.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery Mousewheel 3.1.13 3 | * 4 | * Copyright 2015 jQuery Foundation and other contributors 5 | * Released under the MIT license. 6 | * http://jquery.org/license 7 | */ 8 | !function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?module.exports=a:a(jQuery)}(function(a){function b(b){var g=b||window.event,h=i.call(arguments,1),j=0,l=0,m=0,n=0,o=0,p=0;if(b=a.event.fix(g),b.type="mousewheel","detail"in g&&(m=-1*g.detail),"wheelDelta"in g&&(m=g.wheelDelta),"wheelDeltaY"in g&&(m=g.wheelDeltaY),"wheelDeltaX"in g&&(l=-1*g.wheelDeltaX),"axis"in g&&g.axis===g.HORIZONTAL_AXIS&&(l=-1*m,m=0),j=0===m?l:m,"deltaY"in g&&(m=-1*g.deltaY,j=m),"deltaX"in g&&(l=g.deltaX,0===m&&(j=-1*l)),0!==m||0!==l){if(1===g.deltaMode){var q=a.data(this,"mousewheel-line-height");j*=q,m*=q,l*=q}else if(2===g.deltaMode){var r=a.data(this,"mousewheel-page-height");j*=r,m*=r,l*=r}if(n=Math.max(Math.abs(m),Math.abs(l)),(!f||f>n)&&(f=n,d(g,n)&&(f/=40)),d(g,n)&&(j/=40,l/=40,m/=40),j=Math[j>=1?"floor":"ceil"](j/f),l=Math[l>=1?"floor":"ceil"](l/f),m=Math[m>=1?"floor":"ceil"](m/f),k.settings.normalizeOffset&&this.getBoundingClientRect){var s=this.getBoundingClientRect();o=b.clientX-s.left,p=b.clientY-s.top}return b.deltaX=l,b.deltaY=m,b.deltaFactor=f,b.offsetX=o,b.offsetY=p,b.deltaMode=0,h.unshift(b,j,l,m),e&&clearTimeout(e),e=setTimeout(c,200),(a.event.dispatch||a.event.handle).apply(this,h)}}function c(){f=null}function d(a,b){return k.settings.adjustOldDeltas&&"mousewheel"===a.type&&b%120===0}var e,f,g=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],h="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],i=Array.prototype.slice;if(a.event.fixHooks)for(var j=g.length;j;)a.event.fixHooks[g[--j]]=a.event.mouseHooks;var k=a.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var c=h.length;c;)this.addEventListener(h[--c],b,!1);else this.onmousewheel=b;a.data(this,"mousewheel-line-height",k.getLineHeight(this)),a.data(this,"mousewheel-page-height",k.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var c=h.length;c;)this.removeEventListener(h[--c],b,!1);else this.onmousewheel=null;a.removeData(this,"mousewheel-line-height"),a.removeData(this,"mousewheel-page-height")},getLineHeight:function(b){var c=a(b),d=c["offsetParent"in a.fn?"offsetParent":"parent"]();return d.length||(d=a("body")),parseInt(d.css("fontSize"),10)||parseInt(c.css("fontSize"),10)||16},getPageHeight:function(b){return a(b).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};a.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})}); -------------------------------------------------------------------------------- /app/lightgallery/sass/lg-autoplay.scss: -------------------------------------------------------------------------------- 1 | .lg-progress-bar { 2 | background-color: $lg-progress-bar-bg; 3 | height: $lg-progress-bar-height; 4 | left: 0; 5 | position: absolute; 6 | top: 0; 7 | width: 100%; 8 | z-index: $zindex-progressbar; 9 | opacity: 0; 10 | @include transitionCustom(opacity 0.08s ease 0s); 11 | 12 | .lg-progress { 13 | background-color: $lg-progress-bar-active-bg; 14 | height: $lg-progress-bar-height; 15 | width: 0; 16 | } 17 | 18 | &.lg-start { 19 | .lg-progress { 20 | width: 100%; 21 | } 22 | } 23 | 24 | .lg-show-autoplay & { 25 | opacity: 1; 26 | } 27 | } 28 | 29 | .lg-autoplay-button { 30 | &:after { 31 | .lg-show-autoplay & { 32 | content: "\e01a"; 33 | } 34 | content: "\e01d"; 35 | } 36 | } -------------------------------------------------------------------------------- /app/lightgallery/sass/lg-fb-comment-box.scss: -------------------------------------------------------------------------------- 1 | @import "lg-variables"; 2 | @import "lg-mixins"; 3 | .lg-outer.fb-comments{ 4 | .lg-img-wrap { 5 | padding-right: 400px !important; 6 | } 7 | .fb-comments { 8 | height: 100%; 9 | overflow-y: auto; 10 | position: absolute; 11 | right: 0; 12 | top: 0; 13 | width: 420px; 14 | z-index: 99999; 15 | background: #fff url("../img/loading.gif") no-repeat scroll center center; 16 | &.fb_iframe_widget { 17 | background-image: none; 18 | &.fb_iframe_widget_loader{ 19 | background: #fff url("../img/loading.gif") no-repeat scroll center center; 20 | } 21 | } 22 | } 23 | .lg-toolbar { 24 | right: 420px; 25 | width: auto; 26 | } 27 | .lg-actions .lg-next { 28 | right: 420px; 29 | } 30 | .lg-item { 31 | background-image: none; 32 | &.lg-complete{ 33 | .lg-img-wrap{ 34 | background-image: none; 35 | } 36 | } 37 | } 38 | .lg-img-wrap { 39 | background: url(../img/loading.gif) no-repeat scroll center center transparent; 40 | } 41 | 42 | .lg-sub-html { 43 | padding: 0; 44 | position: static; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/lightgallery/sass/lg-fonts.scss: -------------------------------------------------------------------------------- 1 | // font icons support 2 | @font-face { 3 | font-family: 'lg'; 4 | src: url("../fonts/lg.eot?n1z373"); 5 | src: url("../fonts/lg.eot?#iefixn1z373") format("embedded-opentype"), url("../fonts/lg.woff?n1z373") format("woff"), url("../fonts/lg.ttf?n1z373") format("truetype"), url("../fonts/lg.svg?n1z373#lg") format("svg"); 6 | font-weight: normal; 7 | font-style: normal; 8 | } 9 | 10 | 11 | .lg-icon { 12 | font-family: 'lg'; 13 | speak: none; 14 | font-style: normal; 15 | font-weight: normal; 16 | font-variant: normal; 17 | text-transform: none; 18 | line-height: 1; 19 | /* Better Font Rendering =========== */ 20 | -webkit-font-smoothing: antialiased; 21 | -moz-osx-font-smoothing: grayscale; 22 | } -------------------------------------------------------------------------------- /app/lightgallery/sass/lg-fullscreen.scss: -------------------------------------------------------------------------------- 1 | .lg-fullscreen { 2 | &:after { 3 | content: "\e20c"; 4 | 5 | .lg-fullscreen-on & { 6 | content: "\e20d"; 7 | } 8 | } 9 | } -------------------------------------------------------------------------------- /app/lightgallery/sass/lg-mixins.scss: -------------------------------------------------------------------------------- 1 | // Vendor Prefixes 2 | // 3 | // All vendor mixins are deprecated as of v3.2.0 due to the introduction of 4 | // Autoprefixer in our Gruntfile. They will be removed in v4. 5 | 6 | // - Animations 7 | // - Backface visibility 8 | // - Box shadow 9 | // - Box sizing 10 | // - Content columns 11 | // - Hyphens 12 | // - Placeholder text 13 | // - Transformations 14 | // - Transitions 15 | // - User Select 16 | // - cursor grab 17 | 18 | // Animations 19 | @mixin animation($animation) { 20 | -webkit-animation: $animation; 21 | -o-animation: $animation; 22 | animation: $animation; 23 | } 24 | 25 | @mixin animation-name($name) { 26 | -webkit-animation-name: $name; 27 | animation-name: $name; 28 | } 29 | 30 | @mixin animation-duration($duration) { 31 | -webkit-animation-duration: $duration; 32 | animation-duration: $duration; 33 | } 34 | 35 | @mixin animation-timing-function($timing-function) { 36 | -webkit-animation-timing-function: $timing-function; 37 | animation-timing-function: $timing-function; 38 | } 39 | 40 | @mixin animation-delay($delay) { 41 | -webkit-animation-delay: $delay; 42 | animation-delay: $delay; 43 | } 44 | 45 | @mixin animation-iteration-count($iteration-count) { 46 | -webkit-animation-iteration-count: $iteration-count; 47 | animation-iteration-count: $iteration-count; 48 | } 49 | 50 | @mixin animation-direction($direction) { 51 | -webkit-animation-direction: $direction; 52 | animation-direction: $direction; 53 | } 54 | 55 | @mixin animation-fill-mode($fill-mode) { 56 | -webkit-animation-fill-mode: $fill-mode; 57 | animation-fill-mode: $fill-mode; 58 | } 59 | 60 | @mixin keyframes($name) { 61 | @-webkit-keyframes #{$name} { 62 | @content; 63 | } 64 | 65 | @-moz-keyframes #{$name} { 66 | @content; 67 | } 68 | 69 | @-ms-keyframes #{$name} { 70 | @content; 71 | } 72 | 73 | @keyframes #{$name} { 74 | @content; 75 | } 76 | } 77 | 78 | // Backface visibility 79 | // Prevent browsers from flickering when using CSS 3D transforms. 80 | // Default value is `visible`, but can be changed to `hidden` 81 | 82 | @mixin backface-visibility($visibility) { 83 | -webkit-backface-visibility: $visibility; 84 | -moz-backface-visibility: $visibility; 85 | backface-visibility: $visibility; 86 | } 87 | 88 | // Drop shadows 89 | // 90 | // Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's 91 | // supported browsers that have box shadow capabilities now support it. 92 | 93 | @mixin box-shadow($shadow...) { 94 | -webkit-box-shadow: $shadow; // iOS <4.3 & Android <4.1 95 | box-shadow: $shadow; 96 | } 97 | 98 | // Box sizing 99 | @mixin box-sizing($boxmodel) { 100 | -webkit-box-sizing: $boxmodel; 101 | -moz-box-sizing: $boxmodel; 102 | box-sizing: $boxmodel; 103 | } 104 | 105 | // CSS3 Content Columns 106 | @mixin content-columns($column-count, $column-gap: $grid-gutter-width) { 107 | -webkit-column-count: $column-count; 108 | -moz-column-count: $column-count; 109 | column-count: $column-count; 110 | -webkit-column-gap: $column-gap; 111 | -moz-column-gap: $column-gap; 112 | column-gap: $column-gap; 113 | } 114 | 115 | // Optional hyphenation 116 | @mixin hyphens($mode: auto) { 117 | word-wrap: break-word; 118 | -webkit-hyphens: $mode; 119 | -moz-hyphens: $mode; 120 | -ms-hyphens: $mode; // IE10+ 121 | -o-hyphens: $mode; 122 | hyphens: $mode; 123 | } 124 | 125 | // Transformations 126 | @mixin scale($ratio...) { 127 | -webkit-transform: scale($ratio); 128 | -ms-transform: scale($ratio); // IE9 only 129 | -o-transform: scale($ratio); 130 | transform: scale($ratio); 131 | } 132 | 133 | @mixin scaleX($ratio) { 134 | -webkit-transform: scaleX($ratio); 135 | -ms-transform: scaleX($ratio); // IE9 only 136 | -o-transform: scaleX($ratio); 137 | transform: scaleX($ratio); 138 | } 139 | 140 | @mixin scaleY($ratio) { 141 | -webkit-transform: scaleY($ratio); 142 | -ms-transform: scaleY($ratio); // IE9 only 143 | -o-transform: scaleY($ratio); 144 | transform: scaleY($ratio); 145 | } 146 | 147 | @mixin skew($x, $y) { 148 | -webkit-transform: skewX($x) skewY($y); 149 | -ms-transform: skewX($x) skewY($y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+ 150 | -o-transform: skewX($x) skewY($y); 151 | transform: skewX($x) skewY($y); 152 | } 153 | 154 | @mixin translate($x, $y) { 155 | -webkit-transform: translate($x, $y); 156 | -ms-transform: translate($x, $y); // IE9 only 157 | -o-transform: translate($x, $y); 158 | transform: translate($x, $y); 159 | } 160 | 161 | @mixin translate3d($x, $y, $z) { 162 | -webkit-transform: translate3d($x, $y, $z); 163 | transform: translate3d($x, $y, $z); 164 | } 165 | 166 | @mixin scale3d($x, $y, $z) { 167 | -webkit-transform: scale3d($x, $y, $z); 168 | transform: scale3d($x, $y, $z); 169 | } 170 | 171 | @mixin rotate($degrees) { 172 | -webkit-transform: rotate($degrees); 173 | -ms-transform: rotate($degrees); // IE9 only 174 | -o-transform: rotate($degrees); 175 | transform: rotate($degrees); 176 | } 177 | 178 | @mixin rotateX($degrees) { 179 | -webkit-transform: rotateX($degrees); 180 | -ms-transform: rotateX($degrees); // IE9 only 181 | -o-transform: rotateX($degrees); 182 | transform: rotateX($degrees); 183 | } 184 | 185 | @mixin rotateY($degrees) { 186 | -webkit-transform: rotateY($degrees); 187 | -ms-transform: rotateY($degrees); // IE9 only 188 | -o-transform: rotateY($degrees); 189 | transform: rotateY($degrees); 190 | } 191 | 192 | @mixin perspective($perspective) { 193 | -webkit-perspective: $perspective; 194 | -moz-perspective: $perspective; 195 | perspective: $perspective; 196 | } 197 | 198 | @mixin perspective-origin($perspective) { 199 | -webkit-perspective-origin: $perspective; 200 | -moz-perspective-origin: $perspective; 201 | perspective-origin: $perspective; 202 | } 203 | 204 | @mixin transform-origin($origin) { 205 | -webkit-transform-origin: $origin; 206 | -moz-transform-origin: $origin; 207 | -ms-transform-origin: $origin; // IE9 only 208 | transform-origin: $origin; 209 | } 210 | 211 | @mixin transform($transforms) { 212 | -moz-transform: $transforms; 213 | -o-transform: $transforms; 214 | -ms-transform: $transforms; 215 | -webkit-transform: $transforms; 216 | transform: $transforms; 217 | } 218 | 219 | // Transitions 220 | 221 | @mixin transition($transition...) { 222 | -webkit-transition: $transition; 223 | -o-transition: $transition; 224 | transition: $transition; 225 | } 226 | 227 | @mixin transition-property($transition-property...) { 228 | -webkit-transition-property: $transition-property; 229 | transition-property: $transition-property; 230 | } 231 | 232 | @mixin transition-delay($transition-delay) { 233 | -webkit-transition-delay: $transition-delay; 234 | transition-delay: $transition-delay; 235 | } 236 | 237 | @mixin transition-duration($transition-duration...) { 238 | -webkit-transition-duration: $transition-duration; 239 | transition-duration: $transition-duration; 240 | } 241 | 242 | @mixin transition-timing-function($timing-function) { 243 | -webkit-transition-timing-function: $timing-function; 244 | transition-timing-function: $timing-function; 245 | } 246 | 247 | @mixin transition-transform($transition...) { 248 | -webkit-transition: -webkit-transform $transition; 249 | -moz-transition: -moz-transform $transition; 250 | -o-transition: -o-transform $transition; 251 | transition: transform $transition; 252 | } 253 | 254 | // transition custom 255 | 256 | @function prefix($property, $prefixes: webkit moz o ms) { 257 | $vendor-prefixed-properties: transform background-clip background-size; 258 | $result: (); 259 | 260 | @each $prefix in $prefixes { 261 | @if index($vendor-prefixed-properties, $property) { 262 | $property: -#{$prefix}-#{$property}; 263 | } 264 | $result: append($result, $property); 265 | } 266 | @return $result; 267 | } 268 | 269 | @function trans-prefix($transition, $prefix: moz) { 270 | $prefixed: (); 271 | 272 | @each $trans in $transition { 273 | $prop-name: nth($trans, 1); 274 | $vendor-prop-name: prefix($prop-name, $prefix); 275 | $prop-vals: nth($trans, 2); 276 | $prefixed: append($prefixed, $vendor-prop-name $prop-vals, comma); 277 | } 278 | @return $prefixed; 279 | } 280 | 281 | @mixin transitionCustom($values...) { 282 | $transitions: (); 283 | 284 | @each $declaration in $values { 285 | $prop: nth($declaration, 1); 286 | $prop-opts: (); 287 | $length: length($declaration); 288 | 289 | @for $i from 2 through $length { 290 | $prop-opts: append($prop-opts, nth($declaration, $i)); 291 | } 292 | $trans: $prop, $prop-opts; 293 | $transitions: append($transitions, $trans, comma); 294 | } 295 | -webkit-transition: trans-prefix($transitions, webkit); 296 | -moz-transition: trans-prefix($transitions, moz); 297 | -o-transition: trans-prefix($transitions, o); 298 | transition: $values; 299 | } 300 | 301 | // User select 302 | // For selecting text on the page 303 | 304 | @mixin user-select($select) { 305 | -webkit-user-select: $select; 306 | -moz-user-select: $select; 307 | -ms-user-select: $select; // IE10+ 308 | user-select: $select; 309 | } 310 | 311 | // mouse grab 312 | 313 | @mixin grab-cursor { 314 | cursor: -webkit-grab; 315 | cursor: -moz-grab; 316 | cursor: -o-grab; 317 | cursor: -ms-grab; 318 | cursor: grab; 319 | } 320 | 321 | @mixin grabbing-cursor { 322 | cursor: move; 323 | cursor: -webkit-grabbing; 324 | cursor: -moz-grabbing; 325 | cursor: -o-grabbing; 326 | cursor: -ms-grabbing; 327 | cursor: grabbing; 328 | } -------------------------------------------------------------------------------- /app/lightgallery/sass/lg-pager.scss: -------------------------------------------------------------------------------- 1 | .lg-outer { 2 | .lg-pager-outer { 3 | bottom: 60px; 4 | left: 0; 5 | position: absolute; 6 | right: 0; 7 | text-align: center; 8 | z-index: $zindex-pager; 9 | height: 10px; 10 | 11 | &.lg-pager-hover { 12 | .lg-pager-cont { 13 | overflow: visible; 14 | } 15 | } 16 | } 17 | 18 | .lg-pager-cont { 19 | cursor: pointer; 20 | display: inline-block; 21 | overflow: hidden; 22 | position: relative; 23 | vertical-align: top; 24 | margin: 0 5px; 25 | 26 | &:hover { 27 | .lg-pager-thumb-cont { 28 | opacity: 1; 29 | @include translate3d(0, 0, 0); 30 | } 31 | } 32 | 33 | &.lg-pager-active { 34 | .lg-pager { 35 | box-shadow: 0 0 0 2px white inset; 36 | } 37 | } 38 | } 39 | 40 | .lg-pager-thumb-cont { 41 | background-color: #fff; 42 | color: #FFF; 43 | bottom: 100%; 44 | height: 83px; 45 | left: 0; 46 | margin-bottom: 20px; 47 | margin-left: -60px; 48 | opacity: 0; 49 | padding: 5px; 50 | position: absolute; 51 | width: 120px; 52 | border-radius: 3px; 53 | @include transitionCustom(opacity 0.15s ease 0s, transform 0.15s ease 0s); 54 | @include translate3d(0, 5px, 0); 55 | 56 | img { 57 | width: 100%; 58 | height: 100%; 59 | } 60 | } 61 | 62 | .lg-pager { 63 | background-color: rgba(255, 255, 255, 0.5); 64 | border-radius: 50%; 65 | box-shadow: 0 0 0 8px rgba(255, 255, 255, 0.7) inset; 66 | display: block; 67 | height: 12px; 68 | @include transition(box-shadow 0.3s ease 0s); 69 | width: 12px; 70 | 71 | &:hover, &:focus { 72 | box-shadow: 0 0 0 8px white inset; 73 | } 74 | } 75 | 76 | .lg-caret { 77 | border-left: 10px solid transparent; 78 | border-right: 10px solid transparent; 79 | border-top: 10px dashed; 80 | bottom: -10px; 81 | display: inline-block; 82 | height: 0; 83 | left: 50%; 84 | margin-left: -5px; 85 | position: absolute; 86 | vertical-align: middle; 87 | width: 0; 88 | } 89 | } -------------------------------------------------------------------------------- /app/lightgallery/sass/lg-theme-default.scss: -------------------------------------------------------------------------------- 1 | // default theme 2 | .lg-actions { 3 | .lg-next, .lg-prev { 4 | background-color: $lg-next-prev-bg; 5 | border-radius: $lg-border-radius-base; 6 | color: $lg-next-prev-color; 7 | cursor: pointer; 8 | display: block; 9 | font-size: 22px; 10 | margin-top: -10px; 11 | padding: 8px 10px 9px; 12 | position: absolute; 13 | top: 50%; 14 | z-index: $zindex-controls; 15 | 16 | &.disabled { 17 | pointer-events: none; 18 | opacity: 0.5; 19 | } 20 | 21 | &:hover { 22 | color: $lg-next-prev-hover-color; 23 | } 24 | } 25 | 26 | .lg-next { 27 | right: 20px; 28 | 29 | &:before { 30 | content: "\e095"; 31 | } 32 | } 33 | 34 | .lg-prev { 35 | left: 20px; 36 | 37 | &:after { 38 | content: "\e094"; 39 | } 40 | } 41 | } 42 | 43 | @include keyframes(lg-right-end) { 44 | 0% { 45 | left: 0; 46 | } 47 | 48 | 50% { 49 | left: -30px; 50 | } 51 | 52 | 100% { 53 | left: 0; 54 | } 55 | } 56 | 57 | 58 | @include keyframes(lg-left-end) { 59 | 0% { 60 | left: 0; 61 | } 62 | 63 | 50% { 64 | left: 30px; 65 | } 66 | 67 | 100% { 68 | left: 0; 69 | } 70 | } 71 | 72 | 73 | .lg-outer { 74 | &.lg-right-end { 75 | .lg-object { 76 | @include animation(lg-right-end 0.3s); 77 | position: relative; 78 | } 79 | } 80 | 81 | &.lg-left-end { 82 | .lg-object { 83 | @include animation(lg-left-end 0.3s); 84 | position: relative; 85 | } 86 | } 87 | } 88 | 89 | // lg toolbar 90 | .lg-toolbar { 91 | z-index: $zindex-toolbar; 92 | left: 0; 93 | position: absolute; 94 | top: 0; 95 | width: 100%; 96 | background-color: $lg-toolbar-bg; 97 | 98 | .lg-icon { 99 | color: $lg-toolbar-icon-color; 100 | cursor: pointer; 101 | float: right; 102 | font-size: 24px; 103 | height: 47px; 104 | line-height: 27px; 105 | padding: 10px 0; 106 | text-align: center; 107 | width: 50px; 108 | text-decoration: none !important; 109 | outline: medium none; 110 | 111 | &:hover { 112 | color: $lg-toolbar-icon-hover-color; 113 | } 114 | } 115 | 116 | .lg-close { 117 | &:after { 118 | content: "\e070"; 119 | } 120 | } 121 | 122 | .lg-download { 123 | &:after { 124 | content: "\e0f2"; 125 | } 126 | } 127 | } 128 | 129 | // lightGallery title 130 | .lg-sub-html { 131 | background-color: $lg-sub-html-bg; 132 | bottom: 0; 133 | color: $lg-sub-html-color; 134 | font-size: 16px; 135 | left: 0; 136 | padding: 10px 40px; 137 | position: fixed; 138 | right: 0; 139 | text-align: center; 140 | z-index: $zindex-subhtml; 141 | 142 | h4 { 143 | margin: 0; 144 | font-size: 13px; 145 | font-weight: bold; 146 | } 147 | 148 | p { 149 | font-size: 12px; 150 | margin: 5px 0 0; 151 | } 152 | } 153 | 154 | // lg image counter 155 | #lg-counter { 156 | color: $lg-icon-color; 157 | display: inline-block; 158 | font-size: $lg-counter-font-size; 159 | padding-left: 20px; 160 | padding-top: 12px; 161 | vertical-align: middle; 162 | } 163 | 164 | // for idle state 165 | .lg-toolbar, .lg-prev, .lg-next { 166 | opacity: 1; 167 | @include transitionCustom(transform 0.35s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.35s cubic-bezier(0, 0, 0.25, 1) 0s); 168 | } 169 | 170 | .lg-hide-items { 171 | .lg-prev { 172 | opacity: 0; 173 | @include translate3d(-10px, 0, 0); 174 | } 175 | 176 | .lg-next { 177 | opacity: 0; 178 | @include translate3d(10px, 0, 0); 179 | } 180 | 181 | .lg-toolbar { 182 | opacity: 0; 183 | @include translate3d(0, -10px, 0); 184 | } 185 | } 186 | 187 | // Starting effect 188 | body:not(.lg-from-hash){ 189 | .lg-outer { 190 | &.lg-start-zoom{ 191 | .lg-object{ 192 | @include scale3d(0.5, 0.5, 0.5); 193 | opacity: 0; 194 | @include transitionCustom(transform 250ms ease 0s, opacity 250ms !important); 195 | @include transform-origin(50% 50%); 196 | } 197 | .lg-item.lg-complete{ 198 | .lg-object{ 199 | @include scale3d(1, 1, 1); 200 | opacity: 1; 201 | } 202 | } 203 | } 204 | } 205 | } -------------------------------------------------------------------------------- /app/lightgallery/sass/lg-thumbnail.scss: -------------------------------------------------------------------------------- 1 | .lg-outer { 2 | .lg-thumb-outer { 3 | background-color: $lg-thumb-bg; 4 | bottom: 0; 5 | position: absolute; 6 | width: 100%; 7 | z-index: $zindex-thumbnail; 8 | max-height: 350px; 9 | @include translate3d(0, 100%, 0); 10 | @include transitionCustom(transform 0.25s cubic-bezier(0, 0, 0.25, 1) 0s); 11 | 12 | &.lg-grab { 13 | .lg-thumb-item { 14 | @include grab-cursor; 15 | } 16 | } 17 | 18 | &.lg-grabbing { 19 | .lg-thumb-item { 20 | @include grabbing-cursor; 21 | } 22 | } 23 | 24 | &.lg-dragging { 25 | .lg-thumb { 26 | @include transition-duration(0s !important); 27 | } 28 | } 29 | } 30 | &.lg-thumb-open{ 31 | .lg-thumb-outer { 32 | @include translate3d(0, 0%, 0); 33 | } 34 | } 35 | 36 | .lg-thumb { 37 | padding: 10px 0; 38 | height: 100%; 39 | margin-bottom: -5px; 40 | } 41 | 42 | .lg-thumb-item { 43 | border-radius: 5px; 44 | cursor: pointer; 45 | float: left; 46 | overflow: hidden; 47 | height: 100%; 48 | border: 2px solid #FFF; 49 | border-radius: 4px; 50 | margin-bottom: 5px; 51 | @media (min-width: 1025px) { 52 | @include transition(border-color 0.25s ease); 53 | } 54 | 55 | &.active, &:hover { 56 | border-color: $lg-theme-highlight; 57 | } 58 | 59 | img { 60 | width: 100%; 61 | } 62 | } 63 | 64 | &.lg-has-thumb { 65 | .lg-item { 66 | padding-bottom: 120px; 67 | } 68 | } 69 | 70 | &.lg-can-toggle { 71 | .lg-item { 72 | padding-bottom: 0; 73 | } 74 | } 75 | &.lg-pull-caption-up{ 76 | .lg-sub-html { 77 | @include transition(bottom 0.25s ease); 78 | } 79 | &.lg-thumb-open{ 80 | .lg-sub-html { 81 | bottom: 100px; 82 | } 83 | } 84 | } 85 | 86 | .lg-toogle-thumb { 87 | background-color: $lg-thumb-toggle-bg; 88 | border-radius: $lg-border-radius-base $lg-border-radius-base 0 0; 89 | color: $lg-thumb-toggle-color; 90 | cursor: pointer; 91 | font-size: 24px; 92 | height: 39px; 93 | line-height: 27px; 94 | padding: 5px 0; 95 | position: absolute; 96 | right: 20px; 97 | text-align: center; 98 | top: -39px; 99 | width: 50px; 100 | 101 | &:after { 102 | content: "\e1ff"; 103 | } 104 | 105 | &:hover { 106 | color: $lg-thumb-toggle-hover-color; 107 | } 108 | } 109 | } -------------------------------------------------------------------------------- /app/lightgallery/sass/lg-variables.scss: -------------------------------------------------------------------------------- 1 | $backdrop-opacity: 1; 2 | $lg-toolbar-bg: rgba(0, 0, 0, 0.45); 3 | $lg-border-radius-base: 2px; 4 | $lg-theme-highlight: rgb(169, 7, 7); 5 | $lg-theme: #0D0A0A; 6 | 7 | // basic icon colours 8 | $lg-icon-bg: rgba(0, 0, 0, 0.45); 9 | $lg-icon-color: #999; 10 | $lg-icon-hover-color: #FFF; 11 | 12 | // counter 13 | $lg-counter-color: #e6e6e6; 14 | $lg-counter-font-size: 16px; 15 | 16 | // Next prev icons 17 | $lg-next-prev-bg: $lg-icon-bg; 18 | $lg-next-prev-color: $lg-icon-color; 19 | $lg-next-prev-hover-color: $lg-icon-hover-color; 20 | 21 | // toolbar icons 22 | $lg-toolbar-icon-color: $lg-icon-color; 23 | $lg-toolbar-icon-hover-color: $lg-icon-hover-color; 24 | 25 | // autoplay progress bar 26 | $lg-progress-bar-bg: #333; 27 | $lg-progress-bar-active-bg: $lg-theme-highlight; 28 | $lg-progress-bar-height: 5px; 29 | 30 | // Zoom plugin 31 | $zoom-transition-duration: 0.3s; 32 | 33 | // Sub html - titile 34 | $lg-sub-html-bg: rgba(0, 0, 0, 0.45); 35 | $lg-sub-html-color: #EEE; 36 | 37 | // thumbnail toggle button 38 | $lg-thumb-toggle-bg: #0D0A0A; 39 | $lg-thumb-toggle-color: $lg-icon-color; 40 | $lg-thumb-toggle-hover-color: $lg-icon-hover-color; 41 | $lg-thumb-bg: #0D0A0A; 42 | 43 | // z-index 44 | $zindex-outer: 1050; 45 | $zindex-progressbar: 1080; 46 | $zindex-controls: 1080; 47 | $zindex-toolbar: 1080; 48 | $zindex-subhtml: 1080; 49 | $zindex-thumbnail: 1080; 50 | $zindex-pager: 1080; 51 | $zindex-playbutton: 1080; 52 | $zindex-item: 1060; 53 | $zindex-backdrop: 1040; -------------------------------------------------------------------------------- /app/lightgallery/sass/lg-video.scss: -------------------------------------------------------------------------------- 1 | .lg-outer { 2 | .lg-video-cont { 3 | display: inline-block; 4 | vertical-align: middle; 5 | max-width: 1140px; 6 | max-height: 100%; 7 | width: 100%; 8 | padding: 0 5px; 9 | } 10 | 11 | .lg-video { 12 | width: 100%; 13 | height: 0; 14 | padding-bottom: 56.25%; 15 | overflow: hidden; 16 | position: relative; 17 | 18 | .lg-object { 19 | display: inline-block; 20 | position: absolute; 21 | top: 0; 22 | left: 0; 23 | width: 100% !important; 24 | height: 100% !important; 25 | } 26 | 27 | .lg-video-play { 28 | width: 84px; 29 | height: 59px; 30 | position: absolute; 31 | left: 50%; 32 | top: 50%; 33 | margin-left: -42px; 34 | margin-top: -30px; 35 | z-index: $zindex-playbutton; 36 | cursor: pointer; 37 | } 38 | } 39 | 40 | .lg-has-vimeo{ 41 | .lg-video-play{ 42 | background: url("../img/vimeo-play.png") no-repeat scroll 0 0 transparent; 43 | } 44 | &:hover{ 45 | .lg-video-play{ 46 | background: url("../img/vimeo-play.png") no-repeat scroll 0 -58px transparent; 47 | } 48 | 49 | } 50 | } 51 | 52 | .lg-has-html5{ 53 | .lg-video-play{ 54 | background: transparent url("../img/video-play.png") no-repeat scroll 0 0; 55 | height: 64px; 56 | margin-left: -32px; 57 | margin-top: -32px; 58 | width: 64px; 59 | opacity: 0.8; 60 | } 61 | &:hover{ 62 | .lg-video-play{ 63 | opacity: 1 64 | } 65 | 66 | } 67 | } 68 | 69 | .lg-has-youtube{ 70 | .lg-video-play{ 71 | background: url("../img/youtube-play.png") no-repeat scroll 0 0 transparent; 72 | } 73 | &:hover{ 74 | .lg-video-play{ 75 | background: url("../img/youtube-play.png") no-repeat scroll 0 -60px transparent; 76 | } 77 | 78 | } 79 | } 80 | .lg-video-object { 81 | width: 100% !important; 82 | height: 100% !important; 83 | position: absolute; 84 | top: 0; 85 | left: 0; 86 | } 87 | 88 | .lg-has-video { 89 | .lg-video-object { 90 | visibility: hidden; 91 | } 92 | 93 | &.lg-video-palying { 94 | .lg-object, .lg-video-play { 95 | display: none; 96 | } 97 | 98 | .lg-video-object { 99 | visibility: visible; 100 | } 101 | } 102 | } 103 | } -------------------------------------------------------------------------------- /app/lightgallery/sass/lg-zoom.scss: -------------------------------------------------------------------------------- 1 | .lg-outer { 2 | // reset transition duration 3 | &.lg-css3.lg-zoom-dragging { 4 | .lg-item.lg-complete.lg-zoomable { 5 | .lg-img-wrap, .lg-image { 6 | @include transition-duration(0s); 7 | } 8 | } 9 | } 10 | 11 | .lg-item.lg-complete.lg-zoomable{ 12 | 13 | .lg-img-wrap { 14 | @include transitionCustom(transform $zoom-transition-duration ease 0s); 15 | @include translate3d(0, 0, 0); 16 | @include backface-visibility(hidden); 17 | } 18 | 19 | .lg-image { 20 | // Translate required for zoom 21 | @include scale3d(1, 1, 1); 22 | @include transitionCustom(transform $zoom-transition-duration ease 0s, opacity 0.15s !important); 23 | @include transform-origin(0 0); 24 | @include backface-visibility(hidden); 25 | } 26 | } 27 | 28 | } 29 | 30 | // zoom buttons 31 | #lg-zoom-in { 32 | &:after { 33 | content: "\e311"; 34 | } 35 | } 36 | 37 | #lg-zoom-out { 38 | opacity: 0.5; 39 | pointer-events: none; 40 | 41 | &:after { 42 | content: "\e312"; 43 | } 44 | 45 | .lg-zoomed & { 46 | opacity: 1; 47 | pointer-events: auto; 48 | } 49 | } -------------------------------------------------------------------------------- /app/lightgallery/sass/lightgallery.scss: -------------------------------------------------------------------------------- 1 | // Core variables and mixins 2 | @import "lg-variables"; 3 | @import "lg-mixins"; 4 | @import "lg-fonts"; 5 | @import "lg-theme-default"; 6 | @import "lg-thumbnail"; 7 | @import "lg-video"; 8 | @import "lg-autoplay"; 9 | @import "lg-zoom"; 10 | @import "lg-pager"; 11 | @import "lg-fullscreen"; 12 | 13 | // Clearfix 14 | .group { 15 | *zoom: 1; 16 | } 17 | 18 | .group:before, .group:after { 19 | display: table; 20 | content: ""; 21 | line-height: 0; 22 | } 23 | 24 | .group:after { 25 | clear: both; 26 | } 27 | 28 | // lightgallery core 29 | .lg-outer { 30 | width: 100%; 31 | height: 100%; 32 | position: fixed; 33 | top: 0; 34 | left: 0; 35 | z-index: $zindex-outer; 36 | opacity: 0; 37 | // For start/end transition 38 | @include transition(opacity 0.15s ease 0s); 39 | 40 | * { 41 | @include box-sizing(border-box); 42 | } 43 | 44 | &.lg-visible { 45 | opacity: 1; 46 | } 47 | 48 | // Set transition speed and timing function 49 | &.lg-css3 { 50 | .lg-item { 51 | &.lg-prev-slide, &.lg-next-slide, &.lg-current { 52 | @include transition-duration(inherit !important); 53 | @include transition-timing-function(inherit !important); 54 | } 55 | } 56 | } 57 | 58 | // Remove transition while dragging 59 | &.lg-css3.lg-dragging { 60 | .lg-item { 61 | &.lg-prev-slide, &.lg-next-slide, &.lg-current { 62 | @include transition-duration(0s !important); 63 | opacity: 1; 64 | } 65 | } 66 | } 67 | 68 | // Set cursor grab while dragging 69 | &.lg-grab { 70 | img.lg-object { 71 | @include grab-cursor; 72 | } 73 | } 74 | 75 | &.lg-grabbing { 76 | img.lg-object { 77 | @include grabbing-cursor; 78 | } 79 | } 80 | 81 | .lg { 82 | height: 100%; 83 | width: 100%; 84 | position: relative; 85 | overflow: hidden; 86 | margin-left: auto; 87 | margin-right: auto; 88 | max-width: 100%; 89 | max-height: 100%; 90 | } 91 | 92 | .lg-inner { 93 | width: 100%; 94 | height: 100%; 95 | position: absolute; 96 | left: 0; 97 | top: 0; 98 | white-space: nowrap; 99 | } 100 | 101 | .lg-item { 102 | background: url(../img/loading.gif) no-repeat scroll center center transparent; 103 | display: none !important; 104 | } 105 | &.lg-css3{ 106 | .lg-prev-slide, .lg-current, .lg-next-slide{ 107 | display: inline-block !important; 108 | } 109 | } 110 | &.lg-css{ 111 | .lg-current{ 112 | display: inline-block !important; 113 | } 114 | } 115 | 116 | .lg-item, .lg-img-wrap { 117 | display: inline-block; 118 | text-align: center; 119 | position: absolute; 120 | width: 100%; 121 | height: 100%; 122 | 123 | &:before { 124 | content: ""; 125 | display: inline-block; 126 | height: 50%; 127 | width: 1px; 128 | margin-right: -1px; 129 | } 130 | } 131 | 132 | .lg-img-wrap { 133 | top: 0; 134 | bottom: 0; 135 | left: 0; 136 | right: 0; 137 | padding: 0 5px; 138 | } 139 | 140 | .lg-item { 141 | &.lg-complete { 142 | background-image: none; 143 | } 144 | 145 | &.lg-current { 146 | z-index: $zindex-item; 147 | } 148 | } 149 | 150 | .lg-image { 151 | display: inline-block; 152 | vertical-align: middle; 153 | max-width: 100%; 154 | max-height: 100%; 155 | width: auto !important; 156 | height: auto !important; 157 | } 158 | 159 | &.lg-show-after-load { 160 | .lg-item { 161 | .lg-object, .lg-video-play { 162 | opacity: 0; 163 | @include transition(opacity 0.15s ease 0s); 164 | } 165 | 166 | &.lg-complete { 167 | .lg-object, .lg-video-play { 168 | opacity: 1; 169 | } 170 | } 171 | } 172 | } 173 | 174 | // Hide title div if empty 175 | .lg-empty-html { 176 | display: none; 177 | } 178 | } 179 | .lg-backdrop{ 180 | position: fixed; 181 | top: 0; 182 | left: 0; 183 | right: 0; 184 | bottom: 0; 185 | z-index: $zindex-backdrop; 186 | background-color: #000; 187 | opacity: 0; 188 | @include transition(opacity 0.15s ease 0s); 189 | &.in{ 190 | opacity: $backdrop-opacity; 191 | } 192 | } 193 | 194 | // Default slide animations. Should be placed at the bottom of the animation css 195 | .lg-css3 { 196 | 197 | // Remove all transition effects 198 | &.lg-no-trans { 199 | .lg-prev-slide, .lg-next-slide, .lg-current { 200 | @include transitionCustom(none 0s ease 0s !important); 201 | } 202 | } 203 | 204 | &.lg-use-css3 { 205 | .lg-item { 206 | @include backface-visibility(hidden); 207 | } 208 | } 209 | 210 | &.lg-use-left { 211 | .lg-item { 212 | @include backface-visibility(hidden); 213 | } 214 | } 215 | 216 | // Fade mode 217 | &.lg-fade { 218 | .lg-item { 219 | opacity: 0; 220 | 221 | &.lg-current { 222 | opacity: 1; 223 | } 224 | 225 | // transition timing property and duration will be over written from javascript 226 | &.lg-prev-slide, &.lg-next-slide, &.lg-current { 227 | @include transitionCustom(opacity 0.1s ease 0s); 228 | } 229 | } 230 | } 231 | 232 | &.lg-slide { 233 | &.lg-use-css3 { 234 | .lg-item { 235 | opacity: 0; 236 | 237 | &.lg-prev-slide { 238 | @include translate3d(-100%, 0, 0); 239 | } 240 | 241 | &.lg-next-slide { 242 | @include translate3d(100%, 0, 0); 243 | } 244 | 245 | &.lg-current { 246 | @include translate3d(0, 0, 0); 247 | opacity: 1; 248 | } 249 | 250 | // transition timing property and duration will be over written from javascript 251 | &.lg-prev-slide, &.lg-next-slide, &.lg-current { 252 | @include transitionCustom(transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); 253 | } 254 | } 255 | } 256 | 257 | &.lg-use-left { 258 | .lg-item { 259 | opacity: 0; 260 | position: absolute; 261 | left: 0; 262 | 263 | &.lg-prev-slide { 264 | left: -100%; 265 | } 266 | 267 | &.lg-next-slide { 268 | left: 100%; 269 | } 270 | 271 | &.lg-current { 272 | left: 0; 273 | opacity: 1; 274 | } 275 | 276 | // transition timing property and duration will be over written from javascript 277 | &.lg-prev-slide, &.lg-next-slide, &.lg-current { 278 | @include transitionCustom(left 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s); 279 | } 280 | } 281 | } 282 | } 283 | } -------------------------------------------------------------------------------- /app/lightgallery/sass/prepros.cfg: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "About This File": "This is Prepros config file, https://prepros.io . Please do not edit this file, doing so can crash Prepros." 4 | }, 5 | { 6 | "data": { 7 | "id": "", 8 | "cfgVersion": 2, 9 | "name": "lightgallery-desktop", 10 | "path": "", 11 | "files": { 12 | "8ff90eb8": { 13 | "id": "8ff90eb8", 14 | "path": "lg-animations.scss", 15 | "output": "lg-animations.css", 16 | "name": "lg-animations.scss", 17 | "category": "CSS", 18 | "autoCompile": true, 19 | "autoprefixer": false, 20 | "sourceMaps": false, 21 | "libSass": true, 22 | "compass": false, 23 | "fullCompass": false, 24 | "outputStyle": "expanded", 25 | "customOutput": false, 26 | "imported": false, 27 | "parents": [], 28 | "type": "sass" 29 | }, 30 | "26f18653": { 31 | "id": "26f18653", 32 | "path": "lg-autoplay.scss", 33 | "output": "lg-autoplay.css", 34 | "name": "lg-autoplay.scss", 35 | "category": "CSS", 36 | "autoCompile": false, 37 | "autoprefixer": false, 38 | "sourceMaps": false, 39 | "libSass": true, 40 | "compass": false, 41 | "fullCompass": false, 42 | "outputStyle": "expanded", 43 | "customOutput": false, 44 | "imported": true, 45 | "parents": [ 46 | "f80b85a1" 47 | ], 48 | "type": "sass" 49 | }, 50 | "94edd1e7": { 51 | "id": "94edd1e7", 52 | "path": "lg-fb-comment-box.scss", 53 | "output": "lg-fb-comment-box.css", 54 | "name": "lg-fb-comment-box.scss", 55 | "category": "CSS", 56 | "autoCompile": true, 57 | "autoprefixer": false, 58 | "sourceMaps": false, 59 | "libSass": true, 60 | "compass": false, 61 | "fullCompass": false, 62 | "outputStyle": "expanded", 63 | "customOutput": false, 64 | "imported": false, 65 | "parents": [], 66 | "type": "sass" 67 | }, 68 | "fb5b0eff": { 69 | "id": "fb5b0eff", 70 | "path": "lg-fonts.scss", 71 | "output": "lg-fonts.css", 72 | "name": "lg-fonts.scss", 73 | "category": "CSS", 74 | "autoCompile": false, 75 | "autoprefixer": false, 76 | "sourceMaps": false, 77 | "libSass": true, 78 | "compass": false, 79 | "fullCompass": false, 80 | "outputStyle": "expanded", 81 | "customOutput": false, 82 | "imported": true, 83 | "parents": [ 84 | "f80b85a1" 85 | ], 86 | "type": "sass" 87 | }, 88 | "9e150360": { 89 | "id": "9e150360", 90 | "path": "lg-fullscreen.scss", 91 | "output": "lg-fullscreen.css", 92 | "name": "lg-fullscreen.scss", 93 | "category": "CSS", 94 | "autoCompile": false, 95 | "autoprefixer": false, 96 | "sourceMaps": false, 97 | "libSass": true, 98 | "compass": false, 99 | "fullCompass": false, 100 | "outputStyle": "expanded", 101 | "customOutput": false, 102 | "imported": true, 103 | "parents": [ 104 | "f80b85a1" 105 | ], 106 | "type": "sass" 107 | }, 108 | "11b5aed8": { 109 | "id": "11b5aed8", 110 | "path": "lg-mixins.scss", 111 | "output": "lg-mixins.css", 112 | "name": "lg-mixins.scss", 113 | "category": "CSS", 114 | "autoCompile": false, 115 | "autoprefixer": false, 116 | "sourceMaps": false, 117 | "libSass": true, 118 | "compass": false, 119 | "fullCompass": false, 120 | "outputStyle": "expanded", 121 | "customOutput": false, 122 | "imported": true, 123 | "parents": [ 124 | "94edd1e7", 125 | "6018a35b", 126 | "f80b85a1" 127 | ], 128 | "type": "sass" 129 | }, 130 | "06548c3d": { 131 | "id": "06548c3d", 132 | "path": "lg-pager.scss", 133 | "output": "lg-pager.css", 134 | "name": "lg-pager.scss", 135 | "category": "CSS", 136 | "autoCompile": false, 137 | "autoprefixer": false, 138 | "sourceMaps": false, 139 | "libSass": true, 140 | "compass": false, 141 | "fullCompass": false, 142 | "outputStyle": "expanded", 143 | "customOutput": false, 144 | "imported": true, 145 | "parents": [ 146 | "f80b85a1" 147 | ], 148 | "type": "sass" 149 | }, 150 | "7dbddfad": { 151 | "id": "7dbddfad", 152 | "path": "lg-theme-default.scss", 153 | "output": "lg-theme-default.css", 154 | "name": "lg-theme-default.scss", 155 | "category": "CSS", 156 | "autoCompile": false, 157 | "autoprefixer": false, 158 | "sourceMaps": false, 159 | "libSass": true, 160 | "compass": false, 161 | "fullCompass": false, 162 | "outputStyle": "expanded", 163 | "customOutput": false, 164 | "imported": true, 165 | "parents": [ 166 | "f80b85a1" 167 | ], 168 | "type": "sass" 169 | }, 170 | "ccc7c5d4": { 171 | "id": "ccc7c5d4", 172 | "path": "lg-thumbnail.scss", 173 | "output": "lg-thumbnail.css", 174 | "name": "lg-thumbnail.scss", 175 | "category": "CSS", 176 | "autoCompile": false, 177 | "autoprefixer": false, 178 | "sourceMaps": false, 179 | "libSass": true, 180 | "compass": false, 181 | "fullCompass": false, 182 | "outputStyle": "expanded", 183 | "customOutput": false, 184 | "imported": true, 185 | "parents": [ 186 | "f80b85a1" 187 | ], 188 | "type": "sass" 189 | }, 190 | "6018a35b": { 191 | "id": "6018a35b", 192 | "path": "lg-transitions.scss", 193 | "output": "lg-transitions.css", 194 | "name": "lg-transitions.scss", 195 | "category": "CSS", 196 | "autoCompile": true, 197 | "autoprefixer": false, 198 | "sourceMaps": false, 199 | "libSass": true, 200 | "compass": false, 201 | "fullCompass": false, 202 | "outputStyle": "expanded", 203 | "customOutput": false, 204 | "imported": false, 205 | "parents": [], 206 | "type": "sass" 207 | }, 208 | "36a5e0f7": { 209 | "id": "36a5e0f7", 210 | "path": "lg-variables.scss", 211 | "output": "lg-variables.css", 212 | "name": "lg-variables.scss", 213 | "category": "CSS", 214 | "autoCompile": false, 215 | "autoprefixer": false, 216 | "sourceMaps": false, 217 | "libSass": true, 218 | "compass": false, 219 | "fullCompass": false, 220 | "outputStyle": "expanded", 221 | "customOutput": false, 222 | "imported": true, 223 | "parents": [ 224 | "94edd1e7", 225 | "6018a35b", 226 | "f80b85a1" 227 | ], 228 | "type": "sass" 229 | }, 230 | "70ef8df4": { 231 | "id": "70ef8df4", 232 | "path": "lg-video.scss", 233 | "output": "lg-video.css", 234 | "name": "lg-video.scss", 235 | "category": "CSS", 236 | "autoCompile": false, 237 | "autoprefixer": false, 238 | "sourceMaps": false, 239 | "libSass": true, 240 | "compass": false, 241 | "fullCompass": false, 242 | "outputStyle": "expanded", 243 | "customOutput": false, 244 | "imported": true, 245 | "parents": [ 246 | "f80b85a1" 247 | ], 248 | "type": "sass" 249 | }, 250 | "0690cbf9": { 251 | "id": "0690cbf9", 252 | "path": "lg-zoom.scss", 253 | "output": "lg-zoom.css", 254 | "name": "lg-zoom.scss", 255 | "category": "CSS", 256 | "autoCompile": false, 257 | "autoprefixer": false, 258 | "sourceMaps": false, 259 | "libSass": true, 260 | "compass": false, 261 | "fullCompass": false, 262 | "outputStyle": "expanded", 263 | "customOutput": false, 264 | "imported": true, 265 | "parents": [ 266 | "f80b85a1" 267 | ], 268 | "type": "sass" 269 | }, 270 | "f80b85a1": { 271 | "id": "f80b85a1", 272 | "path": "lightgallery.scss", 273 | "output": "C:/wamp/www/lg-desktop/lightgallery-desktop/app/lightgallery/css/lightgallery.css", 274 | "name": "lightgallery.scss", 275 | "category": "CSS", 276 | "autoCompile": true, 277 | "autoprefixer": false, 278 | "sourceMaps": true, 279 | "libSass": false, 280 | "compass": true, 281 | "fullCompass": false, 282 | "outputStyle": "nested", 283 | "customOutput": true, 284 | "imported": false, 285 | "parents": [], 286 | "type": "sass" 287 | } 288 | }, 289 | "deploymentHistory": {}, 290 | "config": { 291 | "watch": "", 292 | "liveRefresh": true, 293 | "useCustomServer": false, 294 | "port": 0, 295 | "useCustomPort": false, 296 | "customServerUrl": "", 297 | "watchedFileExtensions": "less, sass, scss, styl, md, markdown, coffee, js, jade, haml, slim, ls, html,htm, css, rb, php, asp, aspx, cfm, chm, cms, do, erb, jsp, mhtml, mspx, pl, py, shtml, cshtml, cs,vb, vbs, tpl, ctp, kit, png, jpg, jpeg", 298 | "excludePatterns": "Prepros Build, node_modules, .git, .idea, .sass-cache, .hg, .svn, .cache, config.rb, prepros.cfg, .DS_Store, bower_components", 299 | "autoprefixerBrowsers": "last 4 versions", 300 | "liveRefreshDelay": 0, 301 | "disableImportAutoCompile": true, 302 | "browserFlow": { 303 | "enabled": false, 304 | "mouseSync": true, 305 | "scrollSync": true, 306 | "keyboardSync": true, 307 | "animateCss": true 308 | }, 309 | "deployment": { 310 | "ftpHost": "", 311 | "ftpPort": "21", 312 | "ftpUsePrivateKey": false, 313 | "ftpPrivateKey": "", 314 | "ftpRemotePath": "", 315 | "ftpUserName": "", 316 | "ftpPassword": "", 317 | "ftpType": "FTP", 318 | "ftpSecure": false, 319 | "ftpUploadOnModify": false, 320 | "ftpRefreshAfterUpload": false, 321 | "ignorePreprocessableFiles": true, 322 | "copyPath": "Prepros Build", 323 | "excludePatterns": ".map, Prepros Build, config.rb, prepros.cfg, node_modules, .git, .idea, .sass-cache, .hg, .svn, .cache, .DS_Store, bower_components" 324 | }, 325 | "css": { 326 | "path": "css/", 327 | "outputType": "REPLACE_SEGMENT", 328 | "segmentToReplace": "less, sass, stylus, scss, styl", 329 | "segmentToReplaceWith": "css", 330 | "preprocessableFilesDirs": "less/\nsass/\nstylus/\nscss/\nstyl/\n" 331 | }, 332 | "minCss": { 333 | "path": "", 334 | "outputType": "RELATIVE_FILEDIR", 335 | "segmentToReplace": "", 336 | "segmentToReplaceWith": "", 337 | "types": "", 338 | "preprocessableFilesDirs": "", 339 | "filePrefix": "-dist" 340 | }, 341 | "html": { 342 | "segmentToReplace": "jade, haml, slim, markdown, md, kit", 343 | "segmentToReplaceWith": "html", 344 | "path": "html/", 345 | "extension": ".html", 346 | "outputType": "REPLACE_SEGMENT", 347 | "preprocessableFilesDirs": "jade/\nhaml/\nslim/\nmarkdown/\nmd/\nkit" 348 | }, 349 | "js": { 350 | "segmentToReplace": "coffee, coffeescript, coffeescripts, ls, livescript, livescripts", 351 | "segmentToReplaceWith": "html", 352 | "extension": ".html", 353 | "outputType": "REPLACE_SEGMENT", 354 | "preprocessableFilesDirs": "coffee/\ncoffeescript/\ncoffeescripts/\nls/\nlivescript/\nlivescripts", 355 | "path": "js/" 356 | }, 357 | "minJs": { 358 | "path": "", 359 | "outputType": "RELATIVE_FILEDIR", 360 | "segmentToReplace": "", 361 | "segmentToReplaceWith": "", 362 | "types": "", 363 | "preprocessableFilesDirs": "", 364 | "filePrefix": "-dist" 365 | }, 366 | "compilers": { 367 | "less": { 368 | "autoCompile": true, 369 | "autoprefixer": false, 370 | "compress": false, 371 | "sourceMaps": false 372 | }, 373 | "sass": { 374 | "autoCompile": true, 375 | "autoprefixer": false, 376 | "sourceMaps": false, 377 | "libSass": true, 378 | "compass": false, 379 | "fullCompass": false, 380 | "outputStyle": "expanded" 381 | }, 382 | "stylus": { 383 | "autoCompile": true, 384 | "sourceMaps": false, 385 | "autoprefixer": false, 386 | "nib": false, 387 | "compress": false 388 | }, 389 | "markdown": { 390 | "autoCompile": true, 391 | "sanitize": false, 392 | "gfm": true, 393 | "wrapWithHtml": false 394 | }, 395 | "coffee": { 396 | "autoCompile": true, 397 | "bare": false, 398 | "uglify": false, 399 | "mangle": true, 400 | "iced": false, 401 | "sourceMaps": false 402 | }, 403 | "livescript": { 404 | "autoCompile": true, 405 | "bare": false, 406 | "uglify": false, 407 | "mangle": true 408 | }, 409 | "javascript": { 410 | "autoCompile": false, 411 | "uglify": true, 412 | "mangle": true, 413 | "babel": false, 414 | "sourceMaps": false 415 | }, 416 | "jade": { 417 | "autoCompile": true, 418 | "pretty": true 419 | }, 420 | "haml": { 421 | "autoCompile": true, 422 | "pretty": true, 423 | "doubleQuotes": false 424 | }, 425 | "kit": { 426 | "autoCompile": true, 427 | "minifyHtml": false 428 | }, 429 | "slim": { 430 | "autoCompile": true, 431 | "pretty": true, 432 | "indent": "default" 433 | }, 434 | "css": { 435 | "autoCompile": false, 436 | "sourceMaps": false, 437 | "compress": true, 438 | "cssnext": false, 439 | "autoprefixer": false 440 | }, 441 | "uglify": { 442 | "compress": { 443 | "sequences": true, 444 | "properties": true, 445 | "dead_code": true, 446 | "drop_debugger": true, 447 | "unsafe": false, 448 | "unsafe_comps": false, 449 | "conditionals": true, 450 | "comparisons": true, 451 | "evaluate": true, 452 | "booleans": true, 453 | "loops": true, 454 | "unused": true, 455 | "hoist_funs": true, 456 | "keep_fargs": false, 457 | "hoist_vars": false, 458 | "if_return": true, 459 | "join_vars": true, 460 | "cascade": true, 461 | "side_effects": true, 462 | "pure_getters": false, 463 | "negate_iife": true, 464 | "screw_ie8": false, 465 | "drop_console": false, 466 | "angular": false, 467 | "warnings": true, 468 | "pure_funcs": null, 469 | "global_defs": null 470 | }, 471 | "output": { 472 | "quote_keys": false, 473 | "space_colon": true, 474 | "ascii_only": false, 475 | "unescape_regexps": false, 476 | "inline_script": false, 477 | "beautify": false, 478 | "bracketize": false, 479 | "semicolons": true, 480 | "comments": false, 481 | "preserve_line": false, 482 | "screw_ie8": false, 483 | "preamble": null 484 | } 485 | } 486 | } 487 | } 488 | } 489 | } 490 | ] -------------------------------------------------------------------------------- /app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "lightgallery", 3 | "productName": "Lightgallery", 4 | "identifier": "lightgallery-desktop", 5 | "description": "A modern, electron and nodejs based image viewer for Mac, Windows and Linux.", 6 | "version": "0.1.1", 7 | "author": "Sachin N ", 8 | "main": "background.js", 9 | "dependencies": { 10 | "configstore": "^1.4.0", 11 | "fs-jetpack": "^0.7.0", 12 | "jquery": "^2.1.4" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/spec.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Jasmine Spec Runner 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/stylesheets/main.less: -------------------------------------------------------------------------------- 1 | html, body { 2 | width: 100%; 3 | height: 100%; 4 | margin: 0; 5 | padding: 0; 6 | background-color: black; 7 | } 8 | 9 | body { 10 | display: flex; 11 | justify-content: center; 12 | align-items: center; 13 | font-family: sans-serif; 14 | -webkit-transition: background-color 0.2s ease; 15 | transition: background-color 0.2s ease; 16 | .lg-drag-drop { 17 | top: 50%; 18 | font-size: 18px; 19 | left: 0; 20 | margin-top: -70px; 21 | text-align: center; 22 | position: absolute; 23 | color: #BBB7B7; 24 | right: 0; 25 | img{ 26 | opacity: 0.7; 27 | width: 80px; 28 | } 29 | p{ 30 | margin-bottom: 0; 31 | margin-top: 8px; 32 | } 33 | } 34 | &.lg-on{ 35 | .lg-drag-drop { 36 | display: none; 37 | } 38 | } 39 | &.lg-drag-over{ 40 | background-color: #454648; 41 | } 42 | } 43 | 44 | .lg-close{ 45 | display: none; 46 | } -------------------------------------------------------------------------------- /app/vendor/electron_boilerplate/context_menu.js: -------------------------------------------------------------------------------- 1 | // This gives you default context menu (cut, copy, paste) 2 | // in all input fields and textareas across your app. 3 | 4 | (function () { 5 | 'use strict'; 6 | 7 | var remote = require('electron').remote; 8 | var Menu = remote.Menu; 9 | var MenuItem = remote.MenuItem; 10 | 11 | var cut = new MenuItem({ 12 | label: "Cut", 13 | click: function () { 14 | document.execCommand("cut"); 15 | } 16 | }); 17 | 18 | var copy = new MenuItem({ 19 | label: "Copy", 20 | click: function () { 21 | document.execCommand("copy"); 22 | } 23 | }); 24 | 25 | var paste = new MenuItem({ 26 | label: "Paste", 27 | click: function () { 28 | document.execCommand("paste"); 29 | } 30 | }); 31 | 32 | var textMenu = new Menu(); 33 | textMenu.append(cut); 34 | textMenu.append(copy); 35 | textMenu.append(paste); 36 | 37 | document.addEventListener('contextmenu', function(e) { 38 | 39 | switch (e.target.nodeName) { 40 | case 'TEXTAREA': 41 | case 'INPUT': 42 | e.preventDefault(); 43 | textMenu.popup(remote.getCurrentWindow()); 44 | break; 45 | } 46 | 47 | }, false); 48 | 49 | }()); 50 | -------------------------------------------------------------------------------- /app/vendor/electron_boilerplate/dev_helper.js: -------------------------------------------------------------------------------- 1 | import { app, Menu, BrowserWindow } from 'electron'; 2 | 3 | var setDevMenu = function () { 4 | var devMenu = Menu.buildFromTemplate([{ 5 | label: 'Development', 6 | submenu: [{ 7 | label: 'check', 8 | accelerator: 'CmdOrCtrl+R', 9 | type: 'checkbox', 10 | checked: true, 11 | click: function () { 12 | BrowserWindow.getFocusedWindow().webContents.reloadIgnoringCache(); 13 | } 14 | },{ 15 | label: 'Toggle DevTools', 16 | accelerator: 'Alt+CmdOrCtrl+I', 17 | click: function () { 18 | BrowserWindow.getFocusedWindow().toggleDevTools(); 19 | } 20 | },{ 21 | label: 'Quit', 22 | accelerator: 'CmdOrCtrl+Q', 23 | click: function () { 24 | app.quit(); 25 | } 26 | }] 27 | }]); 28 | Menu.setApplicationMenu(devMenu); 29 | }; 30 | 31 | export default { 32 | setDevMenu: setDevMenu, 33 | } 34 | -------------------------------------------------------------------------------- /app/vendor/electron_boilerplate/external_links.js: -------------------------------------------------------------------------------- 1 | // Convenient way for opening links in external browser, not in the app. 2 | // Useful especially if you have a lot of links to deal with. 3 | // 4 | // Usage: 5 | // 6 | // Every link with class ".js-external-link" will be opened in external browser. 7 | // google 8 | // 9 | // The same behaviour for many links can be achieved by adding 10 | // this class to any parent tag of an anchor tag. 11 | // 15 | 16 | (function () { 17 | 'use strict'; 18 | 19 | var shell = require('electron').shell; 20 | 21 | var supportExternalLinks = function (e) { 22 | var href; 23 | var isExternal = false; 24 | 25 | var checkDomElement = function (element) { 26 | if (element.nodeName === 'A') { 27 | href = element.getAttribute('href'); 28 | } 29 | if (element.classList.contains('js-external-link')) { 30 | isExternal = true; 31 | } 32 | if (href && isExternal) { 33 | shell.openExternal(href); 34 | e.preventDefault(); 35 | } else if (element.parentElement) { 36 | checkDomElement(element.parentElement); 37 | } 38 | } 39 | 40 | checkDomElement(e.target); 41 | } 42 | 43 | document.addEventListener('click', supportExternalLinks, false); 44 | }()); 45 | -------------------------------------------------------------------------------- /app/vendor/electron_boilerplate/window_state.js: -------------------------------------------------------------------------------- 1 | // Simple module to help you remember the size and position of windows. 2 | // Can be used for more than one window, just construct many 3 | // instances of it and give each different name. 4 | 5 | import { app } from 'electron'; 6 | import jetpack from 'fs-jetpack'; 7 | 8 | export default function (name, defaults) { 9 | 10 | var userDataDir = jetpack.cwd(app.getPath('userData')); 11 | var stateStoreFile = 'window-state-' + name +'.json'; 12 | 13 | var state = userDataDir.read(stateStoreFile, 'json') || { 14 | width: defaults.width, 15 | height: defaults.height 16 | }; 17 | 18 | var saveState = function (win) { 19 | if (!win.isMaximized() && !win.isMinimized()) { 20 | var position = win.getPosition(); 21 | var size = win.getSize(); 22 | state.x = position[0]; 23 | state.y = position[1]; 24 | state.width = size[0]; 25 | state.height = size[1]; 26 | } 27 | state.isMaximized = win.isMaximized(); 28 | userDataDir.write(stateStoreFile, state, { atomic: true }); 29 | }; 30 | 31 | return { 32 | get x() { return state.x; }, 33 | get y() { return state.y; }, 34 | get width() { return state.width; }, 35 | get height() { return state.height; }, 36 | get isMaximized() { return state.isMaximized; }, 37 | saveState: saveState 38 | }; 39 | } 40 | -------------------------------------------------------------------------------- /app/vendor/jasmine/boot.js: -------------------------------------------------------------------------------- 1 | /** 2 | Starting with version 2.0, this file "boots" Jasmine, performing all of the necessary initialization before executing the loaded environment and all of a project's specs. This file should be loaded after `jasmine.js` and `jasmine_html.js`, but before any project source files or spec files are loaded. Thus this file can also be used to customize Jasmine for a project. 3 | 4 | If a project is using Jasmine via the standalone distribution, this file can be customized directly. If a project is using Jasmine via the [Ruby gem][jasmine-gem], this file can be copied into the support directory via `jasmine copy_boot_js`. Other environments (e.g., Python) will have different mechanisms. 5 | 6 | The location of `boot.js` can be specified and/or overridden in `jasmine.yml`. 7 | 8 | [jasmine-gem]: http://github.com/pivotal/jasmine-gem 9 | */ 10 | 11 | (function() { 12 | 13 | /** 14 | * ## Require & Instantiate 15 | * 16 | * Require Jasmine's core files. Specifically, this requires and attaches all of Jasmine's code to the `jasmine` reference. 17 | */ 18 | window.jasmine = jasmineRequire.core(jasmineRequire); 19 | 20 | /** 21 | * Since this is being run in a browser and the results should populate to an HTML page, require the HTML-specific Jasmine code, injecting the same reference. 22 | */ 23 | jasmineRequire.html(jasmine); 24 | 25 | /** 26 | * Create the Jasmine environment. This is used to run all specs in a project. 27 | */ 28 | var env = jasmine.getEnv(); 29 | 30 | /** 31 | * ## The Global Interface 32 | * 33 | * Build up the functions that will be exposed as the Jasmine public interface. A project can customize, rename or alias any of these functions as desired, provided the implementation remains unchanged. 34 | */ 35 | var jasmineInterface = jasmineRequire.interface(jasmine, env); 36 | 37 | /** 38 | * Add all of the Jasmine global/public interface to the proper global, so a project can use the public interface directly. For example, calling `describe` in specs instead of `jasmine.getEnv().describe`. 39 | */ 40 | if (typeof window == "undefined" && typeof exports == "object") { 41 | extend(exports, jasmineInterface); 42 | } else { 43 | extend(window, jasmineInterface); 44 | } 45 | 46 | /** 47 | * ## Runner Parameters 48 | * 49 | * More browser specific code - wrap the query string in an object and to allow for getting/setting parameters from the runner user interface. 50 | */ 51 | 52 | var queryString = new jasmine.QueryString({ 53 | getWindowLocation: function() { return window.location; } 54 | }); 55 | 56 | var catchingExceptions = queryString.getParam("catch"); 57 | env.catchExceptions(typeof catchingExceptions === "undefined" ? true : catchingExceptions); 58 | 59 | /** 60 | * ## Reporters 61 | * The `HtmlReporter` builds all of the HTML UI for the runner page. This reporter paints the dots, stars, and x's for specs, as well as all spec names and all failures (if any). 62 | */ 63 | var htmlReporter = new jasmine.HtmlReporter({ 64 | env: env, 65 | onRaiseExceptionsClick: function() { queryString.navigateWithNewParam("catch", !env.catchingExceptions()); }, 66 | addToExistingQueryString: function(key, value) { return queryString.fullStringWithNewParam(key, value); }, 67 | getContainer: function() { return document.body; }, 68 | createElement: function() { return document.createElement.apply(document, arguments); }, 69 | createTextNode: function() { return document.createTextNode.apply(document, arguments); }, 70 | timer: new jasmine.Timer() 71 | }); 72 | 73 | /** 74 | * The `jsApiReporter` also receives spec results, and is used by any environment that needs to extract the results from JavaScript. 75 | */ 76 | env.addReporter(jasmineInterface.jsApiReporter); 77 | env.addReporter(htmlReporter); 78 | 79 | /** 80 | * Filter which specs will be run by matching the start of the full name against the `spec` query param. 81 | */ 82 | var specFilter = new jasmine.HtmlSpecFilter({ 83 | filterString: function() { return queryString.getParam("spec"); } 84 | }); 85 | 86 | env.specFilter = function(spec) { 87 | return specFilter.matches(spec.getFullName()); 88 | }; 89 | 90 | /** 91 | * Setting up timing functions to be able to be overridden. Certain browsers (Safari, IE 8, phantomjs) require this hack. 92 | */ 93 | window.setTimeout = window.setTimeout; 94 | window.setInterval = window.setInterval; 95 | window.clearTimeout = window.clearTimeout; 96 | window.clearInterval = window.clearInterval; 97 | 98 | /** 99 | * ## Execution 100 | * 101 | * Replace the browser window's `onload`, ensure it's called, and then run all of the loaded specs. This includes initializing the `HtmlReporter` instance and then executing the loaded Jasmine environment. All of this will happen after all of the specs are loaded. 102 | */ 103 | var currentWindowOnload = window.onload; 104 | 105 | window.onload = function() { 106 | if (currentWindowOnload) { 107 | currentWindowOnload(); 108 | } 109 | htmlReporter.initialize(); 110 | env.execute(); 111 | }; 112 | 113 | /** 114 | * Helper function for readability above. 115 | */ 116 | function extend(destination, source) { 117 | for (var property in source) destination[property] = source[property]; 118 | return destination; 119 | } 120 | 121 | }()); 122 | -------------------------------------------------------------------------------- /app/vendor/jasmine/jasmine-html.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2008-2015 Pivotal Labs 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining 5 | a copy of this software and associated documentation files (the 6 | "Software"), to deal in the Software without restriction, including 7 | without limitation the rights to use, copy, modify, merge, publish, 8 | distribute, sublicense, and/or sell copies of the Software, and to 9 | permit persons to whom the Software is furnished to do so, subject to 10 | the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 19 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 20 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 21 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | */ 23 | jasmineRequire.html = function(j$) { 24 | j$.ResultsNode = jasmineRequire.ResultsNode(); 25 | j$.HtmlReporter = jasmineRequire.HtmlReporter(j$); 26 | j$.QueryString = jasmineRequire.QueryString(); 27 | j$.HtmlSpecFilter = jasmineRequire.HtmlSpecFilter(); 28 | }; 29 | 30 | jasmineRequire.HtmlReporter = function(j$) { 31 | 32 | var noopTimer = { 33 | start: function() {}, 34 | elapsed: function() { return 0; } 35 | }; 36 | 37 | function HtmlReporter(options) { 38 | var env = options.env || {}, 39 | getContainer = options.getContainer, 40 | createElement = options.createElement, 41 | createTextNode = options.createTextNode, 42 | onRaiseExceptionsClick = options.onRaiseExceptionsClick || function() {}, 43 | addToExistingQueryString = options.addToExistingQueryString || defaultQueryString, 44 | timer = options.timer || noopTimer, 45 | results = [], 46 | specsExecuted = 0, 47 | failureCount = 0, 48 | pendingSpecCount = 0, 49 | htmlReporterMain, 50 | symbols, 51 | failedSuites = []; 52 | 53 | this.initialize = function() { 54 | clearPrior(); 55 | htmlReporterMain = createDom('div', {className: 'jasmine_html-reporter'}, 56 | createDom('div', {className: 'banner'}, 57 | createDom('a', {className: 'title', href: 'http://jasmine.github.io/', target: '_blank'}), 58 | createDom('span', {className: 'version'}, j$.version) 59 | ), 60 | createDom('ul', {className: 'symbol-summary'}), 61 | createDom('div', {className: 'alert'}), 62 | createDom('div', {className: 'results'}, 63 | createDom('div', {className: 'failures'}) 64 | ) 65 | ); 66 | getContainer().appendChild(htmlReporterMain); 67 | 68 | symbols = find('.symbol-summary'); 69 | }; 70 | 71 | var totalSpecsDefined; 72 | this.jasmineStarted = function(options) { 73 | totalSpecsDefined = options.totalSpecsDefined || 0; 74 | timer.start(); 75 | }; 76 | 77 | var summary = createDom('div', {className: 'summary'}); 78 | 79 | var topResults = new j$.ResultsNode({}, '', null), 80 | currentParent = topResults; 81 | 82 | this.suiteStarted = function(result) { 83 | currentParent.addChild(result, 'suite'); 84 | currentParent = currentParent.last(); 85 | }; 86 | 87 | this.suiteDone = function(result) { 88 | if (result.status == 'failed') { 89 | failedSuites.push(result); 90 | } 91 | 92 | if (currentParent == topResults) { 93 | return; 94 | } 95 | 96 | currentParent = currentParent.parent; 97 | }; 98 | 99 | this.specStarted = function(result) { 100 | currentParent.addChild(result, 'spec'); 101 | }; 102 | 103 | var failures = []; 104 | this.specDone = function(result) { 105 | if(noExpectations(result) && typeof console !== 'undefined' && typeof console.error !== 'undefined') { 106 | console.error('Spec \'' + result.fullName + '\' has no expectations.'); 107 | } 108 | 109 | if (result.status != 'disabled') { 110 | specsExecuted++; 111 | } 112 | 113 | symbols.appendChild(createDom('li', { 114 | className: noExpectations(result) ? 'empty' : result.status, 115 | id: 'spec_' + result.id, 116 | title: result.fullName 117 | } 118 | )); 119 | 120 | if (result.status == 'failed') { 121 | failureCount++; 122 | 123 | var failure = 124 | createDom('div', {className: 'spec-detail failed'}, 125 | createDom('div', {className: 'description'}, 126 | createDom('a', {title: result.fullName, href: specHref(result)}, result.fullName) 127 | ), 128 | createDom('div', {className: 'messages'}) 129 | ); 130 | var messages = failure.childNodes[1]; 131 | 132 | for (var i = 0; i < result.failedExpectations.length; i++) { 133 | var expectation = result.failedExpectations[i]; 134 | messages.appendChild(createDom('div', {className: 'result-message'}, expectation.message)); 135 | messages.appendChild(createDom('div', {className: 'stack-trace'}, expectation.stack)); 136 | } 137 | 138 | failures.push(failure); 139 | } 140 | 141 | if (result.status == 'pending') { 142 | pendingSpecCount++; 143 | } 144 | }; 145 | 146 | this.jasmineDone = function() { 147 | var banner = find('.banner'); 148 | banner.appendChild(createDom('span', {className: 'duration'}, 'finished in ' + timer.elapsed() / 1000 + 's')); 149 | 150 | var alert = find('.alert'); 151 | 152 | alert.appendChild(createDom('span', { className: 'exceptions' }, 153 | createDom('label', { className: 'label', 'for': 'raise-exceptions' }, 'raise exceptions'), 154 | createDom('input', { 155 | className: 'raise', 156 | id: 'raise-exceptions', 157 | type: 'checkbox' 158 | }) 159 | )); 160 | var checkbox = find('#raise-exceptions'); 161 | 162 | checkbox.checked = !env.catchingExceptions(); 163 | checkbox.onclick = onRaiseExceptionsClick; 164 | 165 | if (specsExecuted < totalSpecsDefined) { 166 | var skippedMessage = 'Ran ' + specsExecuted + ' of ' + totalSpecsDefined + ' specs - run all'; 167 | alert.appendChild( 168 | createDom('span', {className: 'bar skipped'}, 169 | createDom('a', {href: '?', title: 'Run all specs'}, skippedMessage) 170 | ) 171 | ); 172 | } 173 | var statusBarMessage = ''; 174 | var statusBarClassName = 'bar '; 175 | 176 | if (totalSpecsDefined > 0) { 177 | statusBarMessage += pluralize('spec', specsExecuted) + ', ' + pluralize('failure', failureCount); 178 | if (pendingSpecCount) { statusBarMessage += ', ' + pluralize('pending spec', pendingSpecCount); } 179 | statusBarClassName += (failureCount > 0) ? 'failed' : 'passed'; 180 | } else { 181 | statusBarClassName += 'skipped'; 182 | statusBarMessage += 'No specs found'; 183 | } 184 | 185 | alert.appendChild(createDom('span', {className: statusBarClassName}, statusBarMessage)); 186 | 187 | for(i = 0; i < failedSuites.length; i++) { 188 | var failedSuite = failedSuites[i]; 189 | for(var j = 0; j < failedSuite.failedExpectations.length; j++) { 190 | var errorBarMessage = 'AfterAll ' + failedSuite.failedExpectations[j].message; 191 | var errorBarClassName = 'bar errored'; 192 | alert.appendChild(createDom('span', {className: errorBarClassName}, errorBarMessage)); 193 | } 194 | } 195 | 196 | var results = find('.results'); 197 | results.appendChild(summary); 198 | 199 | summaryList(topResults, summary); 200 | 201 | function summaryList(resultsTree, domParent) { 202 | var specListNode; 203 | for (var i = 0; i < resultsTree.children.length; i++) { 204 | var resultNode = resultsTree.children[i]; 205 | if (resultNode.type == 'suite') { 206 | var suiteListNode = createDom('ul', {className: 'suite', id: 'suite-' + resultNode.result.id}, 207 | createDom('li', {className: 'suite-detail'}, 208 | createDom('a', {href: specHref(resultNode.result)}, resultNode.result.description) 209 | ) 210 | ); 211 | 212 | summaryList(resultNode, suiteListNode); 213 | domParent.appendChild(suiteListNode); 214 | } 215 | if (resultNode.type == 'spec') { 216 | if (domParent.getAttribute('class') != 'specs') { 217 | specListNode = createDom('ul', {className: 'specs'}); 218 | domParent.appendChild(specListNode); 219 | } 220 | var specDescription = resultNode.result.description; 221 | if(noExpectations(resultNode.result)) { 222 | specDescription = 'SPEC HAS NO EXPECTATIONS ' + specDescription; 223 | } 224 | if(resultNode.result.status === 'pending' && resultNode.result.pendingReason !== '') { 225 | specDescription = specDescription + ' PENDING WITH MESSAGE: ' + resultNode.result.pendingReason; 226 | } 227 | specListNode.appendChild( 228 | createDom('li', { 229 | className: resultNode.result.status, 230 | id: 'spec-' + resultNode.result.id 231 | }, 232 | createDom('a', {href: specHref(resultNode.result)}, specDescription) 233 | ) 234 | ); 235 | } 236 | } 237 | } 238 | 239 | if (failures.length) { 240 | alert.appendChild( 241 | createDom('span', {className: 'menu bar spec-list'}, 242 | createDom('span', {}, 'Spec List | '), 243 | createDom('a', {className: 'failures-menu', href: '#'}, 'Failures'))); 244 | alert.appendChild( 245 | createDom('span', {className: 'menu bar failure-list'}, 246 | createDom('a', {className: 'spec-list-menu', href: '#'}, 'Spec List'), 247 | createDom('span', {}, ' | Failures '))); 248 | 249 | find('.failures-menu').onclick = function() { 250 | setMenuModeTo('failure-list'); 251 | }; 252 | find('.spec-list-menu').onclick = function() { 253 | setMenuModeTo('spec-list'); 254 | }; 255 | 256 | setMenuModeTo('failure-list'); 257 | 258 | var failureNode = find('.failures'); 259 | for (var i = 0; i < failures.length; i++) { 260 | failureNode.appendChild(failures[i]); 261 | } 262 | } 263 | }; 264 | 265 | return this; 266 | 267 | function find(selector) { 268 | return getContainer().querySelector('.jasmine_html-reporter ' + selector); 269 | } 270 | 271 | function clearPrior() { 272 | // return the reporter 273 | var oldReporter = find(''); 274 | 275 | if(oldReporter) { 276 | getContainer().removeChild(oldReporter); 277 | } 278 | } 279 | 280 | function createDom(type, attrs, childrenVarArgs) { 281 | var el = createElement(type); 282 | 283 | for (var i = 2; i < arguments.length; i++) { 284 | var child = arguments[i]; 285 | 286 | if (typeof child === 'string') { 287 | el.appendChild(createTextNode(child)); 288 | } else { 289 | if (child) { 290 | el.appendChild(child); 291 | } 292 | } 293 | } 294 | 295 | for (var attr in attrs) { 296 | if (attr == 'className') { 297 | el[attr] = attrs[attr]; 298 | } else { 299 | el.setAttribute(attr, attrs[attr]); 300 | } 301 | } 302 | 303 | return el; 304 | } 305 | 306 | function pluralize(singular, count) { 307 | var word = (count == 1 ? singular : singular + 's'); 308 | 309 | return '' + count + ' ' + word; 310 | } 311 | 312 | function specHref(result) { 313 | return addToExistingQueryString('spec', result.fullName); 314 | } 315 | 316 | function defaultQueryString(key, value) { 317 | return '?' + key + '=' + value; 318 | } 319 | 320 | function setMenuModeTo(mode) { 321 | htmlReporterMain.setAttribute('class', 'jasmine_html-reporter ' + mode); 322 | } 323 | 324 | function noExpectations(result) { 325 | return (result.failedExpectations.length + result.passedExpectations.length) === 0 && 326 | result.status === 'passed'; 327 | } 328 | } 329 | 330 | return HtmlReporter; 331 | }; 332 | 333 | jasmineRequire.HtmlSpecFilter = function() { 334 | function HtmlSpecFilter(options) { 335 | var filterString = options && options.filterString() && options.filterString().replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); 336 | var filterPattern = new RegExp(filterString); 337 | 338 | this.matches = function(specName) { 339 | return filterPattern.test(specName); 340 | }; 341 | } 342 | 343 | return HtmlSpecFilter; 344 | }; 345 | 346 | jasmineRequire.ResultsNode = function() { 347 | function ResultsNode(result, type, parent) { 348 | this.result = result; 349 | this.type = type; 350 | this.parent = parent; 351 | 352 | this.children = []; 353 | 354 | this.addChild = function(result, type) { 355 | this.children.push(new ResultsNode(result, type, this)); 356 | }; 357 | 358 | this.last = function() { 359 | return this.children[this.children.length - 1]; 360 | }; 361 | } 362 | 363 | return ResultsNode; 364 | }; 365 | 366 | jasmineRequire.QueryString = function() { 367 | function QueryString(options) { 368 | 369 | this.navigateWithNewParam = function(key, value) { 370 | options.getWindowLocation().search = this.fullStringWithNewParam(key, value); 371 | }; 372 | 373 | this.fullStringWithNewParam = function(key, value) { 374 | var paramMap = queryStringToParamMap(); 375 | paramMap[key] = value; 376 | return toQueryString(paramMap); 377 | }; 378 | 379 | this.getParam = function(key) { 380 | return queryStringToParamMap()[key]; 381 | }; 382 | 383 | return this; 384 | 385 | function toQueryString(paramMap) { 386 | var qStrPairs = []; 387 | for (var prop in paramMap) { 388 | qStrPairs.push(encodeURIComponent(prop) + '=' + encodeURIComponent(paramMap[prop])); 389 | } 390 | return '?' + qStrPairs.join('&'); 391 | } 392 | 393 | function queryStringToParamMap() { 394 | var paramStr = options.getWindowLocation().search.substring(1), 395 | params = [], 396 | paramMap = {}; 397 | 398 | if (paramStr.length > 0) { 399 | params = paramStr.split('&'); 400 | for (var i = 0; i < params.length; i++) { 401 | var p = params[i].split('='); 402 | var value = decodeURIComponent(p[1]); 403 | if (value === 'true' || value === 'false') { 404 | value = JSON.parse(value); 405 | } 406 | paramMap[decodeURIComponent(p[0])] = value; 407 | } 408 | } 409 | 410 | return paramMap; 411 | } 412 | 413 | } 414 | 415 | return QueryString; 416 | }; 417 | -------------------------------------------------------------------------------- /config/env_development.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "development", 3 | "description": "Add here any environment specific stuff you like." 4 | } 5 | -------------------------------------------------------------------------------- /config/env_production.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "production", 3 | "description": "Add here any environment specific stuff you like." 4 | } 5 | -------------------------------------------------------------------------------- /config/env_test.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "test", 3 | "description": "Add here any environment specific stuff you like." 4 | } 5 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./tasks/build'); 4 | require('./tasks/release'); 5 | -------------------------------------------------------------------------------- /lg-desktop.sublime-project: -------------------------------------------------------------------------------- 1 | { 2 | "folders": 3 | [ 4 | { 5 | "path": "." 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "asar": "^0.7.2", 4 | "electron-prebuilt": "^0.35.1", 5 | "fs-jetpack": "^0.7.0", 6 | "gulp": "^3.9.0", 7 | "gulp-less": "^3.0.3", 8 | "gulp-util": "^3.0.6", 9 | "q": "^1.4.1", 10 | "rollup": "^0.21.0", 11 | "tree-kill": "^0.1.1", 12 | "yargs": "^3.15.0" 13 | }, 14 | "optionalDependencies": { 15 | "appdmg": "^0.3.2", 16 | "rcedit": "^0.3.0" 17 | }, 18 | "scripts": { 19 | "postinstall": "cd app && npm install", 20 | "build": "gulp build", 21 | "release": "gulp release --env=production", 22 | "start": "node ./tasks/start", 23 | "test": "node ./tasks/start --env=test" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /resources/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachinchoolur/lightgallery-desktop/46ace840e0fdc03e79f864ad4b47c7057237ac6e/resources/icon.png -------------------------------------------------------------------------------- /resources/linux/DEBIAN/control: -------------------------------------------------------------------------------- 1 | Package: {{name}} 2 | Version: {{version}} 3 | Maintainer: {{author}} 4 | Priority: optional 5 | Architecture: amd64 6 | Installed-Size: {{size}} 7 | Description: {{description}} 8 | -------------------------------------------------------------------------------- /resources/linux/app.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Version=1.0 3 | Type=Application 4 | Encoding=UTF-8 5 | Name={{productName}} 6 | Comment={{description}} 7 | Exec=/opt/{{name}}/{{name}} 8 | Path=/opt/{{name}}/ 9 | Icon=/opt/{{name}}/icon.png 10 | Terminal=false 11 | Categories=Application; 12 | -------------------------------------------------------------------------------- /resources/osx/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDisplayName 6 | {{productName}} 7 | CFBundleExecutable 8 | {{productName}} 9 | CFBundleIconFile 10 | icon.icns 11 | CFBundleIdentifier 12 | {{identifier}} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | {{productName}} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleVersion 20 | {{version}} 21 | CFBundleGetInfoString 22 | {{version}} 23 | LSMinimumSystemVersion 24 | 10.8.0 25 | NSMainNibFile 26 | MainMenu 27 | NSPrincipalClass 28 | AtomApplication 29 | NSSupportsAutomaticGraphicsSwitching 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /resources/osx/appdmg.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "{{productName}}", 3 | "icon": "{{dmgIcon}}", 4 | "background": "{{dmgBackground}}", 5 | "icon-size": 128, 6 | "contents": [ 7 | { "x": 410, "y": 220, "type": "link", "path": "/Applications" }, 8 | { "x": 130, "y": 220, "type": "file", "path": "{{appPath}}" } 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /resources/osx/dmg-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachinchoolur/lightgallery-desktop/46ace840e0fdc03e79f864ad4b47c7057237ac6e/resources/osx/dmg-background.png -------------------------------------------------------------------------------- /resources/osx/dmg-background@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachinchoolur/lightgallery-desktop/46ace840e0fdc03e79f864ad4b47c7057237ac6e/resources/osx/dmg-background@2x.png -------------------------------------------------------------------------------- /resources/osx/dmg-icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachinchoolur/lightgallery-desktop/46ace840e0fdc03e79f864ad4b47c7057237ac6e/resources/osx/dmg-icon.icns -------------------------------------------------------------------------------- /resources/osx/helper_apps/Info EH.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDisplayName 6 | {{productName}} Helper EH 7 | CFBundleExecutable 8 | {{productName}} Helper EH 9 | CFBundleIdentifier 10 | {{identifier}}.helper.EH 11 | CFBundleName 12 | {{productName}} Helper EH 13 | CFBundlePackageType 14 | APPL 15 | DTSDKName 16 | macosx 17 | LSUIElement 18 | 19 | NSSupportsAutomaticGraphicsSwitching 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /resources/osx/helper_apps/Info NP.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDisplayName 6 | {{productName}} Helper NP 7 | CFBundleExecutable 8 | {{productName}} Helper NP 9 | CFBundleIdentifier 10 | {{identifier}}.helper.NP 11 | CFBundleName 12 | {{productName}} Helper NP 13 | CFBundlePackageType 14 | APPL 15 | DTSDKName 16 | macosx 17 | LSUIElement 18 | 19 | NSSupportsAutomaticGraphicsSwitching 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /resources/osx/helper_apps/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleIdentifier 6 | {{identifier}}.helper 7 | CFBundleName 8 | {{productName}} Helper 9 | CFBundlePackageType 10 | APPL 11 | DTSDKName 12 | macosx 13 | LSUIElement 14 | 15 | NSSupportsAutomaticGraphicsSwitching 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /resources/osx/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachinchoolur/lightgallery-desktop/46ace840e0fdc03e79f864ad4b47c7057237ac6e/resources/osx/icon.icns -------------------------------------------------------------------------------- /resources/windows/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachinchoolur/lightgallery-desktop/46ace840e0fdc03e79f864ad4b47c7057237ac6e/resources/windows/icon.ico -------------------------------------------------------------------------------- /resources/windows/installer.nsi: -------------------------------------------------------------------------------- 1 | ; NSIS packaging/install script 2 | ; Docs: http://nsis.sourceforge.net/Docs/Contents.html 3 | 4 | !include LogicLib.nsh 5 | !include nsDialogs.nsh 6 | 7 | ; -------------------------------- 8 | ; Variables 9 | ; -------------------------------- 10 | 11 | !define dest "{{dest}}" 12 | !define src "{{src}}" 13 | !define name "{{name}}" 14 | !define productName "{{productName}}" 15 | !define version "{{version}}" 16 | !define icon "{{icon}}" 17 | !define setupIcon "{{setupIcon}}" 18 | !define banner "{{banner}}" 19 | 20 | !define exec "{{productName}}.exe" 21 | 22 | !define regkey "Software\${productName}" 23 | !define uninstkey "Software\Microsoft\Windows\CurrentVersion\Uninstall\${productName}" 24 | 25 | !define uninstaller "uninstall.exe" 26 | 27 | ; -------------------------------- 28 | ; Installation 29 | ; -------------------------------- 30 | 31 | Unicode true 32 | SetCompressor /SOLID lzma 33 | 34 | Name "${productName}" 35 | Icon "${setupIcon}" 36 | OutFile "${dest}" 37 | InstallDir "$PROGRAMFILES\${productName}" 38 | InstallDirRegKey HKLM "${regkey}" "" 39 | 40 | RequestExecutionLevel admin 41 | CRCCheck on 42 | SilentInstall normal 43 | 44 | XPStyle on 45 | ShowInstDetails nevershow 46 | AutoCloseWindow false 47 | WindowIcon off 48 | 49 | Caption "${productName} Setup" 50 | ; Don't add sub-captions to title bar 51 | SubCaption 3 " " 52 | SubCaption 4 " " 53 | 54 | Page custom welcome 55 | Page instfiles 56 | 57 | Var Image 58 | Var ImageHandle 59 | 60 | Function .onInit 61 | 62 | ; Extract banner image for welcome page 63 | InitPluginsDir 64 | ReserveFile "${banner}" 65 | File /oname=$PLUGINSDIR\banner.bmp "${banner}" 66 | 67 | FunctionEnd 68 | 69 | ; Custom welcome page 70 | Function welcome 71 | 72 | nsDialogs::Create 1018 73 | 74 | ${NSD_CreateLabel} 185 1u 210 100% "Welcome to ${productName} version ${version} installer.$\r$\n$\r$\nClick install to begin." 75 | 76 | ${NSD_CreateBitmap} 0 0 170 210 "" 77 | Pop $Image 78 | ${NSD_SetImage} $Image $PLUGINSDIR\banner.bmp $ImageHandle 79 | 80 | nsDialogs::Show 81 | 82 | ${NSD_FreeImage} $ImageHandle 83 | 84 | FunctionEnd 85 | 86 | ; Installation declarations 87 | Section "Install" 88 | 89 | WriteRegStr HKLM "${regkey}" "Install_Dir" "$INSTDIR" 90 | WriteRegStr HKLM "${uninstkey}" "DisplayName" "${productName}" 91 | WriteRegStr HKLM "${uninstkey}" "DisplayIcon" '"$INSTDIR\icon.ico"' 92 | WriteRegStr HKLM "${uninstkey}" "UninstallString" '"$INSTDIR\${uninstaller}"' 93 | 94 | ; Remove all application files copied by previous installation 95 | RMDir /r "$INSTDIR" 96 | 97 | SetOutPath $INSTDIR 98 | 99 | ; Include all files from /build directory 100 | File /r "${src}\*" 101 | 102 | ; Create start menu shortcut 103 | CreateShortCut "$SMPROGRAMS\${productName}.lnk" "$INSTDIR\${exec}" "" "$INSTDIR\icon.ico" 104 | 105 | WriteUninstaller "${uninstaller}" 106 | 107 | SectionEnd 108 | 109 | ; -------------------------------- 110 | ; Uninstaller 111 | ; -------------------------------- 112 | 113 | ShowUninstDetails nevershow 114 | 115 | UninstallCaption "Uninstall ${productName}" 116 | UninstallText "Don't like ${productName} anymore? Hit uninstall button." 117 | UninstallIcon "${icon}" 118 | 119 | UninstPage custom un.confirm un.confirmOnLeave 120 | UninstPage instfiles 121 | 122 | Var RemoveAppDataCheckbox 123 | Var RemoveAppDataCheckbox_State 124 | 125 | ; Custom uninstall confirm page 126 | Function un.confirm 127 | 128 | nsDialogs::Create 1018 129 | 130 | ${NSD_CreateLabel} 1u 1u 100% 24u "If you really want to remove ${productName} from your computer press uninstall button." 131 | 132 | ${NSD_CreateCheckbox} 1u 35u 100% 10u "Remove also my ${productName} personal data" 133 | Pop $RemoveAppDataCheckbox 134 | 135 | nsDialogs::Show 136 | 137 | FunctionEnd 138 | 139 | Function un.confirmOnLeave 140 | 141 | ; Save checkbox state on page leave 142 | ${NSD_GetState} $RemoveAppDataCheckbox $RemoveAppDataCheckbox_State 143 | 144 | FunctionEnd 145 | 146 | ; Uninstall declarations 147 | Section "Uninstall" 148 | 149 | DeleteRegKey HKLM "${uninstkey}" 150 | DeleteRegKey HKLM "${regkey}" 151 | 152 | Delete "$SMPROGRAMS\${productName}.lnk" 153 | 154 | ; Remove whole directory from Program Files 155 | RMDir /r "$INSTDIR" 156 | 157 | ; Remove also appData directory generated by your app if user checked this option 158 | ${If} $RemoveAppDataCheckbox_State == ${BST_CHECKED} 159 | RMDir /r "$APPDATA\${productName}" 160 | ${EndIf} 161 | 162 | SectionEnd 163 | -------------------------------------------------------------------------------- /resources/windows/setup-banner.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachinchoolur/lightgallery-desktop/46ace840e0fdc03e79f864ad4b47c7057237ac6e/resources/windows/setup-banner.bmp -------------------------------------------------------------------------------- /resources/windows/setup-icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sachinchoolur/lightgallery-desktop/46ace840e0fdc03e79f864ad4b47c7057237ac6e/resources/windows/setup-icon.ico -------------------------------------------------------------------------------- /tasks/build.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var pathUtil = require('path'); 4 | var Q = require('q'); 5 | var gulp = require('gulp'); 6 | var rollup = require('rollup'); 7 | var less = require('gulp-less'); 8 | var jetpack = require('fs-jetpack'); 9 | 10 | var utils = require('./utils'); 11 | var generateSpecsImportFile = require('./generate_specs_import'); 12 | 13 | var projectDir = jetpack; 14 | var srcDir = projectDir.cwd('./app'); 15 | var destDir = projectDir.cwd('./build'); 16 | 17 | var paths = { 18 | copyFromAppDir: [ 19 | './node_modules/**', 20 | './vendor/**', 21 | './lightgallery/**', 22 | './**/*.html', 23 | './**/*.+(jpg|png|svg)' 24 | ], 25 | } 26 | 27 | // ------------------------------------- 28 | // Tasks 29 | // ------------------------------------- 30 | 31 | gulp.task('clean', function(callback) { 32 | return destDir.dirAsync('.', { empty: true }); 33 | }); 34 | 35 | 36 | var copyTask = function () { 37 | return projectDir.copyAsync('app', destDir.path(), { 38 | overwrite: true, 39 | matching: paths.copyFromAppDir 40 | }); 41 | }; 42 | gulp.task('copy', ['clean'], copyTask); 43 | gulp.task('copy-watch', copyTask); 44 | 45 | 46 | var bundle = function (src, dest) { 47 | var deferred = Q.defer(); 48 | 49 | rollup.rollup({ 50 | entry: src, 51 | }).then(function (bundle) { 52 | var jsFile = pathUtil.basename(dest); 53 | var result = bundle.generate({ 54 | format: 'cjs', 55 | sourceMap: true, 56 | sourceMapFile: jsFile, 57 | }); 58 | // Wrap code in self invoking function so the variables don't 59 | // pollute the global namespace. 60 | var isolatedCode = '(function () {' + result.code + '}());'; 61 | return Q.all([ 62 | destDir.writeAsync(dest, isolatedCode + '\n//# sourceMappingURL=' + jsFile + '.map'), 63 | destDir.writeAsync(dest + '.map', result.map.toString()), 64 | ]); 65 | }).then(function () { 66 | deferred.resolve(); 67 | }).catch(function (err) { 68 | console.error('Build: Error during rollup', err.stack); 69 | }); 70 | 71 | return deferred.promise; 72 | }; 73 | 74 | var bundleApplication = function () { 75 | return Q.all([ 76 | bundle(srcDir.path('background.js'), destDir.path('background.js')), 77 | bundle(srcDir.path('app.js'), destDir.path('app.js')), 78 | ]); 79 | }; 80 | 81 | var bundleSpecs = function () { 82 | generateSpecsImportFile().then(function (specEntryPointPath) { 83 | return Q.all([ 84 | bundle(srcDir.path('background.js'), destDir.path('background.js')), 85 | bundle(specEntryPointPath, destDir.path('spec.js')), 86 | ]); 87 | }); 88 | }; 89 | 90 | var bundleTask = function () { 91 | if (utils.getEnvName() === 'test') { 92 | return bundleSpecs(); 93 | } 94 | return bundleApplication(); 95 | }; 96 | gulp.task('bundle', ['clean'], bundleTask); 97 | gulp.task('bundle-watch', bundleTask); 98 | 99 | 100 | var lessTask = function () { 101 | return gulp.src('app/stylesheets/main.less') 102 | .pipe(less()) 103 | .pipe(gulp.dest(destDir.path('stylesheets'))); 104 | }; 105 | gulp.task('less', ['clean'], lessTask); 106 | gulp.task('less-watch', lessTask); 107 | 108 | 109 | gulp.task('finalize', ['clean'], function () { 110 | var manifest = srcDir.read('package.json', 'json'); 111 | 112 | // Add "dev" or "test" suffix to name, so Electron will write all data 113 | // like cookies and localStorage in separate places for each environment. 114 | switch (utils.getEnvName()) { 115 | case 'development': 116 | manifest.name += '-dev'; 117 | manifest.productName += ' Dev'; 118 | break; 119 | case 'test': 120 | manifest.name += '-test'; 121 | manifest.productName += ' Test'; 122 | break; 123 | } 124 | 125 | // Copy environment variables to package.json file for easy use 126 | // in the running application. This is not official way of doing 127 | // things, but also isn't prohibited ;) 128 | manifest.env = projectDir.read('config/env_' + utils.getEnvName() + '.json', 'json'); 129 | 130 | destDir.write('package.json', manifest); 131 | }); 132 | 133 | 134 | gulp.task('watch', function () { 135 | gulp.watch('app/**/*.js', ['bundle-watch']); 136 | gulp.watch(paths.copyFromAppDir, { cwd: 'app' }, ['copy-watch']); 137 | gulp.watch('app/**/*.less', ['less-watch']); 138 | }); 139 | 140 | 141 | gulp.task('build', ['bundle', 'less', 'copy', 'finalize']); 142 | -------------------------------------------------------------------------------- /tasks/generate_specs_import.js: -------------------------------------------------------------------------------- 1 | // Spec files are scattered through the whole project. Here we're searching 2 | // for them and generate one entry file which will run all the tests. 3 | 4 | 'use strict'; 5 | 6 | var jetpack = require('fs-jetpack'); 7 | var srcDir = jetpack.cwd('app'); 8 | 9 | var fileName = 'spec.js'; 10 | var fileBanner = "// This file is generated automatically.\n" 11 | + "// All your modifications to it will be lost (so don't do it).\n"; 12 | var whatToInclude = [ 13 | '*.spec.js', 14 | '!node_modules/**', 15 | ]; 16 | 17 | module.exports = function () { 18 | return srcDir.findAsync('.', { matching: whatToInclude }, 'relativePath') 19 | .then(function (specPaths) { 20 | var fileContent = specPaths.map(function (path) { 21 | return 'import "' + path + '";'; 22 | }).join('\n'); 23 | return srcDir.writeAsync(fileName, fileBanner + fileContent); 24 | }) 25 | .then(function () { 26 | return srcDir.path(fileName); 27 | }); 28 | }; 29 | -------------------------------------------------------------------------------- /tasks/release.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var gulp = require('gulp'); 4 | var utils = require('./utils'); 5 | 6 | var releaseForOs = { 7 | osx: require('./release_osx'), 8 | linux: require('./release_linux'), 9 | windows: require('./release_windows'), 10 | }; 11 | 12 | gulp.task('release', ['build'], function () { 13 | return releaseForOs[utils.os()](); 14 | }); 15 | -------------------------------------------------------------------------------- /tasks/release_linux.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Q = require('q'); 4 | var gulpUtil = require('gulp-util'); 5 | var childProcess = require('child_process'); 6 | var jetpack = require('fs-jetpack'); 7 | var asar = require('asar'); 8 | var utils = require('./utils'); 9 | 10 | var projectDir; 11 | var releasesDir; 12 | var packName; 13 | var packDir; 14 | var tmpDir; 15 | var readyAppDir; 16 | var manifest; 17 | 18 | var init = function () { 19 | projectDir = jetpack; 20 | tmpDir = projectDir.dir('./tmp', { empty: true }); 21 | releasesDir = projectDir.dir('./releases'); 22 | manifest = projectDir.read('app/package.json', 'json'); 23 | packName = manifest.name + '_' + manifest.version; 24 | packDir = tmpDir.dir(packName); 25 | readyAppDir = packDir.cwd('opt', manifest.name); 26 | 27 | return Q(); 28 | }; 29 | 30 | var copyRuntime = function () { 31 | return projectDir.copyAsync('node_modules/electron-prebuilt/dist', readyAppDir.path(), { overwrite: true }); 32 | }; 33 | 34 | var packageBuiltApp = function () { 35 | var deferred = Q.defer(); 36 | 37 | asar.createPackage(projectDir.path('build'), readyAppDir.path('resources/app.asar'), function() { 38 | deferred.resolve(); 39 | }); 40 | 41 | return deferred.promise; 42 | }; 43 | 44 | var finalize = function () { 45 | // Create .desktop file from the template 46 | var desktop = projectDir.read('resources/linux/app.desktop'); 47 | desktop = utils.replace(desktop, { 48 | name: manifest.name, 49 | productName: manifest.productName, 50 | description: manifest.description, 51 | version: manifest.version, 52 | author: manifest.author 53 | }); 54 | packDir.write('usr/share/applications/' + manifest.name + '.desktop', desktop); 55 | 56 | // Copy icon 57 | projectDir.copy('resources/icon.png', readyAppDir.path('icon.png')); 58 | 59 | return Q(); 60 | }; 61 | 62 | var renameApp = function() { 63 | return readyAppDir.renameAsync("electron", manifest.name); 64 | }; 65 | 66 | var packToDebFile = function () { 67 | var deferred = Q.defer(); 68 | 69 | var debFileName = packName + '_amd64.deb'; 70 | var debPath = releasesDir.path(debFileName); 71 | 72 | gulpUtil.log('Creating DEB package...'); 73 | 74 | // Counting size of the app in KiB 75 | var appSize = Math.round(readyAppDir.inspectTree('.').size / 1024); 76 | 77 | // Preparing debian control file 78 | var control = projectDir.read('resources/linux/DEBIAN/control'); 79 | control = utils.replace(control, { 80 | name: manifest.name, 81 | description: manifest.description, 82 | version: manifest.version, 83 | author: manifest.author, 84 | size: appSize 85 | }); 86 | packDir.write('DEBIAN/control', control); 87 | 88 | // Build the package... 89 | childProcess.exec('fakeroot dpkg-deb -Zxz --build ' + packDir.path().replace(/\s/g, '\\ ') + ' ' + debPath.replace(/\s/g, '\\ '), 90 | function (error, stdout, stderr) { 91 | if (error || stderr) { 92 | console.log("ERROR while building DEB package:"); 93 | console.log(error); 94 | console.log(stderr); 95 | } else { 96 | gulpUtil.log('DEB package ready!', debPath); 97 | } 98 | deferred.resolve(); 99 | }); 100 | 101 | return deferred.promise; 102 | }; 103 | 104 | var cleanClutter = function () { 105 | return tmpDir.removeAsync('.'); 106 | }; 107 | 108 | module.exports = function () { 109 | return init() 110 | .then(copyRuntime) 111 | .then(packageBuiltApp) 112 | .then(finalize) 113 | .then(renameApp) 114 | .then(packToDebFile) 115 | .then(cleanClutter) 116 | .catch(console.error); 117 | }; 118 | -------------------------------------------------------------------------------- /tasks/release_osx.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Q = require('q'); 4 | var gulpUtil = require('gulp-util'); 5 | var jetpack = require('fs-jetpack'); 6 | var asar = require('asar'); 7 | var utils = require('./utils'); 8 | var child_process = require('child_process'); 9 | 10 | var projectDir; 11 | var releasesDir; 12 | var tmpDir; 13 | var finalAppDir; 14 | var manifest; 15 | 16 | var init = function () { 17 | projectDir = jetpack; 18 | tmpDir = projectDir.dir('./tmp', { empty: true }); 19 | releasesDir = projectDir.dir('./releases'); 20 | manifest = projectDir.read('app/package.json', 'json'); 21 | finalAppDir = tmpDir.cwd(manifest.productName + '.app'); 22 | 23 | return Q(); 24 | }; 25 | 26 | var copyRuntime = function () { 27 | return projectDir.copyAsync('node_modules/electron-prebuilt/dist/Electron.app', finalAppDir.path()); 28 | }; 29 | 30 | var cleanupRuntime = function() { 31 | finalAppDir.remove('Contents/Resources/default_app'); 32 | finalAppDir.remove('Contents/Resources/atom.icns'); 33 | return Q(); 34 | } 35 | 36 | var packageBuiltApp = function () { 37 | var deferred = Q.defer(); 38 | 39 | asar.createPackage(projectDir.path('build'), finalAppDir.path('Contents/Resources/app.asar'), function() { 40 | deferred.resolve(); 41 | }); 42 | 43 | return deferred.promise; 44 | }; 45 | 46 | var finalize = function () { 47 | // Prepare main Info.plist 48 | var info = projectDir.read('resources/osx/Info.plist'); 49 | info = utils.replace(info, { 50 | productName: manifest.productName, 51 | identifier: manifest.identifier, 52 | version: manifest.version 53 | }); 54 | finalAppDir.write('Contents/Info.plist', info); 55 | 56 | // Prepare Info.plist of Helper apps 57 | [' EH', ' NP', ''].forEach(function (helper_suffix) { 58 | info = projectDir.read('resources/osx/helper_apps/Info' + helper_suffix + '.plist'); 59 | info = utils.replace(info, { 60 | productName: manifest.productName, 61 | identifier: manifest.identifier 62 | }); 63 | finalAppDir.write('Contents/Frameworks/Electron Helper' + helper_suffix + '.app/Contents/Info.plist', info); 64 | }); 65 | 66 | // Copy icon 67 | projectDir.copy('resources/osx/icon.icns', finalAppDir.path('Contents/Resources/icon.icns')); 68 | 69 | return Q(); 70 | }; 71 | 72 | var renameApp = function() { 73 | // Rename helpers 74 | [' Helper EH', ' Helper NP', ' Helper'].forEach(function (helper_suffix) { 75 | finalAppDir.rename('Contents/Frameworks/Electron' + helper_suffix + '.app/Contents/MacOS/Electron' + helper_suffix, manifest.productName + helper_suffix ); 76 | finalAppDir.rename('Contents/Frameworks/Electron' + helper_suffix + '.app', manifest.productName + helper_suffix + '.app'); 77 | }); 78 | // Rename application 79 | finalAppDir.rename('Contents/MacOS/Electron', manifest.productName); 80 | return Q(); 81 | } 82 | 83 | var signApp = function () { 84 | var identity = utils.getSigningId(); 85 | if (identity) { 86 | var cmd = 'codesign --deep --force --sign "' + identity + '" "' + finalAppDir.path() + '"'; 87 | gulpUtil.log('Signing with:', cmd); 88 | return Q.nfcall(child_process.exec, cmd); 89 | } else { 90 | return Q(); 91 | } 92 | } 93 | 94 | var packToDmgFile = function () { 95 | var deferred = Q.defer(); 96 | 97 | var appdmg = require('appdmg'); 98 | var dmgName = manifest.name + '_' + manifest.version + '.dmg'; 99 | 100 | // Prepare appdmg config 101 | var dmgManifest = projectDir.read('resources/osx/appdmg.json'); 102 | dmgManifest = utils.replace(dmgManifest, { 103 | productName: manifest.productName, 104 | appPath: finalAppDir.path(), 105 | dmgIcon: projectDir.path("resources/osx/dmg-icon.icns"), 106 | dmgBackground: projectDir.path("resources/osx/dmg-background.png") 107 | }); 108 | tmpDir.write('appdmg.json', dmgManifest); 109 | 110 | // Delete DMG file with this name if already exists 111 | releasesDir.remove(dmgName); 112 | 113 | gulpUtil.log('Packaging to DMG file...'); 114 | 115 | var readyDmgPath = releasesDir.path(dmgName); 116 | appdmg({ 117 | source: tmpDir.path('appdmg.json'), 118 | target: readyDmgPath 119 | }) 120 | .on('error', function (err) { 121 | console.error(err); 122 | }) 123 | .on('finish', function () { 124 | gulpUtil.log('DMG file ready!', readyDmgPath); 125 | deferred.resolve(); 126 | }); 127 | 128 | return deferred.promise; 129 | }; 130 | 131 | var cleanClutter = function () { 132 | return tmpDir.removeAsync('.'); 133 | }; 134 | 135 | module.exports = function () { 136 | return init() 137 | .then(copyRuntime) 138 | .then(cleanupRuntime) 139 | .then(packageBuiltApp) 140 | .then(finalize) 141 | .then(renameApp) 142 | .then(signApp) 143 | .then(packToDmgFile) 144 | .then(cleanClutter) 145 | .catch(console.error); 146 | }; 147 | -------------------------------------------------------------------------------- /tasks/release_windows.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Q = require('q'); 4 | var gulpUtil = require('gulp-util'); 5 | var childProcess = require('child_process'); 6 | var jetpack = require('fs-jetpack'); 7 | var asar = require('asar'); 8 | var utils = require('./utils'); 9 | 10 | var projectDir; 11 | var tmpDir; 12 | var releasesDir; 13 | var readyAppDir; 14 | var manifest; 15 | 16 | var init = function () { 17 | projectDir = jetpack; 18 | tmpDir = projectDir.dir('./tmp', { empty: true }); 19 | releasesDir = projectDir.dir('./releases'); 20 | manifest = projectDir.read('app/package.json', 'json'); 21 | readyAppDir = tmpDir.cwd(manifest.name); 22 | 23 | return Q(); 24 | }; 25 | 26 | var copyRuntime = function () { 27 | return projectDir.copyAsync('node_modules/electron-prebuilt/dist', readyAppDir.path(), { overwrite: true }); 28 | }; 29 | 30 | var cleanupRuntime = function () { 31 | return readyAppDir.removeAsync('resources/default_app'); 32 | }; 33 | 34 | var packageBuiltApp = function () { 35 | var deferred = Q.defer(); 36 | 37 | asar.createPackage(projectDir.path('build'), readyAppDir.path('resources/app.asar'), function() { 38 | deferred.resolve(); 39 | }); 40 | 41 | return deferred.promise; 42 | }; 43 | 44 | var finalize = function () { 45 | var deferred = Q.defer(); 46 | 47 | projectDir.copy('resources/windows/icon.ico', readyAppDir.path('icon.ico')); 48 | 49 | // Replace Electron icon for your own. 50 | var rcedit = require('rcedit'); 51 | rcedit(readyAppDir.path('electron.exe'), { 52 | 'icon': projectDir.path('resources/windows/icon.ico'), 53 | 'version-string': { 54 | 'ProductName': manifest.productName, 55 | 'FileDescription': manifest.description, 56 | } 57 | }, function (err) { 58 | if (!err) { 59 | deferred.resolve(); 60 | } 61 | }); 62 | 63 | return deferred.promise; 64 | }; 65 | 66 | var renameApp = function () { 67 | return readyAppDir.renameAsync('electron.exe', manifest.productName + '.exe'); 68 | }; 69 | 70 | var createInstaller = function () { 71 | var deferred = Q.defer(); 72 | 73 | var finalPackageName = manifest.name + '_' + manifest.version + '.exe'; 74 | var installScript = projectDir.read('resources/windows/installer.nsi'); 75 | installScript = utils.replace(installScript, { 76 | name: manifest.name, 77 | productName: manifest.productName, 78 | version: manifest.version, 79 | src: readyAppDir.path(), 80 | dest: releasesDir.path(finalPackageName), 81 | icon: readyAppDir.path('icon.ico'), 82 | setupIcon: projectDir.path('resources/windows/setup-icon.ico'), 83 | banner: projectDir.path('resources/windows/setup-banner.bmp'), 84 | }); 85 | tmpDir.write('installer.nsi', installScript); 86 | 87 | gulpUtil.log('Building installer with NSIS...'); 88 | 89 | // Remove destination file if already exists. 90 | releasesDir.remove(finalPackageName); 91 | 92 | // Note: NSIS have to be added to PATH (environment variables). 93 | var nsis = childProcess.spawn('makensis', [ 94 | tmpDir.path('installer.nsi') 95 | ], { 96 | stdio: 'inherit' 97 | }); 98 | nsis.on('error', function (err) { 99 | if (err.message === 'spawn makensis ENOENT') { 100 | throw "Can't find NSIS. Are you sure you've installed it and" 101 | + " added to PATH environment variable?"; 102 | } else { 103 | throw err; 104 | } 105 | }); 106 | nsis.on('close', function () { 107 | gulpUtil.log('Installer ready!', releasesDir.path(finalPackageName)); 108 | deferred.resolve(); 109 | }); 110 | 111 | return deferred.promise; 112 | }; 113 | 114 | var cleanClutter = function () { 115 | return tmpDir.removeAsync('.'); 116 | }; 117 | 118 | module.exports = function () { 119 | return init() 120 | .then(copyRuntime) 121 | .then(cleanupRuntime) 122 | .then(packageBuiltApp) 123 | .then(finalize) 124 | .then(renameApp) 125 | .then(createInstaller) 126 | .then(cleanClutter) 127 | .catch(console.error); 128 | }; 129 | -------------------------------------------------------------------------------- /tasks/start.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Q = require('q'); 4 | var electron = require('electron-prebuilt'); 5 | var pathUtil = require('path'); 6 | var childProcess = require('child_process'); 7 | var kill = require('tree-kill'); 8 | var utils = require('./utils'); 9 | var watch; 10 | 11 | var gulpPath = pathUtil.resolve('./node_modules/.bin/gulp'); 12 | if (process.platform === 'win32') { 13 | gulpPath += '.cmd'; 14 | } 15 | 16 | var runBuild = function () { 17 | var deferred = Q.defer(); 18 | 19 | var build = childProcess.spawn(gulpPath, [ 20 | 'build', 21 | '--env=' + utils.getEnvName(), 22 | '--color' 23 | ], { 24 | stdio: 'inherit' 25 | }); 26 | 27 | build.on('close', function (code) { 28 | deferred.resolve(); 29 | }); 30 | 31 | return deferred.promise; 32 | }; 33 | 34 | var runGulpWatch = function () { 35 | watch = childProcess.spawn(gulpPath, [ 36 | 'watch', 37 | '--env=' + utils.getEnvName(), 38 | '--color' 39 | ], { 40 | stdio: 'inherit' 41 | }); 42 | 43 | watch.on('close', function (code) { 44 | // Gulp watch exits when error occured during build. 45 | // Just respawn it then. 46 | runGulpWatch(); 47 | }); 48 | }; 49 | 50 | var runApp = function () { 51 | var app = childProcess.spawn(electron, ['./build'], { 52 | stdio: 'inherit' 53 | }); 54 | 55 | app.on('close', function (code) { 56 | // User closed the app. Kill the host process. 57 | kill(watch.pid, 'SIGKILL', function () { 58 | process.exit(); 59 | }); 60 | }); 61 | }; 62 | 63 | runBuild() 64 | .then(function () { 65 | runGulpWatch(); 66 | runApp(); 67 | }); 68 | -------------------------------------------------------------------------------- /tasks/utils.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var argv = require('yargs').argv; 4 | var os = require('os'); 5 | var jetpack = require('fs-jetpack'); 6 | 7 | module.exports.os = function () { 8 | switch (os.platform()) { 9 | case 'darwin': 10 | return 'osx'; 11 | case 'linux': 12 | return 'linux'; 13 | case 'win32': 14 | return 'windows'; 15 | } 16 | return 'unsupported'; 17 | }; 18 | 19 | module.exports.replace = function (str, patterns) { 20 | Object.keys(patterns).forEach(function (pattern) { 21 | var matcher = new RegExp('{{' + pattern + '}}', 'g'); 22 | str = str.replace(matcher, patterns[pattern]); 23 | }); 24 | return str; 25 | }; 26 | 27 | module.exports.getEnvName = function () { 28 | return argv.env || 'development'; 29 | }; 30 | 31 | module.exports.getSigningId = function () { 32 | return argv.sign; 33 | }; 34 | 35 | module.exports.getElectronVersion = function () { 36 | var manifest = jetpack.read(__dirname + '/../package.json', 'json'); 37 | return manifest.devDependencies['electron-prebuilt'].substring(1); 38 | }; 39 | --------------------------------------------------------------------------------