├── .docs └── images │ └── screenshots │ ├── admin-metrics.png │ ├── admin-users.png │ ├── home-labeled.png │ ├── home.png │ └── mentor-labeled2.png ├── .gitignore ├── .meteor ├── .finished-upgraders ├── .gitignore ├── .id ├── cordova-plugins ├── packages ├── platforms ├── release └── versions ├── CONTRIBUTING.md ├── LICENSE.md ├── README.md ├── app.json ├── client ├── app.html ├── app.js ├── components │ ├── announcement │ │ ├── announcement.html │ │ └── announcement.js │ ├── announcementsTable │ │ ├── announcementsTable.html │ │ └── announcementsTable.js │ ├── announcer │ │ ├── announcer.html │ │ └── announcer.js │ ├── banner │ │ └── banner.html │ ├── charts │ │ └── ticketCharts │ │ │ ├── ticketCharts.html │ │ │ └── ticketCharts.js │ ├── feed │ │ ├── feed.html │ │ └── feed.js │ ├── feedback │ │ ├── feedback.html │ │ └── feedback.js │ ├── footer │ │ └── footer.html │ ├── leaderboard │ │ ├── leaderboard.html │ │ └── leaderboard.js │ ├── login │ │ ├── login.html │ │ └── login.js │ ├── mentorStatus │ │ ├── mentorStatus.html │ │ └── mentorStatus.js │ ├── nav │ │ ├── nav.html │ │ └── nav.js │ ├── skillsList │ │ ├── skillsList.html │ │ └── skillsList.js │ ├── ticketPanel │ │ ├── ticketPanel.html │ │ └── ticketPanel.js │ ├── ticketStats │ │ ├── ticketStats.html │ │ └── ticketStats.js │ ├── ticketTable │ │ ├── ticketTable.html │ │ └── ticketTable.js │ ├── tickets │ │ ├── ticket │ │ │ ├── ticket.html │ │ │ └── ticket.js │ │ ├── tickets.html │ │ └── tickets.js │ ├── userEdit │ │ ├── userEdit.html │ │ └── userEdit.js │ ├── userStats │ │ ├── userStats.html │ │ └── userStats.js │ └── userTable │ │ ├── userTable.html │ │ └── userTable.js ├── helpers.js ├── layouts │ └── bannerLayout.html ├── lib │ ├── ReactiveNow.js │ ├── animate.css │ ├── auth.js │ ├── semantic-ui │ │ ├── .custom.semantic.json │ │ ├── custom.semantic.json │ │ ├── definitions │ │ │ ├── behaviors │ │ │ │ ├── api.js │ │ │ │ ├── colorize.js │ │ │ │ ├── form.js │ │ │ │ ├── state.js │ │ │ │ ├── visibility.js │ │ │ │ └── visit.js │ │ │ ├── collections │ │ │ │ ├── breadcrumb.import.less │ │ │ │ ├── form.import.less │ │ │ │ ├── grid.import.less │ │ │ │ ├── menu.import.less │ │ │ │ ├── message.import.less │ │ │ │ └── table.import.less │ │ │ ├── elements │ │ │ │ ├── button.import.less │ │ │ │ ├── container.import.less │ │ │ │ ├── divider.import.less │ │ │ │ ├── flag.import.less │ │ │ │ ├── header.import.less │ │ │ │ ├── icon.import.less │ │ │ │ ├── image.import.less │ │ │ │ ├── input.import.less │ │ │ │ ├── label.import.less │ │ │ │ ├── list.import.less │ │ │ │ ├── loader.import.less │ │ │ │ ├── rail.import.less │ │ │ │ ├── reveal.import.less │ │ │ │ ├── segment.import.less │ │ │ │ └── step.import.less │ │ │ ├── globals │ │ │ │ ├── reset.import.less │ │ │ │ ├── site.import.less │ │ │ │ └── site.js │ │ │ ├── modules │ │ │ │ ├── accordion.import.less │ │ │ │ ├── accordion.js │ │ │ │ ├── checkbox.import.less │ │ │ │ ├── checkbox.js │ │ │ │ ├── dimmer.import.less │ │ │ │ ├── dimmer.js │ │ │ │ ├── dropdown.import.less │ │ │ │ ├── dropdown.js │ │ │ │ ├── embed.import.less │ │ │ │ ├── embed.js │ │ │ │ ├── modal.import.less │ │ │ │ ├── modal.js │ │ │ │ ├── nag.import.less │ │ │ │ ├── nag.js │ │ │ │ ├── popup.import.less │ │ │ │ ├── popup.js │ │ │ │ ├── progress.import.less │ │ │ │ ├── progress.js │ │ │ │ ├── rating.import.less │ │ │ │ ├── rating.js │ │ │ │ ├── search.import.less │ │ │ │ ├── search.js │ │ │ │ ├── shape.import.less │ │ │ │ ├── shape.js │ │ │ │ ├── sidebar.import.less │ │ │ │ ├── sidebar.js │ │ │ │ ├── sticky.import.less │ │ │ │ ├── sticky.js │ │ │ │ ├── tab.import.less │ │ │ │ ├── tab.js │ │ │ │ ├── transition.import.less │ │ │ │ └── transition.js │ │ │ └── views │ │ │ │ ├── ad.import.less │ │ │ │ ├── card.import.less │ │ │ │ ├── comment.import.less │ │ │ │ ├── feed.import.less │ │ │ │ ├── item.import.less │ │ │ │ └── statistic.import.less │ │ ├── semantic.less │ │ ├── site │ │ │ ├── collections │ │ │ │ ├── breadcrumb.overrides.import.less │ │ │ │ ├── breadcrumb.variables.import.less │ │ │ │ ├── form.overrides.import.less │ │ │ │ ├── form.variables.import.less │ │ │ │ ├── grid.overrides.import.less │ │ │ │ ├── grid.variables.import.less │ │ │ │ ├── menu.overrides.import.less │ │ │ │ ├── menu.variables.import.less │ │ │ │ ├── message.overrides.import.less │ │ │ │ ├── message.variables.import.less │ │ │ │ ├── table.overrides.import.less │ │ │ │ └── table.variables.import.less │ │ │ ├── elements │ │ │ │ ├── button.overrides.import.less │ │ │ │ ├── button.variables.import.less │ │ │ │ ├── container.overrides.import.less │ │ │ │ ├── container.variables.import.less │ │ │ │ ├── divider.overrides.import.less │ │ │ │ ├── divider.variables.import.less │ │ │ │ ├── flag.overrides.import.less │ │ │ │ ├── flag.variables.import.less │ │ │ │ ├── header.overrides.import.less │ │ │ │ ├── header.variables.import.less │ │ │ │ ├── icon.overrides.import.less │ │ │ │ ├── icon.variables.import.less │ │ │ │ ├── image.overrides.import.less │ │ │ │ ├── image.variables.import.less │ │ │ │ ├── input.overrides.import.less │ │ │ │ ├── input.variables.import.less │ │ │ │ ├── label.overrides.import.less │ │ │ │ ├── label.variables.import.less │ │ │ │ ├── list.overrides.import.less │ │ │ │ ├── list.variables.import.less │ │ │ │ ├── loader.overrides.import.less │ │ │ │ ├── loader.variables.import.less │ │ │ │ ├── rail.overrides.import.less │ │ │ │ ├── rail.variables.import.less │ │ │ │ ├── reveal.overrides.import.less │ │ │ │ ├── reveal.variables.import.less │ │ │ │ ├── segment.overrides.import.less │ │ │ │ ├── segment.variables.import.less │ │ │ │ ├── step.overrides.import.less │ │ │ │ └── step.variables.import.less │ │ │ ├── globals │ │ │ │ ├── reset.overrides.import.less │ │ │ │ ├── reset.variables.import.less │ │ │ │ ├── site.overrides.import.less │ │ │ │ └── site.variables.import.less │ │ │ ├── modules │ │ │ │ ├── accordion.overrides.import.less │ │ │ │ ├── accordion.variables.import.less │ │ │ │ ├── checkbox.overrides.import.less │ │ │ │ ├── checkbox.variables.import.less │ │ │ │ ├── dimmer.overrides.import.less │ │ │ │ ├── dimmer.variables.import.less │ │ │ │ ├── dropdown.overrides.import.less │ │ │ │ ├── dropdown.variables.import.less │ │ │ │ ├── embed.overrides.import.less │ │ │ │ ├── embed.variables.import.less │ │ │ │ ├── modal.overrides.import.less │ │ │ │ ├── modal.variables.import.less │ │ │ │ ├── nag.overrides.import.less │ │ │ │ ├── nag.variables.import.less │ │ │ │ ├── popup.overrides.import.less │ │ │ │ ├── popup.variables.import.less │ │ │ │ ├── progress.overrides.import.less │ │ │ │ ├── progress.variables.import.less │ │ │ │ ├── rating.overrides.import.less │ │ │ │ ├── rating.variables.import.less │ │ │ │ ├── search.overrides.import.less │ │ │ │ ├── search.variables.import.less │ │ │ │ ├── shape.overrides.import.less │ │ │ │ ├── shape.variables.import.less │ │ │ │ ├── sidebar.overrides.import.less │ │ │ │ ├── sidebar.variables.import.less │ │ │ │ ├── sticky.overrides.import.less │ │ │ │ ├── sticky.variables.import.less │ │ │ │ ├── tab.overrides.import.less │ │ │ │ ├── tab.variables.import.less │ │ │ │ ├── transition.overrides.import.less │ │ │ │ └── transition.variables.import.less │ │ │ └── views │ │ │ │ ├── ad.overrides.import.less │ │ │ │ ├── ad.variables.import.less │ │ │ │ ├── card.overrides.import.less │ │ │ │ ├── card.variables.import.less │ │ │ │ ├── comment.overrides.import.less │ │ │ │ ├── comment.variables.import.less │ │ │ │ ├── feed.overrides.import.less │ │ │ │ ├── feed.variables.import.less │ │ │ │ ├── item.overrides.import.less │ │ │ │ ├── item.variables.import.less │ │ │ │ ├── statistic.overrides.import.less │ │ │ │ └── statistic.variables.import.less │ │ ├── theme.config.import.less │ │ ├── theme.import.less │ │ └── themes │ │ │ └── default │ │ │ ├── collections │ │ │ ├── breadcrumb.overrides.import.less │ │ │ ├── breadcrumb.variables.import.less │ │ │ ├── form.overrides.import.less │ │ │ ├── form.variables.import.less │ │ │ ├── grid.overrides.import.less │ │ │ ├── grid.variables.import.less │ │ │ ├── menu.overrides.import.less │ │ │ ├── menu.variables.import.less │ │ │ ├── message.overrides.import.less │ │ │ ├── message.variables.import.less │ │ │ ├── table.overrides.import.less │ │ │ └── table.variables.import.less │ │ │ ├── elements │ │ │ ├── button.overrides.import.less │ │ │ ├── button.variables.import.less │ │ │ ├── container.overrides.import.less │ │ │ ├── container.variables.import.less │ │ │ ├── divider.overrides.import.less │ │ │ ├── divider.variables.import.less │ │ │ ├── flag.overrides.import.less │ │ │ ├── flag.variables.import.less │ │ │ ├── header.overrides.import.less │ │ │ ├── header.variables.import.less │ │ │ ├── icon.overrides.import.less │ │ │ ├── icon.variables.import.less │ │ │ ├── image.overrides.import.less │ │ │ ├── image.variables.import.less │ │ │ ├── input.overrides.import.less │ │ │ ├── input.variables.import.less │ │ │ ├── label.overrides.import.less │ │ │ ├── label.variables.import.less │ │ │ ├── list.overrides.import.less │ │ │ ├── list.variables.import.less │ │ │ ├── loader.overrides.import.less │ │ │ ├── loader.variables.import.less │ │ │ ├── rail.overrides.import.less │ │ │ ├── rail.variables.import.less │ │ │ ├── reveal.overrides.import.less │ │ │ ├── reveal.variables.import.less │ │ │ ├── segment.overrides.import.less │ │ │ ├── segment.variables.import.less │ │ │ ├── step.overrides.import.less │ │ │ └── step.variables.import.less │ │ │ ├── globals │ │ │ ├── reset.overrides.import.less │ │ │ ├── reset.variables.import.less │ │ │ ├── site.overrides.import.less │ │ │ └── site.variables.import.less │ │ │ ├── modules │ │ │ ├── accordion.overrides.import.less │ │ │ ├── accordion.variables.import.less │ │ │ ├── checkbox.overrides.import.less │ │ │ ├── checkbox.variables.import.less │ │ │ ├── dimmer.overrides.import.less │ │ │ ├── dimmer.variables.import.less │ │ │ ├── dropdown.overrides.import.less │ │ │ ├── dropdown.variables.import.less │ │ │ ├── embed.overrides.import.less │ │ │ ├── embed.variables.import.less │ │ │ ├── modal.overrides.import.less │ │ │ ├── modal.variables.import.less │ │ │ ├── nag.overrides.import.less │ │ │ ├── nag.variables.import.less │ │ │ ├── popup.overrides.import.less │ │ │ ├── popup.variables.import.less │ │ │ ├── progress.overrides.import.less │ │ │ ├── progress.variables.import.less │ │ │ ├── rating.overrides.import.less │ │ │ ├── rating.variables.import.less │ │ │ ├── search.overrides.import.less │ │ │ ├── search.variables.import.less │ │ │ ├── shape.overrides.import.less │ │ │ ├── shape.variables.import.less │ │ │ ├── sidebar.overrides.import.less │ │ │ ├── sidebar.variables.import.less │ │ │ ├── sticky.overrides.import.less │ │ │ ├── sticky.variables.import.less │ │ │ ├── tab.overrides.import.less │ │ │ ├── tab.variables.import.less │ │ │ ├── transition.overrides.import.less │ │ │ └── transition.variables.import.less │ │ │ └── views │ │ │ ├── ad.overrides.import.less │ │ │ ├── ad.variables.import.less │ │ │ ├── card.overrides.import.less │ │ │ ├── card.variables.import.less │ │ │ ├── comment.overrides.import.less │ │ │ ├── comment.variables.import.less │ │ │ ├── feed.overrides.import.less │ │ │ ├── feed.variables.import.less │ │ │ ├── item.overrides.import.less │ │ │ ├── item.variables.import.less │ │ │ ├── statistic.overrides.import.less │ │ │ └── statistic.variables.import.less │ └── stats.js ├── notifications.js ├── router.js ├── stylesheets │ └── scss │ │ ├── _branding.scss │ │ ├── _keyframes.scss │ │ ├── _mixins.scss │ │ ├── _override.scss │ │ ├── components │ │ ├── _banner.scss │ │ ├── _feed.scss │ │ ├── _nav.scss │ │ ├── _ticketPanel.scss │ │ ├── _tickets.scss │ │ ├── _userEdit.scss │ │ ├── _userStats.scss │ │ └── _userTable.scss │ │ ├── elements │ │ ├── _cleaninput.scss │ │ └── _pushbuttons.scss │ │ ├── layouts │ │ └── _bannerLayout.scss │ │ ├── site.scss │ │ └── views │ │ ├── _admin.scss │ │ ├── _error.scss │ │ ├── _home.scss │ │ ├── _profile.scss │ │ └── _splash.scss └── views │ ├── admin │ ├── admin.html │ └── admin.js │ ├── error │ └── error.html │ ├── home │ └── home.html │ ├── mentor │ └── mentor.html │ ├── metrics │ └── metrics.html │ ├── profile │ └── profile.html │ ├── settings │ ├── settings.html │ └── settings.js │ ├── splash │ └── splash.html │ └── userCreation │ ├── userCreation.html │ └── userCreation.js ├── create_config ├── lib └── constants.js ├── private └── config.json.template ├── public └── assets │ └── images │ ├── background.jpg │ ├── banner.jpg │ ├── favicon.ico │ ├── favicon.png │ └── geometry2.png └── server ├── collections.js ├── lib ├── helpers.js └── permissions.js ├── methods.js ├── publications.js └── startup.js /.docs/images/screenshots/admin-metrics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ehzhang/HELPq/a2eff6b4852ea691a4404b53af13e0dde5e1aa86/.docs/images/screenshots/admin-metrics.png -------------------------------------------------------------------------------- /.docs/images/screenshots/admin-users.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ehzhang/HELPq/a2eff6b4852ea691a4404b53af13e0dde5e1aa86/.docs/images/screenshots/admin-users.png -------------------------------------------------------------------------------- /.docs/images/screenshots/home-labeled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ehzhang/HELPq/a2eff6b4852ea691a4404b53af13e0dde5e1aa86/.docs/images/screenshots/home-labeled.png -------------------------------------------------------------------------------- /.docs/images/screenshots/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ehzhang/HELPq/a2eff6b4852ea691a4404b53af13e0dde5e1aa86/.docs/images/screenshots/home.png -------------------------------------------------------------------------------- /.docs/images/screenshots/mentor-labeled2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ehzhang/HELPq/a2eff6b4852ea691a4404b53af13e0dde5e1aa86/.docs/images/screenshots/mentor-labeled2.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .idea/ 3 | private/config.json 4 | .sass-cache/ 5 | -------------------------------------------------------------------------------- /.meteor/.finished-upgraders: -------------------------------------------------------------------------------- 1 | # This file contains information which helps Meteor properly upgrade your 2 | # app when you run 'meteor update'. You should check it into version control 3 | # with your project. 4 | 5 | notices-for-0.9.0 6 | notices-for-0.9.1 7 | 0.9.4-platform-file 8 | notices-for-facebook-graph-api-2 9 | 1.2.0-standard-minifiers-package 10 | 1.2.0-meteor-platform-split 11 | 1.2.0-cordova-changes 12 | 1.2.0-breaking-changes 13 | -------------------------------------------------------------------------------- /.meteor/.gitignore: -------------------------------------------------------------------------------- 1 | local 2 | -------------------------------------------------------------------------------- /.meteor/.id: -------------------------------------------------------------------------------- 1 | # This file contains a token that is unique to your project. 2 | # Check it into your repository along with the rest of this directory. 3 | # It can be used for purposes such as: 4 | # - ensuring you don't accidentally deploy one app on top of another 5 | # - providing package authors with aggregated statistics 6 | 7 | 1uv71v0y87j6d1ydvcip 8 | -------------------------------------------------------------------------------- /.meteor/cordova-plugins: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ehzhang/HELPq/a2eff6b4852ea691a4404b53af13e0dde5e1aa86/.meteor/cordova-plugins -------------------------------------------------------------------------------- /.meteor/packages: -------------------------------------------------------------------------------- 1 | # Meteor packages used by this project, one per line. 2 | # 3 | # 'meteor add' and 'meteor remove' will edit this file for you, 4 | # but you can also edit it by hand. 5 | 6 | accounts-github 7 | service-configuration 8 | iron:router 9 | 10 | accounts-facebook 11 | momentjs:moment 12 | reactive-var 13 | underscore 14 | accounts-password 15 | mizzao:user-status 16 | chart:chart 17 | fourseven:scss 18 | semantic:ui 19 | flemay:less-autoprefixer 20 | standard-minifiers 21 | meteor-base 22 | mobile-experience 23 | mongo 24 | blaze-html-templates 25 | session 26 | jquery 27 | tracker 28 | logging 29 | reload 30 | random 31 | ejson 32 | spacebars 33 | check 34 | -------------------------------------------------------------------------------- /.meteor/platforms: -------------------------------------------------------------------------------- 1 | browser 2 | server 3 | -------------------------------------------------------------------------------- /.meteor/release: -------------------------------------------------------------------------------- 1 | METEOR@1.2.1 2 | -------------------------------------------------------------------------------- /.meteor/versions: -------------------------------------------------------------------------------- 1 | accounts-base@1.2.2 2 | accounts-facebook@1.0.6 3 | accounts-github@1.0.6 4 | accounts-oauth@1.1.8 5 | accounts-password@1.1.4 6 | autoupdate@1.2.4 7 | babel-compiler@5.8.24_1 8 | babel-runtime@0.1.4 9 | base64@1.0.4 10 | binary-heap@1.0.4 11 | blaze@2.1.3 12 | blaze-html-templates@1.0.1 13 | blaze-tools@1.0.4 14 | boilerplate-generator@1.0.4 15 | caching-compiler@1.0.0 16 | caching-html-compiler@1.0.2 17 | callback-hook@1.0.4 18 | chart:chart@1.0.1-beta.4 19 | check@1.1.0 20 | coffeescript@1.0.11 21 | ddp@1.2.2 22 | ddp-client@1.2.1 23 | ddp-common@1.2.2 24 | ddp-rate-limiter@1.0.0 25 | ddp-server@1.2.2 26 | deps@1.0.9 27 | diff-sequence@1.0.1 28 | ecmascript@0.1.6 29 | ecmascript-runtime@0.2.6 30 | ejson@1.0.7 31 | email@1.0.8 32 | facebook@1.2.2 33 | fastclick@1.0.7 34 | flemay:less-autoprefixer@1.2.0 35 | fourseven:scss@3.4.1 36 | geojson-utils@1.0.4 37 | github@1.1.4 38 | hot-code-push@1.0.0 39 | html-tools@1.0.5 40 | htmljs@1.0.5 41 | http@1.1.1 42 | id-map@1.0.4 43 | iron:controller@1.0.12 44 | iron:core@1.0.11 45 | iron:dynamic-template@1.0.12 46 | iron:layout@1.0.12 47 | iron:location@1.0.11 48 | iron:middleware-stack@1.1.0 49 | iron:router@1.0.12 50 | iron:url@1.0.11 51 | jquery@1.11.4 52 | launch-screen@1.0.4 53 | livedata@1.0.15 54 | localstorage@1.0.5 55 | logging@1.0.8 56 | meteor@1.1.10 57 | meteor-base@1.0.1 58 | minifiers@1.1.7 59 | minimongo@1.0.10 60 | mizzao:timesync@0.3.4 61 | mizzao:user-status@0.6.6 62 | mobile-experience@1.0.1 63 | mobile-status-bar@1.0.6 64 | momentjs:moment@2.10.6 65 | mongo@1.1.3 66 | mongo-id@1.0.1 67 | npm-bcrypt@0.7.8_2 68 | npm-mongo@1.4.39_1 69 | oauth@1.1.6 70 | oauth2@1.1.5 71 | observe-sequence@1.0.7 72 | ordered-dict@1.0.4 73 | promise@0.5.1 74 | random@1.0.5 75 | rate-limit@1.0.0 76 | reactive-dict@1.1.3 77 | reactive-var@1.0.6 78 | reload@1.1.4 79 | retry@1.0.4 80 | routepolicy@1.0.6 81 | semantic:ui@2.1.6 82 | semantic:ui-data@2.1.6 83 | service-configuration@1.0.5 84 | session@1.1.1 85 | sha@1.0.4 86 | spacebars@1.0.7 87 | spacebars-compiler@1.0.7 88 | srp@1.0.4 89 | standard-minifiers@1.0.2 90 | templating@1.1.5 91 | templating-tools@1.0.0 92 | tracker@1.0.9 93 | ui@1.0.8 94 | underscore@1.0.4 95 | url@1.0.5 96 | webapp@1.2.3 97 | webapp-hashing@1.0.5 98 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | Contributing to HELPq 2 | ===================== 3 | 4 | Thank you for using HELPq, and we're really excited that you want to help out! 5 | 6 | Development Process 7 | ------------------- 8 | 9 | This project is developed mostly by me (Edwin Zhang), but quite a few hackathons have their own forks. Releases to master can be expected to be stable and ready to use (with configuration, of course), but dev will be the most up to date. 10 | 11 | Pull Requests 12 | ------------- 13 | 14 | We actively welcome your pull requests! 15 | 16 | However, before you begin, please create an issue so we can determine if the work, feature, or bugfix either has someone already working on it as a part of the current roadmap, or if the feature is not something that would belong in the HELPq as a core feature. 17 | 18 | This is mostly meant for discussion, so we can discuss things fully and make a really awesome product :) 19 | 20 | Issues 21 | ------ 22 | 23 | We use issues to track public bugs. Please make sure your description is clear and has sufficient instructions to be able to reproduce the issue. 24 | 25 | We also use issues to track feature requests and discuss. Please mark your issue as 'Feature Request' in this case! 26 | 27 | 28 | Coding Style 29 | ------------ 30 | 31 | Keep it clean, and keep things modular! 32 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Edwin Zhang 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 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "HELPq", 3 | "description": "An extensible, customizable real-time queue system", 4 | "env": { 5 | "ROOT_URL": "https://{SET THIS}.herokuapp.com/", 6 | "ADMIN_PASSWORD": "{SET THIS}", 7 | "ADMIN_USERNAME": "admin", 8 | "DEFAULT_MENTOR": "true", 9 | "FACEBOOK_CLIENT_ID": "facebook-client-id", 10 | "FACEBOOK_ENABLE": "false", 11 | "FACEBOOK_SECRET": "facebook-secret", 12 | "GITHUB_CLIENT_ID": "github-client-id", 13 | "GITHUB_ENABLE": "false", 14 | "GITHUB_SECRET": "github-secret", 15 | "GOOGLE_CLIENT_ID": "google-client-id", 16 | "GOOGLE_ENABLE": "false", 17 | "GOOGLE_SECRET": "google-secret", 18 | "SETTINGS_EXPIRATION_DELAY": "1800000", 19 | "SETTINGS_QUEUE_ENABLED": "true" 20 | }, 21 | "addons": [ 22 | "mongolab" 23 | ], 24 | "buildpacks": [ 25 | { 26 | "url": "https://github.com/AdmitHub/meteor-buildpack-horse" 27 | } 28 | ] 29 | } 30 | -------------------------------------------------------------------------------- /client/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /client/app.js: -------------------------------------------------------------------------------- 1 | Tickets = new Meteor.Collection("tickets"); 2 | Announcements = new Meteor.Collection("announcements"); 3 | Settings = new Meteor.Collection("settings"); 4 | 5 | Meteor.subscribe("userData"); 6 | 7 | Meteor.subscribe("activeTickets"); 8 | 9 | Meteor.subscribe("allAnnouncements"); 10 | 11 | Meteor.subscribe("mentorsOnline"); 12 | 13 | Meteor.subscribe("settings"); 14 | -------------------------------------------------------------------------------- /client/components/announcement/announcement.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/components/announcement/announcement.js: -------------------------------------------------------------------------------- 1 | Template.announcement.onCreated(function(){ 2 | this.subscribe("allAnnouncements"); 3 | }); 4 | 5 | Template.announcement.rendered = function(){ 6 | $(this.find('.message')).addClass('animated fadeIn'); 7 | }; 8 | 9 | Template.announcement.helpers({ 10 | announcement: function(){ 11 | return Announcements.findOne({},{sort: {timestamp: -1}}); 12 | }, 13 | time: function(){ 14 | return moment(this.timestamp).format('MMMM Do YYYY, h:mm a'); 15 | } 16 | }); -------------------------------------------------------------------------------- /client/components/announcementsTable/announcementsTable.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/components/announcementsTable/announcementsTable.js: -------------------------------------------------------------------------------- 1 | Template.announcementsTable.helpers({ 2 | announcements: function(){ 3 | return Announcements.find({ 4 | 5 | }, { 6 | sort: { 7 | timestamp: -1 8 | } 9 | }) 10 | }, 11 | time: function(){ 12 | return moment(this.timestamp).format('MMMM Do YYYY, h:mm a'); 13 | } 14 | }); 15 | 16 | Template.announcementsTable.events({ 17 | 'click .close.icon': function(){ 18 | Meteor.call('deleteAnnouncement', this._id); 19 | } 20 | }); -------------------------------------------------------------------------------- /client/components/announcer/announcer.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/components/announcer/announcer.js: -------------------------------------------------------------------------------- 1 | Template.announcer.rendered = function(){ 2 | $(this.findAll('.ui.checkbox')).checkbox(); 3 | }; 4 | 5 | Template.announcer.events({ 6 | 'click .submit.button': function(){ 7 | createAnnouncement(); 8 | }, 9 | 'keydown input': function(e){ 10 | if (e.keyCode == 13){ 11 | createAnnouncement(); 12 | } 13 | }, 14 | 'keyup .field': function(){ 15 | var $submit = $('button.submit'); 16 | if (isValid()){ 17 | $submit.removeClass('disabled'); 18 | } else { 19 | $submit.addClass('disabled'); 20 | } 21 | } 22 | }); 23 | 24 | function createAnnouncement(){ 25 | if(isValid()){ 26 | var a = getAnnouncement(); 27 | Meteor.call("createAnnouncement", a.header, a.content, a.type); 28 | clearFields(); 29 | } 30 | } 31 | 32 | function getAnnouncement(){ 33 | var form = $('.ui.form input, .ui.form textarea') 34 | .serializeArray() 35 | .reduce(function(obj, item) { 36 | obj[item.name] = item.value; 37 | return obj; 38 | }, {}); 39 | return { 40 | header: form.header, 41 | content: form.content, 42 | type: form.type 43 | } 44 | } 45 | 46 | function clearFields(){ 47 | $(".ui.form input[type='text'], .ui.form textarea").val(""); 48 | } 49 | 50 | function isValid(){ 51 | return $('#a-header').val().length > 0 52 | && $('#a-content').val().length > 0 53 | } 54 | -------------------------------------------------------------------------------- /client/components/banner/banner.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/components/charts/ticketCharts/ticketCharts.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/components/feed/feed.html: -------------------------------------------------------------------------------- 1 | 15 | 16 | -------------------------------------------------------------------------------- /client/components/feed/feed.js: -------------------------------------------------------------------------------- 1 | Template.feed.onCreated(function(){ 2 | this.subscribe("activeTickets"); 3 | }); 4 | 5 | Template.feed.helpers({ 6 | tickets: function () { 7 | return activeTickets(); 8 | }, 9 | mentorsAvailable: function(){ 10 | return mentorsOnline().length; 11 | }, 12 | estimatedWait: function(){ 13 | return formatTime(estimatedWait); 14 | } 15 | }); 16 | 17 | Template.feedTicket.helpers({ 18 | feedName: function () { 19 | if (this.name){ 20 | return this.name; 21 | } 22 | }, 23 | fromNow: function(time){ 24 | return moment(time).from(ReactiveNow.get()); 25 | }, 26 | open: function(){ 27 | return this.status === "OPEN"; 28 | }, 29 | claimed: function(){ 30 | return this.status === "CLAIMED"; 31 | } 32 | }); 33 | 34 | Template.feedTicket.rendered = function(){ 35 | $(this.find('.feedTicket')).addClass('animated fadeIn'); 36 | }; 37 | 38 | function activeTickets(){ 39 | return Tickets.find({ 40 | 'status': { 41 | $in: ['OPEN', 'CLAIMED'] 42 | } 43 | }, { 44 | $sort: {timestamp: 1} 45 | }).fetch(); 46 | } 47 | -------------------------------------------------------------------------------- /client/components/feedback/feedback.html: -------------------------------------------------------------------------------- 1 | 13 | 14 | -------------------------------------------------------------------------------- /client/components/feedback/feedback.js: -------------------------------------------------------------------------------- 1 | Template.feedback.onCreated(function(){ 2 | this.subscribe("allTickets"); 3 | }); 4 | 5 | Template.feedback.helpers({ 6 | tickets: function(){ 7 | return Tickets.find({status: 'COMPLETE'}) 8 | .fetch() 9 | .filter(function(t){ 10 | return t.rating; 11 | }) 12 | .map(function(t){ 13 | return { 14 | name: t.claimName, 15 | rating: t.rating, 16 | comments: t.comments 17 | } 18 | }); 19 | } 20 | 21 | }); 22 | 23 | Template.feedbackItem.helpers({ 24 | negative: function(){ 25 | return this.rating < 3; 26 | } 27 | }); 28 | 29 | Template.feedbackItem.rendered = function(){ 30 | $(this.findAll(".ui.rating")).rating( 31 | { 32 | interactive: false, 33 | maxRating: 5 34 | } 35 | ) 36 | }; -------------------------------------------------------------------------------- /client/components/footer/footer.html: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /client/components/leaderboard/leaderboard.html: -------------------------------------------------------------------------------- 1 | 14 | 15 | -------------------------------------------------------------------------------- /client/components/leaderboard/leaderboard.js: -------------------------------------------------------------------------------- 1 | Template.leaderboard.onCreated(function(){ 2 | this.subscribe("ticketData"); 3 | this.subscribe("allMentors"); 4 | this.rows = new ReactiveVar(); 5 | 6 | // TODO: Expand to more 7 | this.rows.set(10); 8 | }); 9 | 10 | Template.leaderboard.helpers({ 11 | topMentors: function(){ 12 | // Return the top number of mentors 13 | return topMentors(Template.instance().rows.get()); 14 | } 15 | }); 16 | 17 | // Ranking algorithm based on number of ratings and quality of ratings. 18 | function topMentors(num){ 19 | var mentors = {}; 20 | var tickets = Tickets.find({ 21 | status: "COMPLETE" 22 | }).fetch().filter(function(t){return t.rating > 0}); 23 | 24 | // Each mentor has a set of ratings 25 | tickets.forEach(function(t){ 26 | if (t.claimId){ 27 | if (!mentors[t.claimId]) { 28 | mentors[t.claimId] = { 29 | ratings: [] 30 | } 31 | } 32 | mentors[t.claimId].ratings.push(t.rating); 33 | } 34 | }); 35 | 36 | var ids = Object.keys(mentors); 37 | return ids 38 | .filter(function(id){ 39 | return Meteor.users.findOne({_id: id, 'profile.mentor': true}); 40 | }) 41 | .map(function(id){ 42 | return { 43 | profile: Meteor.users.findOne({_id: id}).profile, 44 | rating: laplaceSmooth(mentors[id].ratings), 45 | numTickets: mentors[id].ratings.length 46 | } 47 | }) 48 | .sort(function(a, b){ 49 | return b.rating - a.rating; 50 | }) 51 | .slice(0, num); 52 | 53 | } 54 | 55 | function laplaceSmooth(x){ 56 | var alpha = 6, 57 | beta = 2, 58 | sum = stats.sum(x); 59 | return ((sum + alpha)/(x.length + beta)).toFixed(1); 60 | } -------------------------------------------------------------------------------- /client/components/login/login.html: -------------------------------------------------------------------------------- 1 | 34 | -------------------------------------------------------------------------------- /client/components/login/login.js: -------------------------------------------------------------------------------- 1 | Template.login.onCreated(function(){ 2 | this.error = new ReactiveVar(); 3 | }); 4 | 5 | Template.login.events({ 6 | 'click #login-github': function(){ 7 | Meteor.loginWithGithub({ 8 | loginStyle: 'redirect' 9 | }); 10 | }, 11 | 'click #login-facebook': function(){ 12 | Meteor.loginWithFacebook({ 13 | loginStyle: 'redirect' 14 | }); 15 | }, 16 | 'click #login-password': function(e, t){ 17 | loginPassword(t); 18 | }, 19 | 'keyup #password': function(e, t){ 20 | if (e.keyCode === 13){ 21 | loginPassword(t); 22 | } 23 | } 24 | }); 25 | 26 | Template.login.helpers({ 27 | enabled: function(){ 28 | var services = {}; 29 | ServiceConfiguration.configurations 30 | .find({}) 31 | .fetch() 32 | .forEach(function(service){ 33 | services[service.service] = true; 34 | }); 35 | return services; 36 | }, 37 | error: function(){ 38 | return Template.instance().error.get(); 39 | } 40 | }); 41 | 42 | Template.login.rendered = function(){ 43 | $(this.findAll('.container')).addClass('animated fadeIn'); 44 | }; 45 | 46 | function loginPassword(t){ 47 | Meteor.loginWithPassword( 48 | $(t.findAll('#username')).val().trim(), 49 | $(t.findAll('#password')).val(), 50 | function(error){ 51 | if (error){ 52 | $(t.findAll('#password')).val(""); 53 | t.error.set(error.reason); 54 | } 55 | } 56 | ) 57 | } -------------------------------------------------------------------------------- /client/components/mentorStatus/mentorStatus.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/components/nav/nav.html: -------------------------------------------------------------------------------- 1 | 42 | 43 | 55 | 56 | -------------------------------------------------------------------------------- /client/components/nav/nav.js: -------------------------------------------------------------------------------- 1 | // ----------------------------- 2 | // Mentor section of Nav 3 | // ----------------------------- 4 | Template.navMentor.helpers({ 5 | openTickets: function(){ 6 | return Tickets.find({ 7 | status: { 8 | $in: ["OPEN", "CLAIMED"] 9 | } 10 | }).fetch().length; 11 | } 12 | }); 13 | 14 | // ----------------------------- 15 | // Account section of Nav 16 | // ----------------------------- 17 | Template.navAccount.rendered = function(){ 18 | $(this.findAll('.ui.dropdown')).dropdown(); 19 | }; 20 | 21 | Template.navAccount.events({ 22 | 'click #logout': function(){ 23 | Meteor.logout(); 24 | } 25 | }); 26 | 27 | Template.navAccount.helpers({ 28 | profile: function(){ 29 | if (Meteor.user().profile.name){ 30 | return Meteor.user().profile.name.split(" ")[0]; 31 | } 32 | return "Profile"; 33 | } 34 | }); -------------------------------------------------------------------------------- /client/components/skillsList/skillsList.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/components/skillsList/skillsList.js: -------------------------------------------------------------------------------- 1 | Template.skillsList.onCreated(function(){ 2 | this.subscribe("allMentors"); 3 | }); 4 | 5 | Template.skillsList.helpers({ 6 | skills: function(){ 7 | var skills = {}; 8 | Meteor.users.find({ 'profile.mentor': true}) 9 | .fetch() 10 | .forEach(function(mentor){ 11 | if (mentor.profile.skills){ 12 | mentor.profile.skills.forEach(function(skill){ 13 | var s = skill.toLowerCase(); 14 | if (skills[s]){ 15 | skills[s]++; 16 | } else { 17 | skills[s] = 1; 18 | } 19 | }) 20 | } 21 | }); 22 | var keys = Object.keys(skills); 23 | var count = []; 24 | keys.forEach(function(k){ 25 | count.push({ 26 | skill: k, 27 | count: skills[k] 28 | }) 29 | }); 30 | return count 31 | .sort(function(a, b){return b.count - a.count}) 32 | .slice(0, 15); 33 | } 34 | }); -------------------------------------------------------------------------------- /client/components/ticketStats/ticketStats.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/components/ticketStats/ticketStats.js: -------------------------------------------------------------------------------- 1 | Template.ticketStats.onCreated(function(){ 2 | this.subscribe("allTickets"); 3 | }); 4 | 5 | Template.ticketStats.helpers({ 6 | claimTimes: function(){ 7 | return Tickets.find({status: 'COMPLETE'}).fetch() 8 | .filter(function(ticket){ 9 | return ticket.claimTime && ticket.timestamp; 10 | }) 11 | .map(function(ticket){ 12 | return (ticket.claimTime - ticket.timestamp); 13 | }); 14 | }, 15 | completeTimes: function(){ 16 | return Tickets.find({status: 'COMPLETE'}) 17 | .fetch() 18 | .filter(function(t){return t.claimTime && t.completeTime}) 19 | .map(function(t){return t.completeTime - t.claimTime}); 20 | }, 21 | ratings: function(){ 22 | return Tickets.find({}) 23 | .fetch() 24 | .filter(function(t){return t.rating}) 25 | .map(function(t){return t.rating}); 26 | }, 27 | meanTime: function(){ 28 | return formatTime(stats.mean(this)); 29 | }, 30 | medianTime: function(){ 31 | return formatTime(stats.median(this)); 32 | }, 33 | stdDevTime: function(){ 34 | return formatTime(stats.stdDev(this)); 35 | }, 36 | mean: function(){ 37 | return stats.mean(this).toFixed(1); 38 | }, 39 | count: function(num){ 40 | return this.filter(function(n){return n == num}).length; 41 | } 42 | 43 | }); 44 | 45 | function formatTime(ms){ 46 | var sec = ms/1000; 47 | var output = (sec % 60).toFixed(0) + " seconds"; 48 | if (sec > 60){ 49 | output = Math.floor(sec / 60) + " minutes, " + output; 50 | } 51 | if (sec > 3600){ 52 | output = Math.floor(sec / 3600) + " hours, " + output; 53 | } 54 | return output; 55 | } -------------------------------------------------------------------------------- /client/components/ticketTable/ticketTable.html: -------------------------------------------------------------------------------- 1 | 49 | -------------------------------------------------------------------------------- /client/components/ticketTable/ticketTable.js: -------------------------------------------------------------------------------- 1 | Template.ticketTable.onCreated(function(){ 2 | this.subscribe("allTickets"); 3 | }); 4 | 5 | Template.ticketTable.helpers({ 6 | tickets: function(){ 7 | return Tickets.find({ 8 | },{ 9 | sort: { 10 | timestamp: -1 11 | } 12 | } 13 | 14 | ); 15 | }, 16 | rowClass: function(){ 17 | if (this.status === "COMPLETE") return "positive"; 18 | if (this.status === "CANCELLED") return "negative"; 19 | if (this.status === "CLAIMED") return "active"; 20 | if (this.status === "EXPIRED") return "warning"; 21 | } 22 | }); 23 | 24 | Template.ticketTable.events({ 25 | 'click .delete': function(){ 26 | Meteor.call('deleteTicket', this._id); 27 | } 28 | }); -------------------------------------------------------------------------------- /client/components/tickets/ticket/ticket.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/components/tickets/ticket/ticket.js: -------------------------------------------------------------------------------- 1 | Template.ticket.rendered = function(){ 2 | }; 3 | 4 | Template.ticket.helpers({ 5 | statusIs: function(status){ 6 | return this.status === status; 7 | }, 8 | claimer: function(){ 9 | return this.claimId === Meteor.user()._id; 10 | }, 11 | ownsTicket: function(){ 12 | return this.userId === Meteor.user()._id; 13 | }, 14 | fromNow: function(){ 15 | return moment(this.timestamp).from(ReactiveNow.get()); 16 | }, 17 | formattedDate: function(){ 18 | return moment().format('MMMM Do YYYY, h:mm a'); 19 | }, 20 | hasClaimedTicket: function(){ 21 | return Tickets.find({status: "CLAIMED", claimId: Meteor.user()._id}).fetch().length > 0; 22 | } 23 | }); 24 | 25 | Template.ticket.events({ 26 | 'click .claim.button': function(){ 27 | Meteor.call('claimTicket', this._id); 28 | }, 29 | 'click .complete.button': function(){ 30 | Meteor.call('completeTicket', this._id); 31 | }, 32 | 'click .reopen.button': function(){ 33 | Meteor.call('reopenTicket', this._id); 34 | }, 35 | 'click .cancel.button': function(){ 36 | if(confirm('Are you sure you would like to cancel this ticket?')){ 37 | Meteor.call('cancelTicket', this._id); 38 | } 39 | } 40 | }); -------------------------------------------------------------------------------- /client/components/tickets/tickets.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/components/tickets/tickets.js: -------------------------------------------------------------------------------- 1 | Template.tickets.helpers({ 2 | activeTickets: function () { 3 | return Tickets.find({ 4 | status: { 5 | $in: ['OPEN', 'CLAIMED'] 6 | } 7 | }).fetch(); 8 | } 9 | }); 10 | -------------------------------------------------------------------------------- /client/components/userEdit/userEdit.html: -------------------------------------------------------------------------------- 1 | 52 | -------------------------------------------------------------------------------- /client/components/userEdit/userEdit.js: -------------------------------------------------------------------------------- 1 | Template.userEdit.created = function (){ 2 | var skills = this.data.profile.skills ? this.data.profile.skills : []; 3 | 4 | this.skills = new ReactiveVar(skills); 5 | this.success = new ReactiveVar(); 6 | this.error = new ReactiveVar(); 7 | }; 8 | Template.userEdit.helpers({ 9 | success: function(){ 10 | return Template.instance().success.get(); 11 | }, 12 | error: function(){ 13 | return Template.instance().error.get(); 14 | }, 15 | skills: function(){ 16 | return Template.instance().skills.get().map(function(skill, idx){ 17 | return { 18 | index: idx, 19 | skill: skill 20 | } 21 | }); 22 | } 23 | }); 24 | 25 | Template.userEdit.events({ 26 | 'click .delete.skill': function(e, t){ 27 | removeSkill(e, t); 28 | }, 29 | "keyup input[name='skills']": function(e, t){ 30 | if (e.keyCode === 13){ 31 | addSkill(e, t) 32 | } 33 | }, 34 | 'click .add-skill': addSkill, 35 | 'click .save.button': function(e, t){ 36 | var profile = {}; 37 | 38 | // Get the profile inputs 39 | // Look in this template only 40 | $(t.firstNode).find('input.profile').each(function(idx, el){ 41 | var $el = $(el); 42 | profile[$el.attr('name')] = $el.val(); 43 | }); 44 | 45 | // Get the skills 46 | profile['skills'] = t.skills.get(); 47 | 48 | Meteor.call("updateUser", t.data._id, profile, function(err){ 49 | if (err){ 50 | t.error.set(err); 51 | setTimeout(function(){ 52 | t.error.set(false); 53 | }, 5000) 54 | } else { 55 | t.success.set(true); 56 | setTimeout(function(){ 57 | t.success.set(false); 58 | }, 5000); 59 | } 60 | }); 61 | } 62 | }); 63 | 64 | function removeSkill(e, t){ 65 | var skills = t.skills.get(); 66 | var idx = e.target.getAttribute('data-index'); 67 | skills.splice(idx, 1); 68 | t.skills.set(skills); 69 | } 70 | 71 | function addSkill(e, t){ 72 | var $skillsInput = $("input[name='skills']"); 73 | var skills = t.skills.get(); 74 | if (skills.indexOf($skillsInput.val().toLowerCase()) < 0){ 75 | skills.push($skillsInput.val().toLowerCase()); 76 | t.skills.set(skills); 77 | } 78 | $skillsInput.val(""); 79 | } -------------------------------------------------------------------------------- /client/components/userStats/userStats.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/components/userStats/userStats.js: -------------------------------------------------------------------------------- 1 | Template.userStats.onCreated(function(){ 2 | this.subscribe("allUsers"); 3 | this.subscribe("allTickets"); 4 | }); 5 | 6 | Template.userStats.helpers({ 7 | users: function(){ 8 | return users(); 9 | }, 10 | mentors: function(){ 11 | return Meteor.users.find({ 12 | 'profile.mentor': true 13 | }).fetch(); 14 | }, 15 | ticketCount: function(){ 16 | return tickets().length; 17 | }, 18 | activeMentors: function(){ 19 | return uniqueProp('claimId'); 20 | }, 21 | activeUsers: function(){ 22 | return uniqueProp('userId'); 23 | }, 24 | countStatus: function(status){ 25 | return countStatus(status); 26 | }, 27 | percentStatus: function(status){ 28 | return ticketPercent(countStatus(status)); 29 | }, 30 | wordFreqs: function(){ 31 | var text = tickets().reduce(function(prev, next){ 32 | return prev + " " + next.topic; 33 | }, ""); 34 | return wordFreqs(text); 35 | } 36 | }); 37 | 38 | function tickets(){ 39 | return Tickets.find({}).fetch(); 40 | } 41 | 42 | function users(){ 43 | return Meteor.users.find({}).fetch(); 44 | } 45 | 46 | // Aggregate the number of types of tickets each user submit; 47 | function uniqueProp(key){ 48 | var users = {}; 49 | var count = 0; 50 | tickets().forEach(function(t){ 51 | if (t[key] && !users[t[key]]) { 52 | users[t[key]] = true; 53 | count += 1; 54 | } 55 | }); 56 | return count; 57 | } 58 | 59 | function countStatus(status){ 60 | return tickets().filter(function(t){return t.status === status}).length; 61 | } 62 | 63 | function ticketPercent(n){ 64 | return ((n / tickets().length) * 100).toFixed(0); 65 | } 66 | 67 | function wordFreqs(text){ 68 | var cleaned = text.replace(/[\.,-\/#!$%\^&\*;:{}=\-_`~()]/g,""); 69 | var words = cleaned.split(" "); 70 | var freq = {}; 71 | var ignore = ['',' ', 'and','the','to','a','of','for','as','i','with','it','is','on','that','this','can','in','be','has','if']; 72 | 73 | for (var i = 0; i < words.length; i++){ 74 | var word = words[i].toLowerCase(); 75 | if (!ignore.indexOf(word) > -1){ 76 | freq[word] = freq[word] || 0; 77 | freq[word] += 1; 78 | } 79 | } 80 | 81 | var keys = Object.keys(freq); 82 | var freqs = []; 83 | keys.forEach(function(key){ 84 | freqs.push({ 85 | word: key, 86 | count: freq[key] 87 | }); 88 | }); 89 | return freqs.sort(function(a, b){ 90 | return b.count - a.count; 91 | }).slice(0, 50); 92 | } -------------------------------------------------------------------------------- /client/components/userTable/userTable.js: -------------------------------------------------------------------------------- 1 | var filters = { 2 | all: {} 3 | , 4 | student: { 5 | 'profile.mentor': { 6 | $in: [false, null] 7 | }, 8 | 'profile.admin': { 9 | $in: [false, null] 10 | } 11 | }, 12 | mentor: { 13 | 'profile.mentor': true 14 | }, 15 | admin: { 16 | 'profile.admin': true 17 | } 18 | }; 19 | 20 | Template.userTable.onCreated(function(){ 21 | this.searchText = new ReactiveVar(); 22 | this.filter = new ReactiveVar({}); 23 | this.modal = new ReactiveVar(); 24 | 25 | this.subscribe("allUsers"); 26 | }); 27 | 28 | Template.userTable.rendered = function(){ 29 | $(this.find('.ui.dropdown')).dropdown(); 30 | }; 31 | 32 | Template.userTable.helpers({ 33 | filter: function(){ 34 | return Template.instance().filter.get(); 35 | }, 36 | searchText: function() { 37 | return Template.instance().searchText.get(); 38 | }, 39 | users: function(){ 40 | var t = Template.instance(); 41 | var users = Meteor.users.find( 42 | t.filter.get() 43 | , { 44 | sort: { 45 | createdAt: 1 46 | } 47 | }).fetch(); 48 | return filterBySearchText(users, t.searchText.get()); 49 | } 50 | }); 51 | 52 | Template.userTable.events({ 53 | 'click .toggle-mentor': function(){ 54 | Meteor.call("toggleRole", "mentor", this._id); 55 | }, 56 | 'click .toggle-admin': function(){ 57 | if (this._id === Meteor.userId()){ 58 | if (confirm('Are you sure you would like to remove your admin privileges?')){ 59 | Meteor.call("toggleRole", "admin", this._id); 60 | } 61 | } else { 62 | Meteor.call("toggleRole", "admin", this._id); 63 | } 64 | }, 65 | 'keyup .searchText': function(e, t){ 66 | var currentValue=t.find(".searchText").value; 67 | t.searchText.set(currentValue); 68 | }, 69 | 'click .filter': function(e, t){ 70 | var filter = filters[e.target.getAttribute('data-filter')]; 71 | t.filter.set(filter); 72 | }, 73 | 'click .edit-user.button': function(e, t){ 74 | t.modal.set(Blaze.renderWithData( 75 | Template.userEdit, 76 | this, 77 | $('.edit-user.modal .content').get(0))); 78 | 79 | // Semantic-UI wants to remove the modal from the template and add it 80 | // to a page dimmer. 81 | // Modal needs to be detachable, so that it is not removed 82 | // from the template and pile up in the body. 83 | $('.ui.edit-user.modal') 84 | .modal({ 85 | 'detachable': false, 86 | 'closable': false 87 | }) 88 | .modal('show'); 89 | }, 90 | 'click .edit-user.modal .close': function(e, t){ 91 | Blaze.remove(t.modal.get()); 92 | } 93 | }); 94 | 95 | function filterBySearchText(users, searchText){ 96 | return users.filter(function(user){ 97 | if (!searchText) return true; 98 | return JSON.stringify(user).toLowerCase().indexOf(searchText.toLowerCase()) > -1; 99 | }) 100 | } -------------------------------------------------------------------------------- /client/helpers.js: -------------------------------------------------------------------------------- 1 | // ----------------------- 2 | // UI Helpers 3 | // ----------------------- 4 | 5 | // Get a constant from the constants.js 6 | UI.registerHelper('constant', function(variable){ 7 | return window["CONSTANTS"][variable]; 8 | }); 9 | 10 | // ----------------------- 11 | // Handlebars Helpers 12 | // ----------------------- 13 | 14 | // Check if a user is a certain role 15 | UI.registerHelper('userIs', function(role){ 16 | return authorized[role](); 17 | }); -------------------------------------------------------------------------------- /client/layouts/bannerLayout.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/lib/ReactiveNow.js: -------------------------------------------------------------------------------- 1 | window.ReactiveNow = new ReactiveVar(Date.now()); 2 | 3 | setInterval(function(){ 4 | ReactiveNow.set(Date.now()); 5 | }, 30000); 6 | -------------------------------------------------------------------------------- /client/lib/auth.js: -------------------------------------------------------------------------------- 1 | // Admin have all rights 2 | window.authorized = { 3 | user: function(){ 4 | return Meteor.userId() ? true : false; 5 | }, 6 | admin: function(){ 7 | return Meteor.user() && Meteor.user().profile.admin; 8 | }, 9 | mentor: function(){ 10 | return Meteor.user() && Meteor.user().profile.mentor; 11 | } 12 | }; 13 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/.custom.semantic.json: -------------------------------------------------------------------------------- 1 | { 2 | "definitions": { 3 | "accordion": true, 4 | "ad": true, 5 | "api": true, 6 | "breadcrumb": true, 7 | "button": true, 8 | "card": true, 9 | "checkbox": true, 10 | "colorize": true, 11 | "comment": true, 12 | "container": true, 13 | "dimmer": true, 14 | "divider": true, 15 | "dropdown": true, 16 | "embed": true, 17 | "feed": true, 18 | "flag": true, 19 | "form": true, 20 | "grid": true, 21 | "header": true, 22 | "icon": true, 23 | "image": true, 24 | "input": true, 25 | "item": true, 26 | "label": true, 27 | "list": true, 28 | "loader": true, 29 | "menu": true, 30 | "message": true, 31 | "modal": true, 32 | "nag": true, 33 | "popup": true, 34 | "progress": true, 35 | "rail": true, 36 | "rating": true, 37 | "reset": true, 38 | "reveal": true, 39 | "search": true, 40 | "segment": true, 41 | "shape": true, 42 | "sidebar": true, 43 | "site": true, 44 | "state": true, 45 | "statistic": true, 46 | "step": true, 47 | "sticky": true, 48 | "tab": true, 49 | "table": true, 50 | "transition": true, 51 | "visibility": true, 52 | "visit": true 53 | }, 54 | "themes": { 55 | "amazon": false, 56 | "basic": false, 57 | "bookish": false, 58 | "bootstrap3": false, 59 | "chubby": false, 60 | "classic": false, 61 | "colored": false, 62 | "default": true, 63 | "duo": false, 64 | "fixed": false, 65 | "flat": false, 66 | "github": false, 67 | "gmail": false, 68 | "instagram": false, 69 | "material": false, 70 | "pulsar": false, 71 | "raised": false, 72 | "resetcss": false, 73 | "round": false, 74 | "rtl": false, 75 | "striped": false, 76 | "timeline": false, 77 | "twitter": false 78 | } 79 | } -------------------------------------------------------------------------------- /client/lib/semantic-ui/custom.semantic.json: -------------------------------------------------------------------------------- 1 | { 2 | "definitions": { 3 | "accordion": true, 4 | "ad": true, 5 | "api": true, 6 | "breadcrumb": true, 7 | "button": true, 8 | "card": true, 9 | "checkbox": true, 10 | "colorize": true, 11 | "comment": true, 12 | "container": true, 13 | "dimmer": true, 14 | "divider": true, 15 | "dropdown": true, 16 | "embed": true, 17 | "feed": true, 18 | "flag": true, 19 | "form": true, 20 | "grid": true, 21 | "header": true, 22 | "icon": true, 23 | "image": true, 24 | "input": true, 25 | "item": true, 26 | "label": true, 27 | "list": true, 28 | "loader": true, 29 | "menu": true, 30 | "message": true, 31 | "modal": true, 32 | "nag": true, 33 | "popup": true, 34 | "progress": true, 35 | "rail": true, 36 | "rating": true, 37 | "reset": true, 38 | "reveal": true, 39 | "search": true, 40 | "segment": true, 41 | "shape": true, 42 | "sidebar": true, 43 | "site": true, 44 | "state": true, 45 | "statistic": true, 46 | "step": true, 47 | "sticky": true, 48 | "tab": true, 49 | "table": true, 50 | "transition": true, 51 | "visibility": true, 52 | "visit": true 53 | }, 54 | "themes": { 55 | "amazon": false, 56 | "basic": false, 57 | "bookish": false, 58 | "bootstrap3": false, 59 | "chubby": false, 60 | "classic": false, 61 | "colored": false, 62 | "default": true, 63 | "duo": false, 64 | "fixed": false, 65 | "flat": false, 66 | "github": false, 67 | "gmail": false, 68 | "instagram": false, 69 | "material": false, 70 | "pulsar": false, 71 | "raised": false, 72 | "resetcss": false, 73 | "round": false, 74 | "rtl": false, 75 | "striped": false, 76 | "timeline": false, 77 | "twitter": false 78 | } 79 | } -------------------------------------------------------------------------------- /client/lib/semantic-ui/definitions/collections/breadcrumb.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /*! 6 | * # Semantic UI - Breadcrumb 7 | * http://github.com/semantic-org/semantic-ui/ 8 | * 9 | * 10 | * Copyright 2015 Contributors 11 | * Released under the MIT license 12 | * http://opensource.org/licenses/MIT 13 | * 14 | */ 15 | 16 | /******************************* 17 | Theme 18 | *******************************/ 19 | 20 | @type : 'collection'; 21 | @element : 'breadcrumb'; 22 | 23 | @import (multiple) '../../theme.config.import.less'; 24 | 25 | 26 | /******************************* 27 | Breadcrumb 28 | *******************************/ 29 | 30 | .ui.breadcrumb { 31 | line-height: 1; 32 | display: @display; 33 | margin: @verticalMargin 0em; 34 | vertical-align: @verticalAlign; 35 | } 36 | .ui.breadcrumb:first-child { 37 | margin-top: 0em; 38 | } 39 | .ui.breadcrumb:last-child { 40 | margin-bottom: 0em; 41 | } 42 | 43 | /******************************* 44 | Content 45 | *******************************/ 46 | 47 | /* Divider */ 48 | .ui.breadcrumb .divider { 49 | display: inline-block; 50 | opacity: @dividerOpacity; 51 | margin: 0em @dividerSpacing 0em; 52 | 53 | font-size: @dividerSize; 54 | color: @dividerColor; 55 | vertical-align: @dividerVerticalAlign; 56 | } 57 | 58 | /* Link */ 59 | .ui.breadcrumb a { 60 | color: @linkColor; 61 | } 62 | .ui.breadcrumb a:hover { 63 | color: @linkHoverColor; 64 | } 65 | 66 | 67 | /* Icon Divider */ 68 | .ui.breadcrumb .icon.divider { 69 | font-size: @iconDividerSize; 70 | vertical-align: @iconDividerVerticalAlign; 71 | } 72 | 73 | /* Section */ 74 | .ui.breadcrumb a.section { 75 | cursor: pointer; 76 | } 77 | .ui.breadcrumb .section { 78 | display: inline-block; 79 | margin: @sectionMargin; 80 | padding: @sectionPadding; 81 | } 82 | 83 | /* Loose Coupling */ 84 | .ui.breadcrumb.segment { 85 | display: inline-block; 86 | padding: @segmentPadding; 87 | } 88 | 89 | /******************************* 90 | States 91 | *******************************/ 92 | 93 | .ui.breadcrumb .active.section { 94 | font-weight: @activeFontWeight; 95 | } 96 | 97 | 98 | /******************************* 99 | Variations 100 | *******************************/ 101 | 102 | .ui.mini.breadcrumb { 103 | font-size: @mini; 104 | } 105 | .ui.tiny.breadcrumb { 106 | font-size: @tiny; 107 | } 108 | .ui.small.breadcrumb { 109 | font-size: @small; 110 | } 111 | .ui.breadcrumb { 112 | font-size: @medium; 113 | } 114 | .ui.large.breadcrumb { 115 | font-size: @large; 116 | } 117 | .ui.big.breadcrumb { 118 | font-size: @big; 119 | } 120 | .ui.huge.breadcrumb { 121 | font-size: @huge; 122 | } 123 | .ui.massive.breadcrumb { 124 | font-size: @massive; 125 | } 126 | 127 | .loadUIOverrides(); -------------------------------------------------------------------------------- /client/lib/semantic-ui/definitions/elements/flag.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /*! 6 | * # Semantic UI - Flag 7 | * http://github.com/semantic-org/semantic-ui/ 8 | * 9 | * 10 | * Copyright 2015 Contributors 11 | * Released under the MIT license 12 | * http://opensource.org/licenses/MIT 13 | * 14 | */ 15 | 16 | 17 | /******************************* 18 | Theme 19 | *******************************/ 20 | 21 | @type : 'element'; 22 | @element : 'flag'; 23 | 24 | @import (multiple) '../../theme.config.import.less'; 25 | 26 | 27 | /******************************* 28 | Flag 29 | *******************************/ 30 | 31 | i.flag:not(.icon) { 32 | display: inline-block; 33 | 34 | width: @width; 35 | height: @height; 36 | 37 | line-height: @height; 38 | vertical-align: @verticalAlign; 39 | margin: 0em @margin 0em 0em; 40 | 41 | text-decoration: inherit; 42 | 43 | speak: none; 44 | font-smoothing: antialiased; 45 | backface-visibility: hidden; 46 | } 47 | 48 | /* Sprite */ 49 | i.flag:not(.icon):before { 50 | display: inline-block; 51 | content: ''; 52 | background: url(@spritePath) no-repeat 0px 0px; 53 | width: @width; 54 | height: @height; 55 | } 56 | 57 | .loadUIOverrides(); -------------------------------------------------------------------------------- /client/lib/semantic-ui/definitions/elements/rail.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /*! 6 | * # Semantic UI - Rail 7 | * http://github.com/semantic-org/semantic-ui/ 8 | * 9 | * 10 | * Copyright 2015 Contributors 11 | * Released under the MIT license 12 | * http://opensource.org/licenses/MIT 13 | * 14 | */ 15 | 16 | /******************************* 17 | Theme 18 | *******************************/ 19 | 20 | @type : 'element'; 21 | @element : 'rail'; 22 | 23 | @import (multiple) '../../theme.config.import.less'; 24 | 25 | /******************************* 26 | Rails 27 | *******************************/ 28 | 29 | .ui.rail { 30 | position: absolute; 31 | top: 0%; 32 | width: @width; 33 | height: @height; 34 | } 35 | 36 | .ui.left.rail { 37 | left: auto; 38 | right: 100%; 39 | padding: 0em @splitDistance 0em 0em; 40 | margin: 0em @splitDistance 0em 0em; 41 | } 42 | 43 | .ui.right.rail { 44 | left: 100%; 45 | right: auto; 46 | padding: 0em 0em 0em @splitDistance; 47 | margin: 0em 0em 0em @splitDistance; 48 | } 49 | 50 | /******************************* 51 | Variations 52 | *******************************/ 53 | 54 | /*-------------- 55 | Internal 56 | ---------------*/ 57 | 58 | .ui.left.internal.rail { 59 | left: 0%; 60 | right: auto; 61 | padding: 0em 0em 0em @splitDistance; 62 | margin: 0em 0em 0em @splitDistance; 63 | } 64 | 65 | .ui.right.internal.rail { 66 | left: auto; 67 | right: 0%; 68 | padding: 0em @splitDistance 0em 0em; 69 | margin: 0em @splitDistance 0em 0em; 70 | } 71 | 72 | 73 | /*-------------- 74 | Dividing 75 | ---------------*/ 76 | 77 | .ui.dividing.rail { 78 | width: @dividingWidth; 79 | } 80 | .ui.left.dividing.rail { 81 | padding: 0em @splitDividingDistance 0em 0em; 82 | margin: 0em @splitDividingDistance 0em 0em; 83 | border-right: @dividingBorder; 84 | } 85 | .ui.right.dividing.rail { 86 | border-left: @dividingBorder; 87 | padding: 0em 0em 0em @splitDividingDistance; 88 | margin: 0em 0em 0em @splitDividingDistance; 89 | } 90 | 91 | /*-------------- 92 | Distance 93 | ---------------*/ 94 | 95 | .ui.close.rail { 96 | width: @closeWidth; 97 | } 98 | .ui.close.left.rail { 99 | padding: 0em @splitCloseDistance 0em 0em; 100 | margin: 0em @splitCloseDistance 0em 0em; 101 | } 102 | .ui.close.right.rail { 103 | padding: 0em 0em 0em @splitCloseDistance; 104 | margin: 0em 0em 0em @splitCloseDistance; 105 | } 106 | 107 | .ui.very.close.rail { 108 | width: @veryCloseWidth; 109 | } 110 | .ui.very.close.left.rail { 111 | padding: 0em @splitVeryCloseDistance 0em 0em; 112 | margin: 0em @splitVeryCloseDistance 0em 0em; 113 | } 114 | .ui.very.close.right.rail { 115 | padding: 0em 0em 0em @splitVeryCloseDistance; 116 | margin: 0em 0em 0em @splitVeryCloseDistance; 117 | } 118 | 119 | /*-------------- 120 | Attached 121 | ---------------*/ 122 | 123 | .ui.attached.left.rail, 124 | .ui.attached.right.rail { 125 | padding: 0em; 126 | margin: 0em; 127 | } 128 | 129 | /*-------------- 130 | Sizing 131 | ---------------*/ 132 | 133 | .ui.rail { 134 | font-size: @medium; 135 | } 136 | 137 | 138 | 139 | .loadUIOverrides(); 140 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/definitions/globals/reset.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /*! 6 | * # Semantic UI - Reset 7 | * http://github.com/semantic-org/semantic-ui/ 8 | * 9 | * 10 | * Copyright 2015 Contributors 11 | * Released under the MIT license 12 | * http://opensource.org/licenses/MIT 13 | * 14 | */ 15 | 16 | /******************************* 17 | Theme 18 | *******************************/ 19 | 20 | @type : 'global'; 21 | @element : 'reset'; 22 | 23 | @import (multiple) '../../theme.config.import.less'; 24 | 25 | /******************************* 26 | Reset 27 | *******************************/ 28 | 29 | /* Border-Box */ 30 | *, 31 | *:before, 32 | *:after { 33 | box-sizing: inherit; 34 | } 35 | html { 36 | box-sizing: border-box; 37 | } 38 | 39 | /* iPad Input Shadows */ 40 | input[type="text"], input[type="email"], input[type="search"], input[type="password"] { 41 | -webkit-appearance: none; 42 | -moz-appearance: none; /* mobile firefox too! */ 43 | } 44 | 45 | .loadUIOverrides(); -------------------------------------------------------------------------------- /client/lib/semantic-ui/definitions/modules/shape.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /*! 6 | * # Semantic UI - Shape 7 | * http://github.com/semantic-org/semantic-ui/ 8 | * 9 | * 10 | * Copyright 2015 Contributors 11 | * Released under the MIT license 12 | * http://opensource.org/licenses/MIT 13 | * 14 | */ 15 | 16 | 17 | 18 | /******************************* 19 | Theme 20 | *******************************/ 21 | 22 | @type : 'module'; 23 | @element : 'shape'; 24 | 25 | @import (multiple) '../../theme.config.import.less'; 26 | 27 | /******************************* 28 | Shape 29 | *******************************/ 30 | 31 | .ui.shape { 32 | position: relative; 33 | vertical-align: top; 34 | display: @display; 35 | perspective: @perspective; 36 | transition: @transition; 37 | } 38 | 39 | .ui.shape .sides { 40 | transform-style: preserve-3d; 41 | } 42 | 43 | .ui.shape .side { 44 | opacity: 1; 45 | width: 100%; 46 | 47 | margin: @sideMargin !important; 48 | backface-visibility: @backfaceVisibility; 49 | } 50 | 51 | .ui.shape .side { 52 | display: none; 53 | } 54 | 55 | .ui.shape .side * { 56 | backface-visibility: visible !important; 57 | } 58 | 59 | /******************************* 60 | Types 61 | *******************************/ 62 | 63 | .ui.cube.shape .side { 64 | min-width: @cubeSize; 65 | height: @cubeSize; 66 | 67 | padding: @cubePadding; 68 | 69 | background-color: @cubeBackground; 70 | color: @cubeTextColor; 71 | box-shadow: @cubeBoxShadow; 72 | } 73 | .ui.cube.shape .side > .content { 74 | width: 100%; 75 | height: 100%; 76 | display: table; 77 | 78 | text-align: @cubeTextAlign; 79 | user-select: text; 80 | } 81 | .ui.cube.shape .side > .content > div { 82 | display: table-cell; 83 | vertical-align: middle; 84 | font-size: @cubeFontSize; 85 | } 86 | 87 | /******************************* 88 | Variations 89 | *******************************/ 90 | 91 | .ui.text.shape.animating .sides { 92 | position: static; 93 | } 94 | .ui.text.shape .side { 95 | white-space: nowrap; 96 | } 97 | .ui.text.shape .side > * { 98 | white-space: normal; 99 | } 100 | 101 | 102 | /******************************* 103 | States 104 | *******************************/ 105 | 106 | /*-------------- 107 | Loading 108 | ---------------*/ 109 | 110 | .ui.loading.shape { 111 | position: absolute; 112 | top: -9999px; 113 | left: -9999px; 114 | } 115 | 116 | 117 | /*-------------- 118 | Animating 119 | ---------------*/ 120 | 121 | .ui.shape .animating.side { 122 | position: absolute; 123 | top: 0px; 124 | left: 0px; 125 | display: block; 126 | z-index: @animatingZIndex; 127 | } 128 | .ui.shape .hidden.side { 129 | opacity: @hiddenSideOpacity; 130 | } 131 | 132 | 133 | /*-------------- 134 | CSS 135 | ---------------*/ 136 | 137 | .ui.shape.animating .sides { 138 | position: absolute; 139 | } 140 | .ui.shape.animating .sides { 141 | transition: @transition; 142 | } 143 | .ui.shape.animating .side { 144 | transition: @sideTransition; 145 | } 146 | 147 | /*-------------- 148 | Active 149 | ---------------*/ 150 | 151 | .ui.shape .active.side { 152 | display: block; 153 | } 154 | 155 | .loadUIOverrides(); -------------------------------------------------------------------------------- /client/lib/semantic-ui/definitions/modules/sticky.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /*! 6 | * # Semantic UI - Sticky 7 | * http://github.com/semantic-org/semantic-ui/ 8 | * 9 | * 10 | * Copyright 2015 Contributors 11 | * Released under the MIT license 12 | * http://opensource.org/licenses/MIT 13 | * 14 | */ 15 | 16 | 17 | /******************************* 18 | Theme 19 | *******************************/ 20 | 21 | @type : 'module'; 22 | @element : 'sticky'; 23 | 24 | @import (multiple) '../../theme.config.import.less'; 25 | 26 | /******************************* 27 | Sticky 28 | *******************************/ 29 | 30 | .ui.sticky { 31 | position: static; 32 | transition: @transition; 33 | z-index: @zIndex; 34 | } 35 | 36 | /******************************* 37 | States 38 | *******************************/ 39 | 40 | /* Bound */ 41 | .ui.sticky.bound { 42 | position: absolute; 43 | left: auto; 44 | right: auto; 45 | } 46 | 47 | /* Fixed */ 48 | .ui.sticky.fixed { 49 | position: fixed; 50 | left: auto; 51 | right: auto; 52 | } 53 | 54 | /* Bound/Fixed Position */ 55 | .ui.sticky.bound.top, 56 | .ui.sticky.fixed.top { 57 | top: 0px; 58 | bottom: auto; 59 | } 60 | .ui.sticky.bound.bottom, 61 | .ui.sticky.fixed.bottom { 62 | top: auto; 63 | bottom: 0px; 64 | } 65 | 66 | 67 | /******************************* 68 | Types 69 | *******************************/ 70 | 71 | .ui.native.sticky { 72 | position: -webkit-sticky; 73 | position: -moz-sticky; 74 | position: -ms-sticky; 75 | position: -o-sticky; 76 | position: sticky; 77 | } 78 | 79 | .loadUIOverrides(); -------------------------------------------------------------------------------- /client/lib/semantic-ui/definitions/modules/tab.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /*! 6 | * # Semantic UI - Tab 7 | * http://github.com/semantic-org/semantic-ui/ 8 | * 9 | * 10 | * Copyright 2015 Contributors 11 | * Released under the MIT license 12 | * http://opensource.org/licenses/MIT 13 | * 14 | */ 15 | 16 | 17 | /******************************* 18 | Theme 19 | *******************************/ 20 | 21 | @type : 'module'; 22 | @element : 'tab'; 23 | 24 | @import (multiple) '../../theme.config.import.less'; 25 | 26 | /******************************* 27 | UI Tabs 28 | *******************************/ 29 | 30 | .ui.tab { 31 | display: none; 32 | } 33 | 34 | /******************************* 35 | States 36 | *******************************/ 37 | 38 | /*-------------------- 39 | Active 40 | ---------------------*/ 41 | 42 | .ui.tab.active, 43 | .ui.tab.open { 44 | display: block; 45 | } 46 | 47 | /*-------------------- 48 | Loading 49 | ---------------------*/ 50 | 51 | .ui.tab.loading { 52 | position: relative; 53 | overflow: hidden; 54 | display: block; 55 | min-height: @loadingMinHeight; 56 | } 57 | .ui.tab.loading * { 58 | position: @loadingContentPosition !important; 59 | left: @loadingContentOffset !important; 60 | } 61 | 62 | .ui.tab.loading:before, 63 | .ui.tab.loading.segment:before { 64 | position: absolute; 65 | content: ''; 66 | top: @loaderDistanceFromTop; 67 | left: 50%; 68 | 69 | margin: @loaderMargin; 70 | width: @loaderSize; 71 | height: @loaderSize; 72 | 73 | border-radius: @circularRadius; 74 | border: @loaderLineWidth solid @loaderFillColor; 75 | } 76 | .ui.tab.loading:after, 77 | .ui.tab.loading.segment:after { 78 | position: absolute; 79 | content: ''; 80 | top: @loaderDistanceFromTop; 81 | left: 50%; 82 | 83 | margin: @loaderMargin; 84 | width: @loaderSize; 85 | height: @loaderSize; 86 | 87 | animation: button-spin @loaderSpeed linear; 88 | animation-iteration-count: infinite; 89 | 90 | border-radius: @circularRadius; 91 | 92 | border-color: @loaderLineColor transparent transparent; 93 | border-style: solid; 94 | border-width: @loaderLineWidth; 95 | 96 | box-shadow: 0px 0px 0px 1px transparent; 97 | } 98 | 99 | .loadUIOverrides(); -------------------------------------------------------------------------------- /client/lib/semantic-ui/definitions/modules/transition.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /*! 6 | * # Semantic UI - Transition 7 | * http://github.com/semantic-org/semantic-ui/ 8 | * 9 | * 10 | * Copyright 2015 Contributors 11 | * Released under the MIT license 12 | * http://opensource.org/licenses/MIT 13 | * 14 | */ 15 | 16 | 17 | /******************************* 18 | Theme 19 | *******************************/ 20 | 21 | @type : 'module'; 22 | @element : 'transition'; 23 | 24 | @import (multiple) '../../theme.config.import.less'; 25 | 26 | /******************************* 27 | Transitions 28 | *******************************/ 29 | 30 | .transition { 31 | animation-iteration-count: 1; 32 | animation-duration: @transitionDefaultDuration; 33 | animation-timing-function: @transitionDefaultEasing; 34 | animation-fill-mode: @transitionDefaultFill; 35 | } 36 | 37 | /******************************* 38 | States 39 | *******************************/ 40 | 41 | 42 | /* Animating */ 43 | .animating.transition { 44 | backface-visibility: @backfaceVisibility; 45 | visibility: visible !important; 46 | } 47 | 48 | /* Loading */ 49 | .loading.transition { 50 | position: absolute; 51 | top: -99999px; 52 | left: -99999px; 53 | } 54 | 55 | /* Hidden */ 56 | .hidden.transition { 57 | display: none; 58 | visibility: hidden; 59 | } 60 | 61 | /* Visible */ 62 | .visible.transition { 63 | display: block !important; 64 | visibility: visible !important; 65 | /* backface-visibility: @backfaceVisibility; 66 | transform: @use3DAcceleration;*/ 67 | } 68 | 69 | /* Disabled */ 70 | .disabled.transition { 71 | animation-play-state: paused; 72 | } 73 | 74 | /******************************* 75 | Variations 76 | *******************************/ 77 | 78 | .looping.transition { 79 | animation-iteration-count: infinite; 80 | } 81 | 82 | 83 | .loadUIOverrides(); -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/collections/breadcrumb.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/collections/breadcrumb.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/collections/form.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/collections/form.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/collections/grid.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/collections/grid.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/collections/menu.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/collections/menu.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/collections/message.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/collections/message.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/collections/table.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/collections/table.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/button.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/button.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/container.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/container.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/divider.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/divider.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/flag.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/flag.variables.import.less: -------------------------------------------------------------------------------- 1 | /*------------------- 2 | Flag Variables 3 | --------------------*/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/header.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/header.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/icon.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/icon.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/image.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/image.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/input.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/input.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/label.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/label.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/list.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/list.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/loader.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/loader.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/rail.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/rail.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/reveal.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/reveal.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/segment.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/segment.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/step.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/elements/step.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/globals/reset.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/globals/reset.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Global Variables 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/globals/site.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/globals/site.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Global Variables 3 | *******************************/ -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/accordion.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/accordion.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/checkbox.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/checkbox.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/dimmer.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/dimmer.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/dropdown.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/dropdown.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/embed.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/embed.variables.import.less: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ehzhang/HELPq/a2eff6b4852ea691a4404b53af13e0dde5e1aa86/client/lib/semantic-ui/site/modules/embed.variables.import.less -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/modal.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/modal.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/nag.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/nag.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/popup.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/popup.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/progress.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/progress.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/rating.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/rating.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/search.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/search.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/shape.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/shape.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/sidebar.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/sidebar.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/sticky.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/sticky.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/tab.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/tab.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/transition.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | Site Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/modules/transition.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/views/ad.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/views/ad.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/views/card.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/views/card.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/views/comment.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/views/comment.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/views/feed.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/views/feed.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/views/item.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/views/item.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/views/statistic.overrides.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/site/views/statistic.variables.import.less: -------------------------------------------------------------------------------- 1 | /******************************* 2 | User Variable Overrides 3 | *******************************/ 4 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/theme.config.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | ████████╗██╗ ██╗███████╗███╗ ███╗███████╗███████╗ 4 | ╚══██╔══╝██║ ██║██╔════╝████╗ ████║██╔════╝██╔════╝ 5 | ██║ ███████║█████╗ ██╔████╔██║█████╗ ███████╗ 6 | ██║ ██╔══██║██╔══╝ ██║╚██╔╝██║██╔══╝ ╚════██║ 7 | ██║ ██║ ██║███████╗██║ ╚═╝ ██║███████╗███████║ 8 | ╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚══════╝╚══════╝ 9 | 10 | */ 11 | 12 | /******************************* 13 | Theme Selection 14 | *******************************/ 15 | 16 | /* To override a theme for an individual element 17 | specify theme name below 18 | */ 19 | 20 | /* Global */ 21 | @site : 'default'; 22 | @reset : 'default'; 23 | 24 | /* Elements */ 25 | @button : 'default'; 26 | @container : 'default'; 27 | @divider : 'default'; 28 | @flag : 'default'; 29 | @header : 'default'; 30 | @icon : 'default'; 31 | @image : 'default'; 32 | @input : 'default'; 33 | @label : 'default'; 34 | @list : 'default'; 35 | @loader : 'default'; 36 | @rail : 'default'; 37 | @reveal : 'default'; 38 | @segment : 'default'; 39 | @step : 'default'; 40 | 41 | /* Collections */ 42 | @breadcrumb : 'default'; 43 | @form : 'default'; 44 | @grid : 'default'; 45 | @menu : 'default'; 46 | @message : 'default'; 47 | @table : 'default'; 48 | 49 | /* Modules */ 50 | @accordion : 'default'; 51 | @checkbox : 'default'; 52 | @dimmer : 'default'; 53 | @dropdown : 'default'; 54 | @embed : 'default'; 55 | @modal : 'default'; 56 | @nag : 'default'; 57 | @popup : 'default'; 58 | @progress : 'default'; 59 | @rating : 'default'; 60 | @search : 'default'; 61 | @shape : 'default'; 62 | @sidebar : 'default'; 63 | @sticky : 'default'; 64 | @tab : 'default'; 65 | @transition : 'default'; 66 | 67 | /* Views */ 68 | @ad : 'default'; 69 | @card : 'default'; 70 | @comment : 'default'; 71 | @feed : 'default'; 72 | @item : 'default'; 73 | @statistic : 'default'; 74 | 75 | /******************************* 76 | Folders 77 | *******************************/ 78 | 79 | /* Path to theme packages */ 80 | @themesFolder : 'themes'; 81 | 82 | /* Path to site override folder */ 83 | @siteFolder : 'site'; 84 | 85 | 86 | /******************************* 87 | Import Theme 88 | *******************************/ 89 | 90 | @import "theme.import.less"; 91 | 92 | /* End Config */ -------------------------------------------------------------------------------- /client/lib/semantic-ui/theme.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Import Directives 7 | *******************************/ 8 | 9 | /*------------------ 10 | Theme 11 | -------------------*/ 12 | 13 | @theme: @@element; 14 | 15 | /*-------------------- 16 | Site Variables 17 | ---------------------*/ 18 | 19 | /* Default site.variables */ 20 | @import "@{themesFolder}/default/globals/site.variables.import.less"; 21 | 22 | /* Packaged site.variables */ 23 | @import "@{themesFolder}/@{site}/globals/site.variables.import.less"; 24 | 25 | /* Component's site.variables */ 26 | @import (optional) "@{themesFolder}/@{theme}/globals/site.variables.import.less"; 27 | 28 | /* Site theme site.variables */ 29 | @import (optional) "@{siteFolder}/globals/site.variables.import.less"; 30 | 31 | 32 | /*------------------- 33 | Component Variables 34 | ---------------------*/ 35 | 36 | /* Default */ 37 | @import "@{themesFolder}/default/@{type}s/@{element}.variables.import.less"; 38 | 39 | /* Packaged Theme */ 40 | @import (optional) "@{themesFolder}/@{theme}/@{type}s/@{element}.variables.import.less"; 41 | 42 | /* Site Theme */ 43 | @import (optional) "@{siteFolder}/@{type}s/@{element}.variables.import.less"; 44 | 45 | 46 | /******************************* 47 | Mix-ins 48 | *******************************/ 49 | 50 | /*------------------ 51 | Fonts 52 | -------------------*/ 53 | 54 | .loadFonts() when (@importGoogleFonts) { 55 | @import url('@{googleProtocol}fonts.googleapis.com/css?family=@{googleFontRequest}'); 56 | } 57 | 58 | /*------------------ 59 | Overrides 60 | -------------------*/ 61 | 62 | .loadUIOverrides() { 63 | @import (optional) "@{themesFolder}/@{theme}/@{type}s/@{element}.overrides.import.less"; 64 | @import (optional) "@{siteFolder}/@{type}s/@{element}.overrides.import.less"; 65 | } 66 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/collections/breadcrumb.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/collections/breadcrumb.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Breadcrumb 7 | *******************************/ 8 | 9 | /*------------------- 10 | Breadcrumb 11 | --------------------*/ 12 | 13 | @verticalMargin: 0em; 14 | @display: inline-block; 15 | @verticalAlign: middle; 16 | 17 | @dividerSpacing: @3px; 18 | @dividerOpacity: 0.7; 19 | @dividerColor: @lightTextColor; 20 | 21 | @dividerSize: @relativeSmall; 22 | @dividerVerticalAlign: baseline; 23 | 24 | @iconDividerSize: @relativeTiny; 25 | @iconDividerVerticalAlign: baseline; 26 | 27 | @sectionMargin: 0em; 28 | @sectionPadding: 0em; 29 | 30 | /* Coupling */ 31 | @segmentPadding: @relativeMini @relativeMedium; 32 | 33 | /*------------------- 34 | States 35 | --------------------*/ 36 | 37 | @activeFontWeight: bold; -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/collections/form.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/collections/grid.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | 9 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/collections/grid.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Grid 7 | *******************************/ 8 | 9 | /* Inherited From Site */ 10 | 11 | // @mobileBreakpoint 12 | // @tabletBreakpoint 13 | // @computerBreakpoint 14 | // @largeMonitorBreakpoint 15 | // @widescreenMonitorBreakpoint 16 | 17 | /******************************* 18 | Grid 19 | *******************************/ 20 | 21 | @minWidth: 320px; 22 | 23 | @gutterWidth: 2rem; 24 | @rowSpacing: 2rem; 25 | 26 | @tableWidth: ~"calc(100% + "@gutterWidth~")"; 27 | @columnMaxImageWidth: 100%; 28 | 29 | @consecutiveGridDistance: (@rowSpacing / 2); 30 | 31 | /******************************* 32 | Variations 33 | *******************************/ 34 | 35 | /*-------------- 36 | Relaxed 37 | ---------------*/ 38 | 39 | @relaxedGutterWidth: 3rem; 40 | @veryRelaxedGutterWidth: 5rem; 41 | 42 | /*-------------- 43 | Divided 44 | ---------------*/ 45 | 46 | @dividedBorder: -1px 0px 0px 0px @borderColor; 47 | @verticallyDividedBorder: 0px -1px 0px 0px @borderColor; 48 | 49 | @dividedInvertedBorder: -1px 0px 0px 0px @whiteBorderColor; 50 | @verticallyDividedInvertedBorder: 0px -1px 0px 0px @whiteBorderColor; 51 | 52 | /*-------------- 53 | Celled 54 | ---------------*/ 55 | 56 | @celledMargin: 1em 0em; 57 | @celledWidth: 1px; 58 | @celledBorderColor: @solidBorderColor; 59 | 60 | @celledPadding: 1em; 61 | @celledRelaxedPadding: 1.5em; 62 | @celledVeryRelaxedPadding: 2em; 63 | 64 | @celledGridDivider: 0px 0px 0px @celledWidth @celledBorderColor; 65 | @celledRowDivider: 0px (-@celledWidth) 0px 0px @celledBorderColor; 66 | @celledColumnDivider: (-@celledWidth) 0px 0px 0px @celledBorderColor; 67 | 68 | 69 | /*-------------- 70 | Stackable 71 | ---------------*/ 72 | 73 | @stackableRowSpacing: @rowSpacing; 74 | @stackableGutter: @gutterWidth; 75 | @stackableMobileBorder: 1px solid @borderColor; 76 | @stackableInvertedMobileBorder: 1px solid @whiteBorderColor; 77 | 78 | 79 | /******************************* 80 | Legacy 81 | *******************************/ 82 | 83 | /*-------------- 84 | Page 85 | ---------------*/ 86 | 87 | /* Legacy (DO NOT USE) 88 | */ 89 | @mobileWidth: auto; 90 | @mobileMargin: 0em; 91 | @mobileGutter: 0em; 92 | 93 | @tabletWidth: auto; 94 | @tabletMargin: 0em; 95 | @tabletGutter: 2em; 96 | 97 | @computerWidth: auto; 98 | @computerMargin: 0em; 99 | @computerGutter: 3%; 100 | 101 | @largeMonitorWidth: auto; 102 | @largeMonitorMargin: 0em; 103 | @largeMonitorGutter: 15%; 104 | 105 | @widescreenMonitorWidth: auto; 106 | @widescreenMargin: 0em; 107 | @widescreenMonitorGutter: 23%; -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/collections/menu.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/collections/message.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/collections/message.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Message 7 | *******************************/ 8 | 9 | // @textColor 10 | 11 | /*------------------- 12 | Elements 13 | --------------------*/ 14 | 15 | @verticalMargin: 1em; 16 | @verticalPadding: 1em; 17 | @horizontalPadding: 1.5em; 18 | @background: #F8F8F9; 19 | @lineHeightOffset: ((@lineHeight - 1em) / 2); 20 | 21 | @borderRadius: @defaultBorderRadius; 22 | @borderWidth: 1px; 23 | @borderShadow: 0px 0px 0px @borderWidth @strongBorderColor inset; 24 | @shadowShadow: 0px 0px 0px 0px rgba(0, 0, 0, 0); 25 | @boxShadow: 26 | @borderShadow, 27 | @shadowShadow 28 | ; 29 | 30 | @transition: 31 | opacity @defaultDuration @defaultEasing, 32 | color @defaultDuration @defaultEasing, 33 | background @defaultDuration @defaultEasing, 34 | box-shadow @defaultDuration @defaultEasing 35 | ; 36 | 37 | /* Header */ 38 | @headerFontSize: @relativeLarge; 39 | @headerFontWeight: bold; 40 | @headerDisplay: block; 41 | @headerDistance: 0rem; 42 | @headerMargin: -@headerLineHeightOffset 0em @headerDistance 0em; 43 | @headerParagraphDistance: 0.25em; 44 | 45 | /* Paragraph */ 46 | @messageTextOpacity: 0.85; 47 | @messageParagraphMargin: 0.75em; 48 | 49 | /* List */ 50 | @listOpacity: 0.85; 51 | @listStylePosition: inside; 52 | @listMargin: 0.5em; 53 | @listItemIndent: 1em; 54 | @listItemMargin: 0.3em; 55 | 56 | /* Icon */ 57 | @iconDistance: 0.6em; 58 | 59 | /* Close Icon */ 60 | @closeTopDistance: @verticalPadding - @lineHeightOffset; 61 | @closeRightDistance: 0.5em; 62 | @closeOpacity: 0.7; 63 | @closeTransition: opacity @defaultDuration @defaultEasing; 64 | 65 | 66 | /*------------------- 67 | Types 68 | --------------------*/ 69 | 70 | /* Icon Message */ 71 | @iconSize: 3em; 72 | @iconOpacity: 0.8; 73 | @iconContentDistance: 0rem; 74 | @iconVerticalAlign: middle; 75 | 76 | /* Attached */ 77 | @attachedXOffset: -1px; 78 | @attachedYOffset: -1px; 79 | @attachedBoxShadow: 0em 0em 0em @borderWidth @borderColor inset; 80 | @attachedBottomBoxShadow: 81 | @attachedBoxShadow, 82 | @subtleShadow 83 | ; 84 | 85 | /* Floating */ 86 | @floatingBoxShadow: 87 | @borderShadow, 88 | @floatingShadow 89 | ; 90 | 91 | /* Warning / Positive / Negative / Info */ 92 | @positiveBoxShadow: 93 | 0px 0px 0px @borderWidth @positiveBorderColor inset, 94 | @shadowShadow 95 | ; 96 | @negativeBoxShadow: 97 | 0px 0px 0px @borderWidth @negativeBorderColor inset, 98 | @shadowShadow 99 | ; 100 | @infoBoxShadow: 101 | 0px 0px 0px @borderWidth @infoBorderColor inset, 102 | @shadowShadow 103 | ; 104 | @warningBoxShadow: 105 | 0px 0px 0px @borderWidth @warningBorderColor inset, 106 | @shadowShadow 107 | ; 108 | @errorBoxShadow: 109 | 0px 0px 0px @borderWidth @errorBorderColor inset, 110 | @shadowShadow 111 | ; 112 | @successBoxShadow: 113 | 0px 0px 0px @borderWidth @successBorderColor inset, 114 | @shadowShadow 115 | ; -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/collections/table.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/elements/button.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/elements/container.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/elements/container.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Container 7 | *******************************/ 8 | 9 | /*------------------- 10 | Element 11 | --------------------*/ 12 | 13 | /* Minimum Gutter is used to determine the maximum container width for a given device */ 14 | 15 | @maxWidth: 100%; 16 | 17 | /* Devices */ 18 | @mobileMinimumGutter: 0em; 19 | @mobileWidth: auto; 20 | @mobileGutter: 1em; 21 | 22 | @tabletMinimumGutter: (@emSize * 1); 23 | @tabletWidth: @tabletBreakpoint - (@tabletMinimumGutter * 2) - @scrollbarWidth; 24 | @tabletGutter: auto; 25 | 26 | @computerMinimumGutter: (@emSize * 1.5); 27 | @computerWidth: @computerBreakpoint - (@computerMinimumGutter * 2) - @scrollbarWidth; 28 | @computerGutter: auto; 29 | 30 | @largeMonitorMinimumGutter: (@emSize * 2); 31 | @largeMonitorWidth: @largeMonitorBreakpoint - (@largeMonitorMinimumGutter * 2) - @scrollbarWidth; 32 | @largeMonitorGutter: auto; 33 | 34 | /* Coupling (Add Negative Margin to container size) */ 35 | @gridGutterWidth: 2rem; 36 | @relaxedGridGutterWidth: 3rem; 37 | @veryRelaxedGridGutterWidth: 5rem; 38 | 39 | @mobileGridWidth: @mobileWidth; 40 | @tabletGridWidth: ~"calc("@tabletWidth~" + "@gridGutterWidth~")"; 41 | @computerGridWidth: ~"calc("@computerWidth~" + "@gridGutterWidth~")"; 42 | @largeMonitorGridWidth: ~"calc("@largeMonitorWidth~" + "@gridGutterWidth~")"; 43 | 44 | @mobileRelaxedGridWidth: @mobileWidth; 45 | @tabletRelaxedGridWidth: ~"calc("@tabletWidth~" + "@relaxedGridGutterWidth~")"; 46 | @computerRelaxedGridWidth: ~"calc("@computerWidth~" + "@relaxedGridGutterWidth~")"; 47 | @largeMonitorRelaxedGridWidth: ~"calc("@largeMonitorWidth~" + "@relaxedGridGutterWidth~")"; 48 | 49 | @mobileVeryRelaxedGridWidth: @mobileWidth; 50 | @tabletVeryRelaxedGridWidth: ~"calc("@tabletWidth~" + "@veryRelaxedGridGutterWidth~")"; 51 | @computerVeryRelaxedGridWidth: ~"calc("@computerWidth~" + "@veryRelaxedGridGutterWidth~")"; 52 | @largeMonitorVeryRelaxedGridWidth: ~"calc("@largeMonitorWidth~" + "@veryRelaxedGridGutterWidth~")"; 53 | 54 | /*------------------- 55 | Types 56 | --------------------*/ 57 | 58 | /* Text */ 59 | @textWidth: 700px; 60 | @textFontFamily: @pageFont; 61 | @textLineHeight: 1.5; 62 | @textSize: @large; -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/elements/divider.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | 9 | 10 | .ui.horizontal.divider:before, 11 | .ui.horizontal.divider:after { 12 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC'); 13 | } 14 | 15 | @media only screen and (max-width : (@tabletBreakpoint - 1px)) { 16 | .ui.stackable.grid .ui.vertical.divider:before, 17 | .ui.grid .stackable.row .ui.vertical.divider:before, 18 | .ui.stackable.grid .ui.vertical.divider:after, 19 | .ui.grid .stackable.row .ui.vertical.divider:after { 20 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC'); 21 | } 22 | } -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/elements/divider.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Divider 7 | *******************************/ 8 | 9 | /*------------------- 10 | Element 11 | --------------------*/ 12 | 13 | @margin: 1rem 0rem; 14 | 15 | @highlightWidth: 1px; 16 | @highlightColor: @whiteBorderColor; 17 | 18 | @shadowWidth: 1px; 19 | @shadowColor: @borderColor; 20 | 21 | /* Text */ 22 | @letterSpacing: 0.05em; 23 | @fontWeight: bold; 24 | @color: @darkTextColor; 25 | @textTransform: uppercase; 26 | 27 | /*------------------- 28 | Coupling 29 | --------------------*/ 30 | 31 | /* Icon */ 32 | @dividerIconSize: 1rem; 33 | @dividerIconMargin: 0rem; 34 | 35 | 36 | /******************************* 37 | Variations 38 | *******************************/ 39 | 40 | /* Horizontal / Vertical */ 41 | @horizontalMargin: ''; 42 | @horizontalDividerMargin: 1em; 43 | @horizontalRulerOffset: ~"calc(-50% - "(@horizontalDividerMargin)~")"; 44 | 45 | @verticalDividerMargin: 1rem; 46 | @verticalDividerHeight: ~"calc(100% - "(@verticalDividerMargin)~")"; 47 | 48 | /* Inverted */ 49 | @invertedTextColor: @white; 50 | @invertedHighlightColor: rgba(255, 255, 255, 0.15); 51 | @invertedShadowColor: @borderColor; 52 | 53 | /* Section */ 54 | @sectionMargin: 2rem; 55 | 56 | /* Sizes */ 57 | @medium: 1rem; -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/elements/flag.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Flag 7 | *******************************/ 8 | 9 | /*------------------- 10 | Element 11 | --------------------*/ 12 | 13 | @spritePath: "@{imagePath}/flags.png"; 14 | @width: 16px; 15 | @height: 11px; 16 | @verticalAlign: baseline; 17 | @margin: 0.5em; -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/elements/header.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | 9 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/elements/icon.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Icon 7 | *******************************/ 8 | 9 | /*------------------- 10 | Icon Variables 11 | --------------------*/ 12 | 13 | @fontName: 'icons'; 14 | @fallbackSRC: url("@{fontPath}/@{fontName}.eot"); 15 | @src: 16 | url("@{fontPath}/@{fontName}.eot?#iefix") format('embedded-opentype'), 17 | url("@{fontPath}/@{fontName}.woff2") format('woff2'), 18 | url("@{fontPath}/@{fontName}.woff") format('woff'), 19 | url("@{fontPath}/@{fontName}.ttf") format('truetype'), 20 | url("@{fontPath}/@{fontName}.svg#icons") format('svg') 21 | ; 22 | 23 | @opacity: 1; 24 | @width: @iconWidth; 25 | @height: 1em; 26 | @distanceFromText: 0.25rem; 27 | 28 | 29 | /* Variations */ 30 | 31 | @linkOpacity: 0.8; 32 | @linkDuration: 0.3s; 33 | @loadingDuration: 2s; 34 | 35 | @circularSize: 2em; 36 | @circularPadding: 0.5em 0.5em; 37 | @circularShadow: 0em 0em 0em 0.1em rgba(0, 0, 0, 0.1) inset; 38 | 39 | @borderedSize: 2em; 40 | @borderedVerticalPadding: ((@borderedSize - @height) / 2); 41 | @borderedHorizontalPadding: ((@borderedSize - @width) / 2); 42 | @borderedShadow: 0em 0em 0em 0.1em rgba(0, 0, 0, 0.1) inset; 43 | 44 | @cornerIconSize: 0.45em; 45 | @cornerIconStroke: 1px; 46 | @cornerIconShadow: 47 | -@cornerIconStroke -@cornerIconStroke 0 @white, 48 | @cornerIconStroke -@cornerIconStroke 0 @white, 49 | -@cornerIconStroke @cornerIconStroke 0 @white, 50 | @cornerIconStroke @cornerIconStroke 0 @white 51 | ; 52 | @cornerIconInvertedShadow: 53 | -@cornerIconStroke -@cornerIconStroke 0 @black, 54 | @cornerIconStroke -@cornerIconStroke 0 @black, 55 | -@cornerIconStroke @cornerIconStroke 0 @black, 56 | @cornerIconStroke @cornerIconStroke 0 @black 57 | ; 58 | 59 | @small: @relativeSmall; 60 | @medium: 1em; 61 | @large: 1.5em; 62 | @big: 2em; 63 | @huge: 4em; 64 | @massive: 8em; 65 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/elements/image.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/elements/image.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Image 7 | *******************************/ 8 | 9 | /*------------------- 10 | Element 11 | --------------------*/ 12 | 13 | @placeholderColor: transparent; 14 | @roundedBorderRadius: 0.3125em; 15 | 16 | @imageHorizontalMargin: 0.25rem; 17 | @imageVerticalMargin: 0.5rem; 18 | @imageBorder: 1px solid rgba(0, 0, 0, 0.1); 19 | 20 | /*------------------- 21 | Types 22 | --------------------*/ 23 | 24 | /* Avatar */ 25 | @avatarSize: 2em; 26 | @avatarMargin: 0.25em; 27 | 28 | 29 | /*------------------- 30 | Variations 31 | --------------------*/ 32 | 33 | /* Spaced */ 34 | @spacedDistance: 0.5em; 35 | 36 | /* Floated */ 37 | @floatedHorizontalMargin: 1em; 38 | @floatedVerticalMargin: 1em; 39 | 40 | /* Size */ 41 | @miniWidth: 35px; 42 | @tinyWidth: 80px; 43 | @smallWidth: 150px; 44 | @mediumWidth: 300px; 45 | @largeWidth: 450px; 46 | @bigWidth: 600px; 47 | @hugeWidth: 800px; 48 | @massiveWidth: 960px; 49 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/elements/input.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/elements/input.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Input 7 | *******************************/ 8 | 9 | /*------------------- 10 | Element 11 | --------------------*/ 12 | 13 | @inputFont: @pageFont; 14 | @verticalPadding: @inputVerticalPadding; 15 | @horizontalPadding: @inputHorizontalPadding; 16 | 17 | @lineHeight: @inputLineHeight; 18 | @lineHeightOffset: ((@lineHeight - 1em) / 2); 19 | 20 | @padding: (@verticalPadding - @lineHeightOffset) @horizontalPadding; 21 | 22 | @textAlign: left; 23 | @background: @inputBackground; 24 | @borderWidth: 1px; 25 | @border: @borderWidth solid @borderColor; 26 | @boxShadow: none; 27 | 28 | @borderRadius: @defaultBorderRadius; 29 | @transition: 30 | box-shadow @defaultDuration @defaultEasing, 31 | border-color @defaultDuration @defaultEasing 32 | ; 33 | 34 | @inputColor: @textColor; 35 | 36 | /*------------------- 37 | Types 38 | --------------------*/ 39 | 40 | /* Icon Input */ 41 | @iconWidth: (@verticalPadding * 2) + @glyphWidth; 42 | @iconOpacity: 0.5; 43 | @iconFocusOpacity: 1; 44 | @iconOffset: -0.5em; 45 | 46 | @iconDistance: 0em; 47 | @iconMargin: @iconWidth + @iconDistance; 48 | @iconTransition: opacity 0.3s @defaultEasing; 49 | 50 | @transparentIconWidth: @glyphWidth; 51 | @transparentIconMargin: 2em; 52 | 53 | /* Circular Icon Input */ 54 | @circularIconVerticalOffset: 0.35em; 55 | @circularIconHorizontalOffset: 0.5em; 56 | 57 | /* Labeled Input */ 58 | @labelCornerTop: @borderWidth; 59 | @labelCornerRight: @borderWidth; 60 | @labelCornerSize: @relative9px; 61 | @labelSize: 1em; 62 | @labelVerticalPadding: (@verticalPadding - @lineHeightOffset); 63 | 64 | @labeledMargin: 2.5em; 65 | @labeledIconInputMargin: 3.25em; 66 | @labeledIconMargin: 1.25em; 67 | 68 | /*------------------- 69 | States 70 | --------------------*/ 71 | 72 | /* Placeholder */ 73 | @placeholderColor: @unselectedTextColor; 74 | @placeholderFocusColor: @textColor; 75 | 76 | /* Down */ 77 | @downBorderColor: rgba(0, 0, 0, 0.3); 78 | @downBackground: #FAFAFA; 79 | @downColor: @textColor; 80 | @downBoxShadow: none; 81 | 82 | /* Focus */ 83 | @focusBorderColor: @focusedFormBorderColor; 84 | @focusBackground: @background; 85 | @focusColor: @hoveredTextColor; 86 | @focusBoxShadow: none; 87 | 88 | /* Error */ 89 | @errorBackground: @negativeBackgroundColor; 90 | @errorColor: @negativeTextColor; 91 | @errorBorder: @negativeBorderColor; 92 | @errorBoxShadow: none; 93 | 94 | @placeholderErrorColor: lighten(@errorColor, 40); 95 | @placeholderErrorFocusColor: lighten(@errorColor, 30); 96 | 97 | /* Loader */ 98 | @invertedLoaderFillColor: rgba(0, 0, 0, 0.15); 99 | 100 | /*------------------- 101 | Variations 102 | --------------------*/ 103 | 104 | /* Inverted */ 105 | @transparentInvertedPlaceholderColor: @invertedUnselectedTextColor; 106 | @transparentInvertedColor: @white; 107 | 108 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/elements/label.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/elements/list.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/elements/loader.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/elements/loader.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Loader 7 | *******************************/ 8 | 9 | /* Some global loader styles defined in site.variables */ 10 | // @loaderSpeed 11 | // @loaderLineWidth 12 | // @loaderFillColor 13 | // @loaderLineColor 14 | // @invertedLoaderFillColor 15 | // @invertedLoaderLineColor 16 | 17 | /*------------------- 18 | Standard 19 | --------------------*/ 20 | 21 | @loaderTopOffset: 50%; 22 | @loaderLeftOffset: 50%; 23 | 24 | @shapeBorderColor: @loaderLineColor transparent transparent; 25 | @invertedShapeBorderColor: @invertedLoaderLineColor transparent transparent; 26 | 27 | /*------------------- 28 | Types 29 | --------------------*/ 30 | 31 | /* Text */ 32 | @textDistance: @relativeMini; 33 | @loaderTextColor: @textColor; 34 | @invertedLoaderTextColor: @invertedTextColor; 35 | 36 | /*------------------- 37 | States 38 | --------------------*/ 39 | 40 | @indeterminateDirection: reverse; 41 | @indeterminateSpeed: (2 * @loaderSpeed); 42 | 43 | /*------------------- 44 | Variations 45 | --------------------*/ 46 | 47 | @inlineVerticalAlign: middle; 48 | @inlineMargin: 0em; 49 | 50 | /* Exact Sizes (Avoids Rounding Errors) */ 51 | @mini: 1.2857em; /* 18px */ 52 | @small: 1.7142em; /* 24px */ 53 | @medium: 2.2585em; /* 32px */ 54 | @large: 4.5714em; /* 64px */ 55 | 56 | @miniOffset: 0em 0em 0em -(@mini / 2); 57 | @smallOffset: 0em 0em 0em -(@small / 2); 58 | @mediumOffset: 0em 0em 0em -(@medium / 2); 59 | @largeOffset: 0em 0em 0em -(@large / 2); 60 | 61 | @miniFontSize: @relativeMini; 62 | @smallFontSize: @relativeSmall; 63 | @mediumFontSize: @relativeMedium; 64 | @largeFontSize: @relativeLarge; -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/elements/rail.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/elements/rail.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Rail 7 | *******************************/ 8 | 9 | /*------------------- 10 | Element 11 | --------------------*/ 12 | 13 | @width: 300px; 14 | @height: 100%; 15 | 16 | @distance: 4rem; 17 | @splitDistance: (@distance / 2); 18 | 19 | /*------------------- 20 | Variations 21 | --------------------*/ 22 | 23 | /* Close */ 24 | @closeDistance: 2em; 25 | @veryCloseDistance: 1em; 26 | 27 | @splitCloseDistance: (@closeDistance / 2); 28 | @splitVeryCloseDistance: (@veryCloseDistance / 2); 29 | 30 | @closeWidth: @width + @splitCloseDistance; 31 | @veryCloseWidth: @width + @splitVeryCloseDistance; 32 | 33 | /* Dividing */ 34 | @dividingBorder: 1px solid @borderColor; 35 | @dividingDistance: 5rem; 36 | @splitDividingDistance: (@dividingDistance / 2); 37 | @dividingWidth: @width + @splitDividingDistance; 38 | 39 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/elements/reveal.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/elements/reveal.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Reveal 7 | *******************************/ 8 | 9 | @transitionDelay: 0.1s; 10 | @transitionDuration: 0.5s; 11 | @transitionEasing: cubic-bezier(0.175, 0.885, 0.320, 1); 12 | @transition: all @transitionDuration @defaultEasing @transitionDelay; 13 | 14 | @bottomZIndex: 2; 15 | @topZIndex: 3; 16 | @activeZIndex: 4; 17 | 18 | /* Types */ 19 | @rotateDegrees: 110deg; 20 | @moveTransition: transform @transitionDuration @transitionEasing @transitionDelay; 21 | @slideTransition: transform @transitionDuration @defaultEasing @transitionDelay; -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/elements/segment.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/globals/reset.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Reset 7 | *******************************/ -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/globals/site.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Global Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/accordion.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Accordion 7 | *******************************/ 8 | 9 | @boxShadow: none; 10 | 11 | /* Title */ 12 | @titleFont: @headerFont; 13 | @titlePadding: 0.5em 0em; 14 | @titleFontSize: 1em; 15 | @titleColor: @textColor; 16 | 17 | /* Icon */ 18 | @iconOpacity: 1; 19 | @iconFontSize: 1em; 20 | @iconFloat: none; 21 | @iconWidth: 1.25em; 22 | @iconHeight: 1em; 23 | @iconDisplay: inline-block; 24 | @iconMargin: 0em 0.25rem 0em 0rem; 25 | @iconPadding: 0em; 26 | @iconTransition: 27 | transform @defaultDuration @defaultEasing, 28 | opacity @defaultDuration @defaultEasing 29 | ; 30 | @iconVerticalAlign: baseline; 31 | @iconTransform: none; 32 | 33 | /* Child Accordion */ 34 | @childAccordionMargin: 1em 0em 0em; 35 | @childAccordionPadding: 0em; 36 | 37 | /* Content */ 38 | @contentMargin: ''; 39 | @contentPadding: 0.5em 0em 1em; 40 | 41 | /*------------------- 42 | Coupling 43 | --------------------*/ 44 | 45 | @menuTitlePadding: 0em; 46 | @menuIconFloat: right; 47 | @menuIconMargin: @lineHeightOffset 0em 0em 1em; 48 | @menuIconTransform: rotate(180deg); 49 | 50 | 51 | /*------------------- 52 | States 53 | --------------------*/ 54 | 55 | @activeIconTransform: rotate(90deg); 56 | 57 | /*------------------- 58 | Variations 59 | --------------------*/ 60 | 61 | /* Styled */ 62 | @styledWidth: 600px; 63 | @styledBackground: @white; 64 | @styledBorderRadius: @defaultBorderRadius; 65 | @styledBoxShadow: 66 | @subtleShadow, 67 | 0px 0px 0px 1px @borderColor 68 | ; 69 | 70 | /* Content */ 71 | @styledContentMargin: 0em; 72 | @styledContentPadding: 0.5em 1em 1.5em; 73 | 74 | /* Child Content */ 75 | @styledChildContentMargin: 0em; 76 | @styledChildContentPadding: @styledContentPadding; 77 | 78 | /* Styled Title */ 79 | @styledTitleMargin: 0em; 80 | @styledTitlePadding: 0.75em 1em; 81 | @styledTitleFontWeight: bold; 82 | @styledTitleColor: @unselectedTextColor; 83 | @styledTitleTransition: background-color @defaultDuration @defaultEasing; 84 | @styledTitleBorder: 1px solid @borderColor; 85 | @styledTitleTransition: 86 | background @defaultDuration @defaultEasing, 87 | color @defaultDuration @defaultEasing 88 | ; 89 | 90 | /* Styled Title States */ 91 | @styledTitleHoverBackground: transparent; 92 | @styledTitleHoverColor: @textColor; 93 | @styledActiveTitleBackground: transparent; 94 | @styledActiveTitleColor: @selectedTextColor; 95 | 96 | /* Styled Child Title States */ 97 | @styledHoverChildTitleBackground: @styledTitleHoverBackground; 98 | @styledHoverChildTitleColor: @styledTitleHoverColor; 99 | @styledActiveChildTitleBackground: @styledActiveTitleBackground; 100 | @styledActiveChildTitleColor: @styledActiveTitleColor; 101 | 102 | /* Inverted */ 103 | @invertedTitleColor: @invertedTextColor; 104 | 105 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/checkbox.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | 9 | @font-face { 10 | font-family: 'Checkbox'; 11 | src: 12 | url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBD8AAAC8AAAAYGNtYXAYVtCJAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5Zn4huwUAAAF4AAABYGhlYWQGPe1ZAAAC2AAAADZoaGVhB30DyAAAAxAAAAAkaG10eBBKAEUAAAM0AAAAHGxvY2EAmgESAAADUAAAABBtYXhwAAkALwAAA2AAAAAgbmFtZSC8IugAAAOAAAABknBvc3QAAwAAAAAFFAAAACAAAwMTAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADoAgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6AL//f//AAAAAAAg6AD//f//AAH/4xgEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAEUAUQO7AvgAGgAAARQHAQYjIicBJjU0PwE2MzIfAQE2MzIfARYVA7sQ/hQQFhcQ/uMQEE4QFxcQqAF2EBcXEE4QAnMWEP4UEBABHRAXFhBOEBCoAXcQEE4QFwAAAAABAAABbgMlAkkAFAAAARUUBwYjISInJj0BNDc2MyEyFxYVAyUQEBf9SRcQEBAQFwK3FxAQAhJtFxAQEBAXbRcQEBAQFwAAAAABAAAASQMlA24ALAAAARUUBwYrARUUBwYrASInJj0BIyInJj0BNDc2OwE1NDc2OwEyFxYdATMyFxYVAyUQEBfuEBAXbhYQEO4XEBAQEBfuEBAWbhcQEO4XEBACEm0XEBDuFxAQEBAX7hAQF20XEBDuFxAQEBAX7hAQFwAAAQAAAAIAAHRSzT9fDzz1AAsEAAAAAADRsdR3AAAAANGx1HcAAAAAA7sDbgAAAAgAAgAAAAAAAAABAAADwP/AAAAEAAAAAAADuwABAAAAAAAAAAAAAAAAAAAABwQAAAAAAAAAAAAAAAIAAAAEAABFAyUAAAMlAAAAAAAAAAoAFAAeAE4AcgCwAAEAAAAHAC0AAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAIAAAAAQAAAAAAAgAHAGkAAQAAAAAAAwAIADkAAQAAAAAABAAIAH4AAQAAAAAABQALABgAAQAAAAAABgAIAFEAAQAAAAAACgAaAJYAAwABBAkAAQAQAAgAAwABBAkAAgAOAHAAAwABBAkAAwAQAEEAAwABBAkABAAQAIYAAwABBAkABQAWACMAAwABBAkABgAQAFkAAwABBAkACgA0ALBDaGVja2JveABDAGgAZQBjAGsAYgBvAHhWZXJzaW9uIDIuMABWAGUAcgBzAGkAbwBuACAAMgAuADBDaGVja2JveABDAGgAZQBjAGsAYgBvAHhDaGVja2JveABDAGgAZQBjAGsAYgBvAHhSZWd1bGFyAFIAZQBnAHUAbABhAHJDaGVja2JveABDAGgAZQBjAGsAYgBvAHhGb250IGdlbmVyYXRlZCBieSBJY29Nb29uLgBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('truetype') 13 | ; 14 | } 15 | 16 | /* Checkmark */ 17 | .ui.checkbox label:after, 18 | .ui.checkbox .box:after { 19 | font-family: 'Checkbox'; 20 | } 21 | 22 | /* Checked */ 23 | .ui.checkbox input:checked ~ .box:after, 24 | .ui.checkbox input:checked ~ label:after { 25 | content: '\e800'; 26 | } 27 | 28 | /* Indeterminate */ 29 | .ui.checkbox input:indeterminate ~ .box:after, 30 | .ui.checkbox input:indeterminate ~ label:after { 31 | font-size: 12px; 32 | content: '\e801'; 33 | } 34 | 35 | 36 | /* UTF Reference 37 | .check:before { content: '\e800'; } 38 | .dash:before { content: '\e801'; } 39 | .plus:before { content: '\e802'; } 40 | */ 41 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/dimmer.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/dimmer.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Dimmer 7 | *******************************/ 8 | 9 | @dimmablePosition: relative; 10 | @dimmerPosition: absolute; 11 | 12 | @backgroundColor: rgba(0, 0, 0 , 0.85); 13 | @lineHeight: 1; 14 | @perspective: 2000px; 15 | 16 | @duration: 0.5s; 17 | @transition: 18 | background-color @duration linear 19 | ; 20 | @zIndex: 1000; 21 | @textAlign: center; 22 | @verticalAlign: middle; 23 | @textColor: @white; 24 | @overflow: hidden; 25 | 26 | @blurredStartFilter: ~"blur(0px) grayscale(0)"; 27 | @blurredEndFilter: ~"blur(5px) grayscale(0.7)"; 28 | @blurredTransition: 800ms filter @defaultEasing; 29 | 30 | @blurredBackgroundColor: rgba(0, 0, 0, 0.6); 31 | @blurredInvertedBackgroundColor: rgba(255, 255, 255, 0.6); 32 | 33 | /* Hidden (Default) */ 34 | @hiddenOpacity: 0; 35 | 36 | /* Content */ 37 | @contentDisplay: table; 38 | @contentChildDisplay: table-cell; 39 | 40 | /* Visible */ 41 | @visibleOpacity: 1; 42 | 43 | /*------------------- 44 | Types 45 | --------------------*/ 46 | 47 | /* Page Dimmer*/ 48 | @transformStyle: ''; 49 | @pageDimmerPosition: fixed; 50 | 51 | 52 | /*------------------- 53 | Variations 54 | --------------------*/ 55 | 56 | /* Inverted */ 57 | @invertedBackgroundColor: rgba(255, 255, 255, 0.85); 58 | @invertedTextColor: @textColor; 59 | 60 | /* Simple */ 61 | @simpleZIndex: 1; 62 | @simpleStartBackgroundColor: rgba(0, 0, 0, 0); 63 | @simpleEndBackgroundColor: @backgroundColor; 64 | @simpleInvertedStartBackgroundColor: rgba(255, 255, 255, 0); 65 | @simpleInvertedEndBackgroundColor: @invertedBackgroundColor; -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/embed.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Video Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/embed.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Video 7 | *******************************/ 8 | 9 | /*------------------- 10 | Element 11 | --------------------*/ 12 | 13 | /* Simple */ 14 | @background: @lightGrey; 15 | @transitionDuration: 0.5s; 16 | @transitionEasing: @defaultEasing; 17 | 18 | /* Placeholder */ 19 | @placeholderUnderlay: @background; 20 | 21 | /* Placeholder Overlayed Background */ 22 | @placeholderBackground: radial-gradient(transparent 45%, rgba(0, 0, 0, 0.3)); 23 | @placeholderBackgroundOpacity: 0.5; 24 | @placeholderBackgroundTransition: opacity @transitionDuration @transitionEasing; 25 | 26 | /* Icon */ 27 | @iconBackground: @veryStrongTransparentBlack; 28 | @iconSize: 6rem; 29 | @iconTransition: 30 | opacity @transitionDuration @transitionEasing, 31 | color @transitionDuration @transitionEasing 32 | ; 33 | @iconColor: @white; 34 | @iconShadow: 35 | 0px 2px 10px rgba(34, 36, 38, 0.2) 36 | ; 37 | @iconZIndex: 10; 38 | 39 | /*------------------- 40 | States 41 | --------------------*/ 42 | 43 | /* Hover */ 44 | @hoverPlaceholderBackground: @placeholderBackground; 45 | @hoverPlaceholderBackgroundOpacity: 1; 46 | @hoverIconColor: @white; 47 | 48 | 49 | /*------------------- 50 | Variations 51 | --------------------*/ 52 | 53 | /* Aspect Ratios */ 54 | @squareRatio: (1/1) * 100%; 55 | @widescreenRatio: (9/16) * 100%; 56 | @ultraWidescreenRatio: (9/21) * 100%; 57 | @standardRatio: (3/4) * 100%; -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/modal.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/nag.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/nag.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Nag 7 | *******************************/ 8 | 9 | /*-------------- 10 | Collection 11 | ---------------*/ 12 | 13 | @position: relative; 14 | @width: 100%; 15 | @zIndex: 999; 16 | @margin: 0em; 17 | 18 | @background: #555555; 19 | @opacity: 0.95; 20 | @minHeight: 0em; 21 | @padding: 0.75em 1em; 22 | @lineHeight: 1em; 23 | @boxShadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.2); 24 | 25 | @fontSize: 1rem; 26 | @textAlign: center; 27 | @color: @textColor; 28 | 29 | @transition: 0.2s background ease; 30 | 31 | 32 | /*-------------- 33 | Elements 34 | ---------------*/ 35 | 36 | /* Title */ 37 | @titleColor: @white; 38 | @titleMargin: 0em 0.5em; 39 | 40 | @closeSize: 1em; 41 | @closeMargin: (-@closeSize / 2) 0em 0em; 42 | @closeTop: 50%; 43 | @closeRight: 1em; 44 | @closeColor: @white; 45 | @closeTransition: opacity 0.2s ease; 46 | @closeOpacity: 0.4; 47 | 48 | 49 | /*-------------- 50 | States 51 | ---------------*/ 52 | 53 | /* Hover */ 54 | @nagHoverBackground: @background; 55 | @nagHoverOpacity: 1; 56 | 57 | @closeHoverOpacity: 1; 58 | 59 | /*-------------- 60 | Variations 61 | ---------------*/ 62 | 63 | /* Top / Bottom */ 64 | @top: 0em; 65 | @bottom: 0em; 66 | @borderRadius: @defaultBorderRadius; 67 | @topBorderRadius: 0em 0em @borderRadius @borderRadius; 68 | @bottomBorderRadius: @borderRadius @borderRadius 0em 0em; 69 | 70 | /* Inverted */ 71 | @invertedBackground: @darkWhite; 72 | 73 | /*-------------- 74 | Plural 75 | ---------------*/ 76 | 77 | @groupedBorderRadius: 0em; 78 | 79 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/popup.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/popup.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Popup 7 | *******************************/ 8 | 9 | /*------------------- 10 | Element 11 | --------------------*/ 12 | 13 | @zIndex: 1900; 14 | @background: @white; 15 | 16 | @maxWidth: 250px; 17 | @borderColor: @solidBorderColor; 18 | @borderWidth: 1px; 19 | @boxShadow: @floatingShadow; 20 | @color: @textColor; 21 | 22 | @verticalPadding: 0.833em; 23 | @horizontalPadding: 1em; 24 | @fontWeight: normal; 25 | @fontStyle: normal; 26 | @borderRadius: @defaultBorderRadius; 27 | 28 | /*------------------- 29 | Parts 30 | --------------------*/ 31 | 32 | /* Placement */ 33 | @arrowSize: 0.75em; 34 | @arrowWidth: 1em; 35 | @arrowDistanceFromEdge: 1em; 36 | @boxArrowOffset: 0em; 37 | @popupDistanceAway: @arrowSize; 38 | 39 | 40 | /* Header */ 41 | @headerFontFamily: @headerFont; 42 | @headerFontSize: 1.125em; 43 | @headerDistance: 0.5em; 44 | @headerLineHeight: 1.2; 45 | 46 | /* Content Border */ 47 | @border: @borderWidth solid @borderColor; 48 | 49 | /* Arrow */ 50 | @arrowBackground: @white; 51 | @arrowZIndex: 2; 52 | @arrowJitter: 0.05em; 53 | @arrowOffset: -(@arrowSize / 2) + @arrowJitter; 54 | 55 | @arrowStroke: @borderWidth; 56 | @arrowColor: darken(@borderColor, 10); 57 | 58 | /* Arrow color by position */ 59 | @arrowTopBackground: @arrowBackground; 60 | @arrowCenterBackground: @arrowBackground; 61 | @arrowBottomBackground: @arrowBackground; 62 | 63 | @arrowBoxShadow: @arrowStroke @arrowStroke 0px 0px @arrowColor; 64 | @leftArrowBoxShadow: @arrowStroke -@arrowStroke 0px 0px @arrowColor; 65 | @rightArrowBoxShadow: -@arrowStroke @arrowStroke 0px 0px @arrowColor; 66 | @bottomArrowBoxShadow: -@arrowStroke -@arrowStroke 0px 0px @arrowColor; 67 | 68 | /*------------------- 69 | Coupling 70 | --------------------*/ 71 | 72 | /* Grid Inside Popup */ 73 | @nestedGridMargin: -0.7rem -0.875rem; /* (padding * @medium) */ 74 | @nestedGridWidth: ~"calc(100% + 1.75rem)"; 75 | 76 | /*------------------- 77 | States 78 | --------------------*/ 79 | 80 | @loadingZIndex: -1; 81 | 82 | /*------------------- 83 | Variations 84 | --------------------*/ 85 | 86 | /* Wide */ 87 | @wideWidth: 350px; 88 | @veryWideWidth: 550px; 89 | 90 | /* Inverted */ 91 | @invertedBackground: @black; 92 | @invertedColor: @white; 93 | @invertedBorder: none; 94 | @invertedBoxShadow: none; 95 | 96 | @invertedHeaderBackground: none; 97 | @invertedHeaderColor: @white; 98 | @invertedArrowColor: @invertedBackground; 99 | 100 | /* Arrow color by position */ 101 | @invertedArrowTopBackground: @invertedBackground; 102 | @invertedArrowCenterBackground: @invertedBackground; 103 | @invertedArrowBottomBackground: @invertedBackground; 104 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/progress.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Progress 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/progress.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Progress 7 | *******************************/ 8 | 9 | /*------------------- 10 | Element 11 | --------------------*/ 12 | 13 | @verticalSpacing: 1em; 14 | @margin: @verticalSpacing 0em (@labelHeight + @verticalSpacing); 15 | @firstMargin: 0em 0em (@labelHeight + @verticalSpacing); 16 | @lastMargin: 0em 0em (@labelHeight); 17 | 18 | @background: @strongTransparentBlack; 19 | @border: none; 20 | @boxShadow: none; 21 | @padding: 0em; 22 | @borderRadius: @defaultBorderRadius; 23 | 24 | /* Bar */ 25 | @barPosition: relative; 26 | @barHeight: 1.75em; 27 | @barBackground: #888888; 28 | @barBorderRadius: @borderRadius; 29 | @barTransitionEasing: @defaultEasing; 30 | @barTransitionDuration: @defaultDuration; 31 | @barTransition: 32 | width @barTransitionDuration @barTransitionEasing, 33 | background-color @barTransitionDuration @barTransitionEasing 34 | ; 35 | @barInitialWidth: 0%; 36 | @barMinWidth: 2em; 37 | 38 | /* Progress Bar Label */ 39 | @progressWidth: auto; 40 | @progressSize: @relativeSmall; 41 | @progressPosition: absolute; 42 | @progressTop: 50%; 43 | @progressRight: 0.5em; 44 | @progressLeft: auto; 45 | @progressBottom: auto; 46 | @progressOffset: -0.5em; 47 | @progressColor: @invertedLightTextColor; 48 | @progressTextShadow: none; 49 | @progressFontWeight: bold; 50 | @progressTextAlign: left; 51 | 52 | /* Label */ 53 | @labelWidth: 100%; 54 | @labelHeight: 1.5em; 55 | @labelSize: 1em; 56 | @labelPosition: absolute; 57 | @labelTop: 100%; 58 | @labelLeft: 0%; 59 | @labelRight: auto; 60 | @labelBottom: auto; 61 | @labelOffset: (@labelHeight - 1.3em); 62 | @labelColor: @textColor; 63 | @labelTextShadow: none; 64 | @labelFontWeight: bold; 65 | @labelTextAlign: center; 66 | @labelTransition: color 0.4s @defaultEasing; 67 | 68 | /*------------------- 69 | Types 70 | --------------------*/ 71 | 72 | @indicatingFirstColor: #D95C5C; 73 | @indicatingSecondColor: #EFBC72; 74 | @indicatingThirdColor: #E6BB48; 75 | @indicatingFourthColor: #DDC928; 76 | @indicatingFifthColor: #B4D95C; 77 | @indicatingSixthColor: #66DA81; 78 | 79 | @indicatingFirstLabelColor: @textColor; 80 | @indicatingSecondLabelColor: @textColor; 81 | @indicatingThirdLabelColor: @textColor; 82 | @indicatingFourthLabelColor: @textColor; 83 | @indicatingFifthLabelColor: @textColor; 84 | @indicatingSixthLabelColor: @textColor; 85 | 86 | /*------------------- 87 | States 88 | --------------------*/ 89 | 90 | /* Active */ 91 | @activePulseColor: @white; 92 | @activePulseMaxOpacity: 0.3; 93 | @activePulseDuration: 2s; 94 | @activeMinWidth: @barMinWidth; 95 | 96 | 97 | /*------------------- 98 | Variations 99 | --------------------*/ 100 | 101 | /* Attached */ 102 | @attachedBackground: transparent; 103 | @attachedHeight: 0.2rem; 104 | @attachedBorderRadius: @borderRadius; 105 | 106 | /* Inverted */ 107 | @invertedBackground: @transparentWhite; 108 | @invertedBorder: none; 109 | @invertedBarBackground: @barBackground; 110 | @invertedProgressColor: @offWhite; 111 | @invertedLabelColor: @white; 112 | 113 | /* Sizing */ 114 | @tinyBarHeight: 0.5em; 115 | @smallBarHeight: 1em; 116 | @largeBarHeight: 2.5em; 117 | @bigBarHeight: 3.5em; 118 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/rating.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Rating 7 | *******************************/ 8 | 9 | @margin: 0em @relativeMini; 10 | @whiteSpace: nowrap; 11 | @verticalAlign: baseline; 12 | 13 | @iconCursor: pointer; 14 | @iconWidth: 1.25em; 15 | @iconHeight: auto; 16 | @iconTransition: 17 | opacity @defaultDuration @defaultEasing, 18 | background @defaultDuration @defaultEasing, 19 | text-shadow @defaultDuration @defaultEasing, 20 | color @defaultDuration @defaultEasing 21 | ; 22 | 23 | 24 | /*------------------- 25 | Types 26 | --------------------*/ 27 | 28 | /* Standard */ 29 | @inactiveBackground: transparent; 30 | @inactiveColor: rgba(0, 0, 0, 0.15); 31 | 32 | @selectedBackground: @inactiveBackground; 33 | @selectedColor: @textColor; 34 | 35 | @activeBackground: @inactiveBackground; 36 | @activeColor: @darkTextColor; 37 | 38 | /* Star */ 39 | @starIconWidth: @iconWidth; 40 | @starIconHeight: @iconHeight; 41 | @starShadowWidth: 1px; 42 | 43 | @starInactiveBackground: @inactiveBackground; 44 | @starInactiveColor: @inactiveColor; 45 | @starInactiveTextShadow: none; 46 | 47 | @starActiveBackground: @activeBackground; 48 | @starActiveColor: #FFE623; 49 | @starActiveShadowColor: #DDC507; 50 | @starActiveTextShadow: 51 | 0px -@starShadowWidth 0px @starActiveShadowColor, 52 | -@starShadowWidth 0px 0px @starActiveShadowColor, 53 | 0px @starShadowWidth 0px @starActiveShadowColor, 54 | @starShadowWidth 0px 0px @starActiveShadowColor 55 | ; 56 | 57 | @starSelectedBackground: @selectedBackground; 58 | @starSelectedColor: #FFCC00; 59 | @starSelectedShadowColor: #E6A200; 60 | @starSelectedTextShadow: 61 | 0px -@starShadowWidth 0px @starSelectedShadowColor, 62 | -@starShadowWidth 0px 0px @starSelectedShadowColor, 63 | 0px @starShadowWidth 0px @starSelectedShadowColor, 64 | @starShadowWidth 0px 0px @starSelectedShadowColor 65 | ; 66 | 67 | /* Heart */ 68 | @heartIconWidth: 1.4em; 69 | @heartIconHeight: @iconHeight; 70 | @heartShadowWidth: 1px; 71 | 72 | @heartInactiveBackground: @inactiveBackground; 73 | @heartInactiveColor: @inactiveColor; 74 | @heartInactiveTextShadow: none; 75 | 76 | @heartActiveBackground: @activeBackground; 77 | @heartActiveColor: #FF6D75; 78 | @heartActiveShadowColor: #CD0707; 79 | @heartActiveTextShadow: 80 | 0px -@heartShadowWidth 0px @heartActiveShadowColor, 81 | -@heartShadowWidth 0px 0px @heartActiveShadowColor, 82 | 0px @heartShadowWidth 0px @heartActiveShadowColor, 83 | @heartShadowWidth 0px 0px @heartActiveShadowColor 84 | ; 85 | 86 | @heartSelectedBackground: @selectedBackground; 87 | @heartSelectedColor: #FF3000; 88 | @heartSelectedShadowColor: #AA0101; 89 | @heartSelectedTextShadow: 90 | 0px -@heartShadowWidth 0px @heartSelectedShadowColor, 91 | -@heartShadowWidth 0px 0px @heartSelectedShadowColor, 92 | 0px @heartShadowWidth 0px @heartSelectedShadowColor, 93 | @heartShadowWidth 0px 0px @heartSelectedShadowColor 94 | ; 95 | 96 | /*------------------- 97 | States 98 | --------------------*/ 99 | 100 | @interactiveActiveIconOpacity: 1; 101 | @interactiveSelectedIconOpacity: 1; 102 | 103 | /*------------------- 104 | Variations 105 | --------------------*/ 106 | 107 | @massive: 2rem; -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/search.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/shape.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/shape.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Shape 7 | *******************************/ 8 | 9 | @display: inline-block; 10 | 11 | /* Animating */ 12 | @perspective: 2000px; 13 | 14 | @duration: 0.6s; 15 | @easing: ease-in-out; 16 | 17 | @hiddenSideOpacity: 0.6; 18 | @animatingZIndex: 100; 19 | 20 | @transition: 21 | transform @duration @easing, 22 | left @duration @easing, 23 | width @duration @easing, 24 | height @duration @easing 25 | ; 26 | @sideTransition: opacity @duration @easing; 27 | @backfaceVisibility: hidden; 28 | 29 | /* Side */ 30 | @sideMargin: 0em; 31 | 32 | /*-------------- 33 | Types 34 | ---------------*/ 35 | 36 | /* Cube */ 37 | @cubeSize: 15em; 38 | @cubeBackground: #E6E6E6; 39 | @cubePadding: 2em; 40 | @cubeTextColor: @textColor; 41 | @cubeBoxShadow: 0px 0px 2px rgba(0, 0, 0, 0.3); 42 | 43 | @cubeTextAlign: center; 44 | @cubeFontSize: 2em; 45 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/sidebar.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/sidebar.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Sidebar 7 | *******************************/ 8 | 9 | /*------------------- 10 | Content 11 | --------------------*/ 12 | 13 | /* Animation */ 14 | @perspective: 1500px; 15 | @duration: 500ms; 16 | @easing: @defaultEasing; 17 | 18 | /* Dimmer */ 19 | @dimmerColor: rgba(0, 0, 0, 0.4); 20 | @dimmerTransition: opacity @duration; 21 | 22 | /* Color below page */ 23 | @canvasBackground: @lightBlack; 24 | 25 | /* Shadow */ 26 | @boxShadow: 0px 0px 20px @borderColor; 27 | @horizontalBoxShadow: @boxShadow; 28 | @verticalBoxShadow: @boxShadow; 29 | 30 | /* Layering */ 31 | @bottomLayer: 1; 32 | @middleLayer: 2; 33 | @fixedLayer: 101; 34 | @topLayer: 102; 35 | @dimmerLayer: 1000; 36 | 37 | /*------------------- 38 | Variations 39 | --------------------*/ 40 | 41 | /* Width */ 42 | @veryThinWidth: 60px; 43 | @thinWidth: 150px; 44 | @width: 260px; 45 | @wideWidth: 350px; 46 | @veryWideWidth: 475px; 47 | 48 | /* Height */ 49 | @height: 36px; 50 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/sticky.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/sticky.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Sticky 7 | *******************************/ 8 | 9 | @transsssitionDuration: @defaultDuration; 10 | @transition: none; 11 | @zIndex: 800; -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/tab.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Tab Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/tab.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Tab 7 | *******************************/ 8 | 9 | /* Loading */ 10 | @loadingMinHeight: 250px; 11 | @loadingContentPosition: relative; 12 | @loadingContentOffset: -10000px; 13 | 14 | @loaderDistanceFromTop: 100px; 15 | @loaderSize: 2.5em; -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/modules/transition.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Transition 7 | *******************************/ 8 | 9 | @transitionDefaultEasing: @defaultEasing; 10 | @transitionDefaultFill: both; 11 | @transitionDefaultDuration: 300ms; 12 | 13 | @use3DAcceleration: translateZ(0); 14 | @backfaceVisibility: hidden; -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/views/ad.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/views/ad.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Advertisement 7 | *******************************/ 8 | 9 | @margin: 1em 0em; 10 | @overflow: hidden; 11 | 12 | @testBackground: @lightBlack; 13 | @testColor: @white; 14 | @testFontWeight: bold; 15 | @testText: 'Ad'; 16 | @testFontSize: @relativeMedium; 17 | @testMobileFontSize: @relativeTiny; -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/views/card.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/views/comment.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/views/comment.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Comments 7 | *******************************/ 8 | 9 | 10 | /*------------------- 11 | View 12 | --------------------*/ 13 | 14 | @maxWidth: 650px; 15 | @margin: 1.5em 0em; 16 | 17 | /*------------------- 18 | Elements 19 | --------------------*/ 20 | 21 | /* Comment */ 22 | @commentBackground: none; 23 | @commentMargin: 0.5em 0em 0em; 24 | @commentPadding: 0.5em 0em 0em; 25 | @commentDivider: none; 26 | @commentBorder: none; 27 | @commentLineHeight: 1.2; 28 | @firstCommentMargin: 0em; 29 | @firstCommentPadding: 0em; 30 | 31 | /* Nested Comment */ 32 | @nestedCommentsMargin: 0em 0em 0.5em 0.5em; 33 | @nestedCommentsPadding: 1em 0em 1em 1em; 34 | 35 | @nestedCommentDivider: none; 36 | @nestedCommentBorder: none; 37 | @nestedCommentBackground: none; 38 | 39 | /* Avatar */ 40 | @avatarDisplay: block; 41 | @avatarFloat: left; 42 | @avatarWidth: 2.5em; 43 | @avatarHeight: auto; 44 | @avatarSpacing: 1em; 45 | @avatarMargin: (@commentLineHeight - 1em) 0em 0em; 46 | @avatarBorderRadius: 0.25rem; 47 | 48 | /* Content */ 49 | @contentMargin: @avatarWidth + @avatarSpacing; 50 | 51 | /* Author */ 52 | @authorFontSize: 1em; 53 | @authorColor: @textColor; 54 | @authorHoverColor: @linkHoverColor; 55 | @authorFontWeight: bold; 56 | 57 | /* Metadata */ 58 | @metadataDisplay: inline-block; 59 | @metadataFontSize: 0.875em; 60 | @metadataSpacing: 0.5em; 61 | @metadataContentSpacing: 0.5em; 62 | @metadataColor: @lightTextColor; 63 | 64 | /* Text */ 65 | @textFontSize: 1em; 66 | @textMargin: 0.25em 0em 0.5em; 67 | @textWordWrap: break-word; 68 | @textLineHeight: 1.3; 69 | 70 | /* Actions */ 71 | @actionFontSize: 0.875em; 72 | @actionContentDistance: 0.75em; 73 | @actionLinkColor: @unselectedTextColor; 74 | @actionLinkHoverColor: @hoveredTextColor; 75 | 76 | /* Reply */ 77 | @replyDistance: 1em; 78 | @replyHeight: 12em; 79 | @replyFontSize: 1em; 80 | 81 | @commentReplyDistance: @replyDistance; 82 | 83 | /*------------------- 84 | Variations 85 | --------------------*/ 86 | 87 | /* Threaded */ 88 | @threadedCommentMargin: -1.5em 0 -1em (@avatarWidth / 2); 89 | @threadedCommentPadding: 3em 0em 2em 2.25em; 90 | @threadedCommentBoxShadow: -1px 0px 0px @borderColor; 91 | 92 | 93 | /* Minimal */ 94 | @minimalActionPosition: absolute; 95 | @minimalActionTop: 0px; 96 | @minimalActionRight: 0px; 97 | @minimalActionLeft: auto; 98 | 99 | @minimalTransitionDelay: 0.1s; 100 | @minimalEasing: @defaultEasing; 101 | @minimalDuration: 0.2s; 102 | @minimalTransition: opacity @minimalDuration @minimalEasing; 103 | 104 | /* Sizes */ 105 | @small: 0.9em; 106 | @medium: 1em; 107 | @large: 1.1em; 108 | @huge: 1.2em; -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/views/feed.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/views/item.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/views/statistic.overrides.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Theme Overrides 7 | *******************************/ 8 | -------------------------------------------------------------------------------- /client/lib/semantic-ui/themes/default/views/statistic.variables.import.less: -------------------------------------------------------------------------------- 1 | /* 2 | DO NOT MODIFY - This file has been generated and will be regenerated 3 | Semantic UI v2.1.6 4 | */ 5 | /******************************* 6 | Statistic 7 | *******************************/ 8 | 9 | /*------------------- 10 | View 11 | --------------------*/ 12 | 13 | @margin: 1em 0em; 14 | @textAlign: center; 15 | @maxWidth: auto; 16 | 17 | /* Group */ 18 | @horizontalSpacing: 1.5em; 19 | @rowSpacing: 2em; 20 | @groupMargin: 1em -@horizontalSpacing -@rowSpacing; 21 | 22 | /* Group Element */ 23 | @elementMargin: 0em @horizontalSpacing @rowSpacing; 24 | @elementMaxWidth: @maxWidth; 25 | 26 | /*------------------- 27 | Content 28 | --------------------*/ 29 | 30 | /* Value */ 31 | @valueFont: @pageFont; 32 | @valueFontWeight: normal; 33 | @valueLineHeight: 1em; 34 | @valueColor: @black; 35 | @valueTextTransform: uppercase; 36 | 37 | /* Label */ 38 | @labelSize: @relativeMedium; 39 | @topLabelDistance: 0rem; 40 | @bottomLabelDistance: 0rem; 41 | @labelFont: @headerFont; 42 | @labelFontWeight: bold; 43 | @labelColor: @textColor; 44 | @labelLineHeight: @relativeLarge; 45 | @labelTextTransform: uppercase; 46 | 47 | /* Text */ 48 | @textValueLineHeight: 1em; 49 | @textValueMinHeight: 2em; 50 | @textValueFontWeight: bold; 51 | 52 | /* Label Image */ 53 | @imageHeight: 3rem; 54 | @imageVerticalAlign: baseline; 55 | 56 | /*------------------- 57 | Types 58 | --------------------*/ 59 | 60 | @horizontalGroupElementMargin: 1em 0em; 61 | @horizontalLabelDistance: 0.75em; 62 | 63 | /*------------------- 64 | Variations 65 | --------------------*/ 66 | 67 | /* Floated */ 68 | @leftFloatedMargin: 0em 2em 1em 0em; 69 | @rightFloatedMargin: 0em 0em 1em 2em; 70 | 71 | /* Inverted */ 72 | @invertedValueColor: @white; 73 | @invertedLabelColor: @invertedTextColor; 74 | 75 | /* Item Width */ 76 | @itemGroupMargin: 0em 0em -@rowSpacing; 77 | @itemMargin: 0em 0em @rowSpacing; 78 | 79 | /* Size */ 80 | @miniTextValueSize: 1rem; 81 | @miniValueSize: 1.5rem; 82 | @miniHorizontalValueSize: 1.5rem; 83 | 84 | @tinyTextValueSize: 1rem; 85 | @tinyValueSize: 2rem; 86 | @tinyHorizontalValueSize: 2rem; 87 | 88 | @smallTextValueSize: 1rem; 89 | @smallValueSize: 3rem; 90 | @smallHorizontalValueSize: 2rem; 91 | 92 | @textValueSize: 2rem; 93 | @valueSize: 4rem; 94 | @horizontalValueSize: 3rem; 95 | 96 | @largeTextValueSize: 2.5rem; 97 | @largeValueSize: 5rem; 98 | @largeHorizontalValueSize: 4rem; 99 | 100 | @hugeTextValueSize: 2.5rem; 101 | @hugeValueSize: 6rem; 102 | @hugeHorizontalValueSize: 5rem; -------------------------------------------------------------------------------- /client/lib/stats.js: -------------------------------------------------------------------------------- 1 | window.stats = {}; 2 | 3 | stats.sum = function(x){ 4 | return x.reduce(function(prev, next){ 5 | return prev + next; 6 | },0) 7 | }; 8 | 9 | stats.mean = function(x){ 10 | return stats.sum(x) / x.length; 11 | }; 12 | 13 | stats.min = function(x){ 14 | var min; 15 | for (var i =0; i < x.length; i++){ 16 | if (x[i] < min || min === undefined) min = x[i]; 17 | } 18 | return min; 19 | }; 20 | 21 | stats.max = function(x){ 22 | var max; 23 | for (var i =0; i < x.length; i++){ 24 | if (x[i] > max || max === undefined) max = x[i]; 25 | } 26 | return max; 27 | }; 28 | 29 | stats.median = function(x){ 30 | x.sort(function(a,b) {return a - b;} ); 31 | var mid = Math.floor(x.length/2); 32 | if(x.length % 2) 33 | return x[mid]; 34 | else 35 | return (x[mid-1] + x[mid]) / 2.0; 36 | }; 37 | 38 | stats.stdDev = function(x){ 39 | var mean = stats.mean(x); 40 | return Math.sqrt(stats.sum(x.map(function(n){ 41 | return (n - mean) * (n - mean); 42 | })) / x.length); 43 | }; 44 | 45 | -------------------------------------------------------------------------------- /client/notifications.js: -------------------------------------------------------------------------------- 1 | var Q_NAME = window["CONSTANTS"]["Q_NAME"]; 2 | 3 | // Title Notification 4 | var intervalId; 5 | var timeoutId; 6 | Tracker.autorun(function(){ 7 | 8 | clearInterval(intervalId); 9 | setDocumentTitle(Q_NAME); 10 | 11 | if (authorized.user()){ 12 | var claimedTicket = Tickets.findOne({ 13 | userId: Meteor.userId(), 14 | status: 'CLAIMED' 15 | }); 16 | if (claimedTicket){ 17 | var message = claimedTicket.claimName + " claimed your ticket!"; 18 | 19 | // Desktop Notification 20 | notifyDesktop(message); 21 | 22 | intervalId = setInterval(function(){ 23 | setDocumentTitle("(\u2713) " + Q_NAME); 24 | timeoutId = setTimeout(function(){ 25 | setDocumentTitle(message); 26 | },1500) 27 | },3000); 28 | } else { 29 | setDocumentTitle(Q_NAME); 30 | } 31 | } 32 | 33 | }); 34 | 35 | Tracker.autorun(function(){ 36 | if (authorized.mentor()){ 37 | var activeCount = Tickets.find({ 38 | status: 'OPEN' 39 | }).count(); 40 | setDocumentTitle("(" + activeCount + ") " + Q_NAME); 41 | } 42 | }); 43 | 44 | function setDocumentTitle(text){ 45 | document.title = text; 46 | } 47 | 48 | 49 | // Desktop Notifications 50 | Tracker.autorun(function(){ 51 | if (authorized.user()){ 52 | // Check to see if the browser supports Notifications 53 | if (window["Notification"]){ 54 | // Request permission 55 | Notification.requestPermission(); 56 | } 57 | } 58 | }); 59 | 60 | function notifyDesktop(body){ 61 | if (window["Notification"]){ 62 | if (Notification.permission == "granted"){ 63 | var notification = new Notification(Q_NAME, { 64 | icon: CONSTANTS.NOTIFICATION_ICON, 65 | body: body 66 | }); 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /client/router.js: -------------------------------------------------------------------------------- 1 | Router.onBeforeAction(function() { 2 | if (!Meteor.userId()) { 3 | this.render('splash'); 4 | } else { 5 | this.next(); 6 | } 7 | }); 8 | 9 | Router.route('/', function(){ 10 | this.layout('bannerLayout'); 11 | this.render('home'); 12 | }); 13 | 14 | Router.route('/profile', function(){ 15 | this.layout('bannerLayout'); 16 | this.render('profile'); 17 | }); 18 | 19 | Router.route('/mentor', function(){ 20 | this.layout('bannerLayout'); 21 | if (authorized.mentor()){ 22 | this.render('mentor'); 23 | } else { 24 | this.render('error', { data: { msg: "You're not a mentor!" }}); 25 | } 26 | }); 27 | 28 | Router.route('/admin', function(){ 29 | this.layout('bannerLayout'); 30 | if (authorized.admin()){ 31 | this.render('admin'); 32 | } else { 33 | this.render('error', { data: { msg: "You're not an admin!" }}); 34 | } 35 | }); -------------------------------------------------------------------------------- /client/stylesheets/scss/_branding.scss: -------------------------------------------------------------------------------- 1 | //------------------------------ 2 | // BRANDING COLOR VARIABLES 3 | // 4 | // primary: primary brand color 5 | // secondary: secondary brand color 6 | // success: generally some sort of green that fits with your color palette 7 | // danger: generally some sort of red to indicate danger 8 | //------------------------------ 9 | 10 | // Primary color of your brand (Used for primary buttons, glows, etc.) 11 | $brand-primary: #137DC3; 12 | 13 | // Secondary color of your brand (used for secondary buttons) 14 | $brand-secondary: #FFBF0A; 15 | 16 | // Success Buttons 17 | $brand-success: rgb(46, 204, 113); 18 | 19 | // Danger/Negative Buttons 20 | $brand-danger: #FF490A; 21 | 22 | // Black 23 | $black: #2d2d2d; 24 | 25 | // -------------- 26 | // Colors used for social auth 27 | // -------------- 28 | 29 | // Facebook Color 30 | $facebook-blue: #3b5998; 31 | 32 | // Github Gray 33 | $github-gray: #e4e4e4; 34 | 35 | // =============================================================================== 36 | 37 | //------------------------------ 38 | // FONT MIXINS 39 | // 40 | // Change the default fonts. 41 | // font-stack: base fonts 42 | // logo-font: font for the logo 43 | // 44 | // To use fonts other than Lato/Montserrat, edit client/app.html to include 45 | // the appropriate fonts. 46 | //------------------------------ 47 | 48 | // Styling for the fonts 49 | @mixin font-stack(){ 50 | font-family: 'Lato', 'Helvetica Neue', 'Helvetica', sans-serif; 51 | font-weight: 300; 52 | } 53 | 54 | @mixin logo-font(){ 55 | font-family: 'Montserrat', 'Helvetica Neue', 'Helvetica', sans-serif; 56 | font-weight: 700; 57 | } 58 | 59 | // =============================================================================== 60 | 61 | //------------------------------ 62 | // IMAGE BRANDING 63 | // 64 | // Set branding here by changing up the color of text and the background images 65 | // or background color. 66 | //------------------------------ 67 | 68 | // The splash is the login page. 69 | #splash { 70 | 71 | // There are a few defaults that are here, which you can comment/uncomment, 72 | // but you should feel free to change this to whatever you want. 73 | 74 | // Font color 75 | color: white; 76 | 77 | // Basic white text on brand color: 78 | // background: $brand-primary; 79 | 80 | // Single background image covering the entire page 81 | // background: url(/assets/images/background.jpg) no-repeat center center; 82 | // background-size: cover; 83 | 84 | // Background image that repeats 85 | background: url(/assets/images/geometry2.png) repeat; 86 | } 87 | 88 | 89 | // Banner which appears under the nav, and on each page. 90 | #banner { 91 | // Font color 92 | color: white; 93 | 94 | // Single background image covering 95 | // background: url(/assets/images/background.jpg) no-repeat center center; 96 | // background-size: cover; 97 | 98 | // Basic white on brand color: 99 | // background: $brand-primary; 100 | 101 | // Repeated Background: 102 | background: url(/assets/images/geometry2.png) repeat; 103 | } 104 | 105 | // Footer, which appears on each page. 106 | footer { 107 | color: darken(white, 25%); 108 | } -------------------------------------------------------------------------------- /client/stylesheets/scss/_keyframes.scss: -------------------------------------------------------------------------------- 1 | @-webkit-keyframes iconPulse { 2 | from {opacity: 1 } 3 | 50% {opacity: .5} 4 | to {opacity: 1} 5 | } 6 | 7 | @-webkit-keyframes borderPulse { 8 | from {border-color: $brand-primary} 9 | 50% {border-color: lighten($brand-primary, 80%)} 10 | to {border-color: $brand-primary} 11 | } 12 | -------------------------------------------------------------------------------- /client/stylesheets/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | 2 | 3 | @mixin border-radius($radius) { 4 | -webkit-border-radius: $radius; 5 | -moz-border-radius: $radius; 6 | -ms-border-radius: $radius; 7 | border-radius: $radius; 8 | } 9 | 10 | @mixin bold(){ 11 | font-weight: 700; 12 | } 13 | 14 | @mixin vertical-align() { 15 | position: relative; 16 | top: 50%; 17 | -webkit-transform: translateY(-50%); 18 | -ms-transform: translateY(-50%); 19 | transform: translateY(-50%); 20 | } 21 | 22 | @mixin pulse($name, $duration){ 23 | -webkit-animation-name: $name; 24 | -webkit-animation-duration: $duration; 25 | -webkit-animation-iteration-count: infinite; 26 | } 27 | -------------------------------------------------------------------------------- /client/stylesheets/scss/_override.scss: -------------------------------------------------------------------------------- 1 | // Put any SCSS or CSS here to override styles -------------------------------------------------------------------------------- /client/stylesheets/scss/components/_banner.scss: -------------------------------------------------------------------------------- 1 | #banner { 2 | margin-bottom: 12px; 3 | 4 | .content { 5 | @include logo-font(); 6 | font-size: 3em; 7 | letter-spacing: .2em; 8 | color: white; 9 | text-align: center; 10 | padding: 1.4em 0 1.4em; 11 | a { 12 | color: white; 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /client/stylesheets/scss/components/_feed.scss: -------------------------------------------------------------------------------- 1 | .feed { 2 | .claimed.icon { 3 | color: $brand-primary !important; 4 | @include pulse(iconPulse, 2s); 5 | } 6 | 7 | .content { 8 | .negative.extra.text { 9 | border-left: 3px solid $brand-danger !important; 10 | padding-left: 8px !important; 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /client/stylesheets/scss/components/_nav.scss: -------------------------------------------------------------------------------- 1 | #nav { 2 | position: absolute; 3 | padding: 8px 8px 0; 4 | width: 100%; 5 | 6 | .floating.notification.label { 7 | top: -0.5em; 8 | left: 90%; 9 | padding: 0.4em; 10 | } 11 | } 12 | 13 | @media only screen and (min-width: 768px) { 14 | 15 | #mobile-nav { 16 | display: none; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /client/stylesheets/scss/components/_ticketPanel.scss: -------------------------------------------------------------------------------- 1 | .ticketPanel { 2 | text-align: center; 3 | .title { 4 | font-size: 1.8em; 5 | line-height: 1.8em; 6 | margin-bottom: 12px; 7 | } 8 | .content { 9 | font-size: 1.3em; 10 | } 11 | input { 12 | width: 100%; 13 | } 14 | button { 15 | font-size: 1.3em; 16 | } 17 | 18 | #rating { 19 | margin-top: 12px; 20 | .rating { 21 | margin-bottom: 12px; 22 | } 23 | .comments { 24 | height: auto; 25 | min-height: 0; 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /client/stylesheets/scss/components/_tickets.scss: -------------------------------------------------------------------------------- 1 | .tickets { 2 | text-align: center; 3 | .ticket { 4 | text-align: left; 5 | font-size: 1.2em; 6 | 7 | &.claimed { 8 | border: 1px solid $brand-primary; 9 | @include pulse(borderPulse, 2s); 10 | } 11 | 12 | button { 13 | margin-bottom: 4px; 14 | font-size: .8em; 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /client/stylesheets/scss/components/_userEdit.scss: -------------------------------------------------------------------------------- 1 | .user-edit { 2 | .label { 3 | margin-bottom: 8px; 4 | } 5 | } -------------------------------------------------------------------------------- /client/stylesheets/scss/components/_userStats.scss: -------------------------------------------------------------------------------- 1 | .userStats { 2 | .statistics { 3 | .statistic { 4 | margin-bottom: 1.3em; 5 | } 6 | } 7 | } -------------------------------------------------------------------------------- /client/stylesheets/scss/components/_userTable.scss: -------------------------------------------------------------------------------- 1 | .userTable { 2 | .label { 3 | margin-bottom: 6px; 4 | } 5 | } -------------------------------------------------------------------------------- /client/stylesheets/scss/elements/_cleaninput.scss: -------------------------------------------------------------------------------- 1 | input.clean { 2 | background: darken(white, 2%); 3 | padding: .5em; 4 | font-size: 1em; 5 | border: none; 6 | border-bottom: 1px solid lighten($black, 60%); 7 | margin: 8px auto; 8 | text-align: center; 9 | 10 | &:focus { 11 | outline: none; 12 | } 13 | } -------------------------------------------------------------------------------- /client/stylesheets/scss/elements/_pushbuttons.scss: -------------------------------------------------------------------------------- 1 | button.push { 2 | @include font-stack(); 3 | @include border-radius(2px); 4 | @include bold(); 5 | color: white; 6 | display: block; 7 | position: relative; 8 | background: none; 9 | font-size: 1.1em; 10 | padding: .7em 1em; 11 | border: none; 12 | background: grey; 13 | border-bottom: 4px solid grey; 14 | border-bottom-color: lighten(grey, 10); 15 | text-transform: uppercase; 16 | transition-duration: .2s; 17 | 18 | &:focus { 19 | outline: none; 20 | } 21 | 22 | &:active { 23 | margin-top: 4px; 24 | border-bottom-width: 0; 25 | } 26 | 27 | &.small { 28 | font-size: .75em; 29 | } 30 | 31 | &.fluid { 32 | width: 100%; 33 | } 34 | 35 | &.disabled { 36 | opacity: .3; 37 | cursor: auto; 38 | &:active { 39 | margin-top: 0; 40 | border-bottom-width: 4px; 41 | } 42 | 43 | } 44 | 45 | &.primary { 46 | background: $brand-primary; 47 | border-bottom-color: lighten($brand-primary, 10); 48 | } 49 | 50 | &.secondary { 51 | background: $brand-secondary; 52 | border-bottom-color: lighten($brand-secondary, 10); 53 | } 54 | 55 | &.success { 56 | background: $brand-success; 57 | border-bottom-color: lighten($brand-success, 10); 58 | } 59 | 60 | &.danger { 61 | background: $brand-danger; 62 | border-bottom-color: lighten($brand-danger, 10); 63 | } 64 | 65 | &.github { 66 | color: darken($github-gray, 50); 67 | background: $github-gray; 68 | border-bottom-color: lighten($github-gray, 3); 69 | } 70 | 71 | &.facebook { 72 | background: $facebook-blue; 73 | border-bottom-color: lighten($facebook-blue, 10); 74 | } 75 | 76 | 77 | } -------------------------------------------------------------------------------- /client/stylesheets/scss/layouts/_bannerLayout.scss: -------------------------------------------------------------------------------- 1 | #container.bannerLayout { 2 | min-height: 100%; 3 | position: relative; 4 | 5 | #content { 6 | padding: 12px 12px 60px 12px; 7 | } 8 | 9 | #footer { 10 | position: absolute; 11 | bottom: 0; 12 | width: 100%; 13 | footer { 14 | text-align: center; 15 | padding-top: 12px; 16 | padding-bottom: 12px; 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /client/stylesheets/scss/site.scss: -------------------------------------------------------------------------------- 1 | @import 'branding'; 2 | @import 'keyframes'; 3 | @import 'mixins'; 4 | 5 | // Individual Elements 6 | @import 'elements/pushbuttons'; 7 | @import 'elements/cleaninput'; 8 | 9 | // Components 10 | @import 'components/banner'; 11 | @import 'components/nav'; 12 | @import 'components/tickets'; 13 | @import 'components/ticketPanel'; 14 | @import 'components/feed'; 15 | @import 'components/userStats'; 16 | @import 'components/userEdit'; 17 | @import 'components/userTable'; 18 | 19 | // Views 20 | @import 'views/splash'; 21 | @import 'views/home'; 22 | @import 'views/error'; 23 | @import 'views/admin'; 24 | @import 'views/profile'; 25 | 26 | body, 27 | html, 28 | button, 29 | input { 30 | @include font-stack(); 31 | color: #303030; 32 | } 33 | 34 | body, 35 | html { 36 | margin: 0; 37 | padding: 0; 38 | height: 100%; 39 | } 40 | 41 | // Layout 42 | @import 'layouts/bannerLayout'; 43 | 44 | // Any overrides 45 | @import 'override'; 46 | 47 | -------------------------------------------------------------------------------- /client/stylesheets/scss/views/_admin.scss: -------------------------------------------------------------------------------- 1 | #admin { 2 | padding-bottom: 40px; 3 | } -------------------------------------------------------------------------------- /client/stylesheets/scss/views/_error.scss: -------------------------------------------------------------------------------- 1 | #error { 2 | text-align: center; 3 | font-size: 1.5em; 4 | margin-top: 30px; 5 | } -------------------------------------------------------------------------------- /client/stylesheets/scss/views/_home.scss: -------------------------------------------------------------------------------- 1 | #home { 2 | .feed-title { 3 | font-size: 1.2em; 4 | margin-bottom: 8px; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /client/stylesheets/scss/views/_profile.scss: -------------------------------------------------------------------------------- 1 | #profile { 2 | .title { 3 | text-align: center; 4 | } 5 | } -------------------------------------------------------------------------------- /client/stylesheets/scss/views/_splash.scss: -------------------------------------------------------------------------------- 1 | #splash { 2 | height: 100%; 3 | width: 100%; 4 | color: white; 5 | 6 | >.container { 7 | @include vertical-align(); 8 | button { 9 | margin: 0 auto; 10 | } 11 | 12 | .header, 13 | .subheader { 14 | text-align: center; 15 | } 16 | 17 | .subheader { 18 | font-size: 1.5em; 19 | margin-bottom: .5em; 20 | } 21 | 22 | .header { 23 | @include logo-font(); 24 | font-size: 4em; 25 | letter-spacing: .2em; 26 | line-height: 1.33; 27 | } 28 | 29 | #login { 30 | max-width: 320px; 31 | margin: 0 auto; 32 | } 33 | 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /client/views/admin/admin.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/views/admin/admin.js: -------------------------------------------------------------------------------- 1 | Template.admin.helpers({ 2 | pageIs: function(page){ 3 | return Session.equals("admin", page); 4 | }, 5 | isActive: function(page){ 6 | return Session.equals("admin", page) ? "active" : ""; 7 | } 8 | }); 9 | 10 | Template.admin.events({ 11 | 'click .admin.menu .item': function(e){ 12 | var page = e.target.getAttribute('data-goto'); 13 | Session.set("admin", page); 14 | } 15 | }); 16 | 17 | -------------------------------------------------------------------------------- /client/views/error/error.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/views/home/home.html: -------------------------------------------------------------------------------- 1 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /client/views/mentor/mentor.html: -------------------------------------------------------------------------------- 1 | 24 | 25 | -------------------------------------------------------------------------------- /client/views/metrics/metrics.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/views/profile/profile.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/views/settings/settings.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/views/settings/settings.js: -------------------------------------------------------------------------------- 1 | // Helper to edit the settings 2 | Template.settings.rendered = function(){ 3 | $(this.findAll('.ui.checkbox')).checkbox(); 4 | setRadio('expirationDelay'); 5 | }; 6 | 7 | Template.settings.helpers({ 8 | settings: function(){ 9 | return settings(); 10 | } 11 | }); 12 | 13 | Template.settings.events({ 14 | "click #queueEnabled.ui.checkbox": function(e, t){ 15 | Meteor.call("setSetting", 16 | 'queueEnabled', 17 | $('#queueEnabled input').prop('checked')); 18 | }, 19 | "click .checkbox[data-name='expire']": function(e, t){ 20 | var value = t.findAll("input[name='expirationDelay']").filter(function(box){ 21 | return box.checked; 22 | })[0].value; 23 | Meteor.call("setSetting", 'expirationDelay', parseInt(value)); 24 | } 25 | }); 26 | 27 | function settings(){ 28 | return Settings.findOne({}); 29 | } 30 | 31 | function setRadio(name){ 32 | if (settings()){ 33 | $("input[name='" + name + "']").each(function(i, el){ 34 | if (el.value == settings()[name]){ 35 | el.checked = true; 36 | } 37 | }) 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /client/views/splash/splash.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/views/userCreation/userCreation.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/views/userCreation/userCreation.js: -------------------------------------------------------------------------------- 1 | Template.userCreation.onCreated(function(){ 2 | this.csv = new ReactiveVar(""); 3 | this.ready = new ReactiveVar(false); 4 | this.error = new ReactiveVar(false); 5 | this.users = new ReactiveVar([]); 6 | }); 7 | 8 | Template.userCreation.helpers({ 9 | error: function(){ 10 | return Template.instance().error.get(); 11 | }, 12 | ready: function(){ 13 | return Template.instance().ready.get(); 14 | }, 15 | formattedUsers: function(){ 16 | return Template.instance().users.get(); 17 | } 18 | }); 19 | 20 | Template.userCreation.events({ 21 | "click #checkFormat": function(e, t){ 22 | // Reset the error 23 | t.error.set(false); 24 | 25 | // Grab the csv text 26 | var csv = $('#usersCsv').val(); 27 | 28 | try { 29 | t.users.set(formatCsv(csv, t)); 30 | t.ready.set(true); 31 | } catch(err){ 32 | t.error.set(err); 33 | t.ready.set(false); 34 | } 35 | }, 36 | "click #createUsers": function(e, t){ 37 | // Create the users one by one 38 | t.users.get().forEach(function(user, idx){ 39 | Meteor.call("createAccount", 40 | user.username, 41 | user.password, 42 | user.profile, 43 | function(error){ 44 | if (error){ 45 | user.failed = true; 46 | } else { 47 | user.success = true; 48 | } 49 | var u = t.users.get(); 50 | u[idx] = user; 51 | t.users.set(u); 52 | }); 53 | }); 54 | } 55 | }); 56 | 57 | function formatCsv(csv, t){ 58 | var rows = csv.split('\n'); 59 | 60 | if (csv.length == 0){ 61 | throw "There's nothing here."; 62 | } 63 | 64 | var users = {}; 65 | 66 | return rows.map(function(row, i){ 67 | var columns = row.split(','); 68 | 69 | if (columns.length < 3){ 70 | throw "Row " + i + " has " + columns.length + " values, expected 3"; 71 | } 72 | 73 | if (columns.length > 3){ 74 | throw "Row " + i + " has " + columns.length + " values, expected 3"; 75 | } 76 | 77 | var username = columns[0].trim(), 78 | password = columns[1].trim(), 79 | name = columns[2].trim(); 80 | 81 | // Ensure the username is unique 82 | if (users[username]) { 83 | throw "Duplicate username: " + username; 84 | } 85 | 86 | // Ensure the password is at least 6 characters 87 | if (password.length < 6){ 88 | throw "Row " + i + " password too short, must be 6 characters or more"; 89 | } 90 | 91 | // Keep track of this username 92 | users[username] = true; 93 | 94 | return { 95 | username: username, 96 | password: password, 97 | profile: { 98 | name: name 99 | } 100 | } 101 | }) 102 | 103 | } -------------------------------------------------------------------------------- /create_config: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ -e private/config.json ]; then 4 | 5 | while true; do 6 | read -p "Warning: config.json already exists, are you sure you want to ovewrite it? (y/n) " yn 7 | 8 | case $yn in 9 | [Yy]* ) echo "overwriting..."; break;; 10 | [Nn]* ) exit;; 11 | *) echo "Invalid response (y/n)" 12 | esac 13 | done 14 | fi 15 | 16 | cp private/config.json.template private/config.json 17 | echo "Server side config created." 18 | echo "Edit it in private/config.json to add Facebook or GitHub integration." -------------------------------------------------------------------------------- /lib/constants.js: -------------------------------------------------------------------------------- 1 | CONSTANTS = { 2 | /** 3 | * ------------------------- 4 | * BRANDING 5 | * ------------------------- 6 | * 7 | * This is most the branding, such as your queue's name. 8 | * 9 | */ 10 | Q_NAME: "HELPq", 11 | SPLASH_MESSAGE: "Have a question? Get matched with a mentor for help.", 12 | 13 | // Path to image asset for desktop notifications 14 | NOTIFICATION_ICON: "/assets/images/favicon.png", 15 | 16 | /** 17 | * ------------------------- 18 | * TICKET PANEL 19 | * ------------------------- 20 | * 21 | * This is the panel where the student/hacker requests for help. 22 | * 23 | * " PROBLEM_PLACEHOLDER: the kind of problem a student might have 24 | * - this could be something more or less specific, depending on the application. 25 | * - for example: "debuggin, node.js, photoshop, etc." 26 | * 27 | * " LOCATION_PLACEHOLDER: where the student might be 28 | * - this could be more specific, like: "Which Table are you at? 4A, 2B, etc." 29 | * 30 | * " CONTACT: what kind of info you're requesting for contact 31 | * - for example: "you can identify me by:" 32 | * " " PLACEHOLDER: "my red shirt, blue hat, etc" 33 | * 34 | */ 35 | 36 | TICKET_PANEL_GREETING: "How can we help you?", 37 | TICKET_PANEL_TOPIC: "I need help with", 38 | TICKET_PANEL_TOPIC_PLACEHOLDER: "describe your problem", 39 | 40 | TICKET_PANEL_LOCATION: "you can find me at", 41 | TICKET_PANEL_LOCATION_PLACEHOLDER: "where are you?", 42 | 43 | TICKET_PANEL_CONTACT: "You can contact me through", 44 | TICKET_PANEL_CONTACT_PLACEHOLDER: "your cell phone #, email, etc.", 45 | 46 | TICKET_PANEL_HELP: "Help me!", 47 | TICKET_PANEL_CANCEL: "Nevermind!", 48 | 49 | TICKET_PANEL_OPEN: "Your ticket is open.", 50 | TICKET_PANEL_OPEN_MESSAGE: "We'll let you know when your ticket has been claimed!", 51 | 52 | TICKET_PANEL_CLAIMED: "Your ticket has been claimed!", 53 | 54 | TICKET_PANEL_DISABLED_MSG: "The queue is currently closed!" 55 | }; 56 | 57 | -------------------------------------------------------------------------------- /private/config.json.template: -------------------------------------------------------------------------------- 1 | { 2 | "admin": { 3 | "username": "admin", 4 | "password": "hunter2" 5 | }, 6 | "github": { 7 | "enable": false, 8 | "clientId": "github-client-id", 9 | "secret": "github-secret" 10 | }, 11 | "facebook": { 12 | "enable": false, 13 | "appId": "facebook-client-id", 14 | "secret": "facebook-secret" 15 | }, 16 | "google": { 17 | "enable": false, 18 | "clientId": "google-client-id", 19 | "secret": "google-secret" 20 | }, 21 | "settings": { 22 | "queueEnabled": true, 23 | "expirationDelay": 1800000 24 | }, 25 | "defaultMentor": true 26 | } 27 | -------------------------------------------------------------------------------- /public/assets/images/background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ehzhang/HELPq/a2eff6b4852ea691a4404b53af13e0dde5e1aa86/public/assets/images/background.jpg -------------------------------------------------------------------------------- /public/assets/images/banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ehzhang/HELPq/a2eff6b4852ea691a4404b53af13e0dde5e1aa86/public/assets/images/banner.jpg -------------------------------------------------------------------------------- /public/assets/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ehzhang/HELPq/a2eff6b4852ea691a4404b53af13e0dde5e1aa86/public/assets/images/favicon.ico -------------------------------------------------------------------------------- /public/assets/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ehzhang/HELPq/a2eff6b4852ea691a4404b53af13e0dde5e1aa86/public/assets/images/favicon.png -------------------------------------------------------------------------------- /public/assets/images/geometry2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ehzhang/HELPq/a2eff6b4852ea691a4404b53af13e0dde5e1aa86/public/assets/images/geometry2.png -------------------------------------------------------------------------------- /server/collections.js: -------------------------------------------------------------------------------- 1 | // Collections 2 | /** 3 | * 4 | * Ticket: 5 | * { 6 | * userId: STRING, 7 | * name: STRING, 8 | * imageUrl: STRING [optional] 9 | * topic: STRING, 10 | * location: STRING, 11 | * contact: STRING, 12 | * timestamp: Number (Milliseconds), 13 | * status: STRING [OPEN, CLAIMED, COMPLETE, EXPIRED, CANCELLED], 14 | * expiresAt: Number (Milliseconds) 15 | * claimId: STRING 16 | * claimName: STRING 17 | * claimTime: Number (Milliseconds) 18 | * completeTime: Number (Milliseconds) 19 | * rating: NUMBER 20 | * comments: STRING 21 | * } 22 | * 23 | */ 24 | Tickets = new Meteor.Collection('tickets'); 25 | 26 | /** 27 | * Announcement: 28 | * { 29 | * userId: STRING, 30 | * name: STRING, 31 | * header: STRING, 32 | * content: STRING, 33 | * timestamp: Number (Milliseconds) 34 | * } 35 | */ 36 | Announcements = new Meteor.Collection('announcements'); 37 | 38 | /** 39 | * Settings contain all of the information that can be edited on the client side. 40 | * 41 | * There is and should only be a single document. 42 | * { 43 | * queueEnabled: BOOLEAN 44 | * expirationDelay: Number (Milliseconds) 45 | * } 46 | */ 47 | Settings = new Meteor.Collection('settings'); 48 | 49 | /** 50 | * Users: 51 | * { 52 | * profile: { 53 | * name: STRING 54 | * email: STRING 55 | * phone: STRING 56 | * company: STRING 57 | * mentor: BOOLEAN 58 | * admin: BOOLEAN 59 | * skills: [STRING] 60 | * } 61 | * } 62 | */ 63 | 64 | // ---------------------------------------- 65 | // Collection Permissions 66 | // ---------------------------------------- 67 | 68 | Meteor.users.allow({ 69 | // Update users, only if Admin 70 | update: function(userId, doc){ 71 | var user = _getUser(userId); 72 | return user.profile.admin; 73 | } 74 | }); 75 | 76 | // Currently, disable all direct modifications 77 | Tickets.allow({ 78 | insert: function () { 79 | // Don't fuck with the console, yo 80 | return false; 81 | }, 82 | update: function () { 83 | // Only admin and mentors can modify tickets 84 | return false; 85 | // Enable below to allow client modifications 86 | //return Meteor.user().profile.admin || Meteor.user().profile.mentor; 87 | }, 88 | remove: function () { 89 | // Only admin and mentors can remove tickets 90 | return false; 91 | // Enable below to allow client modifications 92 | //return Meteor.user().profile.admin || Meteor.user().profile.mentor; 93 | } 94 | }); 95 | 96 | Announcements.allow({ 97 | insert: function() {return false}, 98 | update: function() {return false}, 99 | remove: function() {return false} 100 | }); 101 | 102 | Settings.allow({ 103 | insert: function() {return false}, 104 | update: function() {return false}, 105 | remove: function() {return false} 106 | }); -------------------------------------------------------------------------------- /server/lib/helpers.js: -------------------------------------------------------------------------------- 1 | // --------------------------------------- 2 | // Helper Functions 3 | // --------------------------------------- 4 | 5 | _getUser = function(id){ 6 | return Meteor.users.findOne({_id: id}); 7 | }; 8 | 9 | _getUserName = function(user){ 10 | if (user.profile.name){ 11 | return user.profile.name; 12 | } 13 | 14 | if (user.services.github.username){ 15 | return user.services.github.username; 16 | } 17 | return "Anonymous"; 18 | }; 19 | 20 | _settings = function(){ 21 | return Settings.findOne({}); 22 | }; 23 | 24 | _log = function(message){ 25 | console.log("[", new Date().toLocaleString(), "]", message); 26 | }; -------------------------------------------------------------------------------- /server/lib/permissions.js: -------------------------------------------------------------------------------- 1 | // ---------------------------------------- 2 | // Basic Roles, Client side auth 3 | // ---------------------------------------- 4 | 5 | // Admin have all rights 6 | authorized = { 7 | user: function(id){ 8 | var user = _getUser(id); 9 | return user ? true : false; 10 | }, 11 | admin: function(id){ 12 | var user = _getUser(id); 13 | return user.profile.admin 14 | }, 15 | mentor: function(id){ 16 | var user = _getUser(id); 17 | return user.profile.admin || user.profile.mentor 18 | } 19 | }; --------------------------------------------------------------------------------