├── .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 |
2 | {{#if announcement}}
3 | {{#with announcement}}
4 |
5 |
8 |
9 | {{time}}
10 |
11 |
12 | {{content}}
13 |
14 |
15 | - {{name}}
16 |
17 |
18 | {{/with}}
19 | {{/if}}
20 |
--------------------------------------------------------------------------------
/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 |
2 | {{#each announcements}}
3 |
4 |
5 |
8 |
9 | {{time}}
10 |
11 |
12 | {{content}}
13 |
14 |
15 | - {{name}}
16 |
17 |
18 | {{/each}}
19 |
--------------------------------------------------------------------------------
/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 |
2 |
54 |
--------------------------------------------------------------------------------
/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 |
2 |
9 |
--------------------------------------------------------------------------------
/client/components/charts/ticketCharts/ticketCharts.html:
--------------------------------------------------------------------------------
1 |
2 |
10 |
--------------------------------------------------------------------------------
/client/components/feed/feed.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Currently in the queue:
4 |
5 |
6 | {{#if tickets}}
7 | {{#each tickets}}
8 | {{> feedTicket }}
9 | {{/each}}
10 | {{else}}
11 | Nobody in the queue!
12 | {{/if}}
13 |
14 |
15 |
16 |
17 |
18 |
19 | {{#if open}}
20 |
21 | {{/if}}
22 | {{#if claimed}}
23 |
24 | {{/if}}
25 |
26 |
27 |
28 | {{ feedName }}
29 |
30 | {{fromNow timestamp}}
31 |
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/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 |
2 |
3 |
6 |
7 | {{#each tickets}}
8 | {{> feedbackItem }}
9 | {{/each}}
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
20 | {{#if comments}}
21 | {{#if negative}}
22 |
25 | {{else}}
26 |
29 | {{/if}}
30 | {{/if}}
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/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 |
2 |
5 |
6 |
--------------------------------------------------------------------------------
/client/components/leaderboard/leaderboard.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 | {{#each topMentors}}
8 | {{> leaderboardUser}}
9 | {{/each}}
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
{{profile.name}}
19 |
{{profile.company}}
20 |
21 | {{rating}} ({{numTickets}} Tickets)
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/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 |
2 |
3 | {{#if error}}
4 |
5 | {{error}}
6 |
7 | {{/if}}
8 |
22 |
23 | {{#if enabled.github}}
24 |
25 |
26 | {{/if}}
27 |
28 | {{#if enabled.facebook}}
29 |
30 |
31 | {{/if}}
32 |
33 |
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 |
2 |
3 | {{#if mentorsAvailable}}
4 |
6 |
{{mentorsAvailable}} {{mentorsText}} online.
7 | Estimated wait:
{{estimatedWait}}
8 | {{else}}
9 |
No mentors online right now.
11 | {{/if}}
12 |
13 |
--------------------------------------------------------------------------------
/client/components/nav/nav.html:
--------------------------------------------------------------------------------
1 |
2 | {{#if currentUser }}
3 |
4 |
20 |
21 |
22 |
23 | {{#if userIs 'mentor'}}
24 |
38 | {{/if}}
39 |
40 | {{/if}}
41 |
42 |
43 |
44 | {{#if userIs 'mentor'}}
45 |
46 |
47 | {{#if openTickets}}
48 |
49 | {{ openTickets }}
50 |
51 | {{/if}}
52 |
53 | {{/if}}
54 |
55 |
56 |
57 |
58 |
59 | {{profile}}
60 |
64 |
65 |
66 |
--------------------------------------------------------------------------------
/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 |
2 |
3 |
6 |
7 | {{#each skills}}
8 |
9 |
{{skill}} - {{count}}
10 |
11 | {{/each}}
12 |
13 |
14 |
--------------------------------------------------------------------------------
/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 |
2 |
3 | {{#with claimTimes}}
4 |
5 | Average response time:
6 |
7 | {{meanTime}}
8 |
9 |
10 | Median: {{medianTime}}, Std Dev:{{stdDevTime}}
11 |
12 |
13 | {{/with}}
14 |
15 |
16 |
17 | {{#with completeTimes}}
18 |
19 | Average Completion time:
20 |
21 | {{meanTime}}
22 |
23 |
24 | Median: {{medianTime}}, Std Dev: {{stdDevTime}}
25 |
26 |
27 | {{/with}}
28 |
29 |
30 |
31 | {{#with ratings}}
32 |
33 | Average Rating:
34 |
35 | {{mean}}
36 |
37 |
38 |
39 |
40 | {{/with}}
41 |
42 |
--------------------------------------------------------------------------------
/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 |
2 |
3 |
4 |
5 |
6 |
7 | Name |
8 | Topic |
9 | Location |
10 | Contact |
11 |
12 |
13 |
14 | ClaimName |
15 |
16 |
17 | Rating |
18 | Comments |
19 | |
20 |
21 |
22 |
23 | {{#each tickets}}
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 | {{name}} |
32 | {{topic}} |
33 | {{location}} |
34 | {{contact}} |
35 |
36 |
37 |
38 | {{claimName}} |
39 |
40 |
41 | {{rating}} |
42 | {{comments}} |
43 | |
44 |
45 | {{/each}}
46 |
47 |
48 |
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 |
2 |
4 |
5 | {{#if userIs 'admin'}}
6 |
7 | {{/if}}
8 |
15 |
20 |
21 |
22 |
23 | {{#if topic}}
24 | {{topic}}
25 | {{else}}
26 | something.
27 | {{/if}}
28 |
29 |
30 |
31 | ({{location}})
32 |
33 |
34 |
35 |
Contact:
36 | {{contact}}
37 |
38 |
68 |
69 |
70 |
--------------------------------------------------------------------------------
/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 |
2 |
3 | {{#if activeTickets}}
4 | {{#each activeTickets}}
5 | {{> ticket }}
6 | {{/each}}
7 | {{else}}
8 |
9 |
10 | 🙌
11 |
12 |
13 | Looks like it's all clear!
14 |
15 | {{/if}}
16 |
17 |
--------------------------------------------------------------------------------
/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 |
2 |
51 |
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 |
2 |
3 |
8 |
9 |
10 |
11 | Total Users:
12 |
13 | {{ users.length }}
14 |
15 |
16 |
17 | Total Mentors:
18 |
19 | {{ mentors.length }}
20 |
21 |
22 |
23 | Total Tickets:
24 |
25 | {{ ticketCount }}
26 |
27 |
28 |
29 |
30 |
31 |
32 | Of {{users.length}} users,
33 | {{activeUsers}} have submitted tickets.
34 |
35 |
36 |
37 | Of {{mentors.length}} mentors,
38 | {{activeMentors}} have completed tickets.
39 |
40 |
41 |
42 |
43 |
44 | {{#each wordFreqs}}
45 |
46 | {{word}} {{count}}
47 |
48 | {{/each}}
49 |
50 |
51 |
52 |
53 |
54 |
--------------------------------------------------------------------------------
/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 |
2 |
3 | {{> nav }}
4 | {{> banner }}
5 |
6 |
7 | {{> yield }}
8 |
9 |
10 |
13 |
14 |
--------------------------------------------------------------------------------
/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 |
2 |
3 |
4 |
5 |
28 |
29 |
30 |
31 | {{#if pageIs 'announce'}}
32 | {{> announcer }}
33 | {{> announcementsTable}}
34 | {{/if}}
35 |
36 | {{#if pageIs 'users'}}
37 | {{> userTable }}
38 | {{/if}}
39 |
40 | {{#if pageIs 'userCreation'}}
41 | {{> userCreation}}
42 | {{/if}}
43 |
44 | {{#if pageIs 'tickets'}}
45 | {{> ticketTable }}
46 | {{/if}}
47 |
48 | {{#if pageIs 'metrics'}}
49 | {{> metrics}}
50 | {{/if}}
51 |
52 | {{#if pageIs 'feedback'}}
53 | {{> feedback}}
54 | {{/if}}
55 |
56 | {{#if pageIs 'settings'}}
57 | {{> settings}}
58 | {{/if}}
59 |
60 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/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 |
2 |
3 | {{msg}}
4 |
5 |
--------------------------------------------------------------------------------
/client/views/home/home.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | {{> announcement }}
7 |
8 |
9 |
10 |
11 | {{> ticketPanel }}
12 |
13 |
14 |
15 |
16 | {{> mentorStatus}}
17 |
18 |
19 |
20 |
21 |
22 | {{> feed }}
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/client/views/mentor/mentor.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | {{> tickets }}
6 |
7 |
8 |
9 |
10 | {{> leaderboard }}
11 |
12 |
13 |
14 |
15 |
16 | {{> skillsList }}
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/client/views/metrics/metrics.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | {{> ticketStats }}
6 |
7 | {{> userStats}}
8 |
9 |
10 |
11 | {{> leaderboard }}
12 |
13 | {{> skillsList }}
14 |
15 |
16 |
17 |
18 |
19 | {{> ticketCharts }}
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/client/views/profile/profile.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | {{#with currentUser}}
8 | {{> userEdit }}
9 | {{/with}}
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/client/views/settings/settings.html:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
12 |
21 |
22 |
25 |
55 |
56 |
--------------------------------------------------------------------------------
/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 |
2 |
3 |
4 |
7 |
10 |
11 | {{> login }}
12 |
13 |
14 |
--------------------------------------------------------------------------------
/client/views/userCreation/userCreation.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
30 |
31 |
32 |
35 | {{#if error}}
36 |
37 | {{error}}
38 |
39 | {{/if}}
40 |
41 | {{#each formattedUsers}}
42 |
43 | {{#if success}}
44 |
45 | {{else}}
46 | {{#if failed}}
47 |
48 | {{else}}
49 |
50 | {{/if}}
51 | {{/if}}
52 |
53 |
54 |
57 |
58 | Username:
59 |
60 | {{username}}
61 |
62 | Password:
63 |
64 | {{password}}
65 |
66 |
67 |
68 |
69 | {{/each}}
70 |
71 |
72 |
73 |
74 |
--------------------------------------------------------------------------------
/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 | };
--------------------------------------------------------------------------------