├── LICENSE
├── README.md
├── bower.json
├── config.xml
├── gulpfile.js
├── hooks
├── README.md
└── after_prepare
│ └── 010_add_platform_class.js
├── package.json
├── scss
└── ionic.app.scss
└── www
├── List.html
├── RongCloudLibPlugin.html
├── css
├── ionic.app.css
├── ionic.app.min.css
└── style.css
├── img
├── 1.jpg
├── face
│ ├── 1.gif
│ ├── 10.gif
│ ├── 11.gif
│ ├── 12.gif
│ ├── 13.gif
│ ├── 14.gif
│ ├── 15.gif
│ ├── 16.gif
│ ├── 17.gif
│ ├── 18.gif
│ ├── 19.gif
│ ├── 2.gif
│ ├── 20.gif
│ ├── 21.gif
│ ├── 22.gif
│ ├── 23.gif
│ ├── 24.gif
│ ├── 25.gif
│ ├── 26.gif
│ ├── 27.gif
│ ├── 28.gif
│ ├── 29.gif
│ ├── 3.gif
│ ├── 30.gif
│ ├── 31.gif
│ ├── 32.gif
│ ├── 33.gif
│ ├── 34.gif
│ ├── 35.gif
│ ├── 36.gif
│ ├── 37.gif
│ ├── 38.gif
│ ├── 39.gif
│ ├── 4.gif
│ ├── 40.gif
│ ├── 41.gif
│ ├── 42.gif
│ ├── 43.gif
│ ├── 44.gif
│ ├── 45.gif
│ ├── 46.gif
│ ├── 47.gif
│ ├── 48.gif
│ ├── 49.gif
│ ├── 5.gif
│ ├── 50.gif
│ ├── 51.gif
│ ├── 52.gif
│ ├── 53.gif
│ ├── 54.gif
│ ├── 55.gif
│ ├── 56.gif
│ ├── 57.gif
│ ├── 58.gif
│ ├── 59.gif
│ ├── 6.gif
│ ├── 60.gif
│ ├── 61.gif
│ ├── 62.gif
│ ├── 63.gif
│ ├── 64.gif
│ ├── 65.gif
│ ├── 66.gif
│ ├── 67.gif
│ ├── 68.gif
│ ├── 69.gif
│ ├── 7.gif
│ ├── 70.gif
│ ├── 71.gif
│ ├── 72.gif
│ ├── 73.gif
│ ├── 74.gif
│ ├── 75.gif
│ ├── 8.gif
│ └── 9.gif
├── icon.gif
├── ionic.png
├── personPhoto.png
├── staticimage.png
└── test.amr
├── index.html
├── js
├── Util.js
├── angular-ios9-uiwebview.patch.js
├── app.js
├── controllers.js
├── conversation
│ └── controller.js
├── friend
│ └── controller.js
├── jquery-1.8.2.min.js
├── jquery.qqFace.js
├── login
│ └── controller.js
├── services.js
├── testController.js
└── testDetailController.js
├── lib
├── angular-animate
│ ├── .bower.json
│ ├── README.md
│ ├── angular-animate.js
│ ├── angular-animate.min.js
│ ├── angular-animate.min.js.map
│ ├── bower.json
│ ├── index.js
│ └── package.json
├── angular-sanitize
│ ├── .bower.json
│ ├── README.md
│ ├── angular-sanitize.js
│ ├── angular-sanitize.min.js
│ ├── angular-sanitize.min.js.map
│ ├── bower.json
│ ├── index.js
│ └── package.json
├── angular-ui-router
│ ├── .bower.json
│ ├── CHANGELOG.md
│ ├── CONTRIBUTING.md
│ ├── LICENSE
│ ├── README.md
│ ├── api
│ │ └── angular-ui-router.d.ts
│ ├── bower.json
│ ├── release
│ │ ├── angular-ui-router.js
│ │ └── angular-ui-router.min.js
│ └── src
│ │ ├── common.js
│ │ ├── resolve.js
│ │ ├── state.js
│ │ ├── stateDirectives.js
│ │ ├── stateFilters.js
│ │ ├── templateFactory.js
│ │ ├── urlMatcherFactory.js
│ │ ├── urlRouter.js
│ │ ├── view.js
│ │ ├── viewDirective.js
│ │ └── viewScroll.js
├── angular
│ ├── .bower.json
│ ├── README.md
│ ├── angular-csp.css
│ ├── angular.js
│ ├── angular.min.js
│ ├── angular.min.js.gzip
│ ├── angular.min.js.map
│ ├── bower.json
│ ├── index.js
│ └── package.json
├── ionic
│ ├── css
│ │ ├── ionic.css
│ │ └── ionic.min.css
│ ├── fonts
│ │ ├── ionicons.eot
│ │ ├── ionicons.svg
│ │ ├── ionicons.ttf
│ │ └── ionicons.woff
│ ├── js
│ │ ├── angular-ui
│ │ │ ├── angular-ui-router.js
│ │ │ └── angular-ui-router.min.js
│ │ ├── angular
│ │ │ ├── angular-animate.js
│ │ │ ├── angular-animate.min.js
│ │ │ ├── angular-resource.js
│ │ │ ├── angular-resource.min.js
│ │ │ ├── angular-sanitize.js
│ │ │ ├── angular-sanitize.min.js
│ │ │ ├── angular.js
│ │ │ └── angular.min.js
│ │ ├── ionic-angular.js
│ │ ├── ionic-angular.min.js
│ │ ├── ionic.bundle.js
│ │ ├── ionic.bundle.min.js
│ │ ├── ionic.js
│ │ └── ionic.min.js
│ ├── scss
│ │ ├── _action-sheet.scss
│ │ ├── _animations.scss
│ │ ├── _backdrop.scss
│ │ ├── _badge.scss
│ │ ├── _bar.scss
│ │ ├── _button-bar.scss
│ │ ├── _button.scss
│ │ ├── _checkbox.scss
│ │ ├── _form.scss
│ │ ├── _grid.scss
│ │ ├── _items.scss
│ │ ├── _list.scss
│ │ ├── _loading.scss
│ │ ├── _menu.scss
│ │ ├── _mixins.scss
│ │ ├── _modal.scss
│ │ ├── _platform.scss
│ │ ├── _popover.scss
│ │ ├── _popup.scss
│ │ ├── _progress.scss
│ │ ├── _radio.scss
│ │ ├── _range.scss
│ │ ├── _refresher.scss
│ │ ├── _reset.scss
│ │ ├── _scaffolding.scss
│ │ ├── _select.scss
│ │ ├── _slide-box.scss
│ │ ├── _spinner.scss
│ │ ├── _tabs.scss
│ │ ├── _toggle.scss
│ │ ├── _transitions.scss
│ │ ├── _type.scss
│ │ ├── _util.scss
│ │ ├── _variables.scss
│ │ ├── ionic.scss
│ │ └── ionicons
│ │ │ ├── _ionicons-font.scss
│ │ │ ├── _ionicons-icons.scss
│ │ │ ├── _ionicons-variables.scss
│ │ │ └── ionicons.scss
│ └── version.json
├── jasmine-1.3.1
│ ├── MIT.LICENSE
│ ├── jasmine-html.js
│ ├── jasmine.css
│ └── jasmine.js
├── jasmine-2.3.4
│ ├── boot.js
│ ├── console.js
│ ├── jasmine-html.js
│ ├── jasmine.css
│ ├── jasmine.js
│ └── jasmine_favicon.png
└── ngCordova
│ ├── .bower.json
│ ├── CHANGELOG.md
│ ├── LICENSE
│ ├── README.md
│ ├── bower.json
│ ├── dist
│ ├── ng-cordova-mocks.js
│ ├── ng-cordova-mocks.min.js
│ ├── ng-cordova.js
│ └── ng-cordova.min.js
│ └── package.json
├── spec
├── Developer.js
├── DeveloperSuite.js
├── Lists.js
├── Project.js
├── RongCloudLibPlugin.js
└── RongCloudLibPluginSuite.js
└── templates
├── browse.html
├── friend-detail.html
├── friends.html
├── login.html
├── message
├── diz.html
├── img.html
├── imgtext.html
├── lbs.html
├── txt.html
└── vc.html
├── tab-account.html
├── tab-blacklist.html
├── tab-chats.html
├── tab-friendinfo.html
├── tab-friends.html
├── tab-groupinfo.html
├── tabs.html
└── testdetail.html
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 融云 RongCloud
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
23 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # 融云 RongCloud Cordova IM v2.0
2 |
3 | ## Environment Setup
4 |
5 | ### 初始化开发工具
6 |
7 | ```
8 | npm install -g cordova ionic
9 |
10 | 如有必要,使用 `sudo npm`
11 |
12 | ### 安装依赖库
13 |
14 | 新建ionic空项目,将package.json和www目录覆盖到新项目下,再执行
15 | ionic state restore
16 | ```
17 | 由于 ionic 版本问题,执行该命令可能会出现问题,主要问题如下
18 | ***** 如果提示缺少 .project 可以将 ionic.config.json 文件复制一份,改名为 ionic.project
19 | ***** Error: Cannot find module './project' 参考 https://github.com/driftyco/ionic-cli/issues/856
20 |
21 |
22 | ### 特别说明
23 | 1. demo 不可以直接运行,需要配置相关开发环境
24 | 2. 发送语音信息需要注意: demo 中用到了 cordova-plugin-media ,这个插件需要在 android 和 ios 的源码中修改几个参数
25 | 发送语音需要长按 喇叭按钮
26 | 3. demo在以下环境中分别在 android 和 ios 端测试通过
27 | node 4.4.3
28 | cordova: 5.3.3
29 | 主要相关的插件版本分别为
30 | cordova-plugin-media 1.0.1
31 | cordova-plugin-camera 2.2.0
32 | cordova-plugin-file 3.0.0
33 | 如果您的demo中和以上插件版本不同,可能需要调整插件用法,请自行处理
34 | 4. demo 暂用老版本的后台,所以暂不支持注册和加好友,后续会改为新版本的后台,和融云官网的 SealTalk 互通
35 | 5. demo和插件仅支持在移动端运行,支持 android 和 ios
36 |
37 | ### ios
38 | appFolder/platforms/ios/appFolder/Plugins/cordova-plugin-media/CDVSound.m audioFile.recorder 前加入
39 |
40 | ```
41 | NSDictionary *recordSetting = @{AVFormatIDKey: @(kAudioFormatLinearPCM),
42 | AVSampleRateKey: @8000.00f,
43 | AVNumberOfChannelsKey: @1,
44 | AVLinearPCMBitDepthKey: @16,
45 | AVLinearPCMIsNonInterleaved: @NO,
46 | AVLinearPCMIsFloatKey: @NO,
47 | AVLinearPCMIsBigEndianKey: @NO};
48 | ```
49 |
50 | 改完后结果为
51 |
52 | ```
53 | NSDictionary *recordSetting = @{AVFormatIDKey: @(kAudioFormatLinearPCM),
54 | AVSampleRateKey: @8000.00f,
55 | AVNumberOfChannelsKey: @1,
56 | AVLinearPCMBitDepthKey: @16,
57 | AVLinearPCMIsNonInterleaved: @NO,
58 | AVLinearPCMIsFloatKey: @NO,
59 | AVLinearPCMIsBigEndianKey: @NO};
60 | audioFile.recorder = [[CDVAudioRecorder alloc] initWithURL:audioFile.resourceURL settings:recordSetting error:&error];
61 |
62 | ```
63 |
64 | ### android
65 | appfoldere/platforms/android/src/org/apache/cordova/media/AudioPlayer.java 中 startRecording中 case NONE: 中加入并替换为
66 |
67 | ```
68 | this.recorder.setAudioSamplingRate(8000);
69 | this.recorder.setAudioEncodingBitRate(7950);
70 | this.recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
71 | this.recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
72 | ```
73 |
--------------------------------------------------------------------------------
/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "HelloIonic",
3 | "private": "true",
4 | "devDependencies": {
5 | "ionic": "driftyco/ionic-bower#1.1.0",
6 | "ngCordova": "~0.1.23-alpha"
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/config.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | cordovaIM
4 |
5 | An Ionic Framework and Cordova project.
6 |
7 |
8 | Ionic Framework Team
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
--------------------------------------------------------------------------------
/gulpfile.js:
--------------------------------------------------------------------------------
1 | var gulp = require('gulp');
2 | var gutil = require('gulp-util');
3 | var bower = require('bower');
4 | var concat = require('gulp-concat');
5 | var sass = require('gulp-sass');
6 | var minifyCss = require('gulp-minify-css');
7 | var rename = require('gulp-rename');
8 | var sh = require('shelljs');
9 |
10 | var paths = {
11 | sass: ['./scss/**/*.scss'],
12 | css: ['./src/css/**/*.css'],
13 | scripts: [
14 | './src/js/**/*.js',
15 | '!./src/js/lib/ng-img-crop-customized/ng-img-crop.js', /* exclude ng-img-crop.js: handled separately */
16 | '!./src/js/lib/ng-img-crop-customized/ng-img-crop.min.js', /* exclude ng-img-crop.min.js: handled separately */
17 | '!./src/js/config/config.js' /* exclude config.js: handled separately */
18 | ],
19 | images: ['./src/img/**/*'],
20 | templates: ['./src/js/**/*.html'],
21 | indexTemplate: ['./src/index-template.html'],
22 | index: ['./src/index.html'],
23 | locales: [
24 | './src/js/locales/*.json'
25 | ],
26 | dist: ['./www']
27 | };
28 |
29 | var files = {
30 | jsbundle: 'app.bundle.min.js',
31 | appcss: 'app.css',
32 | ionicappmincss: 'ionic.app.min.css',
33 | ionicbundle: 'ionic.bundle.min.js' // change to 'ionic.bundle.js' for debugging moduleErr errors
34 | };
35 |
36 |
37 | gulp.task('default', ['sass','watch']);
38 |
39 | gulp.task('sass', function(done) {
40 | gulp.src('./scss/ionic.app.scss')
41 | .pipe(sass())
42 | .on('error', sass.logError)
43 | .pipe(gulp.dest('./www/css/'))
44 | .pipe(minifyCss({
45 | keepSpecialComments: 0
46 | }))
47 | .pipe(rename({ extname: '.min.css' }))
48 | .pipe(gulp.dest('./www/css/'))
49 | .on('end', done);
50 | });
51 |
52 | gulp.task('watch', function() {
53 | gulp.watch(paths.sass, ['sass']);
54 | gulp.watch('www/js/**/*.js', ['uglify','reload'], function(event){
55 | console.log('event.type:'+event.type); //变化类型 added为新增,deleted为删除,changed为改变
56 | console.log('event.path:'+event.path); //变化的文件的路径
57 | });
58 | });
59 |
60 | gulp.task('html', function () {
61 | gulp.src('./www/templates/*.html')
62 | .pipe(connect.reload());
63 | });
64 |
65 | gulp.task('scripts', function() {
66 | return gulp.src('javascripts/*.js')
67 | .pipe(jshint())
68 | .pipe(jshint.reporter('default'))
69 | .pipe(concat('all.js'))
70 | .pipe(rename({ suffix: '.min' }))
71 | .pipe(uglify())
72 | .pipe(gulp.dest('assets'))
73 | .pipe(notify({ message: 'Scripts task complete' }));
74 | });
75 |
76 | gulp.task('install', ['git-check'], function() {
77 | return bower.commands.install()
78 | .on('log', function(data) {
79 | gutil.log('bower', gutil.colors.cyan(data.id), data.message);
80 | });
81 | });
82 |
83 | gulp.task('git-check', function(done) {
84 | if (!sh.which('git')) {
85 | console.log(
86 | ' ' + gutil.colors.red('Git is not installed.'),
87 | '\n Git, the version control system, is required to download Ionic.',
88 | '\n Download git here:', gutil.colors.cyan('http://git-scm.com/downloads') + '.',
89 | '\n Once git is installed, run \'' + gutil.colors.cyan('gulp install') + '\' again.'
90 | );
91 | process.exit(1);
92 | }
93 | done();
94 | });
95 |
96 | gulp.task('uglify',function(){
97 | //do something
98 | });
99 | gulp.task('reload',function(){
100 | //do something
101 | });
102 | //gulp.watch('js/**/*.js', ['uglify','reload']);
103 |
--------------------------------------------------------------------------------
/hooks/README.md:
--------------------------------------------------------------------------------
1 |
21 | # Cordova Hooks
22 |
23 | This directory may contain scripts used to customize cordova commands. This
24 | directory used to exist at `.cordova/hooks`, but has now been moved to the
25 | project root. Any scripts you add to these directories will be executed before
26 | and after the commands corresponding to the directory name. Useful for
27 | integrating your own build systems or integrating with version control systems.
28 |
29 | __Remember__: Make your scripts executable.
30 |
31 | ## Hook Directories
32 | The following subdirectories will be used for hooks:
33 |
34 | after_build/
35 | after_compile/
36 | after_docs/
37 | after_emulate/
38 | after_platform_add/
39 | after_platform_rm/
40 | after_platform_ls/
41 | after_plugin_add/
42 | after_plugin_ls/
43 | after_plugin_rm/
44 | after_plugin_search/
45 | after_prepare/
46 | after_run/
47 | after_serve/
48 | before_build/
49 | before_compile/
50 | before_docs/
51 | before_emulate/
52 | before_platform_add/
53 | before_platform_rm/
54 | before_platform_ls/
55 | before_plugin_add/
56 | before_plugin_ls/
57 | before_plugin_rm/
58 | before_plugin_search/
59 | before_prepare/
60 | before_run/
61 | before_serve/
62 | pre_package/ <-- Windows 8 and Windows Phone only.
63 |
64 | ## Script Interface
65 |
66 | All scripts are run from the project's root directory and have the root directory passes as the first argument. All other options are passed to the script using environment variables:
67 |
68 | * CORDOVA_VERSION - The version of the Cordova-CLI.
69 | * CORDOVA_PLATFORMS - Comma separated list of platforms that the command applies to (e.g.: android, ios).
70 | * CORDOVA_PLUGINS - Comma separated list of plugin IDs that the command applies to (e.g.: org.apache.cordova.file, org.apache.cordova.file-transfer)
71 | * CORDOVA_HOOK - Path to the hook that is being executed.
72 | * CORDOVA_CMDLINE - The exact command-line arguments passed to cordova (e.g.: cordova run ios --emulate)
73 |
74 | If a script returns a non-zero exit code, then the parent cordova command will be aborted.
75 |
76 |
77 | ## Writing hooks
78 |
79 | We highly recommend writting your hooks using Node.js so that they are
80 | cross-platform. Some good examples are shown here:
81 |
82 | [http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/](http://devgirl.org/2013/11/12/three-hooks-your-cordovaphonegap-project-needs/)
83 |
84 |
--------------------------------------------------------------------------------
/hooks/after_prepare/010_add_platform_class.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | // Add Platform Class
4 | // v1.0
5 | // Automatically adds the platform class to the body tag
6 | // after the `prepare` command. By placing the platform CSS classes
7 | // directly in the HTML built for the platform, it speeds up
8 | // rendering the correct layout/style for the specific platform
9 | // instead of waiting for the JS to figure out the correct classes.
10 |
11 | var fs = require('fs');
12 | var path = require('path');
13 |
14 | var rootdir = process.argv[2];
15 |
16 | function addPlatformBodyTag(indexPath, platform) {
17 | // add the platform class to the body tag
18 | try {
19 | var platformClass = 'platform-' + platform;
20 | var cordovaClass = 'platform-cordova platform-webview';
21 |
22 | var html = fs.readFileSync(indexPath, 'utf8');
23 |
24 | var bodyTag = findBodyTag(html);
25 | if(!bodyTag) return; // no opening body tag, something's wrong
26 |
27 | if(bodyTag.indexOf(platformClass) > -1) return; // already added
28 |
29 | var newBodyTag = bodyTag;
30 |
31 | var classAttr = findClassAttr(bodyTag);
32 | if(classAttr) {
33 | // body tag has existing class attribute, add the classname
34 | var endingQuote = classAttr.substring(classAttr.length-1);
35 | var newClassAttr = classAttr.substring(0, classAttr.length-1);
36 | newClassAttr += ' ' + platformClass + ' ' + cordovaClass + endingQuote;
37 | newBodyTag = bodyTag.replace(classAttr, newClassAttr);
38 |
39 | } else {
40 | // add class attribute to the body tag
41 | newBodyTag = bodyTag.replace('>', ' class="' + platformClass + ' ' + cordovaClass + '">');
42 | }
43 |
44 | html = html.replace(bodyTag, newBodyTag);
45 |
46 | fs.writeFileSync(indexPath, html, 'utf8');
47 |
48 | process.stdout.write('add to body class: ' + platformClass + '\n');
49 | } catch(e) {
50 | process.stdout.write(e);
51 | }
52 | }
53 |
54 | function findBodyTag(html) {
55 | // get the body tag
56 | try{
57 | return html.match(/
])(.*?)>/gi)[0];
58 | }catch(e){}
59 | }
60 |
61 | function findClassAttr(bodyTag) {
62 | // get the body tag's class attribute
63 | try{
64 | return bodyTag.match(/ class=["|'](.*?)["|']/gi)[0];
65 | }catch(e){}
66 | }
67 |
68 | if (rootdir) {
69 |
70 | // go through each of the platform directories that have been prepared
71 | var platforms = (process.env.CORDOVA_PLATFORMS ? process.env.CORDOVA_PLATFORMS.split(',') : []);
72 |
73 | for(var x=0; x
3 |
4 | Jasmine Spec Example
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
28 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/www/RongCloudLibPlugin.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Jasmine Spec Example
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/www/css/style.css:
--------------------------------------------------------------------------------
1 | /* Empty. Add your own CSS if you like */
2 | /*.messages {
3 | margin:0;
4 | padding:0;
5 | list-style-type:none;
6 | }
7 |
8 | .messages li {
9 | display:block;
10 | clear:both;
11 | max-width:50%;
12 | margin:0 0 1rem 0;
13 | padding:0;
14 | }
15 |
16 | .messages li.me {
17 | float:right;
18 | }
19 |
20 | .messages li.me img {
21 | float:right;
22 | }
23 |
24 | .messages div {
25 | border-radius:.75rem;
26 | background:#e6e5eb;
27 | color:#383641;
28 | padding:.6875rem;
29 | margin:0;
30 | font-size:.875rem;
31 | }
32 |
33 | .messages li.me div {
34 | background:#158ffe;
35 | color:#fff;
36 | }
37 |
38 | .messages img {
39 | display:block;
40 | max-width:65%;
41 | border-radius:.75rem;
42 | }*/
43 |
44 | .message {
45 | display:block;
46 | clear:both;
47 | max-width:50%;
48 | margin:0 0 1rem 0;
49 | /*padding:0;*/
50 | border-radius:.75rem;
51 | background:#e6e5eb;
52 | color:#383641;
53 | padding:.6875rem;
54 | /*margin:0;*/
55 | font-size:.875rem;
56 | }
57 |
58 |
59 | .message img {
60 | display:block;
61 | max-width:65%;
62 | border-radius:.75rem;
63 | }
64 |
65 | .me {
66 | background:#b3eeb6;
67 | color:#fff;
68 | float:right;
69 | }
70 |
--------------------------------------------------------------------------------
/www/img/1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/1.jpg
--------------------------------------------------------------------------------
/www/img/face/1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/1.gif
--------------------------------------------------------------------------------
/www/img/face/10.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/10.gif
--------------------------------------------------------------------------------
/www/img/face/11.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/11.gif
--------------------------------------------------------------------------------
/www/img/face/12.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/12.gif
--------------------------------------------------------------------------------
/www/img/face/13.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/13.gif
--------------------------------------------------------------------------------
/www/img/face/14.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/14.gif
--------------------------------------------------------------------------------
/www/img/face/15.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/15.gif
--------------------------------------------------------------------------------
/www/img/face/16.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/16.gif
--------------------------------------------------------------------------------
/www/img/face/17.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/17.gif
--------------------------------------------------------------------------------
/www/img/face/18.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/18.gif
--------------------------------------------------------------------------------
/www/img/face/19.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/19.gif
--------------------------------------------------------------------------------
/www/img/face/2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/2.gif
--------------------------------------------------------------------------------
/www/img/face/20.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/20.gif
--------------------------------------------------------------------------------
/www/img/face/21.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/21.gif
--------------------------------------------------------------------------------
/www/img/face/22.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/22.gif
--------------------------------------------------------------------------------
/www/img/face/23.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/23.gif
--------------------------------------------------------------------------------
/www/img/face/24.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/24.gif
--------------------------------------------------------------------------------
/www/img/face/25.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/25.gif
--------------------------------------------------------------------------------
/www/img/face/26.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/26.gif
--------------------------------------------------------------------------------
/www/img/face/27.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/27.gif
--------------------------------------------------------------------------------
/www/img/face/28.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/28.gif
--------------------------------------------------------------------------------
/www/img/face/29.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/29.gif
--------------------------------------------------------------------------------
/www/img/face/3.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/3.gif
--------------------------------------------------------------------------------
/www/img/face/30.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/30.gif
--------------------------------------------------------------------------------
/www/img/face/31.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/31.gif
--------------------------------------------------------------------------------
/www/img/face/32.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/32.gif
--------------------------------------------------------------------------------
/www/img/face/33.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/33.gif
--------------------------------------------------------------------------------
/www/img/face/34.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/34.gif
--------------------------------------------------------------------------------
/www/img/face/35.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/35.gif
--------------------------------------------------------------------------------
/www/img/face/36.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/36.gif
--------------------------------------------------------------------------------
/www/img/face/37.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/37.gif
--------------------------------------------------------------------------------
/www/img/face/38.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/38.gif
--------------------------------------------------------------------------------
/www/img/face/39.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/39.gif
--------------------------------------------------------------------------------
/www/img/face/4.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/4.gif
--------------------------------------------------------------------------------
/www/img/face/40.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/40.gif
--------------------------------------------------------------------------------
/www/img/face/41.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/41.gif
--------------------------------------------------------------------------------
/www/img/face/42.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/42.gif
--------------------------------------------------------------------------------
/www/img/face/43.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/43.gif
--------------------------------------------------------------------------------
/www/img/face/44.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/44.gif
--------------------------------------------------------------------------------
/www/img/face/45.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/45.gif
--------------------------------------------------------------------------------
/www/img/face/46.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/46.gif
--------------------------------------------------------------------------------
/www/img/face/47.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/47.gif
--------------------------------------------------------------------------------
/www/img/face/48.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/48.gif
--------------------------------------------------------------------------------
/www/img/face/49.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/49.gif
--------------------------------------------------------------------------------
/www/img/face/5.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/5.gif
--------------------------------------------------------------------------------
/www/img/face/50.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/50.gif
--------------------------------------------------------------------------------
/www/img/face/51.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/51.gif
--------------------------------------------------------------------------------
/www/img/face/52.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/52.gif
--------------------------------------------------------------------------------
/www/img/face/53.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/53.gif
--------------------------------------------------------------------------------
/www/img/face/54.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/54.gif
--------------------------------------------------------------------------------
/www/img/face/55.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/55.gif
--------------------------------------------------------------------------------
/www/img/face/56.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/56.gif
--------------------------------------------------------------------------------
/www/img/face/57.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/57.gif
--------------------------------------------------------------------------------
/www/img/face/58.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/58.gif
--------------------------------------------------------------------------------
/www/img/face/59.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/59.gif
--------------------------------------------------------------------------------
/www/img/face/6.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/6.gif
--------------------------------------------------------------------------------
/www/img/face/60.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/60.gif
--------------------------------------------------------------------------------
/www/img/face/61.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/61.gif
--------------------------------------------------------------------------------
/www/img/face/62.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/62.gif
--------------------------------------------------------------------------------
/www/img/face/63.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/63.gif
--------------------------------------------------------------------------------
/www/img/face/64.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/64.gif
--------------------------------------------------------------------------------
/www/img/face/65.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/65.gif
--------------------------------------------------------------------------------
/www/img/face/66.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/66.gif
--------------------------------------------------------------------------------
/www/img/face/67.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/67.gif
--------------------------------------------------------------------------------
/www/img/face/68.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/68.gif
--------------------------------------------------------------------------------
/www/img/face/69.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/69.gif
--------------------------------------------------------------------------------
/www/img/face/7.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/7.gif
--------------------------------------------------------------------------------
/www/img/face/70.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/70.gif
--------------------------------------------------------------------------------
/www/img/face/71.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/71.gif
--------------------------------------------------------------------------------
/www/img/face/72.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/72.gif
--------------------------------------------------------------------------------
/www/img/face/73.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/73.gif
--------------------------------------------------------------------------------
/www/img/face/74.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/74.gif
--------------------------------------------------------------------------------
/www/img/face/75.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/75.gif
--------------------------------------------------------------------------------
/www/img/face/8.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/8.gif
--------------------------------------------------------------------------------
/www/img/face/9.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/face/9.gif
--------------------------------------------------------------------------------
/www/img/icon.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/icon.gif
--------------------------------------------------------------------------------
/www/img/ionic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/ionic.png
--------------------------------------------------------------------------------
/www/img/personPhoto.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/personPhoto.png
--------------------------------------------------------------------------------
/www/img/staticimage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/staticimage.png
--------------------------------------------------------------------------------
/www/img/test.amr:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/img/test.amr
--------------------------------------------------------------------------------
/www/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
39 |
40 |
41 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/www/js/angular-ios9-uiwebview.patch.js:
--------------------------------------------------------------------------------
1 | /**
2 | * ================== angular-ios9-uiwebview.patch.js v1.1.1 ==================
3 | *
4 | * This patch works around iOS9 UIWebView regression that causes infinite digest
5 | * errors in Angular.
6 | *
7 | * The patch can be applied to Angular 1.2.0 – 1.4.5. Newer versions of Angular
8 | * have the workaround baked in.
9 | *
10 | * To apply this patch load/bundle this file with your application and add a
11 | * dependency on the "ngIOS9UIWebViewPatch" module to your main app module.
12 | *
13 | * For example:
14 | *
15 | * ```
16 | * angular.module('myApp', ['ngRoute'])`
17 | * ```
18 | *
19 | * becomes
20 | *
21 | * ```
22 | * angular.module('myApp', ['ngRoute', 'ngIOS9UIWebViewPatch'])
23 | * ```
24 | *
25 | *
26 | * More info:
27 | * - https://openradar.appspot.com/22186109
28 | * - https://github.com/angular/angular.js/issues/12241
29 | * - https://github.com/driftyco/ionic/issues/4082
30 | *
31 | *
32 | * @license AngularJS
33 | * (c) 2010-2015 Google, Inc. http://angularjs.org
34 | * License: MIT
35 | */
36 |
37 | angular.module('ngIOS9UIWebViewPatch', ['ng']).config(['$provide', function($provide) {
38 | 'use strict';
39 |
40 | $provide.decorator('$browser', ['$delegate', '$window', function($delegate, $window) {
41 |
42 | if (isIOS9UIWebView($window.navigator.userAgent)) {
43 | return applyIOS9Shim($delegate);
44 | }
45 |
46 | return $delegate;
47 |
48 | function isIOS9UIWebView(userAgent) {
49 | return /(iPhone|iPad|iPod).* OS 9_\d/.test(userAgent) && !/Version\/9\./.test(userAgent);
50 | }
51 |
52 | function applyIOS9Shim(browser) {
53 | var pendingLocationUrl = null;
54 | var originalUrlFn= browser.url;
55 |
56 | browser.url = function() {
57 | if (arguments.length) {
58 | pendingLocationUrl = arguments[0];
59 | return originalUrlFn.apply(browser, arguments);
60 | }
61 |
62 | return pendingLocationUrl || originalUrlFn.apply(browser, arguments);
63 | };
64 |
65 | window.addEventListener('popstate', clearPendingLocationUrl, false);
66 | window.addEventListener('hashchange', clearPendingLocationUrl, false);
67 |
68 | function clearPendingLocationUrl() {
69 | pendingLocationUrl = null;
70 | }
71 |
72 | return browser;
73 | }
74 | }]);
75 | }]);
76 |
--------------------------------------------------------------------------------
/www/js/app.js:
--------------------------------------------------------------------------------
1 | // Ionic Starter App
2 |
3 | // angular.module is a global place for creating, registering and retrieving Angular modules
4 | // 'starter' is the name of this angular module example (also set in a attribute in index.html)
5 | // the 2nd parameter is an array of 'requires'
6 | // 'starter.controllers' is found in controllers.js
7 | angular.module('cordovaim', ['ionic', 'cordovaim.login.controller', 'cordovaim.controllers', 'cordovaim.conversation.controller', 'cordovaim.frienddetail.controller', 'cordovaim.test.controller', 'cordovaim.testdetail.controller', 'cordovaim.services', 'ngCordova', 'ngIOS9UIWebViewPatch' ])
8 |
9 | .run(function($ionicPlatform, $rootScope) {
10 | $ionicPlatform.ready(function() {
11 | if (window.cordova && window.cordova.plugins.Keyboard) {
12 | cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
13 | cordova.plugins.Keyboard.disableScroll(true);
14 |
15 | }
16 | if (window.StatusBar) {
17 | // org.apache.cordova.statusbar required
18 | StatusBar.styleDefault();
19 | }
20 |
21 | });
22 | })
23 |
24 | .config(function($ionicConfigProvider) {
25 | $ionicConfigProvider.tabs.position('bottom');
26 | })
27 |
28 | .config(function($stateProvider, $urlRouterProvider) {
29 | $stateProvider
30 |
31 | .state('login', {
32 | url: '/login',
33 | templateUrl: 'templates/login.html',
34 | controller: 'LoginCtrl'
35 | })
36 |
37 | .state('tab', {
38 | url: '/tab',
39 | abstract: true,
40 | cache: false,
41 | templateUrl: 'templates/tabs.html',
42 | controller: 'AppCtrl'
43 | })
44 |
45 | .state('tab.browse', {
46 | url: '/browse',
47 | views: {
48 | 'tab-account': {
49 | templateUrl: 'templates/browse.html',
50 | controller: 'TestCtrl'
51 | //controller: 'BrowseCtrl'
52 | }
53 | }
54 | })
55 |
56 | .state('tab.friends', {
57 | url: '/friends',
58 | views: {
59 | 'tab-friends': {
60 | templateUrl: 'templates/tab-friends.html',
61 | controller: 'FriendsCtrl'
62 | }
63 | }
64 | })
65 |
66 | .state('tab.friendInfo', {
67 | url: '/friendInfo/:targetId/:conversationType',
68 | views: {
69 | 'tab-friends': {
70 | templateUrl: 'templates/tab-friendinfo.html',
71 | controller: 'friendInfoCtrl'
72 | }
73 | }
74 | })
75 |
76 | .state('tab.groupInfo', {
77 | url: '/groupInfo/:targetId/:conversationType',
78 | views: {
79 | 'tab-friends': {
80 | templateUrl: 'templates/tab-groupinfo.html',
81 | controller: 'groupInfoCtrl'
82 | }
83 | }
84 | })
85 |
86 | .state('tab.friend-chat', {
87 | url: '/friend2/:targetId/:conversationType',
88 | views: {
89 | 'tab-friends': {
90 | templateUrl: 'templates/friend-detail.html',
91 | controller: 'friendDetailCtrl'
92 | }
93 | }
94 | })
95 |
96 | .state('tab.chats', {
97 | url: '/chats',
98 | views: {
99 | 'tab-chats': {
100 | templateUrl: 'templates/tab-chats.html',
101 | controller: 'conversationCtrl'
102 | }
103 | }
104 | })
105 |
106 | .state('tab.friend-detail', {
107 | url: '/friend/:targetId/:conversationType',
108 | views: {
109 | 'tab-chats': {
110 | templateUrl: 'templates/friend-detail.html',
111 | controller: 'friendDetailCtrl'
112 | }
113 | }
114 | })
115 |
116 | .state('tab.account', {
117 | url: '/account',
118 | views: {
119 | 'tab-account': {
120 | templateUrl: 'templates/tab-account.html',
121 | controller: 'AccountCtrl'
122 | }
123 | }
124 | })
125 |
126 | .state('tab.blacklist', {
127 | url: '/blacklist',
128 | views: {
129 | 'tab-account': {
130 | templateUrl: 'templates/tab-blacklist.html',
131 | controller: 'blacklistCtrl'
132 | }
133 | }
134 | })
135 |
136 | .state('tab.testdetail', {
137 | url: '/testdetail',
138 | views: {
139 | 'tab-account': {
140 | templateUrl: 'templates/testdetail.html',
141 | controller: 'TestDetailCtrl'
142 | }
143 | }
144 | });
145 | // if none of the above states are matched, use this as the fallback
146 | $urlRouterProvider.otherwise('/login');
147 | })
148 | .filter('trustHtml', function($sce) {
149 |
150 | return function(input) {
151 |
152 | return $sce.trustAsHtml(input);
153 |
154 | }
155 |
156 | });
157 |
--------------------------------------------------------------------------------
/www/js/conversation/controller.js:
--------------------------------------------------------------------------------
1 | angular.module('cordovaim.conversation.controller', [])
2 | .controller('conversationCtrl', function($scope, Friends, Groups, Chatroom, CustomerService, Discussion, newMessageEventService) {
3 |
4 | var newMsgCallBack = function(d,data){
5 | console.log('conversation newMessage' + data);
6 | jsonMsg = JSON.parse(data);
7 | jsonMsg.unreadMessageCount = "1";
8 | var target;
9 | if(jsonMsg.conversationType == "PRIVATE"){
10 | target = Friends.get(jsonMsg.targetId);
11 | }
12 | else if(jsonMsg.conversationType == "GROUP"){
13 | target = Groups.get(jsonMsg.targetId);
14 | }
15 |
16 | console.log('target:' + JSON.stringify(target));
17 | jsonMsg = myUtil.resolveCon(jsonMsg, 1, target);
18 | console.log('jsonMsg after resolveCon:' + JSON.stringify(jsonMsg));
19 | //jsonMsg.sendTime = new Date(jsonMsg.sendTime).toString().split(" ")[4];
20 | //console.log("FriendsCtrl received new message " + (jsonMsg.details.content));
21 | $targetId = $("#" + jsonMsg.targetId);
22 |
23 | //当前会话列表已有的会话,只改变消息内容和时间
24 | if ($targetId.length > 0) {
25 | var index = findInFriends(jsonMsg.targetId);
26 | if (index > -1) {
27 | // var $unreadcount = $targetId.find('.unreadcount');
28 | if($scope.friends[index].conversationType == 'CHATROOM' || $scope.friends[index].conversationType == 'CUSTOMER_SERVICE')
29 | return;
30 | var unreadMessageCount = parseInt($scope.friends[index].unreadMessageCount);
31 | unreadMessageCount++;
32 | $scope.friends[index].unreadMessageCount = unreadMessageCount;
33 | $scope.friends[index].latestMessage = jsonMsg.latestMessage;
34 | // $unreadcount.html.removeClass('ng-hide');
35 | }
36 | } else {
37 | // if(jsonMsg.conversationType == "PRIVATE"){
38 | // target = Friends.get(result[i].targetId);
39 | // jsonMsg.conversationTitle = target.username;
40 | // jsonMsg.portrait = target.portrait;
41 | // }
42 | // else if(result[i].conversationType == "GROUP"){
43 | // target = Groups.get(result[i].targetId);
44 | // jsonMsg.conversationTitle = target.name;
45 | // jsonMsg.portrait = target.portrait;
46 | // }
47 | $scope.friends.push(jsonMsg);
48 | }
49 | }
50 | newMessageEventService.listen(newMsgCallBack);
51 |
52 | $scope.clearConversition = function() {
53 | RongCloudLibPlugin.clearConversations({
54 | conversationTypes: ["PRIVATE", "DISCUSSION"]
55 | },
56 | function(ret, err) {
57 | if (ret) {
58 | alert("clearConversition success: " + result.status);
59 | $scope.$apply(function() {
60 | $scope.friends = [];
61 | });
62 | }
63 | if (err) {
64 | alert('clearConversition err:' + JSON.stringify(err));
65 | }
66 | }
67 |
68 | );
69 | }
70 |
71 | var findInFriends = function(val) {
72 | for (var i = 0; i < $scope.friends.length; i++) {
73 | if ($scope.friends[i].targetId == val) {
74 | return i;
75 | break
76 | }
77 | }
78 | return -1;
79 | }
80 |
81 | var getConversationList = function() {
82 | RongCloudLibPlugin.getConversationList(
83 | function(ret, err) {
84 | if (ret) {
85 | console.log('getConversationList:' + JSON.stringify(ret));
86 | var result = ret.result;
87 | var target, discussionIndex = -1;
88 | for (var i = 0; i < result.length; i++) {
89 | if(result[i].conversationType == 'DISCUSSION' && result[i].targetId == Discussion.all()[0].targetId){
90 | discussionIndex = i;
91 | }
92 | if(result[i].conversationType == "PRIVATE"){
93 | target = Friends.get(result[i].targetId);
94 | }
95 | else if(result[i].conversationType == "GROUP"){
96 | target = Groups.get(result[i].targetId);
97 | }
98 | console.log('target:' + JSON.stringify(target));
99 | result[i] = myUtil.resolveCon(result[i], 0, target);
100 | //alert('conversationTitle:'+result[i].conversationTitle);
101 | }
102 | if(discussionIndex > -1){
103 | result[discussionIndex].conversationTitle = Discussion.all()[0].conversationTitle;
104 | }else{
105 | result.unshift(Discussion.all()[0]);
106 | }
107 |
108 | result.unshift(Chatroom.all()[0]);
109 | result.unshift(CustomerService.all()[0]);
110 | $scope.$apply(function() {
111 | $scope.friends = result;
112 | });
113 | }
114 | if (err) {
115 | alert('getConversationList err:' + JSON.stringify(err));
116 | }
117 |
118 | }
119 | );
120 |
121 | }
122 |
123 | var init = function(){
124 | $scope.friends = [];
125 | getConversationList();
126 | }
127 | init();
128 |
129 | });
130 |
--------------------------------------------------------------------------------
/www/js/jquery.qqFace.js:
--------------------------------------------------------------------------------
1 | // QQ表情插件
2 | (function($){
3 | $.fn.qqFace = function(options){
4 | var defaults = {
5 | id : 'facebox',
6 | path : 'face/',
7 | assign : 'content',
8 | tip : 'em_'
9 | };
10 | var option = $.extend(defaults, options);
11 | var assign = $('#'+option.assign);
12 | var id = option.id;
13 | var path = option.path;
14 | var tip = option.tip;
15 |
16 | if(assign.length<=0){
17 | alert('缺少表情赋值对象。');
18 | return false;
19 | }
20 |
21 | $(this).click(function(e){
22 | var strFace, labFace;
23 | if($('#'+id).length<=0){
24 | strFace = '' +
25 | '
';
26 | for(var i=1; i<=75; i++){
27 | labFace = '['+tip+i+']';
28 | strFace += ' | ';
29 | if( i % 14 == 0 ) strFace += '
';
30 | }
31 | strFace += '
';
32 | }
33 | $(this).parent().parent().append(strFace);
34 | var offset = $(this).position();
35 | var top = offset.top + $(this).outerHeight();
36 | // $('#'+id).css('top',top);
37 | // $('#'+id).css('left',offset.left);
38 | $('#'+id).css('top','35px');
39 | $('#'+id).css('left','-3px');
40 | $('#'+id).show();
41 | e.stopPropagation();
42 | });
43 |
44 | $(document).click(function(){
45 | $('#'+id).hide();
46 | $('#'+id).remove();
47 | });
48 | };
49 |
50 | })(jQuery);
51 |
52 | jQuery.extend({
53 | unselectContents: function(){
54 | if(window.getSelection)
55 | window.getSelection().removeAllRanges();
56 | else if(document.selection)
57 | document.selection.empty();
58 | }
59 | });
60 | jQuery.fn.extend({
61 | selectContents: function(){
62 | $(this).each(function(i){
63 | var node = this;
64 | var selection, range, doc, win;
65 | if ((doc = node.ownerDocument) && (win = doc.defaultView) && typeof win.getSelection != 'undefined' && typeof doc.createRange != 'undefined' && (selection = window.getSelection()) && typeof selection.removeAllRanges != 'undefined'){
66 | range = doc.createRange();
67 | range.selectNode(node);
68 | if(i == 0){
69 | selection.removeAllRanges();
70 | }
71 | selection.addRange(range);
72 | } else if (document.body && typeof document.body.createTextRange != 'undefined' && (range = document.body.createTextRange())){
73 | range.moveToElementText(node);
74 | range.select();
75 | }
76 | });
77 | },
78 |
79 | setCaret: function(){
80 | if(!$.browser.msie) return;
81 | var initSetCaret = function(){
82 | var textObj = $(this).get(0);
83 | textObj.caretPos = document.selection.createRange().duplicate();
84 | };
85 | $(this).click(initSetCaret).select(initSetCaret).keyup(initSetCaret);
86 | },
87 |
88 | insertAtCaret: function(textFeildValue){
89 | var textObj = $(this).get(0);
90 | if(document.all && textObj.createTextRange && textObj.caretPos){
91 | var caretPos=textObj.caretPos;
92 | caretPos.text = caretPos.text.charAt(caretPos.text.length-1) == '' ?
93 | textFeildValue+'' : textFeildValue;
94 | } else if(textObj.setSelectionRange){
95 | var rangeStart=textObj.selectionStart;
96 | var rangeEnd=textObj.selectionEnd;
97 | var tempStr1=textObj.value.substring(0,rangeStart);
98 | var tempStr2=textObj.value.substring(rangeEnd);
99 | textObj.value=tempStr1+textFeildValue+tempStr2;
100 | textObj.focus();
101 | var len=textFeildValue.length;
102 | textObj.setSelectionRange(rangeStart+len,rangeStart+len);
103 | textObj.blur();
104 | }else{
105 | textObj.value+=textFeildValue;
106 | }
107 | }
108 | });
109 |
--------------------------------------------------------------------------------
/www/js/login/controller.js:
--------------------------------------------------------------------------------
1 | angular.module('cordovaim.login.controller', [])
2 | .controller('LoginCtrl', function($scope, Friends, $rootScope, $state, $ionicHistory, serverService) {
3 |
4 | $scope.data = {
5 | username: "",
6 | password: ""
7 | };
8 | // if (window.RongCloudLibPlugin) {
9 | // com.rongCloud.lib required
10 |
11 | var initRong = function(token) {
12 | $rootScope.arrMsgs = new Array();
13 | $rootScope.arrCons = new Array();
14 | RongCloudLibPlugin.init({
15 | // appKey: "lmxuhwagx8tyd",
16 | // appKey: "z3v5yqkbv8v30",
17 | appKey: _appKey
18 | // deviceToken: "87jjfds8393sfjds83"
19 | },
20 | function(ret, err) {
21 | if (ret) {
22 | console.log('init:' + JSON.stringify(ret));
23 | }
24 | if (err) {
25 | console.log('init error:' + JSON.stringify(err));
26 | }
27 | }
28 |
29 | );
30 |
31 | RongCloudLibPlugin.setConnectionStatusListener(
32 | function(ret, err) {
33 | if (ret) {
34 | console.log('setConnectionStatusListener:' + JSON.stringify(ret));
35 | if(ret.result.connectionStatus == 'KICKED'){
36 | alert('您的帐号已在其他端登录!');
37 | $rootScope.hideTabs = false;
38 | $ionicHistory.clearCache();
39 | $state.go('login');
40 | }
41 | }
42 | if (err) {
43 | console.log('setConnectionStatusListener error:' + JSON.stringify(err));
44 | }
45 | }
46 | );
47 |
48 | RongCloudLibPlugin.connect({
49 | token: token
50 | },
51 | function(ret, err) {
52 | if (ret) {
53 | console.log('connect:' + JSON.stringify(ret));
54 | $rootScope.curUID = ret.result.userId;
55 | $rootScope.$apply();
56 | myUtil.setUserId(ret.result.userId);
57 | $state.go('tab.friends', {
58 | userId: ret.result.userId
59 | }, {
60 | reload: true
61 | });
62 | }
63 | if (err) {
64 | console.log('init error:' + JSON.stringify(err));
65 | }
66 | }
67 | );
68 |
69 | RongCloudLibPlugin.setOnReceiveMessageListener(
70 | function(ret, err) {
71 | if (ret) {
72 | console.log('setOnReceiveMessageListener:' + JSON.stringify(ret));
73 | // alert('setOnReceiveMessageListener:' + JSON.stringify(ret));
74 | $rootScope.arrMsgs.push(JSON.stringify(ret.result.message));
75 | $rootScope.$apply();
76 | }
77 | if (err) {
78 | console.log('setOnReceiveMessageListener error:' + JSON.stringify(err));
79 | }
80 | }
81 |
82 | );
83 | }
84 |
85 | // }
86 |
87 | $scope.login = function() {
88 | var uid = $scope.data.username;
89 | var pwd = $scope.data.password;
90 | var user = Friends.get(uid);
91 | var data = {email: uid, password: pwd};
92 | serverService.login(data).then(function(ret, err){
93 | if(ret){
94 | // "data":{"code":200,"result":{"id":"78274","username":"Eva","portrait":"http://www.gravatar.com/avatar/629497a2072fbfdbde466141b2888c42?s=82&d=wavatar","token":"9a++ytEwunqmxV0RBXNqn82yq+hfEluLjZ78E1qo4hHrwCrWRcote1512+sMJnu/ofBIBi6KLRnPk4Q6Ktm9Lg=="}},"status":200,"config":{"method":"POST","transformRequest":[null],"transformResponse":[null],"url":"http://webim.demo.rong.io/email_login_token","data":"email=zhengyi@rongcloud.cn&password=zyrongcloud","headers":{"Content-Type":"application/x-www-form-urlencoded","Accept":"application/json, text/plain, */*"}},"statu
95 | console.log("login data:" + JSON.stringify(ret));
96 | if(ret.data.code == "200"){
97 | $rootScope.user = ret.data.result;
98 | initRong($rootScope.user.token);
99 | }
100 | else{
101 | alert("email or password is error");
102 | }
103 | }
104 | if(err){
105 | console.log("login err:" + JSON.stringify(err));
106 | }
107 | });
108 | // console.log("LOGIN user: " + $scope.data.username + " - PW: " + $scope.data.password);
109 | // // alert(JSON.stringify(user));
110 | // console.log('Friends:'+JSON.stringify(Friends.all()));
111 | // if (user) {
112 | // $scope.data.username = "";
113 | // initRong(user.token);
114 | // } else {
115 | // console.error('user not exists!');
116 | // alert('user not exists!');
117 | // }
118 | }
119 | $scope.exit = function() {
120 | window.close();
121 | ionic.Platform.exitApp();
122 | }
123 |
124 | });
125 |
--------------------------------------------------------------------------------
/www/lib/angular-animate/.bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular-animate",
3 | "version": "1.4.3",
4 | "main": "./angular-animate.js",
5 | "ignore": [],
6 | "dependencies": {
7 | "angular": "1.4.3"
8 | },
9 | "homepage": "https://github.com/angular/bower-angular-animate",
10 | "_release": "1.4.3",
11 | "_resolution": {
12 | "type": "version",
13 | "tag": "v1.4.3",
14 | "commit": "4ce2a76359401102d2e0146ccf69e6c060799ff8"
15 | },
16 | "_source": "git://github.com/angular/bower-angular-animate.git",
17 | "_target": "1.4.3",
18 | "_originalSource": "angular-animate"
19 | }
--------------------------------------------------------------------------------
/www/lib/angular-animate/README.md:
--------------------------------------------------------------------------------
1 | # packaged angular-animate
2 |
3 | This repo is for distribution on `npm` and `bower`. The source for this module is in the
4 | [main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngAnimate).
5 | Please file issues and pull requests against that repo.
6 |
7 | ## Install
8 |
9 | You can install this package either with `npm` or with `bower`.
10 |
11 | ### npm
12 |
13 | ```shell
14 | npm install angular-animate
15 | ```
16 |
17 | Then add `ngAnimate` as a dependency for your app:
18 |
19 | ```javascript
20 | angular.module('myApp', [require('angular-animate')]);
21 | ```
22 |
23 | ### bower
24 |
25 | ```shell
26 | bower install angular-animate
27 | ```
28 |
29 | Then add a `
33 | ```
34 |
35 | Then add `ngAnimate` as a dependency for your app:
36 |
37 | ```javascript
38 | angular.module('myApp', ['ngAnimate']);
39 | ```
40 |
41 | ## Documentation
42 |
43 | Documentation is available on the
44 | [AngularJS docs site](http://docs.angularjs.org/api/ngAnimate).
45 |
46 | ## License
47 |
48 | The MIT License
49 |
50 | Copyright (c) 2010-2015 Google, Inc. http://angularjs.org
51 |
52 | Permission is hereby granted, free of charge, to any person obtaining a copy
53 | of this software and associated documentation files (the "Software"), to deal
54 | in the Software without restriction, including without limitation the rights
55 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
56 | copies of the Software, and to permit persons to whom the Software is
57 | furnished to do so, subject to the following conditions:
58 |
59 | The above copyright notice and this permission notice shall be included in
60 | all copies or substantial portions of the Software.
61 |
62 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
63 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
64 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
65 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
66 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
67 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
68 | THE SOFTWARE.
69 |
--------------------------------------------------------------------------------
/www/lib/angular-animate/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular-animate",
3 | "version": "1.4.3",
4 | "main": "./angular-animate.js",
5 | "ignore": [],
6 | "dependencies": {
7 | "angular": "1.4.3"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/www/lib/angular-animate/index.js:
--------------------------------------------------------------------------------
1 | require('./angular-animate');
2 | module.exports = 'ngAnimate';
3 |
--------------------------------------------------------------------------------
/www/lib/angular-animate/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular-animate",
3 | "version": "1.4.3",
4 | "description": "AngularJS module for animations",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "repository": {
10 | "type": "git",
11 | "url": "https://github.com/angular/angular.js.git"
12 | },
13 | "keywords": [
14 | "angular",
15 | "framework",
16 | "browser",
17 | "animation",
18 | "client-side"
19 | ],
20 | "author": "Angular Core Team ",
21 | "license": "MIT",
22 | "bugs": {
23 | "url": "https://github.com/angular/angular.js/issues"
24 | },
25 | "homepage": "http://angularjs.org"
26 | }
27 |
--------------------------------------------------------------------------------
/www/lib/angular-sanitize/.bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular-sanitize",
3 | "version": "1.4.3",
4 | "main": "./angular-sanitize.js",
5 | "ignore": [],
6 | "dependencies": {
7 | "angular": "1.4.3"
8 | },
9 | "homepage": "https://github.com/angular/bower-angular-sanitize",
10 | "_release": "1.4.3",
11 | "_resolution": {
12 | "type": "version",
13 | "tag": "v1.4.3",
14 | "commit": "0367ee4c3f9cb8af5d1da9ec35b71a8b523d9fc0"
15 | },
16 | "_source": "git://github.com/angular/bower-angular-sanitize.git",
17 | "_target": "1.4.3",
18 | "_originalSource": "angular-sanitize"
19 | }
--------------------------------------------------------------------------------
/www/lib/angular-sanitize/README.md:
--------------------------------------------------------------------------------
1 | # packaged angular-sanitize
2 |
3 | This repo is for distribution on `npm` and `bower`. The source for this module is in the
4 | [main AngularJS repo](https://github.com/angular/angular.js/tree/master/src/ngSanitize).
5 | Please file issues and pull requests against that repo.
6 |
7 | ## Install
8 |
9 | You can install this package either with `npm` or with `bower`.
10 |
11 | ### npm
12 |
13 | ```shell
14 | npm install angular-sanitize
15 | ```
16 |
17 | Then add `ngSanitize` as a dependency for your app:
18 |
19 | ```javascript
20 | angular.module('myApp', [require('angular-sanitize')]);
21 | ```
22 |
23 | ### bower
24 |
25 | ```shell
26 | bower install angular-sanitize
27 | ```
28 |
29 | Add a `
33 | ```
34 |
35 | Then add `ngSanitize` as a dependency for your app:
36 |
37 | ```javascript
38 | angular.module('myApp', ['ngSanitize']);
39 | ```
40 |
41 | ## Documentation
42 |
43 | Documentation is available on the
44 | [AngularJS docs site](http://docs.angularjs.org/api/ngSanitize).
45 |
46 | ## License
47 |
48 | The MIT License
49 |
50 | Copyright (c) 2010-2015 Google, Inc. http://angularjs.org
51 |
52 | Permission is hereby granted, free of charge, to any person obtaining a copy
53 | of this software and associated documentation files (the "Software"), to deal
54 | in the Software without restriction, including without limitation the rights
55 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
56 | copies of the Software, and to permit persons to whom the Software is
57 | furnished to do so, subject to the following conditions:
58 |
59 | The above copyright notice and this permission notice shall be included in
60 | all copies or substantial portions of the Software.
61 |
62 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
63 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
64 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
65 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
66 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
67 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
68 | THE SOFTWARE.
69 |
--------------------------------------------------------------------------------
/www/lib/angular-sanitize/angular-sanitize.min.js:
--------------------------------------------------------------------------------
1 | /*
2 | AngularJS v1.4.3
3 | (c) 2010-2015 Google, Inc. http://angularjs.org
4 | License: MIT
5 | */
6 | (function(n,h,p){'use strict';function E(a){var f=[];r(f,h.noop).chars(a);return f.join("")}function g(a,f){var d={},c=a.split(","),b;for(b=0;b=c;d--)f.end&&f.end(e[d]);e.length=c}}"string"!==typeof a&&(a=null===a||"undefined"===typeof a?"":""+a);var b,k,e=[],m=a,l;for(e.last=function(){return e[e.length-1]};a;){l="";k=!0;if(e.last()&&w[e.last()])a=a.replace(new RegExp("([\\W\\w]*)<\\s*\\/\\s*"+e.last()+"[^>]*>","i"),function(a,b){b=b.replace(H,"$1").replace(I,"$1");f.chars&&f.chars(q(b));return""}),c("",e.last());else{if(0===a.indexOf("\x3c!--"))b=a.indexOf("--",4),0<=b&&a.lastIndexOf("--\x3e",
8 | b)===b&&(f.comment&&f.comment(a.substring(4,b)),a=a.substring(b+3),k=!1);else if(x.test(a)){if(b=a.match(x))a=a.replace(b[0],""),k=!1}else if(J.test(a)){if(b=a.match(y))a=a.substring(b[0].length),b[0].replace(y,c),k=!1}else K.test(a)&&((b=a.match(z))?(b[4]&&(a=a.substring(b[0].length),b[0].replace(z,d)),k=!1):(l+="<",a=a.substring(1)));k&&(b=a.indexOf("<"),l+=0>b?a:a.substring(0,b),a=0>b?"":a.substring(b),f.chars&&f.chars(q(l)))}if(a==m)throw L("badparse",a);m=a}c()}function q(a){if(!a)return"";A.innerHTML=
9 | a.replace(//g,">")}function r(a,f){var d=!1,c=h.bind(a,a.push);return{start:function(a,k,e){a=h.lowercase(a);!d&&w[a]&&(d=a);d||!0!==C[a]||(c("<"),c(a),h.forEach(k,function(d,e){var k=h.lowercase(e),g="img"===a&&"src"===k||
10 | "background"===k;!0!==O[k]||!0===D[k]&&!f(d,g)||(c(" "),c(e),c('="'),c(B(d)),c('"'))}),c(e?"/>":">"))},end:function(a){a=h.lowercase(a);d||!0!==C[a]||(c(""),c(a),c(">"));a==d&&(d=!1)},chars:function(a){d||c(B(a))}}}var L=h.$$minErr("$sanitize"),z=/^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/,y=/^<\/\s*([\w:-]+)[^>]*>/,G=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,K=/^,J=/^<\//,H=/\x3c!--(.*?)--\x3e/g,x=/]*?)>/i,
11 | I=/"\u201d\u2019]/i,d=/^mailto:/i;return function(c,b){function k(a){a&&g.push(E(a))}function e(a,
15 | c){g.push("');k(c);g.push("")}if(!c)return c;for(var m,l=c,g=[],n,p;m=l.match(f);)n=m[0],m[2]||m[4]||(n=(m[3]?"http://":"mailto:")+n),p=m.index,k(l.substr(0,p)),e(n,m[0].replace(d,"")),l=l.substring(p+m[0].length);k(l);return a(g.join(""))}}])})(window,window.angular);
16 | //# sourceMappingURL=angular-sanitize.min.js.map
17 |
--------------------------------------------------------------------------------
/www/lib/angular-sanitize/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular-sanitize",
3 | "version": "1.4.3",
4 | "main": "./angular-sanitize.js",
5 | "ignore": [],
6 | "dependencies": {
7 | "angular": "1.4.3"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/www/lib/angular-sanitize/index.js:
--------------------------------------------------------------------------------
1 | require('./angular-sanitize');
2 | module.exports = 'ngSanitize';
3 |
--------------------------------------------------------------------------------
/www/lib/angular-sanitize/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular-sanitize",
3 | "version": "1.4.3",
4 | "description": "AngularJS module for sanitizing HTML",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "repository": {
10 | "type": "git",
11 | "url": "https://github.com/angular/angular.js.git"
12 | },
13 | "keywords": [
14 | "angular",
15 | "framework",
16 | "browser",
17 | "html",
18 | "client-side"
19 | ],
20 | "author": "Angular Core Team ",
21 | "license": "MIT",
22 | "bugs": {
23 | "url": "https://github.com/angular/angular.js/issues"
24 | },
25 | "homepage": "http://angularjs.org"
26 | }
27 |
--------------------------------------------------------------------------------
/www/lib/angular-ui-router/.bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular-ui-router",
3 | "version": "0.2.13",
4 | "main": "./release/angular-ui-router.js",
5 | "dependencies": {
6 | "angular": ">= 1.0.8"
7 | },
8 | "ignore": [
9 | "**/.*",
10 | "node_modules",
11 | "bower_components",
12 | "component.json",
13 | "package.json",
14 | "lib",
15 | "config",
16 | "sample",
17 | "test",
18 | "tests",
19 | "ngdoc_assets",
20 | "Gruntfile.js",
21 | "files.js"
22 | ],
23 | "homepage": "https://github.com/angular-ui/ui-router",
24 | "_release": "0.2.13",
25 | "_resolution": {
26 | "type": "version",
27 | "tag": "0.2.13",
28 | "commit": "c3d543aae43d4600512520a0d70723ac31f2cb62"
29 | },
30 | "_source": "git://github.com/angular-ui/ui-router.git",
31 | "_target": "0.2.13",
32 | "_originalSource": "angular-ui-router"
33 | }
--------------------------------------------------------------------------------
/www/lib/angular-ui-router/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 |
2 | # Report an Issue
3 |
4 | Help us make UI-Router better! If you think you might have found a bug, or some other weirdness, start by making sure
5 | it hasn't already been reported. You can [search through existing issues](https://github.com/angular-ui/ui-router/search?q=wat%3F&type=Issues)
6 | to see if someone's reported one similar to yours.
7 |
8 | If not, then [create a plunkr](http://bit.ly/UIR-Plunk) that demonstrates the problem (try to use as little code
9 | as possible: the more minimalist, the faster we can debug it).
10 |
11 | Next, [create a new issue](https://github.com/angular-ui/ui-router/issues/new) that briefly explains the problem,
12 | and provides a bit of background as to the circumstances that triggered it. Don't forget to include the link to
13 | that plunkr you created!
14 |
15 | **Note**: If you're unsure how a feature is used, or are encountering some unexpected behavior that you aren't sure
16 | is a bug, it's best to talk it out on
17 | [StackOverflow](http://stackoverflow.com/questions/ask?tags=angularjs,angular-ui-router) before reporting it. This
18 | keeps development streamlined, and helps us focus on building great software.
19 |
20 |
21 | Issues only! |
22 | -------------|
23 | Please keep in mind that the issue tracker is for *issues*. Please do *not* post an issue if you need help or support. Instead, see one of the above-mentioned forums or [IRC](irc://irc.freenode.net/#angularjs). |
24 |
25 | ####Purple Labels
26 | A purple label means that **you** need to take some further action.
27 | - : Your issue is not specific enough, or there is no clear action that we can take. Please clarify and refine your issue.
28 | - : Please [create a plunkr](http://bit.ly/UIR-Plunk)
29 | - : We suspect your issue is really a help request, or could be answered by the community. Please ask your question on [StackOverflow](http://stackoverflow.com/questions/ask?tags=angularjs,angular-ui-router). If you determine that is an actual issue, please explain why.
30 |
31 | If your issue gets labeled with purple label, no further action will be taken until you respond to the label appropriately.
32 |
33 | # Contribute
34 |
35 | **(1)** See the **[Developing](#developing)** section below, to get the development version of UI-Router up and running on your local machine.
36 |
37 | **(2)** Check out the [roadmap](https://github.com/angular-ui/ui-router/milestones) to see where the project is headed, and if your feature idea fits with where we're headed.
38 |
39 | **(3)** If you're not sure, [open an RFC](https://github.com/angular-ui/ui-router/issues/new?title=RFC:%20My%20idea) to get some feedback on your idea.
40 |
41 | **(4)** Finally, commit some code and open a pull request. Code & commits should abide by the following rules:
42 |
43 | - *Always* have test coverage for new features (or regression tests for bug fixes), and *never* break existing tests
44 | - Commits should represent one logical change each; if a feature goes through multiple iterations, squash your commits down to one
45 | - Make sure to follow the [Angular commit message format](https://github.com/angular/angular.js/blob/master/CONTRIBUTING.md#commit-message-format) so your change will appear in the changelog of the next release.
46 | - Changes should always respect the coding style of the project
47 |
48 |
49 |
50 | # Developing
51 |
52 | UI-Router uses grunt >= 0.4.x
. Make sure to upgrade your environment and read the
53 | [Migration Guide](http://gruntjs.com/upgrading-from-0.3-to-0.4).
54 |
55 | Dependencies for building from source and running tests:
56 |
57 | * [grunt-cli](https://github.com/gruntjs/grunt-cli) - run: `$ npm install -g grunt-cli`
58 | * Then, install the development dependencies by running `$ npm install` from the project directory
59 |
60 | There are a number of targets in the gruntfile that are used to generating different builds:
61 |
62 | * `grunt`: Perform a normal build, runs jshint and karma tests
63 | * `grunt build`: Perform a normal build
64 | * `grunt dist`: Perform a clean build and generate documentation
65 | * `grunt dev`: Run dev server (sample app) and watch for changes, builds and runs karma tests on changes.
66 |
--------------------------------------------------------------------------------
/www/lib/angular-ui-router/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License
2 |
3 | Copyright (c) 2014 The AngularUI Team, Karsten Sperling
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/www/lib/angular-ui-router/api/angular-ui-router.d.ts:
--------------------------------------------------------------------------------
1 | // Type definitions for Angular JS 1.1.5+ (ui.router module)
2 | // Project: https://github.com/angular-ui/ui-router
3 | // Definitions by: Michel Salib
4 | // Definitions: https://github.com/borisyankov/DefinitelyTyped
5 |
6 | declare module ng.ui {
7 |
8 | interface IState {
9 | name?: string;
10 | template?: string;
11 | templateUrl?: any; // string || () => string
12 | templateProvider?: any; // () => string || IPromise
13 | controller?: any;
14 | controllerAs?: string;
15 | controllerProvider?: any;
16 | resolve?: {};
17 | url?: string;
18 | params?: any;
19 | views?: {};
20 | abstract?: boolean;
21 | onEnter?: (...args: any[]) => void;
22 | onExit?: (...args: any[]) => void;
23 | data?: any;
24 | reloadOnSearch?: boolean;
25 | }
26 |
27 | interface ITypedState extends IState {
28 | data?: T;
29 | }
30 |
31 | interface IStateProvider extends IServiceProvider {
32 | state(name: string, config: IState): IStateProvider;
33 | state(config: IState): IStateProvider;
34 | decorator(name?: string, decorator?: (state: IState, parent: Function) => any): any;
35 | }
36 |
37 | interface IUrlMatcher {
38 | concat(pattern: string): IUrlMatcher;
39 | exec(path: string, searchParams: {}): {};
40 | parameters(): string[];
41 | format(values: {}): string;
42 | }
43 |
44 | interface IUrlMatcherFactory {
45 | compile(pattern: string): IUrlMatcher;
46 | isMatcher(o: any): boolean;
47 | }
48 |
49 | interface IUrlRouterProvider extends IServiceProvider {
50 | when(whenPath: RegExp, handler: Function): IUrlRouterProvider;
51 | when(whenPath: RegExp, handler: any[]): IUrlRouterProvider;
52 | when(whenPath: RegExp, toPath: string): IUrlRouterProvider;
53 | when(whenPath: IUrlMatcher, hanlder: Function): IUrlRouterProvider;
54 | when(whenPath: IUrlMatcher, handler: any[]): IUrlRouterProvider;
55 | when(whenPath: IUrlMatcher, toPath: string): IUrlRouterProvider;
56 | when(whenPath: string, handler: Function): IUrlRouterProvider;
57 | when(whenPath: string, handler: any[]): IUrlRouterProvider;
58 | when(whenPath: string, toPath: string): IUrlRouterProvider;
59 | otherwise(handler: Function): IUrlRouterProvider;
60 | otherwise(handler: any[]): IUrlRouterProvider;
61 | otherwise(path: string): IUrlRouterProvider;
62 | rule(handler: Function): IUrlRouterProvider;
63 | rule(handler: any[]): IUrlRouterProvider;
64 | }
65 |
66 | interface IStateOptions {
67 | location?: any;
68 | inherit?: boolean;
69 | relative?: IState;
70 | notify?: boolean;
71 | reload?: boolean;
72 | }
73 |
74 | interface IHrefOptions {
75 | lossy?: boolean;
76 | inherit?: boolean;
77 | relative?: IState;
78 | absolute?: boolean;
79 | }
80 |
81 | interface IStateService {
82 | go(to: string, params?: {}, options?: IStateOptions): IPromise;
83 | transitionTo(state: string, params?: {}, updateLocation?: boolean): void;
84 | transitionTo(state: string, params?: {}, options?: IStateOptions): void;
85 | includes(state: string, params?: {}): boolean;
86 | is(state:string, params?: {}): boolean;
87 | is(state: IState, params?: {}): boolean;
88 | href(state: IState, params?: {}, options?: IHrefOptions): string;
89 | href(state: string, params?: {}, options?: IHrefOptions): string;
90 | get(state: string): IState;
91 | get(): IState[];
92 | current: IState;
93 | params: any;
94 | reload(): void;
95 | }
96 |
97 | interface IStateParamsService {
98 | [key: string]: any;
99 | }
100 |
101 | interface IStateParams {
102 | [key: string]: any;
103 | }
104 |
105 | interface IUrlRouterService {
106 | /*
107 | * Triggers an update; the same update that happens when the address bar
108 | * url changes, aka $locationChangeSuccess.
109 | *
110 | * This method is useful when you need to use preventDefault() on the
111 | * $locationChangeSuccess event, perform some custom logic (route protection,
112 | * auth, config, redirection, etc) and then finally proceed with the transition
113 | * by calling $urlRouter.sync().
114 | *
115 | */
116 | sync(): void;
117 | }
118 |
119 | interface IUiViewScrollProvider {
120 | /*
121 | * Reverts back to using the core $anchorScroll service for scrolling
122 | * based on the url anchor.
123 | */
124 | useAnchorScroll(): void;
125 | }
126 | }
127 |
--------------------------------------------------------------------------------
/www/lib/angular-ui-router/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular-ui-router",
3 | "version": "0.2.13",
4 | "main": "./release/angular-ui-router.js",
5 | "dependencies": {
6 | "angular": ">= 1.0.8"
7 | },
8 | "ignore": [
9 | "**/.*",
10 | "node_modules",
11 | "bower_components",
12 | "component.json",
13 | "package.json",
14 | "lib",
15 | "config",
16 | "sample",
17 | "test",
18 | "tests",
19 | "ngdoc_assets",
20 | "Gruntfile.js",
21 | "files.js"
22 | ]
23 | }
24 |
--------------------------------------------------------------------------------
/www/lib/angular-ui-router/src/stateFilters.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @ngdoc filter
3 | * @name ui.router.state.filter:isState
4 | *
5 | * @requires ui.router.state.$state
6 | *
7 | * @description
8 | * Translates to {@link ui.router.state.$state#methods_is $state.is("stateName")}.
9 | */
10 | $IsStateFilter.$inject = ['$state'];
11 | function $IsStateFilter($state) {
12 | var isFilter = function (state) {
13 | return $state.is(state);
14 | };
15 | isFilter.$stateful = true;
16 | return isFilter;
17 | }
18 |
19 | /**
20 | * @ngdoc filter
21 | * @name ui.router.state.filter:includedByState
22 | *
23 | * @requires ui.router.state.$state
24 | *
25 | * @description
26 | * Translates to {@link ui.router.state.$state#methods_includes $state.includes('fullOrPartialStateName')}.
27 | */
28 | $IncludedByStateFilter.$inject = ['$state'];
29 | function $IncludedByStateFilter($state) {
30 | var includesFilter = function (state) {
31 | return $state.includes(state);
32 | };
33 | includesFilter.$stateful = true;
34 | return includesFilter;
35 | }
36 |
37 | angular.module('ui.router.state')
38 | .filter('isState', $IsStateFilter)
39 | .filter('includedByState', $IncludedByStateFilter);
40 |
--------------------------------------------------------------------------------
/www/lib/angular-ui-router/src/templateFactory.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @ngdoc object
3 | * @name ui.router.util.$templateFactory
4 | *
5 | * @requires $http
6 | * @requires $templateCache
7 | * @requires $injector
8 | *
9 | * @description
10 | * Service. Manages loading of templates.
11 | */
12 | $TemplateFactory.$inject = ['$http', '$templateCache', '$injector'];
13 | function $TemplateFactory( $http, $templateCache, $injector) {
14 |
15 | /**
16 | * @ngdoc function
17 | * @name ui.router.util.$templateFactory#fromConfig
18 | * @methodOf ui.router.util.$templateFactory
19 | *
20 | * @description
21 | * Creates a template from a configuration object.
22 | *
23 | * @param {object} config Configuration object for which to load a template.
24 | * The following properties are search in the specified order, and the first one
25 | * that is defined is used to create the template:
26 | *
27 | * @param {string|object} config.template html string template or function to
28 | * load via {@link ui.router.util.$templateFactory#fromString fromString}.
29 | * @param {string|object} config.templateUrl url to load or a function returning
30 | * the url to load via {@link ui.router.util.$templateFactory#fromUrl fromUrl}.
31 | * @param {Function} config.templateProvider function to invoke via
32 | * {@link ui.router.util.$templateFactory#fromProvider fromProvider}.
33 | * @param {object} params Parameters to pass to the template function.
34 | * @param {object} locals Locals to pass to `invoke` if the template is loaded
35 | * via a `templateProvider`. Defaults to `{ params: params }`.
36 | *
37 | * @return {string|object} The template html as a string, or a promise for
38 | * that string,or `null` if no template is configured.
39 | */
40 | this.fromConfig = function (config, params, locals) {
41 | return (
42 | isDefined(config.template) ? this.fromString(config.template, params) :
43 | isDefined(config.templateUrl) ? this.fromUrl(config.templateUrl, params) :
44 | isDefined(config.templateProvider) ? this.fromProvider(config.templateProvider, params, locals) :
45 | null
46 | );
47 | };
48 |
49 | /**
50 | * @ngdoc function
51 | * @name ui.router.util.$templateFactory#fromString
52 | * @methodOf ui.router.util.$templateFactory
53 | *
54 | * @description
55 | * Creates a template from a string or a function returning a string.
56 | *
57 | * @param {string|object} template html template as a string or function that
58 | * returns an html template as a string.
59 | * @param {object} params Parameters to pass to the template function.
60 | *
61 | * @return {string|object} The template html as a string, or a promise for that
62 | * string.
63 | */
64 | this.fromString = function (template, params) {
65 | return isFunction(template) ? template(params) : template;
66 | };
67 |
68 | /**
69 | * @ngdoc function
70 | * @name ui.router.util.$templateFactory#fromUrl
71 | * @methodOf ui.router.util.$templateFactory
72 | *
73 | * @description
74 | * Loads a template from the a URL via `$http` and `$templateCache`.
75 | *
76 | * @param {string|Function} url url of the template to load, or a function
77 | * that returns a url.
78 | * @param {Object} params Parameters to pass to the url function.
79 | * @return {string|Promise.} The template html as a string, or a promise
80 | * for that string.
81 | */
82 | this.fromUrl = function (url, params) {
83 | if (isFunction(url)) url = url(params);
84 | if (url == null) return null;
85 | else return $http
86 | .get(url, { cache: $templateCache, headers: { Accept: 'text/html' }})
87 | .then(function(response) { return response.data; });
88 | };
89 |
90 | /**
91 | * @ngdoc function
92 | * @name ui.router.util.$templateFactory#fromProvider
93 | * @methodOf ui.router.util.$templateFactory
94 | *
95 | * @description
96 | * Creates a template by invoking an injectable provider function.
97 | *
98 | * @param {Function} provider Function to invoke via `$injector.invoke`
99 | * @param {Object} params Parameters for the template.
100 | * @param {Object} locals Locals to pass to `invoke`. Defaults to
101 | * `{ params: params }`.
102 | * @return {string|Promise.} The template html as a string, or a promise
103 | * for that string.
104 | */
105 | this.fromProvider = function (provider, params, locals) {
106 | return $injector.invoke(provider, null, locals || { params: params });
107 | };
108 | }
109 |
110 | angular.module('ui.router.util').service('$templateFactory', $TemplateFactory);
111 |
--------------------------------------------------------------------------------
/www/lib/angular-ui-router/src/view.js:
--------------------------------------------------------------------------------
1 |
2 | $ViewProvider.$inject = [];
3 | function $ViewProvider() {
4 |
5 | this.$get = $get;
6 | /**
7 | * @ngdoc object
8 | * @name ui.router.state.$view
9 | *
10 | * @requires ui.router.util.$templateFactory
11 | * @requires $rootScope
12 | *
13 | * @description
14 | *
15 | */
16 | $get.$inject = ['$rootScope', '$templateFactory'];
17 | function $get( $rootScope, $templateFactory) {
18 | return {
19 | // $view.load('full.viewName', { template: ..., controller: ..., resolve: ..., async: false, params: ... })
20 | /**
21 | * @ngdoc function
22 | * @name ui.router.state.$view#load
23 | * @methodOf ui.router.state.$view
24 | *
25 | * @description
26 | *
27 | * @param {string} name name
28 | * @param {object} options option object.
29 | */
30 | load: function load(name, options) {
31 | var result, defaults = {
32 | template: null, controller: null, view: null, locals: null, notify: true, async: true, params: {}
33 | };
34 | options = extend(defaults, options);
35 |
36 | if (options.view) {
37 | result = $templateFactory.fromConfig(options.view, options.params, options.locals);
38 | }
39 | if (result && options.notify) {
40 | /**
41 | * @ngdoc event
42 | * @name ui.router.state.$state#$viewContentLoading
43 | * @eventOf ui.router.state.$view
44 | * @eventType broadcast on root scope
45 | * @description
46 | *
47 | * Fired once the view **begins loading**, *before* the DOM is rendered.
48 | *
49 | * @param {Object} event Event object.
50 | * @param {Object} viewConfig The view config properties (template, controller, etc).
51 | *
52 | * @example
53 | *
54 | *
55 | * $scope.$on('$viewContentLoading',
56 | * function(event, viewConfig){
57 | * // Access to all the view config properties.
58 | * // and one special property 'targetView'
59 | * // viewConfig.targetView
60 | * });
61 | *
62 | */
63 | $rootScope.$broadcast('$viewContentLoading', options);
64 | }
65 | return result;
66 | }
67 | };
68 | }
69 | }
70 |
71 | angular.module('ui.router.state').provider('$view', $ViewProvider);
72 |
--------------------------------------------------------------------------------
/www/lib/angular-ui-router/src/viewScroll.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @ngdoc object
3 | * @name ui.router.state.$uiViewScrollProvider
4 | *
5 | * @description
6 | * Provider that returns the {@link ui.router.state.$uiViewScroll} service function.
7 | */
8 | function $ViewScrollProvider() {
9 |
10 | var useAnchorScroll = false;
11 |
12 | /**
13 | * @ngdoc function
14 | * @name ui.router.state.$uiViewScrollProvider#useAnchorScroll
15 | * @methodOf ui.router.state.$uiViewScrollProvider
16 | *
17 | * @description
18 | * Reverts back to using the core [`$anchorScroll`](http://docs.angularjs.org/api/ng.$anchorScroll) service for
19 | * scrolling based on the url anchor.
20 | */
21 | this.useAnchorScroll = function () {
22 | useAnchorScroll = true;
23 | };
24 |
25 | /**
26 | * @ngdoc object
27 | * @name ui.router.state.$uiViewScroll
28 | *
29 | * @requires $anchorScroll
30 | * @requires $timeout
31 | *
32 | * @description
33 | * When called with a jqLite element, it scrolls the element into view (after a
34 | * `$timeout` so the DOM has time to refresh).
35 | *
36 | * If you prefer to rely on `$anchorScroll` to scroll the view to the anchor,
37 | * this can be enabled by calling {@link ui.router.state.$uiViewScrollProvider#methods_useAnchorScroll `$uiViewScrollProvider.useAnchorScroll()`}.
38 | */
39 | this.$get = ['$anchorScroll', '$timeout', function ($anchorScroll, $timeout) {
40 | if (useAnchorScroll) {
41 | return $anchorScroll;
42 | }
43 |
44 | return function ($element) {
45 | $timeout(function () {
46 | $element[0].scrollIntoView();
47 | }, 0, false);
48 | };
49 | }];
50 | }
51 |
52 | angular.module('ui.router.state').provider('$uiViewScroll', $ViewScrollProvider);
53 |
--------------------------------------------------------------------------------
/www/lib/angular/.bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular",
3 | "version": "1.4.3",
4 | "main": "./angular.js",
5 | "ignore": [],
6 | "dependencies": {},
7 | "homepage": "https://github.com/angular/bower-angular",
8 | "_release": "1.4.3",
9 | "_resolution": {
10 | "type": "version",
11 | "tag": "v1.4.3",
12 | "commit": "dbd689e8103a6366e53e1f6786727f7c65ccfd75"
13 | },
14 | "_source": "git://github.com/angular/bower-angular.git",
15 | "_target": "1.4.3",
16 | "_originalSource": "angular"
17 | }
--------------------------------------------------------------------------------
/www/lib/angular/README.md:
--------------------------------------------------------------------------------
1 | # packaged angular
2 |
3 | This repo is for distribution on `npm` and `bower`. The source for this module is in the
4 | [main AngularJS repo](https://github.com/angular/angular.js).
5 | Please file issues and pull requests against that repo.
6 |
7 | ## Install
8 |
9 | You can install this package either with `npm` or with `bower`.
10 |
11 | ### npm
12 |
13 | ```shell
14 | npm install angular
15 | ```
16 |
17 | Then add a `
21 | ```
22 |
23 | Or `require('angular')` from your code.
24 |
25 | ### bower
26 |
27 | ```shell
28 | bower install angular
29 | ```
30 |
31 | Then add a `
35 | ```
36 |
37 | ## Documentation
38 |
39 | Documentation is available on the
40 | [AngularJS docs site](http://docs.angularjs.org/).
41 |
42 | ## License
43 |
44 | The MIT License
45 |
46 | Copyright (c) 2010-2015 Google, Inc. http://angularjs.org
47 |
48 | Permission is hereby granted, free of charge, to any person obtaining a copy
49 | of this software and associated documentation files (the "Software"), to deal
50 | in the Software without restriction, including without limitation the rights
51 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
52 | copies of the Software, and to permit persons to whom the Software is
53 | furnished to do so, subject to the following conditions:
54 |
55 | The above copyright notice and this permission notice shall be included in
56 | all copies or substantial portions of the Software.
57 |
58 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
59 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
60 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
61 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
62 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
63 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
64 | THE SOFTWARE.
65 |
--------------------------------------------------------------------------------
/www/lib/angular/angular-csp.css:
--------------------------------------------------------------------------------
1 | /* Include this file in your html if you are using the CSP mode. */
2 |
3 | @charset "UTF-8";
4 |
5 | [ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak],
6 | .ng-cloak, .x-ng-cloak,
7 | .ng-hide:not(.ng-hide-animate) {
8 | display: none !important;
9 | }
10 |
11 | ng\:form {
12 | display: block;
13 | }
14 |
15 | .ng-animate-shim {
16 | visibility:hidden;
17 | }
18 |
19 | .ng-anchor {
20 | position:absolute;
21 | }
22 |
--------------------------------------------------------------------------------
/www/lib/angular/angular.min.js.gzip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/lib/angular/angular.min.js.gzip
--------------------------------------------------------------------------------
/www/lib/angular/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular",
3 | "version": "1.4.3",
4 | "main": "./angular.js",
5 | "ignore": [],
6 | "dependencies": {
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/www/lib/angular/index.js:
--------------------------------------------------------------------------------
1 | require('./angular');
2 | module.exports = angular;
3 |
--------------------------------------------------------------------------------
/www/lib/angular/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular",
3 | "version": "1.4.3",
4 | "description": "HTML enhanced for web apps",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "repository": {
10 | "type": "git",
11 | "url": "https://github.com/angular/angular.js.git"
12 | },
13 | "keywords": [
14 | "angular",
15 | "framework",
16 | "browser",
17 | "client-side"
18 | ],
19 | "author": "Angular Core Team ",
20 | "license": "MIT",
21 | "bugs": {
22 | "url": "https://github.com/angular/angular.js/issues"
23 | },
24 | "homepage": "http://angularjs.org"
25 | }
26 |
--------------------------------------------------------------------------------
/www/lib/ionic/fonts/ionicons.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/lib/ionic/fonts/ionicons.eot
--------------------------------------------------------------------------------
/www/lib/ionic/fonts/ionicons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/lib/ionic/fonts/ionicons.ttf
--------------------------------------------------------------------------------
/www/lib/ionic/fonts/ionicons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/lib/ionic/fonts/ionicons.woff
--------------------------------------------------------------------------------
/www/lib/ionic/js/angular/angular-resource.min.js:
--------------------------------------------------------------------------------
1 | /*
2 | AngularJS v1.4.3
3 | (c) 2010-2015 Google, Inc. http://angularjs.org
4 | License: MIT
5 | */
6 | (function(I,d,B){'use strict';function D(f,q){q=q||{};d.forEach(q,function(d,h){delete q[h]});for(var h in f)!f.hasOwnProperty(h)||"$"===h.charAt(0)&&"$"===h.charAt(1)||(q[h]=f[h]);return q}var x=d.$$minErr("$resource"),C=/^(\.[a-zA-Z_$@][0-9a-zA-Z_$@]*)+$/;d.module("ngResource",["ng"]).provider("$resource",function(){var f=this;this.defaults={stripTrailingSlashes:!0,actions:{get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}}};
7 | this.$get=["$http","$q",function(q,h){function u(d,g){this.template=d;this.defaults=s({},f.defaults,g);this.urlParams={}}function w(y,g,l,m){function c(b,k){var c={};k=s({},g,k);r(k,function(a,k){v(a)&&(a=a());var d;if(a&&a.charAt&&"@"==a.charAt(0)){d=b;var e=a.substr(1);if(null==e||""===e||"hasOwnProperty"===e||!C.test("."+e))throw x("badmember",e);for(var e=e.split("."),n=0,g=e.length;n .ng-enter {
10 | @include transition(all cubic-bezier(.1, .7, .1, 1) 400ms);
11 | }
12 | .slide-in-up.ng-enter-active,
13 | .slide-in-up > .ng-enter-active {
14 | @include translate3d(0, 0, 0);
15 | }
16 |
17 | .slide-in-up.ng-leave,
18 | .slide-in-up > .ng-leave {
19 | @include transition(all ease-in-out 250ms);
20 | }
21 |
22 |
23 | // Scale Out
24 | // Scale from hero (1 in this case) to zero
25 | // -------------------------------
26 |
27 | @-webkit-keyframes scaleOut {
28 | from { -webkit-transform: scale(1); opacity: 1; }
29 | to { -webkit-transform: scale(0.8); opacity: 0; }
30 | }
31 | @keyframes scaleOut {
32 | from { transform: scale(1); opacity: 1; }
33 | to { transform: scale(0.8); opacity: 0; }
34 | }
35 |
36 |
37 | // Super Scale In
38 | // Scale from super (1.x) to duper (1 in this case)
39 | // -------------------------------
40 |
41 | @-webkit-keyframes superScaleIn {
42 | from { -webkit-transform: scale(1.2); opacity: 0; }
43 | to { -webkit-transform: scale(1); opacity: 1 }
44 | }
45 | @keyframes superScaleIn {
46 | from { transform: scale(1.2); opacity: 0; }
47 | to { transform: scale(1); opacity: 1; }
48 | }
49 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_backdrop.scss:
--------------------------------------------------------------------------------
1 |
2 | .backdrop {
3 | position: fixed;
4 | top: 0;
5 | left: 0;
6 | z-index: $z-index-backdrop;
7 |
8 | width: 100%;
9 | height: 100%;
10 |
11 | background-color: $loading-backdrop-bg-color;
12 |
13 | visibility: hidden;
14 | opacity: 0;
15 |
16 | &.visible {
17 | visibility: visible;
18 | }
19 | &.active {
20 | opacity: 1;
21 | }
22 |
23 | @include transition($loading-backdrop-fadein-duration opacity linear);
24 | }
25 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_badge.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Badges
4 | * --------------------------------------------------
5 | */
6 |
7 | .badge {
8 | @include badge-style($badge-default-bg, $badge-default-text);
9 | z-index: $z-index-badge;
10 | display: inline-block;
11 | padding: 3px 8px;
12 | min-width: 10px;
13 | border-radius: $badge-border-radius;
14 | vertical-align: baseline;
15 | text-align: center;
16 | white-space: nowrap;
17 | font-weight: $badge-font-weight;
18 | font-size: $badge-font-size;
19 | line-height: $badge-line-height;
20 |
21 | &:empty {
22 | display: none;
23 | }
24 | }
25 |
26 | //Be sure to override specificity of rule that 'badge color matches tab color by default'
27 | .tabs .tab-item .badge,
28 | .badge {
29 | &.badge-light {
30 | @include badge-style($badge-light-bg, $badge-light-text);
31 | }
32 | &.badge-stable {
33 | @include badge-style($badge-stable-bg, $badge-stable-text);
34 | }
35 | &.badge-positive {
36 | @include badge-style($badge-positive-bg, $badge-positive-text);
37 | }
38 | &.badge-calm {
39 | @include badge-style($badge-calm-bg, $badge-calm-text);
40 | }
41 | &.badge-assertive {
42 | @include badge-style($badge-assertive-bg, $badge-assertive-text);
43 | }
44 | &.badge-balanced {
45 | @include badge-style($badge-balanced-bg, $badge-balanced-text);
46 | }
47 | &.badge-energized {
48 | @include badge-style($badge-energized-bg, $badge-energized-text);
49 | }
50 | &.badge-royal {
51 | @include badge-style($badge-royal-bg, $badge-royal-text);
52 | }
53 | &.badge-dark {
54 | @include badge-style($badge-dark-bg, $badge-dark-text);
55 | }
56 | }
57 |
58 | // Quick fix for labels/badges in buttons
59 | .button .badge {
60 | position: relative;
61 | top: -1px;
62 | }
63 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_button-bar.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Button Bar
4 | * --------------------------------------------------
5 | */
6 |
7 | .button-bar {
8 | @include display-flex();
9 | @include flex(1);
10 | width: 100%;
11 |
12 | &.button-bar-inline {
13 | display: block;
14 | width: auto;
15 |
16 | @include clearfix();
17 |
18 | > .button {
19 | width: auto;
20 | display: inline-block;
21 | float: left;
22 | }
23 | }
24 | }
25 |
26 | .button-bar > .button {
27 | @include flex(1);
28 | display: block;
29 |
30 | overflow: hidden;
31 |
32 | padding: 0 16px;
33 |
34 | width: 0;
35 |
36 | border-width: 1px 0px 1px 1px;
37 | border-radius: 0;
38 | text-align: center;
39 | text-overflow: ellipsis;
40 | white-space: nowrap;
41 |
42 | &:before,
43 | .icon:before {
44 | line-height: 44px;
45 | }
46 |
47 | &:first-child {
48 | border-radius: $button-border-radius 0px 0px $button-border-radius;
49 | }
50 | &:last-child {
51 | border-right-width: 1px;
52 | border-radius: 0px $button-border-radius $button-border-radius 0px;
53 | }
54 | }
55 |
56 | .button-bar > .button-small {
57 | &:before,
58 | .icon:before {
59 | line-height: 28px;
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_checkbox.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Checkbox
4 | * --------------------------------------------------
5 | */
6 |
7 | .checkbox {
8 | // set the color defaults
9 | @include checkbox-style($checkbox-off-border-default, $checkbox-on-bg-default, $checkbox-on-border-default);
10 |
11 | position: relative;
12 | display: inline-block;
13 | padding: ($checkbox-height / 4) ($checkbox-width / 4);
14 | cursor: pointer;
15 | }
16 | .checkbox-light {
17 | @include checkbox-style($checkbox-off-border-light, $checkbox-on-bg-light, $checkbox-off-border-light);
18 | }
19 | .checkbox-stable {
20 | @include checkbox-style($checkbox-off-border-stable, $checkbox-on-bg-stable, $checkbox-off-border-stable);
21 | }
22 | .checkbox-positive {
23 | @include checkbox-style($checkbox-off-border-positive, $checkbox-on-bg-positive, $checkbox-off-border-positive);
24 | }
25 | .checkbox-calm {
26 | @include checkbox-style($checkbox-off-border-calm, $checkbox-on-bg-calm, $checkbox-off-border-calm);
27 | }
28 | .checkbox-assertive {
29 | @include checkbox-style($checkbox-off-border-assertive, $checkbox-on-bg-assertive, $checkbox-off-border-assertive);
30 | }
31 | .checkbox-balanced {
32 | @include checkbox-style($checkbox-off-border-balanced, $checkbox-on-bg-balanced, $checkbox-off-border-balanced);
33 | }
34 | .checkbox-energized{
35 | @include checkbox-style($checkbox-off-border-energized, $checkbox-on-bg-energized, $checkbox-off-border-energized);
36 | }
37 | .checkbox-royal {
38 | @include checkbox-style($checkbox-off-border-royal, $checkbox-on-bg-royal, $checkbox-off-border-royal);
39 | }
40 | .checkbox-dark {
41 | @include checkbox-style($checkbox-off-border-dark, $checkbox-on-bg-dark, $checkbox-off-border-dark);
42 | }
43 |
44 | .checkbox input:disabled:before,
45 | .checkbox input:disabled + .checkbox-icon:before {
46 | border-color: $checkbox-off-border-light;
47 | }
48 |
49 | .checkbox input:disabled:checked:before,
50 | .checkbox input:disabled:checked + .checkbox-icon:before {
51 | background: $checkbox-on-bg-light;
52 | }
53 |
54 |
55 | .checkbox.checkbox-input-hidden input {
56 | display: none !important;
57 | }
58 |
59 | .checkbox input,
60 | .checkbox-icon {
61 | position: relative;
62 | width: $checkbox-width;
63 | height: $checkbox-height;
64 | display: block;
65 | border: 0;
66 | background: transparent;
67 | cursor: pointer;
68 | -webkit-appearance: none;
69 |
70 | &:before {
71 | // what the checkbox looks like when its not checked
72 | display: table;
73 | width: 100%;
74 | height: 100%;
75 | border-width: $checkbox-border-width;
76 | border-style: solid;
77 | border-radius: $checkbox-border-radius;
78 | background: $checkbox-off-bg-color;
79 | content: ' ';
80 | @include transition(background-color 20ms ease-in-out);
81 | }
82 | }
83 |
84 | .checkbox input:checked:before,
85 | input:checked + .checkbox-icon:before {
86 | border-width: $checkbox-border-width + 1;
87 | }
88 |
89 | // the checkmark within the box
90 | .checkbox input:after,
91 | .checkbox-icon:after {
92 | @include transition(opacity .05s ease-in-out);
93 | @include rotate(-45deg);
94 | position: absolute;
95 | top: 33%;
96 | left: 25%;
97 | display: table;
98 | width: ($checkbox-width / 2);
99 | height: ($checkbox-width / 4) - 1;
100 | border: $checkbox-check-width solid $checkbox-check-color;
101 | border-top: 0;
102 | border-right: 0;
103 | content: ' ';
104 | opacity: 0;
105 | }
106 |
107 | .platform-android .checkbox-platform input:before,
108 | .platform-android .checkbox-platform .checkbox-icon:before,
109 | .checkbox-square input:before,
110 | .checkbox-square .checkbox-icon:before {
111 | border-radius: 2px;
112 | width: 72%;
113 | height: 72%;
114 | margin-top: 14%;
115 | margin-left: 14%;
116 | border-width: 2px;
117 | }
118 |
119 | .platform-android .checkbox-platform input:after,
120 | .platform-android .checkbox-platform .checkbox-icon:after,
121 | .checkbox-square input:after,
122 | .checkbox-square .checkbox-icon:after {
123 | border-width: 2px;
124 | top: 19%;
125 | left: 25%;
126 | width: ($checkbox-width / 2) - 1;
127 | height: 7px;
128 | }
129 |
130 | .grade-c .checkbox input:after,
131 | .grade-c .checkbox-icon:after {
132 | @include rotate(0);
133 | top: 3px;
134 | left: 4px;
135 | border: none;
136 | color: $checkbox-check-color;
137 | content: '\2713';
138 | font-weight: bold;
139 | font-size: 20px;
140 | }
141 |
142 | // what the checkmark looks like when its checked
143 | .checkbox input:checked:after,
144 | input:checked + .checkbox-icon:after {
145 | opacity: 1;
146 | }
147 |
148 | // make sure item content have enough padding on left to fit the checkbox
149 | .item-checkbox {
150 | padding-left: ($item-padding * 2) + $checkbox-width;
151 |
152 | &.active {
153 | box-shadow: none;
154 | }
155 | }
156 |
157 | // position the checkbox to the left within an item
158 | .item-checkbox .checkbox {
159 | position: absolute;
160 | top: 50%;
161 | right: $item-padding / 2;
162 | left: $item-padding / 2;
163 | z-index: $z-index-item-checkbox;
164 | margin-top: (($checkbox-height + ($checkbox-height / 2)) / 2) * -1;
165 | }
166 |
167 |
168 | .item-checkbox.item-checkbox-right {
169 | padding-right: ($item-padding * 2) + $checkbox-width;
170 | padding-left: $item-padding;
171 | }
172 |
173 | .item-checkbox-right .checkbox input,
174 | .item-checkbox-right .checkbox-icon {
175 | float: right;
176 | }
177 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_grid.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Grid
3 | * --------------------------------------------------
4 | * Using flexbox for the grid, inspired by Philip Walton:
5 | * http://philipwalton.github.io/solved-by-flexbox/demos/grids/
6 | * By default each .col within a .row will evenly take up
7 | * available width, and the height of each .col with take
8 | * up the height of the tallest .col in the same .row.
9 | */
10 |
11 | .row {
12 | @include display-flex();
13 | padding: ($grid-padding-width / 2);
14 | width: 100%;
15 | }
16 |
17 | .row-wrap {
18 | @include flex-wrap(wrap);
19 | }
20 |
21 | .row-no-padding {
22 | padding: 0;
23 |
24 | > .col {
25 | padding: 0;
26 | }
27 | }
28 |
29 | .row + .row {
30 | margin-top: ($grid-padding-width / 2) * -1;
31 | padding-top: 0;
32 | }
33 |
34 | .col {
35 | @include flex(1);
36 | display: block;
37 | padding: ($grid-padding-width / 2);
38 | width: 100%;
39 | }
40 |
41 |
42 | /* Vertically Align Columns */
43 | /* .row-* vertically aligns every .col in the .row */
44 | .row-top {
45 | @include align-items(flex-start);
46 | }
47 | .row-bottom {
48 | @include align-items(flex-end);
49 | }
50 | .row-center {
51 | @include align-items(center);
52 | }
53 | .row-stretch {
54 | @include align-items(stretch);
55 | }
56 | .row-baseline {
57 | @include align-items(baseline);
58 | }
59 |
60 | /* .col-* vertically aligns an individual .col */
61 | .col-top {
62 | @include align-self(flex-start);
63 | }
64 | .col-bottom {
65 | @include align-self(flex-end);
66 | }
67 | .col-center {
68 | @include align-self(center);
69 | }
70 |
71 | /* Column Offsets */
72 | .col-offset-10 {
73 | margin-left: 10%;
74 | }
75 | .col-offset-20 {
76 | margin-left: 20%;
77 | }
78 | .col-offset-25 {
79 | margin-left: 25%;
80 | }
81 | .col-offset-33, .col-offset-34 {
82 | margin-left: 33.3333%;
83 | }
84 | .col-offset-50 {
85 | margin-left: 50%;
86 | }
87 | .col-offset-66, .col-offset-67 {
88 | margin-left: 66.6666%;
89 | }
90 | .col-offset-75 {
91 | margin-left: 75%;
92 | }
93 | .col-offset-80 {
94 | margin-left: 80%;
95 | }
96 | .col-offset-90 {
97 | margin-left: 90%;
98 | }
99 |
100 |
101 | /* Explicit Column Percent Sizes */
102 | /* By default each grid column will evenly distribute */
103 | /* across the grid. However, you can specify individual */
104 | /* columns to take up a certain size of the available area */
105 | .col-10 {
106 | @include flex(0, 0, 10%);
107 | max-width: 10%;
108 | }
109 | .col-20 {
110 | @include flex(0, 0, 20%);
111 | max-width: 20%;
112 | }
113 | .col-25 {
114 | @include flex(0, 0, 25%);
115 | max-width: 25%;
116 | }
117 | .col-33, .col-34 {
118 | @include flex(0, 0, 33.3333%);
119 | max-width: 33.3333%;
120 | }
121 | .col-50 {
122 | @include flex(0, 0, 50%);
123 | max-width: 50%;
124 | }
125 | .col-66, .col-67 {
126 | @include flex(0, 0, 66.6666%);
127 | max-width: 66.6666%;
128 | }
129 | .col-75 {
130 | @include flex(0, 0, 75%);
131 | max-width: 75%;
132 | }
133 | .col-80 {
134 | @include flex(0, 0, 80%);
135 | max-width: 80%;
136 | }
137 | .col-90 {
138 | @include flex(0, 0, 90%);
139 | max-width: 90%;
140 | }
141 |
142 |
143 | /* Responsive Grid Classes */
144 | /* Adding a class of responsive-X to a row */
145 | /* will trigger the flex-direction to */
146 | /* change to column and add some margin */
147 | /* to any columns in the row for clearity */
148 |
149 | @include responsive-grid-break('.responsive-sm', $grid-responsive-sm-break);
150 | @include responsive-grid-break('.responsive-md', $grid-responsive-md-break);
151 | @include responsive-grid-break('.responsive-lg', $grid-responsive-lg-break);
152 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_list.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Lists
4 | * --------------------------------------------------
5 | */
6 |
7 | .list {
8 | position: relative;
9 | padding-top: $item-border-width;
10 | padding-bottom: $item-border-width;
11 | padding-left: 0; // reset padding because ul and ol
12 | margin-bottom: 20px;
13 | }
14 | .list:last-child {
15 | margin-bottom: 0px;
16 | &.card{
17 | margin-bottom:40px;
18 | }
19 | }
20 |
21 |
22 | /**
23 | * List Header
24 | * --------------------------------------------------
25 | */
26 |
27 | .list-header {
28 | margin-top: $list-header-margin-top;
29 | padding: $list-header-padding;
30 | background-color: $list-header-bg;
31 | color: $list-header-color;
32 | font-weight: bold;
33 | }
34 |
35 | // when its a card make sure it doesn't duplicate top and bottom borders
36 | .card.list .list-item {
37 | padding-right: 1px;
38 | padding-left: 1px;
39 | }
40 |
41 |
42 | /**
43 | * Cards and Inset Lists
44 | * --------------------------------------------------
45 | * A card and list-inset are close to the same thing, except a card as a box shadow.
46 | */
47 |
48 | .card,
49 | .list-inset {
50 | overflow: hidden;
51 | margin: ($content-padding * 2) $content-padding;
52 | border-radius: $card-border-radius;
53 | background-color: $card-body-bg;
54 | }
55 |
56 | .card {
57 | padding-top: $item-border-width;
58 | padding-bottom: $item-border-width;
59 | box-shadow: $card-box-shadow;
60 |
61 | .item {
62 | border-left: 0;
63 | border-right: 0;
64 | }
65 | .item:first-child {
66 | border-top: 0;
67 | }
68 | .item:last-child {
69 | border-bottom: 0;
70 | }
71 | }
72 |
73 | .padding {
74 | .card, .list-inset {
75 | margin-left: 0;
76 | margin-right: 0;
77 | }
78 | }
79 |
80 | .card .item,
81 | .list-inset .item,
82 | .padding > .list .item
83 | {
84 | &:first-child {
85 | border-top-left-radius: $card-border-radius;
86 | border-top-right-radius: $card-border-radius;
87 |
88 | .item-content {
89 | border-top-left-radius: $card-border-radius;
90 | border-top-right-radius: $card-border-radius;
91 | }
92 | }
93 | &:last-child {
94 | border-bottom-right-radius: $card-border-radius;
95 | border-bottom-left-radius: $card-border-radius;
96 |
97 | .item-content {
98 | border-bottom-right-radius: $card-border-radius;
99 | border-bottom-left-radius: $card-border-radius;
100 | }
101 | }
102 | }
103 |
104 | .card .item:last-child,
105 | .list-inset .item:last-child {
106 | margin-bottom: $item-border-width * -1;
107 | }
108 |
109 | .card .item,
110 | .list-inset .item,
111 | .padding > .list .item,
112 | .padding-horizontal > .list .item {
113 | margin-right: 0;
114 | margin-left: 0;
115 |
116 | &.item-input input {
117 | padding-right: 44px;
118 | }
119 | }
120 | .padding-left > .list .item {
121 | margin-left: 0;
122 | }
123 | .padding-right > .list .item {
124 | margin-right: 0;
125 | }
126 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_loading.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Loading
4 | * --------------------------------------------------
5 | */
6 |
7 | .loading-container {
8 | position: absolute;
9 | left: 0;
10 | top: 0;
11 | right: 0;
12 | bottom: 0;
13 |
14 | z-index: $z-index-loading;
15 |
16 | @include display-flex();
17 | @include justify-content(center);
18 | @include align-items(center);
19 |
20 | @include transition(0.2s opacity linear);
21 | visibility: hidden;
22 | opacity: 0;
23 |
24 | &:not(.visible) .icon,
25 | &:not(.visible) .spinner{
26 | display: none;
27 | }
28 | &.visible {
29 | visibility: visible;
30 | }
31 | &.active {
32 | opacity: 1;
33 | }
34 |
35 | .loading {
36 | padding: $loading-padding;
37 |
38 | border-radius: $loading-border-radius;
39 | background-color: $loading-bg-color;
40 |
41 | color: $loading-text-color;
42 |
43 | text-align: center;
44 | text-overflow: ellipsis;
45 | font-size: $loading-font-size;
46 |
47 | h1, h2, h3, h4, h5, h6 {
48 | color: $loading-text-color;
49 | }
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_menu.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Menus
4 | * --------------------------------------------------
5 | * Side panel structure
6 | */
7 |
8 | .menu {
9 | position: absolute;
10 | top: 0;
11 | bottom: 0;
12 | z-index: $z-index-menu;
13 | overflow: hidden;
14 |
15 | min-height: 100%;
16 | max-height: 100%;
17 | width: $menu-width;
18 |
19 | background-color: $menu-bg;
20 |
21 | .scroll-content {
22 | z-index: $z-index-menu-scroll-content;
23 | }
24 |
25 | .bar-header {
26 | z-index: $z-index-menu-bar-header;
27 | }
28 | }
29 |
30 | .menu-content {
31 | @include transform(none);
32 | box-shadow: $menu-side-shadow;
33 | }
34 |
35 | .menu-open .menu-content .pane,
36 | .menu-open .menu-content .scroll-content {
37 | pointer-events: none;
38 | overflow: hidden;
39 | }
40 |
41 | .grade-b .menu-content,
42 | .grade-c .menu-content {
43 | @include box-sizing(content-box);
44 | right: -1px;
45 | left: -1px;
46 | border-right: 1px solid #ccc;
47 | border-left: 1px solid #ccc;
48 | box-shadow: none;
49 | }
50 |
51 | .menu-left {
52 | left: 0;
53 | }
54 |
55 | .menu-right {
56 | right: 0;
57 | }
58 |
59 | .aside-open.aside-resizing .menu-right {
60 | display: none;
61 | }
62 |
63 | .menu-animated {
64 | @include transition-transform($menu-animation-speed ease);
65 | }
66 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_modal.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Modals
4 | * --------------------------------------------------
5 | * Modals are independent windows that slide in from off-screen.
6 | */
7 |
8 | .modal-backdrop,
9 | .modal-backdrop-bg {
10 | position: fixed;
11 | top: 0;
12 | left: 0;
13 | z-index: $z-index-modal;
14 | width: 100%;
15 | height: 100%;
16 | }
17 |
18 | .modal-backdrop-bg {
19 | pointer-events: none;
20 | }
21 |
22 | .modal {
23 | display: block;
24 | position: absolute;
25 | top: 0;
26 | z-index: $z-index-modal;
27 | overflow: hidden;
28 | min-height: 100%;
29 | width: 100%;
30 | background-color: $modal-bg-color;
31 | }
32 |
33 | @media (min-width: $modal-inset-mode-break-point) {
34 | // inset mode is when the modal doesn't fill the entire
35 | // display but instead is centered within a large display
36 | .modal {
37 | top: $modal-inset-mode-top;
38 | right: $modal-inset-mode-right;
39 | bottom: $modal-inset-mode-bottom;
40 | left: $modal-inset-mode-left;
41 | min-height: $modal-inset-mode-min-height;
42 | width: (100% - $modal-inset-mode-left - $modal-inset-mode-right);
43 | }
44 |
45 | .modal.ng-leave-active {
46 | bottom: 0;
47 | }
48 |
49 | // remove ios header padding from inset header
50 | .platform-ios.platform-cordova .modal-wrapper .modal {
51 | .bar-header:not(.bar-subheader) {
52 | height: $bar-height;
53 | > * {
54 | margin-top: 0;
55 | }
56 | }
57 | .tabs-top > .tabs,
58 | .tabs.tabs-top {
59 | top: $bar-height;
60 | }
61 | .has-header,
62 | .bar-subheader {
63 | top: $bar-height;
64 | }
65 | .has-subheader {
66 | top: $bar-height + $bar-subheader-height;
67 | }
68 | .has-header.has-tabs-top {
69 | top: $bar-height + $tabs-height;
70 | }
71 | .has-header.has-subheader.has-tabs-top {
72 | top: $bar-height + $bar-subheader-height + $tabs-height;
73 | }
74 | }
75 |
76 | .modal-backdrop-bg {
77 | @include transition(opacity 300ms ease-in-out);
78 | background-color: $modal-backdrop-bg-active;
79 | opacity: 0;
80 | }
81 |
82 | .active .modal-backdrop-bg {
83 | opacity: 0.5;
84 | }
85 | }
86 |
87 | // disable clicks on all but the modal
88 | .modal-open {
89 | pointer-events: none;
90 |
91 | .modal,
92 | .modal-backdrop {
93 | pointer-events: auto;
94 | }
95 | // prevent clicks on modal when loading overlay is active though
96 | &.loading-active {
97 | .modal,
98 | .modal-backdrop {
99 | pointer-events: none;
100 | }
101 | }
102 | }
103 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_platform.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Platform
4 | * --------------------------------------------------
5 | * Platform specific tweaks
6 | */
7 |
8 | .platform-ios.platform-cordova {
9 | // iOS has a status bar which sits on top of the header.
10 | // Bump down everything to make room for it. However, if
11 | // if its in Cordova, and set to fullscreen, then disregard the bump.
12 | &:not(.fullscreen) {
13 | .bar-header:not(.bar-subheader) {
14 | height: $bar-height + $ios-statusbar-height;
15 |
16 | &.item-input-inset .item-input-wrapper {
17 | margin-top: 19px !important;
18 | }
19 |
20 | > * {
21 | margin-top: $ios-statusbar-height;
22 | }
23 | }
24 | .tabs-top > .tabs,
25 | .tabs.tabs-top {
26 | top: $bar-height + $ios-statusbar-height;
27 | }
28 |
29 | .has-header,
30 | .bar-subheader {
31 | top: $bar-height + $ios-statusbar-height;
32 | }
33 | .has-subheader {
34 | top: $bar-height + $bar-subheader-height + $ios-statusbar-height;
35 | }
36 | .has-header.has-tabs-top {
37 | top: $bar-height + $tabs-height + $ios-statusbar-height;
38 | }
39 | .has-header.has-subheader.has-tabs-top {
40 | top: $bar-height + $bar-subheader-height + $tabs-height + $ios-statusbar-height;
41 | }
42 | }
43 | .popover{
44 | .bar-header:not(.bar-subheader) {
45 | height: $bar-height;
46 | &.item-input-inset .item-input-wrapper {
47 | margin-top: -1px;
48 | }
49 | > * {
50 | margin-top: 0;
51 | }
52 | }
53 | .has-header,
54 | .bar-subheader {
55 | top: $bar-height;
56 | }
57 | .has-subheader {
58 | top: $bar-height + $bar-subheader-height;
59 | }
60 | }
61 | &.status-bar-hide {
62 | // Cordova doesn't adjust the body height correctly, this makes up for it
63 | margin-bottom: 20px;
64 | }
65 | }
66 |
67 | @media (orientation:landscape) {
68 | .platform-ios.platform-browser.platform-ipad {
69 | position: fixed; // required for iPad 7 Safari
70 | }
71 | }
72 |
73 | .platform-c:not(.enable-transitions) * {
74 | // disable transitions on grade-c devices (Android 2)
75 | -webkit-transition: none !important;
76 | transition: none !important;
77 | }
78 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_popover.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Popovers
4 | * --------------------------------------------------
5 | * Popovers are independent views which float over content
6 | */
7 |
8 | .popover-backdrop {
9 | position: fixed;
10 | top: 0;
11 | left: 0;
12 | z-index: $z-index-popover;
13 | width: 100%;
14 | height: 100%;
15 | background-color: $popover-backdrop-bg-inactive;
16 |
17 | &.active {
18 | background-color: $popover-backdrop-bg-active;
19 | }
20 | }
21 |
22 | .popover {
23 | position: absolute;
24 | top: 25%;
25 | left: 50%;
26 | z-index: $z-index-popover;
27 | display: block;
28 | margin-top: 12px;
29 | margin-left: -$popover-width / 2;
30 | height: $popover-height;
31 | width: $popover-width;
32 | background-color: $popover-bg-color;
33 | box-shadow: $popover-box-shadow;
34 | opacity: 0;
35 |
36 | .item:first-child {
37 | border-top: 0;
38 | }
39 |
40 | .item:last-child {
41 | border-bottom: 0;
42 | }
43 |
44 | &.popover-bottom {
45 | margin-top: -12px;
46 | }
47 | }
48 |
49 |
50 | // Set popover border-radius
51 | .popover,
52 | .popover .bar-header {
53 | border-radius: $popover-border-radius;
54 | }
55 | .popover .scroll-content {
56 | z-index: 1;
57 | margin: 2px 0;
58 | }
59 | .popover .bar-header {
60 | border-bottom-right-radius: 0;
61 | border-bottom-left-radius: 0;
62 | }
63 | .popover .has-header {
64 | border-top-right-radius: 0;
65 | border-top-left-radius: 0;
66 | }
67 | .popover-arrow {
68 | display: none;
69 | }
70 |
71 |
72 | // iOS Popover
73 | .platform-ios {
74 |
75 | .popover {
76 | box-shadow: $popover-box-shadow-ios;
77 | border-radius: $popover-border-radius-ios;
78 | }
79 | .popover .bar-header {
80 | @include border-top-radius($popover-border-radius-ios);
81 | }
82 | .popover .scroll-content {
83 | margin: 8px 0;
84 | border-radius: $popover-border-radius-ios;
85 | }
86 | .popover .scroll-content.has-header {
87 | margin-top: 0;
88 | }
89 | .popover-arrow {
90 | position: absolute;
91 | display: block;
92 | top: -17px;
93 | width: 30px;
94 | height: 19px;
95 | overflow: hidden;
96 |
97 | &:after {
98 | position: absolute;
99 | top: 12px;
100 | left: 5px;
101 | width: 20px;
102 | height: 20px;
103 | background-color: $popover-bg-color;
104 | border-radius: 3px;
105 | content: '';
106 | @include rotate(-45deg);
107 | }
108 | }
109 | .popover-bottom .popover-arrow {
110 | top: auto;
111 | bottom: -10px;
112 | &:after {
113 | top: -6px;
114 | }
115 | }
116 | }
117 |
118 |
119 | // Android Popover
120 | .platform-android {
121 |
122 | .popover {
123 | margin-top: -32px;
124 | background-color: $popover-bg-color-android;
125 | box-shadow: $popover-box-shadow-android;
126 |
127 | .item {
128 | border-color: $popover-bg-color-android;
129 | background-color: $popover-bg-color-android;
130 | color: #4d4d4d;
131 | }
132 | &.popover-bottom {
133 | margin-top: 32px;
134 | }
135 | }
136 |
137 | .popover-backdrop,
138 | .popover-backdrop.active {
139 | background-color: transparent;
140 | }
141 | }
142 |
143 |
144 | // disable clicks on all but the popover
145 | .popover-open {
146 | pointer-events: none;
147 |
148 | .popover,
149 | .popover-backdrop {
150 | pointer-events: auto;
151 | }
152 | // prevent clicks on popover when loading overlay is active though
153 | &.loading-active {
154 | .popover,
155 | .popover-backdrop {
156 | pointer-events: none;
157 | }
158 | }
159 | }
160 |
161 |
162 | // wider popover on larger viewports
163 | @media (min-width: $popover-large-break-point) {
164 | .popover {
165 | width: $popover-large-width;
166 | }
167 | }
168 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_popup.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Popups
4 | * --------------------------------------------------
5 | */
6 |
7 | .popup-container {
8 | position: absolute;
9 | top: 0;
10 | left: 0;
11 | bottom: 0;
12 | right: 0;
13 | background: rgba(0,0,0,0);
14 |
15 | @include display-flex();
16 | @include justify-content(center);
17 | @include align-items(center);
18 |
19 | z-index: $z-index-popup;
20 |
21 | // Start hidden
22 | visibility: hidden;
23 | &.popup-showing {
24 | visibility: visible;
25 | }
26 |
27 | &.popup-hidden .popup {
28 | @include animation-name(scaleOut);
29 | @include animation-duration($popup-leave-animation-duration);
30 | @include animation-timing-function(ease-in-out);
31 | @include animation-fill-mode(both);
32 | }
33 |
34 | &.active .popup {
35 | @include animation-name(superScaleIn);
36 | @include animation-duration($popup-enter-animation-duration);
37 | @include animation-timing-function(ease-in-out);
38 | @include animation-fill-mode(both);
39 | }
40 |
41 | .popup {
42 | width: $popup-width;
43 | max-width: 100%;
44 | max-height: 90%;
45 |
46 | border-radius: $popup-border-radius;
47 | background-color: $popup-background-color;
48 |
49 | @include display-flex();
50 | @include flex-direction(column);
51 | }
52 |
53 | input,
54 | textarea {
55 | width: 100%;
56 | }
57 | }
58 |
59 | .popup-head {
60 | padding: 15px 10px;
61 | border-bottom: 1px solid #eee;
62 | text-align: center;
63 | }
64 | .popup-title {
65 | margin: 0;
66 | padding: 0;
67 | font-size: 15px;
68 | }
69 | .popup-sub-title {
70 | margin: 5px 0 0 0;
71 | padding: 0;
72 | font-weight: normal;
73 | font-size: 11px;
74 | }
75 | .popup-body {
76 | padding: 10px;
77 | overflow: auto;
78 | }
79 |
80 | .popup-buttons {
81 | @include display-flex();
82 | @include flex-direction(row);
83 | padding: 10px;
84 | min-height: $popup-button-min-height + 20;
85 |
86 | .button {
87 | @include flex(1);
88 | display: block;
89 | min-height: $popup-button-min-height;
90 | border-radius: $popup-button-border-radius;
91 | line-height: $popup-button-line-height;
92 |
93 | margin-right: 5px;
94 | &:last-child {
95 | margin-right: 0px;
96 | }
97 | }
98 | }
99 |
100 | .popup-open {
101 | pointer-events: none;
102 |
103 | &.modal-open .modal {
104 | pointer-events: none;
105 | }
106 |
107 | .popup-backdrop, .popup {
108 | pointer-events: auto;
109 | }
110 | }
111 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_progress.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Progress
4 | * --------------------------------------------------
5 | */
6 |
7 | progress {
8 | display: block;
9 | margin: $progress-margin;
10 | width: $progress-width;
11 | }
12 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_radio.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Radio Button Inputs
4 | * --------------------------------------------------
5 | */
6 |
7 | .item-radio {
8 | padding: 0;
9 |
10 | &:hover {
11 | cursor: pointer;
12 | }
13 | }
14 |
15 | .item-radio .item-content {
16 | /* give some room to the right for the checkmark icon */
17 | padding-right: $item-padding * 4;
18 | }
19 |
20 | .item-radio .radio-icon {
21 | /* checkmark icon will be hidden by default */
22 | position: absolute;
23 | top: 0;
24 | right: 0;
25 | z-index: $z-index-item-radio;
26 | visibility: hidden;
27 | padding: $item-padding - 2;
28 | height: 100%;
29 | font-size: 24px;
30 | }
31 |
32 | .item-radio input {
33 | /* hide any radio button inputs elements (the ugly circles) */
34 | position: absolute;
35 | left: -9999px;
36 |
37 | &:checked ~ .item-content {
38 | /* style the item content when its checked */
39 | background: #f7f7f7;
40 | }
41 |
42 | &:checked ~ .radio-icon {
43 | /* show the checkmark icon when its checked */
44 | visibility: visible;
45 | }
46 | }
47 |
48 | // Hack for Android to correctly display the checked item
49 | // http://timpietrusky.com/advanced-checkbox-hack
50 | .platform-android.grade-b .item-radio,
51 | .platform-android.grade-c .item-radio {
52 | -webkit-animation: androidCheckedbugfix infinite 1s;
53 | }
54 | @-webkit-keyframes androidCheckedbugfix {
55 | from { padding: 0; }
56 | to { padding: 0; }
57 | }
58 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_range.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Range
4 | * --------------------------------------------------
5 | */
6 |
7 | .range input{
8 | display: inline-block;
9 | overflow: hidden;
10 | margin-top: 5px;
11 | margin-bottom: 5px;
12 | padding-right: 2px;
13 | padding-left: 1px;
14 | width: auto;
15 | height: $range-slider-height + 15;
16 | outline: none;
17 | background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, $range-default-track-bg), color-stop(100%, $range-default-track-bg));
18 | background: linear-gradient(to right, $range-default-track-bg 0%, $range-default-track-bg 100%);
19 | background-position: center;
20 | background-size: 99% $range-track-height;
21 | background-repeat: no-repeat;
22 | -webkit-appearance: none;
23 |
24 | &::-webkit-slider-thumb {
25 | position: relative;
26 | width: $range-slider-width;
27 | height: $range-slider-height;
28 | border-radius: $range-slider-border-radius;
29 | background-color: $toggle-handle-off-bg-color;
30 | box-shadow: $range-slider-box-shadow;
31 | cursor: pointer;
32 | -webkit-appearance: none;
33 | border: 0;
34 | }
35 |
36 | &::-webkit-slider-thumb:before{
37 | /* what creates the colorful line on the left side of the slider */
38 | position: absolute;
39 | top: ($range-slider-height / 2) - ($range-track-height / 2);
40 | left: -2001px;
41 | width: 2000px;
42 | height: $range-track-height;
43 | background: $dark;
44 | content: ' ';
45 | }
46 |
47 | &::-webkit-slider-thumb:after {
48 | /* create a larger (but hidden) hit area */
49 | position: absolute;
50 | top: -15px;
51 | left: -15px;
52 | padding: 30px;
53 | content: ' ';
54 | //background: red;
55 | //opacity: .5;
56 | }
57 | &::-ms-track{
58 | background: transparent;
59 | border-color: transparent;
60 | border-width: 11px 0 16px;
61 | color:transparent;
62 | margin-top:20px;
63 | }
64 | &::-ms-thumb {
65 | width: $range-slider-width;
66 | height: $range-slider-height;
67 | border-radius: $range-slider-border-radius;
68 | background-color: $toggle-handle-off-bg-color;
69 | border-color:$toggle-handle-off-bg-color;
70 | box-shadow: $range-slider-box-shadow;
71 | margin-left:1px;
72 | margin-right:1px;
73 | outline:none;
74 | }
75 | &::-ms-fill-lower{
76 | height: $range-track-height;
77 | background:$dark;
78 | }
79 | &::-ms-fill-upper {
80 | height: $range-track-height;
81 | background:$range-default-track-bg;
82 | }
83 | }
84 |
85 | .range {
86 | @include display-flex();
87 | @include align-items(center);
88 | padding: 2px 11px;
89 |
90 | &.range-light {
91 | input { @include range-style($range-light-track-bg); }
92 | }
93 | &.range-stable {
94 | input { @include range-style($range-stable-track-bg); }
95 | }
96 | &.range-positive {
97 | input { @include range-style($range-positive-track-bg); }
98 | }
99 | &.range-calm {
100 | input { @include range-style($range-calm-track-bg); }
101 | }
102 | &.range-balanced {
103 | input { @include range-style($range-balanced-track-bg); }
104 | }
105 | &.range-assertive {
106 | input { @include range-style($range-assertive-track-bg); }
107 | }
108 | &.range-energized {
109 | input { @include range-style($range-energized-track-bg); }
110 | }
111 | &.range-royal {
112 | input { @include range-style($range-royal-track-bg); }
113 | }
114 | &.range-dark {
115 | input { @include range-style($range-dark-track-bg); }
116 | }
117 | }
118 |
119 | .range .icon {
120 | @include flex(0);
121 | display: block;
122 | min-width: $range-icon-size;
123 | text-align: center;
124 | font-size: $range-icon-size;
125 | }
126 |
127 | .range input {
128 | @include flex(1);
129 | display: block;
130 | margin-right: 10px;
131 | margin-left: 10px;
132 | }
133 |
134 | .range-label {
135 | @include flex(0, 0, auto);
136 | display: block;
137 | white-space: nowrap;
138 | }
139 |
140 | .range-label:first-child {
141 | padding-left: 5px;
142 | }
143 | .range input + .range-label {
144 | padding-right: 5px;
145 | padding-left: 0;
146 | }
147 |
148 | // WP range height must be auto
149 | .platform-windowsphone{
150 | .range input{
151 | height:auto;
152 | }
153 | }
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_refresher.scss:
--------------------------------------------------------------------------------
1 |
2 | // Scroll refresher (for pull to refresh)
3 | .scroll-refresher {
4 | position: absolute;
5 | top: -60px;
6 | right: 0;
7 | left: 0;
8 | overflow: hidden;
9 | margin: auto;
10 | height: 60px;
11 | .ionic-refresher-content {
12 | position: absolute;
13 | bottom: 15px;
14 | left: 0;
15 | width: 100%;
16 | color: $scroll-refresh-icon-color;
17 | text-align: center;
18 |
19 | font-size: 30px;
20 |
21 | .text-refreshing,
22 | .text-pulling {
23 | font-size: 16px;
24 | line-height: 16px;
25 | }
26 | &.ionic-refresher-with-text {
27 | bottom: 10px;
28 | }
29 | }
30 |
31 | .icon-refreshing,
32 | .icon-pulling {
33 | width: 100%;
34 | -webkit-backface-visibility: hidden;
35 | backface-visibility: hidden;
36 | -webkit-transform-style: preserve-3d;
37 | transform-style: preserve-3d;
38 | }
39 | .icon-pulling {
40 | @include animation-name(refresh-spin-back);
41 | @include animation-duration(200ms);
42 | @include animation-timing-function(linear);
43 | @include animation-fill-mode(none);
44 | -webkit-transform: translate3d(0,0,0) rotate(0deg);
45 | transform: translate3d(0,0,0) rotate(0deg);
46 | }
47 | .icon-refreshing,
48 | .text-refreshing {
49 | display: none;
50 | }
51 | .icon-refreshing {
52 | @include animation-duration(1.5s);
53 | }
54 |
55 | &.active {
56 | .icon-pulling:not(.pulling-rotation-disabled) {
57 | @include animation-name(refresh-spin);
58 | -webkit-transform: translate3d(0,0,0) rotate(-180deg);
59 | transform: translate3d(0,0,0) rotate(-180deg);
60 | }
61 | &.refreshing {
62 | @include transition(-webkit-transform .2s);
63 | @include transition(transform .2s);
64 | -webkit-transform: scale(1,1);
65 | transform: scale(1,1);
66 |
67 | .icon-pulling,
68 | .text-pulling {
69 | display: none;
70 | }
71 | .icon-refreshing,
72 | .text-refreshing {
73 | display: block;
74 | }
75 | &.refreshing-tail {
76 | -webkit-transform: scale(0,0);
77 | transform: scale(0,0);
78 | }
79 | }
80 | }
81 | }
82 | .overflow-scroll > .scroll{
83 | &.overscroll{
84 | position:fixed;
85 | }
86 | -webkit-overflow-scrolling:touch;
87 | width:100%;
88 | }
89 |
90 | @-webkit-keyframes refresh-spin {
91 | 0% { -webkit-transform: translate3d(0,0,0) rotate(0); }
92 | 100% { -webkit-transform: translate3d(0,0,0) rotate(180deg); }
93 | }
94 |
95 | @keyframes refresh-spin {
96 | 0% { transform: translate3d(0,0,0) rotate(0); }
97 | 100% { transform: translate3d(0,0,0) rotate(180deg); }
98 | }
99 |
100 | @-webkit-keyframes refresh-spin-back {
101 | 0% { -webkit-transform: translate3d(0,0,0) rotate(180deg); }
102 | 100% { -webkit-transform: translate3d(0,0,0) rotate(0); }
103 | }
104 |
105 | @keyframes refresh-spin-back {
106 | 0% { transform: translate3d(0,0,0) rotate(180deg); }
107 | 100% { transform: translate3d(0,0,0) rotate(0); }
108 | }
109 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_select.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Select
4 | * --------------------------------------------------
5 | */
6 |
7 | .item-select {
8 | position: relative;
9 |
10 | select {
11 | @include appearance(none);
12 | position: absolute;
13 | top: 0;
14 | bottom: 0;
15 | right: 0;
16 | padding: 0 ($item-padding * 3) 0 $item-padding;
17 | max-width: 65%;
18 |
19 | border: none;
20 | background: $item-default-bg;
21 | color: #333;
22 |
23 | // hack to hide default dropdown arrow in FF
24 | text-indent: .01px;
25 | text-overflow: '';
26 |
27 | white-space: nowrap;
28 | font-size: $font-size-base;
29 |
30 | cursor: pointer;
31 | direction: rtl; // right align the select text
32 | }
33 |
34 | select::-ms-expand {
35 | // hide default dropdown arrow in IE
36 | display: none;
37 | }
38 |
39 | option {
40 | direction: ltr;
41 | }
42 |
43 | &:after {
44 | position: absolute;
45 | top: 50%;
46 | right: $item-padding;
47 | margin-top: -3px;
48 | width: 0;
49 | height: 0;
50 | border-top: 5px solid;
51 | border-right: 5px solid rgba(0, 0, 0, 0);
52 | border-left: 5px solid rgba(0, 0, 0, 0);
53 | color: #999;
54 | content: "";
55 | pointer-events: none;
56 | }
57 | &.item-light {
58 | select{
59 | background:$item-light-bg;
60 | color:$item-light-text;
61 | }
62 | }
63 | &.item-stable {
64 | select{
65 | background:$item-stable-bg;
66 | color:$item-stable-text;
67 | }
68 | &:after, .input-label{
69 | color:darken($item-stable-border,30%);
70 | }
71 | }
72 | &.item-positive {
73 | select{
74 | background:$item-positive-bg;
75 | color:$item-positive-text;
76 | }
77 | &:after, .input-label{
78 | color:$item-positive-text;
79 | }
80 | }
81 | &.item-calm {
82 | select{
83 | background:$item-calm-bg;
84 | color:$item-calm-text;
85 | }
86 | &:after, .input-label{
87 | color:$item-calm-text;
88 | }
89 | }
90 | &.item-assertive {
91 | select{
92 | background:$item-assertive-bg;
93 | color:$item-assertive-text;
94 | }
95 | &:after, .input-label{
96 | color:$item-assertive-text;
97 | }
98 | }
99 | &.item-balanced {
100 | select{
101 | background:$item-balanced-bg;
102 | color:$item-balanced-text;
103 | }
104 | &:after, .input-label{
105 | color:$item-balanced-text;
106 | }
107 | }
108 | &.item-energized {
109 | select{
110 | background:$item-energized-bg;
111 | color:$item-energized-text;
112 | }
113 | &:after, .input-label{
114 | color:$item-energized-text;
115 | }
116 | }
117 | &.item-royal {
118 | select{
119 | background:$item-royal-bg;
120 | color:$item-royal-text;
121 | }
122 | &:after, .input-label{
123 | color:$item-royal-text;
124 | }
125 | }
126 | &.item-dark {
127 | select{
128 | background:$item-dark-bg;
129 | color:$item-dark-text;
130 | }
131 | &:after, .input-label{
132 | color:$item-dark-text;
133 | }
134 | }
135 | }
136 |
137 | select {
138 | &[multiple],
139 | &[size] {
140 | height: auto;
141 | }
142 | }
143 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_slide-box.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Slide Box
4 | * --------------------------------------------------
5 | */
6 |
7 | .slider {
8 | position: relative;
9 | visibility: hidden;
10 | // Make sure items don't scroll over ever
11 | overflow: hidden;
12 | }
13 |
14 | .slider-slides {
15 | position: relative;
16 | height: 100%;
17 | }
18 |
19 | .slider-slide {
20 | position: relative;
21 | display: block;
22 | float: left;
23 | width: 100%;
24 | height: 100%;
25 | vertical-align: top;
26 | }
27 |
28 | .slider-slide-image {
29 | > img {
30 | width: 100%;
31 | }
32 | }
33 |
34 | .slider-pager {
35 | position: absolute;
36 | bottom: 20px;
37 | z-index: $z-index-slider-pager;
38 | width: 100%;
39 | height: 15px;
40 | text-align: center;
41 |
42 | .slider-pager-page {
43 | display: inline-block;
44 | margin: 0px 3px;
45 | width: 15px;
46 | color: #000;
47 | text-decoration: none;
48 |
49 | opacity: 0.3;
50 |
51 | &.active {
52 | @include transition(opacity 0.4s ease-in);
53 | opacity: 1;
54 | }
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_spinner.scss:
--------------------------------------------------------------------------------
1 | /**
2 | * Spinners
3 | * --------------------------------------------------
4 | */
5 |
6 | .spinner {
7 | svg {
8 | width: $spinner-width;
9 | height: $spinner-height;
10 | }
11 |
12 | stroke: $spinner-default-stroke;
13 | fill: $spinner-default-fill;
14 |
15 | &.spinner-light {
16 | stroke: $spinner-light-stroke;
17 | fill: $spinner-light-fill;
18 | }
19 | &.spinner-stable {
20 | stroke: $spinner-stable-stroke;
21 | fill: $spinner-stable-fill;
22 | }
23 | &.spinner-positive {
24 | stroke: $spinner-positive-stroke;
25 | fill: $spinner-positive-fill;
26 | }
27 | &.spinner-calm {
28 | stroke: $spinner-calm-stroke;
29 | fill: $spinner-calm-fill;
30 | }
31 | &.spinner-balanced {
32 | stroke: $spinner-balanced-stroke;
33 | fill: $spinner-balanced-fill;
34 | }
35 | &.spinner-assertive {
36 | stroke: $spinner-assertive-stroke;
37 | fill: $spinner-assertive-fill;
38 | }
39 | &.spinner-energized {
40 | stroke: $spinner-energized-stroke;
41 | fill: $spinner-energized-fill;
42 | }
43 | &.spinner-royal {
44 | stroke: $spinner-royal-stroke;
45 | fill: $spinner-royal-fill;
46 | }
47 | &.spinner-dark {
48 | stroke: $spinner-dark-stroke;
49 | fill: $spinner-dark-fill;
50 | }
51 | }
52 |
53 | .spinner-android {
54 | stroke: #4b8bf4;
55 | }
56 |
57 | .spinner-ios,
58 | .spinner-ios-small {
59 | stroke: #69717d;
60 | }
61 |
62 | .spinner-spiral {
63 | .stop1 {
64 | stop-color: $spinner-light-fill;
65 | stop-opacity: 0;
66 | }
67 |
68 | &.spinner-light {
69 | .stop1 {
70 | stop-color: $spinner-default-fill;
71 | }
72 | .stop2 {
73 | stop-color: $spinner-light-fill;
74 | }
75 | }
76 | &.spinner-stable .stop2 {
77 | stop-color: $spinner-stable-fill;
78 | }
79 | &.spinner-positive .stop2 {
80 | stop-color: $spinner-positive-fill;
81 | }
82 | &.spinner-calm .stop2 {
83 | stop-color: $spinner-calm-fill;
84 | }
85 | &.spinner-balanced .stop2 {
86 | stop-color: $spinner-balanced-fill;
87 | }
88 | &.spinner-assertive .stop2 {
89 | stop-color: $spinner-assertive-fill;
90 | }
91 | &.spinner-energized .stop2 {
92 | stop-color: $spinner-energized-fill;
93 | }
94 | &.spinner-royal .stop2 {
95 | stop-color: $spinner-royal-fill;
96 | }
97 | &.spinner-dark .stop2 {
98 | stop-color: $spinner-dark-fill;
99 | }
100 | }
101 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_transitions.scss:
--------------------------------------------------------------------------------
1 |
2 | // iOS View Transitions
3 | // -------------------------------
4 |
5 | $ios-transition-duration: 500ms !default;
6 | $ios-transition-timing-function: cubic-bezier(.36, .66, .04, 1) !default;
7 | $ios-transition-container-bg-color: #000 !default;
8 |
9 |
10 | [nav-view-transition="ios"] {
11 |
12 | [nav-view="entering"],
13 | [nav-view="leaving"] {
14 | @include transition-duration( $ios-transition-duration );
15 | @include transition-timing-function( $ios-transition-timing-function );
16 | -webkit-transition-property: opacity, -webkit-transform, box-shadow;
17 | transition-property: opacity, transform, box-shadow;
18 | }
19 |
20 | &[nav-view-direction="forward"],
21 | &[nav-view-direction="back"] {
22 | background-color: $ios-transition-container-bg-color;
23 | }
24 |
25 | [nav-view="active"],
26 | &[nav-view-direction="forward"] [nav-view="entering"],
27 | &[nav-view-direction="back"] [nav-view="leaving"] {
28 | z-index: $z-index-view-above;
29 | }
30 |
31 | &[nav-view-direction="back"] [nav-view="entering"],
32 | &[nav-view-direction="forward"] [nav-view="leaving"] {
33 | z-index: $z-index-view-below;
34 | }
35 |
36 | }
37 |
38 |
39 |
40 | // iOS Nav Bar Transitions
41 | // -------------------------------
42 |
43 | [nav-bar-transition="ios"] {
44 |
45 | .title,
46 | .buttons,
47 | .back-text {
48 | @include transition-duration( $ios-transition-duration );
49 | @include transition-timing-function( $ios-transition-timing-function );
50 | -webkit-transition-property: opacity, -webkit-transform;
51 | transition-property: opacity, transform;
52 | }
53 |
54 | [nav-bar="active"],
55 | [nav-bar="entering"] {
56 | z-index: $z-index-bar-above;
57 |
58 | .bar {
59 | background: transparent;
60 | }
61 | }
62 |
63 | [nav-bar="cached"] {
64 | display: block;
65 |
66 | .header-item {
67 | display: none;
68 | }
69 | }
70 |
71 | }
72 |
73 |
74 |
75 | // Android View Transitions
76 | // -------------------------------
77 |
78 | $android-transition-duration: 200ms !default;
79 | $android-transition-timing-function: cubic-bezier(0.4, 0.6, 0.2, 1) !default;
80 |
81 |
82 | [nav-view-transition="android"] {
83 |
84 | [nav-view="entering"],
85 | [nav-view="leaving"] {
86 | @include transition-duration( $android-transition-duration );
87 | @include transition-timing-function( $android-transition-timing-function );
88 | -webkit-transition-property: -webkit-transform;
89 | transition-property: transform;
90 | }
91 |
92 | [nav-view="active"],
93 | &[nav-view-direction="forward"] [nav-view="entering"],
94 | &[nav-view-direction="back"] [nav-view="leaving"] {
95 | z-index: $z-index-view-above;
96 | }
97 |
98 | &[nav-view-direction="back"] [nav-view="entering"],
99 | &[nav-view-direction="forward"] [nav-view="leaving"] {
100 | z-index: $z-index-view-below;
101 | }
102 |
103 | }
104 |
105 |
106 |
107 | // Android Nav Bar Transitions
108 | // -------------------------------
109 |
110 | [nav-bar-transition="android"] {
111 |
112 | .title,
113 | .buttons {
114 | @include transition-duration( $android-transition-duration );
115 | @include transition-timing-function( $android-transition-timing-function );
116 | -webkit-transition-property: opacity;
117 | transition-property: opacity;
118 | }
119 |
120 | [nav-bar="active"],
121 | [nav-bar="entering"] {
122 | z-index: $z-index-bar-above;
123 |
124 | .bar {
125 | background: transparent;
126 | }
127 | }
128 |
129 | [nav-bar="cached"] {
130 | display: block;
131 |
132 | .header-item {
133 | display: none;
134 | }
135 | }
136 |
137 | }
138 |
139 |
140 |
141 | // Nav Swipe
142 | // -------------------------------
143 |
144 | [nav-swipe="fast"] {
145 | [nav-view],
146 | .title,
147 | .buttons,
148 | .back-text {
149 | @include transition-duration(50ms);
150 | @include transition-timing-function(linear);
151 | }
152 | }
153 |
154 | [nav-swipe="slow"] {
155 | [nav-view],
156 | .title,
157 | .buttons,
158 | .back-text {
159 | @include transition-duration(160ms);
160 | @include transition-timing-function(linear);
161 | }
162 | }
163 |
164 |
165 |
166 | // Transition Settings
167 | // -------------------------------
168 |
169 | [nav-view="cached"],
170 | [nav-bar="cached"] {
171 | display: none;
172 | }
173 |
174 | [nav-view="stage"] {
175 | opacity: 0;
176 | @include transition-duration( 0 );
177 | }
178 |
179 | [nav-bar="stage"] {
180 | .title,
181 | .buttons,
182 | .back-text {
183 | position: absolute;
184 | opacity: 0;
185 | @include transition-duration(0s);
186 | }
187 | }
188 |
189 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/_type.scss:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * Typography
4 | * --------------------------------------------------
5 | */
6 |
7 |
8 | // Body text
9 | // -------------------------
10 |
11 | p {
12 | margin: 0 0 ($line-height-computed / 2);
13 | }
14 |
15 |
16 | // Emphasis & misc
17 | // -------------------------
18 |
19 | small { font-size: 85%; }
20 | cite { font-style: normal; }
21 |
22 |
23 | // Alignment
24 | // -------------------------
25 |
26 | .text-left { text-align: left; }
27 | .text-right { text-align: right; }
28 | .text-center { text-align: center; }
29 |
30 |
31 | // Headings
32 | // -------------------------
33 |
34 | h1, h2, h3, h4, h5, h6,
35 | .h1, .h2, .h3, .h4, .h5, .h6 {
36 | color: $base-color;
37 | font-weight: $headings-font-weight;
38 | font-family: $headings-font-family;
39 | line-height: $headings-line-height;
40 |
41 | small {
42 | font-weight: normal;
43 | line-height: 1;
44 | }
45 | }
46 |
47 | h1, .h1,
48 | h2, .h2,
49 | h3, .h3 {
50 | margin-top: $line-height-computed;
51 | margin-bottom: ($line-height-computed / 2);
52 |
53 | &:first-child {
54 | margin-top: 0;
55 | }
56 |
57 | + h1, + .h1,
58 | + h2, + .h2,
59 | + h3, + .h3 {
60 | margin-top: ($line-height-computed / 2);
61 | }
62 | }
63 |
64 | h4, .h4,
65 | h5, .h5,
66 | h6, .h6 {
67 | margin-top: ($line-height-computed / 2);
68 | margin-bottom: ($line-height-computed / 2);
69 | }
70 |
71 | h1, .h1 { font-size: floor($font-size-base * 2.60); } // ~36px
72 | h2, .h2 { font-size: floor($font-size-base * 2.15); } // ~30px
73 | h3, .h3 { font-size: ceil($font-size-base * 1.70); } // ~24px
74 | h4, .h4 { font-size: ceil($font-size-base * 1.25); } // ~18px
75 | h5, .h5 { font-size: $font-size-base; }
76 | h6, .h6 { font-size: ceil($font-size-base * 0.85); } // ~12px
77 |
78 | h1 small, .h1 small { font-size: ceil($font-size-base * 1.70); } // ~24px
79 | h2 small, .h2 small { font-size: ceil($font-size-base * 1.25); } // ~18px
80 | h3 small, .h3 small,
81 | h4 small, .h4 small { font-size: $font-size-base; }
82 |
83 |
84 | // Description Lists
85 | // -------------------------
86 |
87 | dl {
88 | margin-bottom: $line-height-computed;
89 | }
90 | dt,
91 | dd {
92 | line-height: $line-height-base;
93 | }
94 | dt {
95 | font-weight: bold;
96 | }
97 |
98 |
99 | // Blockquotes
100 | // -------------------------
101 |
102 | blockquote {
103 | margin: 0 0 $line-height-computed;
104 | padding: ($line-height-computed / 2) $line-height-computed;
105 | border-left: 5px solid gray;
106 |
107 | p {
108 | font-weight: 300;
109 | font-size: ($font-size-base * 1.25);
110 | line-height: 1.25;
111 | }
112 |
113 | p:last-child {
114 | margin-bottom: 0;
115 | }
116 |
117 | small {
118 | display: block;
119 | line-height: $line-height-base;
120 | &:before {
121 | content: '\2014 \00A0';// EM DASH, NBSP;
122 | }
123 | }
124 | }
125 |
126 |
127 | // Quotes
128 | // -------------------------
129 |
130 | q:before,
131 | q:after,
132 | blockquote:before,
133 | blockquote:after {
134 | content: "";
135 | }
136 |
137 |
138 | // Addresses
139 | // -------------------------
140 |
141 | address {
142 | display: block;
143 | margin-bottom: $line-height-computed;
144 | font-style: normal;
145 | line-height: $line-height-base;
146 | }
147 |
148 |
149 | // Links
150 | // -------------------------
151 |
152 | a.subdued {
153 | padding-right: 10px;
154 | color: #888;
155 | text-decoration: none;
156 |
157 | &:hover {
158 | text-decoration: none;
159 | }
160 | &:last-child {
161 | padding-right: 0;
162 | }
163 | }
164 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/ionic.scss:
--------------------------------------------------------------------------------
1 | @charset "UTF-8";
2 |
3 | @import
4 | // Ionicons
5 | "ionicons/ionicons.scss",
6 |
7 | // Variables
8 | "mixins",
9 | "variables",
10 |
11 | // Base
12 | "reset",
13 | "scaffolding",
14 | "type",
15 |
16 | // Components
17 | "action-sheet",
18 | "backdrop",
19 | "bar",
20 | "tabs",
21 | "menu",
22 | "modal",
23 | "popover",
24 | "popup",
25 | "loading",
26 | "items",
27 | "list",
28 | "badge",
29 | "slide-box",
30 | "refresher",
31 | "spinner",
32 |
33 | // Forms
34 | "form",
35 | "checkbox",
36 | "toggle",
37 | "radio",
38 | "range",
39 | "select",
40 | "progress",
41 |
42 | // Buttons
43 | "button",
44 | "button-bar",
45 |
46 | // Util
47 | "grid",
48 | "util",
49 | "platform",
50 |
51 | // Animations
52 | "animations",
53 | "transitions";
54 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/ionicons/_ionicons-font.scss:
--------------------------------------------------------------------------------
1 | // Ionicons Font Path
2 | // --------------------------
3 |
4 | @font-face {
5 | font-family: $ionicons-font-family;
6 | src:url("#{$ionicons-font-path}/ionicons.eot?v=#{$ionicons-version}");
7 | src:url("#{$ionicons-font-path}/ionicons.eot?v=#{$ionicons-version}#iefix") format("embedded-opentype"),
8 | url("#{$ionicons-font-path}/ionicons.ttf?v=#{$ionicons-version}") format("truetype"),
9 | url("#{$ionicons-font-path}/ionicons.woff?v=#{$ionicons-version}") format("woff"),
10 | url("#{$ionicons-font-path}/ionicons.woff") format("woff"), /* for WP8 */
11 | url("#{$ionicons-font-path}/ionicons.svg?v=#{$ionicons-version}#Ionicons") format("svg");
12 | font-weight: normal;
13 | font-style: normal;
14 | }
15 |
16 | .ion {
17 | display: inline-block;
18 | font-family: $ionicons-font-family;
19 | speak: none;
20 | font-style: normal;
21 | font-weight: normal;
22 | font-variant: normal;
23 | text-transform: none;
24 | text-rendering: auto;
25 | line-height: 1;
26 | -webkit-font-smoothing: antialiased;
27 | -moz-osx-font-smoothing: grayscale;
28 | }
29 |
--------------------------------------------------------------------------------
/www/lib/ionic/scss/ionicons/ionicons.scss:
--------------------------------------------------------------------------------
1 | @charset "UTF-8";
2 | @import "ionicons-variables";
3 | /*!
4 | Ionicons, v2.0.1
5 | Created by Ben Sperry for the Ionic Framework, http://ionicons.com/
6 | https://twitter.com/benjsperry https://twitter.com/ionicframework
7 | MIT License: https://github.com/driftyco/ionicons
8 |
9 | Android-style icons originally built by Google’s
10 | Material Design Icons: https://github.com/google/material-design-icons
11 | used under CC BY http://creativecommons.org/licenses/by/4.0/
12 | Modified icons to fit ionicon’s grid from original.
13 | */
14 |
15 | @import "ionicons-font";
16 | @import "ionicons-icons";
17 |
--------------------------------------------------------------------------------
/www/lib/ionic/version.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "1.1.0",
3 | "codename": "xenon-xerus",
4 | "date": "2015-08-13",
5 | "time": "19:56:13"
6 | }
7 |
--------------------------------------------------------------------------------
/www/lib/jasmine-1.3.1/MIT.LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (c) 2008-2011 Pivotal Labs
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining
4 | a copy of this software and associated documentation files (the
5 | "Software"), to deal in the Software without restriction, including
6 | without limitation the rights to use, copy, modify, merge, publish,
7 | distribute, sublicense, and/or sell copies of the Software, and to
8 | permit persons to whom the Software is furnished to do so, subject to
9 | the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be
12 | included in all copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 |
--------------------------------------------------------------------------------
/www/lib/jasmine-2.3.4/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 global scope, so a project can use the public interface directly. For example, calling `describe` in specs instead of `jasmine.getEnv().describe`.
39 | */
40 | extend(window, jasmineInterface);
41 |
42 | /**
43 | * ## Runner Parameters
44 | *
45 | * More browser specific code - wrap the query string in an object and to allow for getting/setting parameters from the runner user interface.
46 | */
47 |
48 | var queryString = new jasmine.QueryString({
49 | getWindowLocation: function() { return window.location; }
50 | });
51 |
52 | var catchingExceptions = queryString.getParam("catch");
53 | env.catchExceptions(typeof catchingExceptions === "undefined" ? true : catchingExceptions);
54 |
55 | var throwingExpectationFailures = queryString.getParam("throwFailures");
56 | env.throwOnExpectationFailure(throwingExpectationFailures);
57 |
58 | /**
59 | * ## Reporters
60 | * 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).
61 | */
62 | var htmlReporter = new jasmine.HtmlReporter({
63 | env: env,
64 | onRaiseExceptionsClick: function() { queryString.navigateWithNewParam("catch", !env.catchingExceptions()); },
65 | onThrowExpectationsClick: function() { queryString.navigateWithNewParam("throwFailures", !env.throwingExpectationFailures()); },
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 |
--------------------------------------------------------------------------------
/www/lib/jasmine-2.3.4/jasmine_favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rongcloud-archive/cordova-plugin-rongcloud-im-demo/617e9af2fe699dc7990b6d19a5af9789d6d0a100/www/lib/jasmine-2.3.4/jasmine_favicon.png
--------------------------------------------------------------------------------
/www/lib/ngCordova/.bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ngCordova",
3 | "version": "0.1.23-alpha",
4 | "homepage": "http://ngCordova.com/",
5 | "authors": [
6 | "Max Lynch ",
7 | "Paolo Bernasconi ",
8 | "Chad Campbell "
9 | ],
10 | "description": "AngularJS Cordova wrappers for common Cordova plugins.",
11 | "main": [
12 | "./dist/ng-cordova.js"
13 | ],
14 | "ignore": [
15 | "**/.*",
16 | "gulpfile.js",
17 | "test",
18 | "src",
19 | "config",
20 | "demo",
21 | "CONTRIBUTING.md",
22 | "CODE_OF_CONDUCT.md"
23 | ],
24 | "dependencies": {
25 | "angular": ">= 1.2.23"
26 | },
27 | "keywords": [
28 | "ngCordova",
29 | "ng-cordova",
30 | "ngcordova",
31 | "ng cordova",
32 | "cordova",
33 | "phonegap",
34 | "angular",
35 | "angularjs",
36 | "ionic",
37 | "cordova plugin"
38 | ],
39 | "license": "MIT",
40 | "private": false,
41 | "devDependencies": {
42 | "angular": ">= 1.2.23",
43 | "angular-mocks": ">= 1.2.23",
44 | "jquery": "~2.1.1"
45 | },
46 | "_release": "0.1.23-alpha",
47 | "_resolution": {
48 | "type": "version",
49 | "tag": "v0.1.23-alpha",
50 | "commit": "c4afa3dbbb80b15eded760e039cd2d69da891502"
51 | },
52 | "_source": "git://github.com/driftyco/ng-cordova.git",
53 | "_target": "~0.1.23-alpha",
54 | "_originalSource": "ngCordova",
55 | "_direct": true
56 | }
--------------------------------------------------------------------------------
/www/lib/ngCordova/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | Please refer to the [Github ngCordova Releases file](https://github.com/driftyco/ng-cordova/releases) for detailed information.
2 |
--------------------------------------------------------------------------------
/www/lib/ngCordova/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2014 Drifty
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/www/lib/ngCordova/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ngCordova",
3 | "version": "0.1.23-alpha",
4 | "homepage": "http://ngCordova.com/",
5 | "authors": [
6 | "Max Lynch ",
7 | "Paolo Bernasconi ",
8 | "Chad Campbell "
9 | ],
10 | "description": "AngularJS Cordova wrappers for common Cordova plugins.",
11 | "main": [
12 | "./dist/ng-cordova.js"
13 | ],
14 | "ignore": [
15 | "**/.*",
16 | "gulpfile.js",
17 | "test",
18 | "src",
19 | "config",
20 | "demo",
21 | "CONTRIBUTING.md",
22 | "CODE_OF_CONDUCT.md"
23 | ],
24 | "dependencies": {
25 | "angular": ">= 1.2.23"
26 | },
27 | "keywords": [
28 | "ngCordova",
29 | "ng-cordova",
30 | "ngcordova",
31 | "ng cordova",
32 | "cordova",
33 | "phonegap",
34 | "angular",
35 | "angularjs",
36 | "ionic",
37 | "cordova plugin"
38 | ],
39 | "license": "MIT",
40 | "private": false,
41 | "devDependencies": {
42 | "angular": ">= 1.2.23",
43 | "angular-mocks": ">= 1.2.23",
44 | "jquery": "~2.1.1"
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/www/lib/ngCordova/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ng-cordova",
3 | "private": false,
4 | "main": "dist/ng-cordova",
5 | "version": "0.1.23-alpha",
6 | "repository": {
7 | "url": "git://github.com/driftyco/ng-cordova.git"
8 | },
9 | "devDependencies": {
10 | "gulp": "^3.7.0",
11 | "gulp-concat": "^2.2.0",
12 | "gulp-footer": "^1.0.4",
13 | "gulp-header": "^1.0.2",
14 | "gulp-jscs": "^1.6.0",
15 | "gulp-jshint": "^1.6.1",
16 | "gulp-prettify": "^0.3.0",
17 | "gulp-rename": "^1.2.0",
18 | "gulp-shell": "^0.2.10",
19 | "gulp-uglify": "^0.2.1",
20 | "jshint-stylish": "^0.4.0",
21 | "karma": "^0.12.16",
22 | "karma-chrome-launcher": "~0.1.2",
23 | "karma-coverage": "~0.2.6",
24 | "karma-jasmine": "~0.1.5",
25 | "karma-phantomjs-launcher": "~0.1.2",
26 | "minimist": "^0.1.0"
27 | },
28 | "licenses": [
29 | {
30 | "type": "MIT"
31 | }
32 | ],
33 | "scripts": {
34 | "test": "gulp lint && gulp karma --browsers=PhantomJS --reporters=progress"
35 | },
36 | "dependencies": {
37 | "conventional-changelog": "0.0.11",
38 | "fs": "0.0.2",
39 | "gulp-git": "^1.2.4",
40 | "q": "^1.1.2"
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/www/spec/Developer.js:
--------------------------------------------------------------------------------
1 | function Developer() {
2 | }
3 |
4 | Developer.prototype.workOn = function(project) {
5 | this.currentProject = project;
6 | this.isWorking = true;
7 | };
8 |
9 | Developer.prototype.pause = function() {
10 | this.isWorking = false;
11 | };
12 |
13 | Developer.prototype.resume = function() {
14 | if (this.isWorking) {
15 | throw new Error("The project is already started.");
16 | }
17 | this.isWorking = true;
18 | };
19 |
20 |
--------------------------------------------------------------------------------
/www/spec/DeveloperSuite.js:
--------------------------------------------------------------------------------
1 | describe("An example of Jasmine Spec - Working developer", function() {
2 | var developer;
3 | var project;
4 |
5 | beforeEach(function() {
6 | this.addMatchers({
7 | wantToWorkOn: function(expectProject) {
8 | var developer = this.actual;
9 | return developer.currentProject === expectProject && developer.isWorking;
10 | }
11 | });
12 |
13 | developer = new Developer();
14 | project = new Project();
15 | });
16 |
17 | describe("when the projcet is started,", function() {
18 | it("should be able to work on the project", function() {
19 | developer.workOn(project);
20 | expect(developer.currentProject).toEqual(project);
21 |
22 | expect(developer).wantToWorkOn(project);
23 | });
24 | });
25 |
26 | describe("when the projcet is paused,", function() {
27 | beforeEach(function() {
28 | developer.workOn(project);
29 | developer.pause();
30 | });
31 |
32 | it("should know the project is currently paused", function() {
33 | expect(developer.isWorking).toBeFalsy();
34 | expect(developer).not.wantToWorkOn(project);
35 | });
36 |
37 | it("should be possible to resume the project", function() {
38 | developer.resume();
39 | expect(developer.isWorking).toBeTruthy();
40 | expect(developer.currentProject).toEqual(project);
41 | });
42 | });
43 |
44 |
45 | describe("when the project is resumed,", function() {
46 | it("should throw an exception if project is started", function() {
47 | developer.workOn(project);
48 |
49 | expect(function() {
50 | developer.resume();
51 | }).toThrow("The project is already started.");
52 | });
53 | });
54 | });
--------------------------------------------------------------------------------
/www/spec/Lists.js:
--------------------------------------------------------------------------------
1 | describe("Examples of Jasmine suite", function() {
2 |
3 | //List 1
4 | describe("This is an exmaple suite", function() {
5 | it("contains spec with an expectation", function() {
6 | expect(true).toBe(true);
7 | expect(false).toBe(false);
8 | expect(false).not.toBe(true);
9 | });
10 | });
11 |
12 | describe("JSON test suite", function() {
13 | var stra = {a:1, b:4};
14 | var strb = {b:4, a:1};
15 | it("JSON spec with an expectation", function() {
16 | expect(stra).toEqual(strb);
17 | });
18 | });
19 |
20 | //List 2
21 | describe("Test suite is a function.", function() {
22 | var gVar;
23 |
24 | it("Spec is a function.", function() {
25 | gVar = true;
26 | expect(gVar).toBe(true);
27 | });
28 |
29 | it("Another spec is a function.", function() {
30 | gVar = false;
31 | expect(gVar).toBe(false);
32 | });
33 |
34 | });
35 |
36 | //List 3
37 | describe("This is an exmaple suite", function() {
38 | it("contains spec with an expectation", function() {
39 | var num = 10;
40 | expect(num).toEqual(10);
41 | });
42 | });
43 |
44 | //List 4
45 | describe("The 'toBe' matcher compares with ===", function() {
46 | it("and has a positive case ", function() {
47 | expect(true).toBe(true);
48 | });
49 | it("and can have a negative case", function() {
50 | expect(false).not.toBe(true);
51 | });
52 | });
53 |
54 |
55 | //List 5
56 | describe("Included matchers:", function() {
57 |
58 | it("The 'toBe' Matcher", function() {
59 | var a = 3.6;
60 | var b = a;
61 |
62 | expect(a).toBe(b);
63 | expect(a).not.toBe(null);
64 | });
65 |
66 | describe("The 'toEqual' matcher", function() {
67 |
68 | it("works for simple literals and variables", function() {
69 | var a = "varA";
70 | expect(a).toEqual("varA");
71 | });
72 |
73 | it("Work for objects", function() {
74 | var obj = {
75 | a: 1,
76 | b: 4
77 | };
78 | var obj2 = {
79 | a: 1,
80 | b: 4
81 | };
82 | expect(obj).toEqual(obj2);
83 | });
84 | });
85 |
86 | it("The 'toBeDefined' matcher ", function() {
87 | var obj = {
88 | defined: 'defined'
89 | };
90 |
91 | expect(obj.defined).toBeDefined();
92 | expect(obj.undefined).not.toBeDefined();
93 | });
94 |
95 | });
96 |
97 | //List 6
98 | describe("An example of setup and teardown", function() {
99 | var gVar;
100 |
101 | beforeEach(function() {
102 | gVar = 3.6;
103 | gVar += 1;
104 | });
105 |
106 | afterEach(function() {
107 | gVar = 0;
108 | });
109 |
110 | it("after setup, gVar has new value.", function() {
111 | expect(gVar).toEqual(4.6);
112 | });
113 |
114 | it("A spec contains 2 expectations.", function() {
115 | gVar = 0;
116 | expect(gVar).toEqual(0);
117 | expect(true).toEqual(true);
118 | });
119 | });
120 |
121 | //List 7
122 | describe("A spec", function() {
123 | var gVar;
124 |
125 | beforeEach(function() {
126 | gVar = 3.6;
127 | gVar += 1;
128 | });
129 |
130 | afterEach(function() {
131 | gVar = 0;
132 | });
133 |
134 | it("after setup, gVar has new value.", function() {
135 | expect(gVar).toEqual(4.6);
136 | });
137 |
138 | it("A spec contains 2 expectations.", function() {
139 | gVar = 0;
140 | expect(gVar).toEqual(0);
141 | expect(true).toEqual(true);
142 | });
143 |
144 | describe("nested describe", function() {
145 | var tempVar;
146 |
147 | beforeEach(function() {
148 | tempVar = 4.6;
149 | });
150 |
151 | it("gVar is global scope, tempVar is this describe scope.", function() {
152 | expect(gVar).toEqual(tempVar);
153 | });
154 | });
155 | });
156 |
157 | //List 8
158 | xdescribe("An example of xdescribe.", function() {
159 | var gVar;
160 |
161 | beforeEach(function() {
162 | gVar = 3.6;
163 | gVar += 1;
164 | });
165 |
166 | xit(" and xit", function() {
167 | expect(gVar).toEqual(4.6);
168 | });
169 | });
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 | });
178 |
--------------------------------------------------------------------------------
/www/spec/Project.js:
--------------------------------------------------------------------------------
1 | function Project() {
2 | }
3 |
--------------------------------------------------------------------------------
/www/spec/RongCloudLibPluginSuite.js:
--------------------------------------------------------------------------------
1 | describe("An example of Jasmine Spec - RongCloudLibPlugin", function() {
2 |
3 | describe("when RongCloudLibPlugin is init,", function() {
4 | it("should be able to init", function() {
5 | RongCloudLibPlugin.init(
6 | function(result) {
7 | // var lstResult = 'init:' + JSON.stringify(result); console.log(lstResult);
8 | var jsonResult = {
9 | status: 'success', // 状态码:success / error
10 | };
11 | expect(result).toEqual(jsonResult);
12 | },
13 | function(error) {
14 | fail("Callback has been called");
15 | //var lstResult = 'init error:' + JSON.stringify(error);console.log(lstResult);
16 | },
17 | {
18 | appKey: "lmxuhwagx8tyd",
19 | deviceToken: "87jjfds8393sfjds83"
20 | }
21 | );
22 | });
23 | });
24 |
25 | describe("when RongCloudLibPlugin is connect,", function() {
26 | it("should be able to init", function() {
27 | RongCloudLibPlugin.connect(
28 | function(result) {
29 | // var lstResult = 'init:' + JSON.stringify(result); console.log(lstResult);
30 | var jsonResult = {
31 | status: 'success', // 状态码:success / error
32 | result:
33 | {
34 | userId: 'aaa5936' // 当前登录的用户 Id
35 | }
36 | }
37 | expect(result).toEqual(jsonResult);
38 | },
39 | function(error) {
40 | //var lstResult = 'init error:' + JSON.stringify(error);console.log(lstResult);
41 | },
42 | {
43 | token: token
44 | }
45 | );
46 | });
47 | });
48 |
49 |
50 | });
51 |
--------------------------------------------------------------------------------
/www/templates/browse.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Browse
4 |
5 |
6 |
7 | {{ lstResult }}
8 |
9 |
10 |
--------------------------------------------------------------------------------
/www/templates/friend-detail.html:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
10 |
14 |
15 |
16 |
17 | -
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
32 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/www/templates/friends.html:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
12 |
13 |
26 |
27 |
28 |
29 | {{ lstResult }}
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/www/templates/login.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/www/templates/message/diz.html:
--------------------------------------------------------------------------------
1 | : {{message.sentTime}}
2 |
--------------------------------------------------------------------------------
/www/templates/message/img.html:
--------------------------------------------------------------------------------
1 |
2 |
![]()
3 |
4 | {{message.senderUserId}}
5 |
--------------------------------------------------------------------------------
/www/templates/message/imgtext.html:
--------------------------------------------------------------------------------
1 | {{message.content.title}}
2 | ![]()
3 |
{{message.content.description}}'
4 |
5 |
6 | {{message.senderUserId}}
7 |
--------------------------------------------------------------------------------
/www/templates/message/lbs.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | {{message.content.poi}}
4 | {{message.senderUserId}}
5 |
--------------------------------------------------------------------------------
/www/templates/message/txt.html:
--------------------------------------------------------------------------------
1 |
2 | : {{message.sentTime}} {{message.senderUserId}}
3 |
--------------------------------------------------------------------------------
/www/templates/message/vc.html:
--------------------------------------------------------------------------------
1 |
2 |
{{message.content.duration}}''
3 |
4 |
5 |
6 |
7 |
8 | {{message.senderUserId}}
9 |
--------------------------------------------------------------------------------
/www/templates/tab-account.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | {{User.username}}
7 | ID: {{User.id}}
8 |
9 |
10 | 系统消息
11 |
12 | 隐私 黑名单
13 |
14 | 退出帐号
15 |
16 |
17 |
18 | 测试
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/www/templates/tab-blacklist.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{friend.username}}移出黑名单
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/www/templates/tab-chats.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | {{ friend.conversationTitle }}
7 | {{ friend.unreadMessageCount }}
8 |
9 |
10 |
11 |
12 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/www/templates/tab-friendinfo.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | {{Target.username}}
7 | ID: {{Target.id}}
8 |
9 | 发消息
10 |
11 | 加入黑名单
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/www/templates/tab-friends.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 联系人
6 |
7 |
8 |
9 |
10 | {{friend.username}}
11 |
12 |
13 |
14 |
15 | 群组
16 |
17 |
18 |
19 | {{group.name}}
20 | {{group.number}}/{{group.max_number}}
21 | {{group.introduce}}
22 |
23 |
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/www/templates/tab-groupinfo.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | {{Target.name}}
7 | 群成员{{Target.number}}人
8 |
9 | 发起群聊
10 | 添加新成员(待完成)
11 |
12 |
13 |
14 | {{ member.id }}
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/www/templates/tabs.html:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/www/templates/testdetail.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
17 |
18 |
28 |
29 |
82 |
83 |
84 |
87 |
90 |
91 |
92 |
93 |
94 |
95 |
--------------------------------------------------------------------------------