diff --git a/Gruntfile.js b/Gruntfile.js index 3a2a4cd4e7..c97795e743 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -4,14 +4,16 @@ var fork = require('child_process').fork; var env = process.env; var worker; var updateWorker; +var initWorker; var incomplete = []; var running = 0; - module.exports = function (grunt) { var args = []; + var initArgs = ['--build']; if (!grunt.option('verbose')) { args.push('--log-level=info'); + initArgs.push('--log-level=info'); } function update(action, filepath, target) { @@ -49,7 +51,9 @@ module.exports = function (grunt) { updateWorker.on('exit', function () { running -= 1; if (running === 0) { - worker = fork('app.js', args, { env: env }); + worker = fork('app.js', args, { + env: env, + }); worker.on('message', function () { if (incomplete.length) { incomplete = []; @@ -131,15 +135,24 @@ module.exports = function (grunt) { grunt.loadNpmTasks('grunt-contrib-watch'); - if (grunt.option('skip')) { - grunt.registerTask('default', ['watch:serverUpdated']); - } else { - grunt.registerTask('default', ['watch']); - } - - + grunt.registerTask('default', ['watch']); env.NODE_ENV = 'development'; - worker = fork('app.js', args, { env: env }); + if (grunt.option('skip')) { + worker = fork('app.js', args, { + env: env, + }); + } else { + initWorker = fork('app.js', initArgs, { + env: env, + }); + + initWorker.on('exit', function () { + worker = fork('app.js', args, { + env: env, + }); + }); + } + grunt.event.on('watch', update); }; diff --git a/package.json b/package.json index 69fb210e96..94c021490d 100644 --- a/package.json +++ b/package.json @@ -56,9 +56,9 @@ "nodebb-plugin-dbsearch": "1.0.5", "nodebb-plugin-emoji-extended": "1.1.1", "nodebb-plugin-emoji-one": "1.1.5", - "nodebb-plugin-markdown": "7.1.0", + "nodebb-plugin-markdown": "7.1.1", "nodebb-plugin-mentions": "1.1.3", - "nodebb-plugin-soundpack-default": "0.1.6", + "nodebb-plugin-soundpack-default": "1.0.0", "nodebb-plugin-spam-be-gone": "0.4.10", "nodebb-rewards-essentials": "0.0.9", "nodebb-theme-lavender": "3.0.15", diff --git a/public/.eslintrc b/public/.eslintrc index 6e7ddc57e0..7c80ae2ec1 100644 --- a/public/.eslintrc +++ b/public/.eslintrc @@ -12,11 +12,47 @@ "bootbox": true, "templates": true, "Visibility": true, - "Tinycon": true + "Tinycon": true, + "Promise": true }, "env": { "jquery": true, "amd": true, - "browser": true + "browser": true, + "es6": false + }, + "rules": { + "no-dupe-class-members": "off", + "no-var": "off", + "object-shorthand": "off", + "prefer-arrow-callback": "off", + "prefer-spread": "off", + "prefer-reflect": "off", + "prefer-template": "off" + }, + "parserOptions": { + "ecmaVersion": 5, + "ecmaFeatures": { + "arrowFunctions": false, + "classes": false, + "defaultParams": false, + "destructuring": false, + "experimentalObjectRestSpread": false, + "blockBindings": false, + "forOf": false, + "generators": false, + "globalReturn": false, + "jsx": false, + "modules": false, + "objectLiteralComputedProperties": false, + "objectLiteralDuplicateProperties": false, + "objectLiteralShorthandMethods": false, + "objectLiteralShorthandProperties": false, + "impliedStrict": false, + "restParams": false, + "spread": false, + "superInFunctions": false, + "templateStrings": false + } } } diff --git a/public/language/cs/admin/appearance/skins.json b/public/language/cs/admin/appearance/skins.json index 64edb7c071..c84298d5a2 100644 --- a/public/language/cs/admin/appearance/skins.json +++ b/public/language/cs/admin/appearance/skins.json @@ -1,9 +1,9 @@ { "loading": "Načítání motivů…", - "homepage": "Homepage", - "select-skin": "Select Skin", - "current-skin": "Current Skin", - "skin-updated": "Skin Updated", + "homepage": "Domovská stránka", + "select-skin": "Vyber motiv", + "current-skin": "Současný motiv", + "skin-updated": "Motiv aktualizován", "applied-success": "%1 skin was succesfully applied", "revert-success": "Skin reverted to base colours" } \ No newline at end of file diff --git a/public/language/cs/admin/settings/user.json b/public/language/cs/admin/settings/user.json index bdabb075e9..607a2fbd92 100644 --- a/public/language/cs/admin/settings/user.json +++ b/public/language/cs/admin/settings/user.json @@ -1,21 +1,21 @@ { - "authentication": "Authentication", - "allow-local-login": "Allow local login", - "require-email-confirmation": "Require Email Confirmation", + "authentication": "Ověření", + "allow-local-login": "Povolit místní přihlášení", + "require-email-confirmation": "Vyžadovat potvrzení e-mailem", "email-confirm-interval": "User may not resend a confirmation email until", - "email-confirm-email2": "minutes have elapsed", + "email-confirm-email2": "minut uplynulo", "allow-login-with": "Allow login with", - "allow-login-with.username-email": "Username or Email", - "allow-login-with.username": "Username Only", - "allow-login-with.email": "Email Only", - "account-settings": "Account Settings", - "disable-username-changes": "Disable username changes", - "disable-email-changes": "Disable email changes", - "disable-password-changes": "Disable password changes", - "allow-account-deletion": "Allow account deletion", + "allow-login-with.username-email": "Uživatelské jméno nebo e-mail", + "allow-login-with.username": "Pouze uživatelské jméno", + "allow-login-with.email": "Pouze e-mail", + "account-settings": "Nastavení účtu", + "disable-username-changes": "Zakázat změnu uživatelského jména", + "disable-email-changes": "Zakázat změnu e-mailu", + "disable-password-changes": "Zakázat změnu hesla", + "allow-account-deletion": "Povolit smazání účtu", "user-info-private": "Make user info private", - "themes": "Themes", - "disable-user-skins": "Prevent users from choosing a custom skin", + "themes": "Témata", + "disable-user-skins": "Zabránit uživateli ve výběru vlastního vzhledu", "account-protection": "Account Protection", "login-attempts": "Login attempts per hour", "login-attempts-help": "If login attempts to a user's account exceeds this threshold, that account will be locked for a pre-configured amount of time", @@ -34,10 +34,10 @@ "registration.max-invites": "Maximum Invitations per User", "max-invites": "Maximum Invitations per User", "max-invites-help": "0 for no restriction. Admins get infinite invitations
Only applicable for \"Invite Only\"", - "min-username-length": "Minimum Username Length", - "max-username-length": "Maximum Username Length", - "min-password-length": "Minimum Password Length", - "max-about-me-length": "Maximum About Me Length", + "min-username-length": "Minimální délka uživatelského jména", + "max-username-length": "Maximální délka uživatelského jména", + "min-password-length": "Minimální délka hesla", + "max-about-me-length": "Maximální délka hesla", "terms-of-use": "Forum Terms of Use (Leave blank to disable)", "user-search": "User Search", "user-search-results-per-page": "Number of results to display", @@ -48,10 +48,10 @@ "outgoing-new-tab": "Open outgoing links in new tab", "topic-search": "Enable In-Topic Searching", "digest-freq": "Subscribe to Digest", - "digest-freq.off": "Off", - "digest-freq.daily": "Daily", - "digest-freq.weekly": "Weekly", - "digest-freq.monthly": "Monthly", + "digest-freq.off": "Vypnuto", + "digest-freq.daily": "Denně", + "digest-freq.weekly": "Týdně", + "digest-freq.monthly": "Měsíčně", "email-chat-notifs": "Send an email if a new chat message arrives and I am not online", "email-post-notif": "Send an email when replies are made to topics I am subscribed to", "follow-created-topics": "Follow topics you create", diff --git a/public/language/cs/login.json b/public/language/cs/login.json index 8d189a2d0e..e8652b4d33 100644 --- a/public/language/cs/login.json +++ b/public/language/cs/login.json @@ -8,5 +8,5 @@ "failed_login_attempt": "Přihlášení neúspěšné", "login_successful": "Přihlášení proběhlo úspěšně!", "dont_have_account": "Nemáte účet?", - "logged-out-due-to-inactivity": "You have been logged out of the Admin Control Panel due to inactivity" + "logged-out-due-to-inactivity": "Z důvodu nečinnosti jste byl odhlášen z ovládacího panelu administrátora" } \ No newline at end of file diff --git a/public/language/cs/modules.json b/public/language/cs/modules.json index 28a90319de..84afa3b052 100644 --- a/public/language/cs/modules.json +++ b/public/language/cs/modules.json @@ -13,7 +13,7 @@ "chat.contacts": "Kontakty", "chat.message-history": "Historie zpráv", "chat.pop-out": "Skrýt chat", - "chat.minimize": "Minimize", + "chat.minimize": "Minimalizovat", "chat.maximize": "Maximalizovat", "chat.seven_days": "7 dní", "chat.thirty_days": "30 dní", diff --git a/public/language/cs/register.json b/public/language/cs/register.json index fae5335f6a..fccff9ac25 100644 --- a/public/language/cs/register.json +++ b/public/language/cs/register.json @@ -1,6 +1,6 @@ { "register": "Registrace", - "cancel_registration": "Cancel Registration", + "cancel_registration": "Zrušit registraci", "help.email": "Ve výchozím nastavení bude váš e-mail skrytý.", "help.username_restrictions": "Jedinečné uživatelské jméno dlouhé %1 až %2 znaků. Ostatní uživatelé Vás mohou zmínit jako @uživatelské-jméno.", "help.minimum_password_length": "Délka vašeho hesla musí být alespoň %1 znaků.", diff --git a/public/language/cs/user.json b/public/language/cs/user.json index 01cf965cc8..25b2599e43 100644 --- a/public/language/cs/user.json +++ b/public/language/cs/user.json @@ -94,7 +94,7 @@ "topics_per_page": "Témat na stránce", "posts_per_page": "Příspěvků na stránce", "notification_sounds": "Přehrát zvuk když dostanete notifikaci", - "notifications_and_sounds": "Notifications & Sounds", + "notifications_and_sounds": "Upozornění a zvuky", "incoming-message-sound": "Incoming message sound", "outgoing-message-sound": "Outgoing message sound", "notification-sound": "Notification sound", diff --git a/public/language/en-GB/admin/general/dashboard.json b/public/language/en-GB/admin/general/dashboard.json index a70dda322e..02046bd17a 100644 --- a/public/language/en-GB/admin/general/dashboard.json +++ b/public/language/en-GB/admin/general/dashboard.json @@ -21,6 +21,7 @@ "upgrade-available": "

A new version (v%1) has been released. Consider upgrading your NodeBB.

", "prerelease-upgrade-available": "

This is an outdated pre-release version of NodeBB. A new version (v%1) has been released. Consider upgrading your NodeBB.

", "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", + "running-in-development": "Forum is running in development mode. The forum may be open to potential vulnerabilities; please contact your system administrator.", "notices": "Notices", "restart-not-required": "Restart not required", diff --git a/public/language/ja/topic.json b/public/language/ja/topic.json index 6f7cac850b..3a70be2b0f 100644 --- a/public/language/ja/topic.json +++ b/public/language/ja/topic.json @@ -107,10 +107,10 @@ "more_guests": "ゲストさんが%1人", "users_and_others": "%1と他は%2", "sort_by": "並び替え", - "oldest_to_newest": "新しい順に", - "newest_to_oldest": "古い順に", - "most_votes": "最高評価", - "most_posts": "最高投稿", + "oldest_to_newest": "古い\bものから新しい順", + "newest_to_oldest": "新しいものから古い順", + "most_votes": "最も投票された順", + "most_posts": "最も投稿された順", "stale.title": "新しいスレッドを作りますか?", "stale.warning": "あなたが返信しようとしてるスレッドが古いスレッドです。新しいスレッドを作って、そしてこのスレッドが参考として入れた方を勧めます。そうしますか?", "stale.create": "新しいスレッドを作ります。", diff --git a/public/language/ja/unread.json b/public/language/ja/unread.json index 47909bf086..feaef7879f 100644 --- a/public/language/ja/unread.json +++ b/public/language/ja/unread.json @@ -1,6 +1,6 @@ { "title": "未読", - "no_unread_topics": "未読のスレッドがあります。", + "no_unread_topics": "未読のスレッドはありません。", "load_more": "もっと見る", "mark_as_read": "既読にする", "selected": "選択済み", diff --git a/public/language/ru/admin/advanced/cache.json b/public/language/ru/admin/advanced/cache.json index 208775f991..c0487f399b 100644 --- a/public/language/ru/admin/advanced/cache.json +++ b/public/language/ru/admin/advanced/cache.json @@ -1,11 +1,11 @@ { "post-cache": "Кэш записи", "posts-in-cache": "Записей в кэше", - "average-post-size": "Average Post Size", - "length-to-max": "Length / Max", + "average-post-size": "Средний размер записи", + "length-to-max": "Длина / Максимальная", "percent-full": "%1% Full", - "post-cache-size": "Post Cache Size", + "post-cache-size": "Размер записи в кэше", "items-in-cache": "Items in Cache", - "control-panel": "Control Panel", - "update-settings": "Update Cache Settings" + "control-panel": "Панель управления", + "update-settings": "Обновить настройки кэша" } \ No newline at end of file diff --git a/public/language/sk/admin/advanced/errors.json b/public/language/sk/admin/advanced/errors.json index 1b12ed100f..02a4a0c461 100644 --- a/public/language/sk/admin/advanced/errors.json +++ b/public/language/sk/admin/advanced/errors.json @@ -1,14 +1,14 @@ { "figure-x": "Znázorniť %1", "error-events-per-day": "%1 events per day", - "error.404": "404 Not Found", - "error.503": "503 Service Unavailable", + "error.404": "404 Nenájdené", + "error.503": "503 Služba nie je k dispozícií", "manage-error-log": "Manage Error Log", "export-error-log": "Export Error Log (CSV)", "clear-error-log": "Clear Error Log", "route": "Route", "count": "Count", - "no-routes-not-found": "Hooray! No 404 errors!", + "no-routes-not-found": "Hurá! Žiadne chyby 404!", "clear404-confirm": "Are you sure you wish to clear the 404 error logs?", - "clear404-success": "\"404 Not Found\" errors cleared" + "clear404-success": "Chybné hlásenia \"404 Nenájdené\" vyčistené" } \ No newline at end of file diff --git a/public/language/sk/admin/advanced/events.json b/public/language/sk/admin/advanced/events.json index cce4546e34..ef963e4ce2 100644 --- a/public/language/sk/admin/advanced/events.json +++ b/public/language/sk/admin/advanced/events.json @@ -1,6 +1,6 @@ { "events": "Udalosti", - "no-events": "There are no events", - "control-panel": "Events Control Panel", - "delete-events": "Delete Events" + "no-events": "Zatiaľ neexistujô žiadne udalosti", + "control-panel": "Ovládací panel udalostí", + "delete-events": "Odstrániť udalosť" } \ No newline at end of file diff --git a/public/language/sk/admin/advanced/logs.json b/public/language/sk/admin/advanced/logs.json index 0dd71a3f30..1c30f4dca7 100644 --- a/public/language/sk/admin/advanced/logs.json +++ b/public/language/sk/admin/advanced/logs.json @@ -1,7 +1,7 @@ { - "logs": "Protokoly", - "control-panel": "Logs Control Panel", - "reload": "Reload Logs", - "clear": "Clear Logs", - "clear-success": "Logs Cleared!" + "logs": "Záznamy", + "control-panel": "Ovládací panel záznamov", + "reload": "Znovu načítať záznamy", + "clear": "Vyčistiť záznamy", + "clear-success": "Záznamy vyčistené!" } \ No newline at end of file diff --git a/public/language/sk/admin/appearance/skins.json b/public/language/sk/admin/appearance/skins.json index 4db6fbdd8a..f7440bfa8e 100644 --- a/public/language/sk/admin/appearance/skins.json +++ b/public/language/sk/admin/appearance/skins.json @@ -1,9 +1,9 @@ { - "loading": "Loading Skins...", - "homepage": "Homepage", - "select-skin": "Select Skin", - "current-skin": "Current Skin", - "skin-updated": "Skin Updated", - "applied-success": "%1 skin was succesfully applied", - "revert-success": "Skin reverted to base colours" + "loading": "Načítať vzhľady...", + "homepage": "Domovska stránka", + "select-skin": "Vybrať vzhľad", + "current-skin": "Aktuálny vzhľad", + "skin-updated": "Vzhľad aktualizovaný", + "applied-success": "%1 vzhľad bol úspešne aplikovaný", + "revert-success": "Vzhľad bol obnovený do základných farieb" } \ No newline at end of file diff --git a/public/language/sk/admin/appearance/themes.json b/public/language/sk/admin/appearance/themes.json index 3148a01337..34dca8603e 100644 --- a/public/language/sk/admin/appearance/themes.json +++ b/public/language/sk/admin/appearance/themes.json @@ -1,11 +1,11 @@ { - "checking-for-installed": "Checking for installed themes...", - "homepage": "Homepage", - "select-theme": "Select Theme", - "current-theme": "Current Theme", - "no-themes": "No installed themes found", - "revert-confirm": "Are you sure you wish to restore the default NodeBB theme?", - "theme-changed": "Theme Changed", - "revert-success": "You have successfully reverted your NodeBB back to it's default theme.", - "restart-to-activate": "Please restart your NodeBB to fully activate this theme" + "checking-for-installed": "Kontrola nainštalovaných motívov...", + "homepage": "Domovská stránka", + "select-theme": "Vybrať motív", + "current-theme": "Aktuálny motív", + "no-themes": "Žiadne nainštalované motívy neboli nájdené", + "revert-confirm": "Ste si istý, že chcete obnoviť predvolený NodeBB motív?", + "theme-changed": "Motív zmenený", + "revert-success": "Úspešne sa Vám podarilo obnoviť Váš NodeBB do predvoleného motívu.", + "restart-to-activate": "Prosím, reštartujte Váš NodeBB pre úplne aktivovanie tohto motívu." } \ No newline at end of file diff --git a/public/language/sk/admin/general/dashboard.json b/public/language/sk/admin/general/dashboard.json index a70dda322e..12a34ba046 100644 --- a/public/language/sk/admin/general/dashboard.json +++ b/public/language/sk/admin/general/dashboard.json @@ -1,20 +1,20 @@ { - "forum-traffic": "Forum Traffic", - "page-views": "Page Views", - "unique-visitors": "Unique Visitors", - "users": "Users", - "posts": "Posts", - "topics": "Topics", - "page-views-last-month": "Page views Last Month", - "page-views-this-month": "Page views This Month", - "page-views-last-day": "Page views in last 24 hours", + "forum-traffic": "Prevádzka fóra", + "page-views": "Zobrazenia stránok", + "unique-visitors": "Unikátne návštevy", + "users": "Užívatelia", + "posts": "Príspevky", + "topics": "Témy", + "page-views-last-month": "Zobrazenia stránok za posledný mesiac", + "page-views-this-month": "Zobrazenia stránok za tento mesiac", + "page-views-last-day": "Zobrazenia stránok za posledných 24 hodín", - "stats.day": "Day", - "stats.week": "Week", - "stats.month": "Month", - "stats.all": "All Time", + "stats.day": "Deň", + "stats.week": "Týždeň", + "stats.month": "Mesiac", + "stats.all": "Celé obdobie", - "updates": "Updates", + "updates": "Aktualizácie", "running-version": "You are running NodeBB v%1.", "keep-updated": "Always make sure that your NodeBB is up to date for the latest security patches and bug fixes.", "up-to-date": "

You are up-to-date

", @@ -22,42 +22,42 @@ "prerelease-upgrade-available": "

This is an outdated pre-release version of NodeBB. A new version (v%1) has been released. Consider upgrading your NodeBB.

", "prerelease-warning": "

This is a pre-release version of NodeBB. Unintended bugs may occur.

", - "notices": "Notices", - "restart-not-required": "Restart not required", - "restart-required": "Restart required", - "search-plugin-installed": "Search Plugin installed", - "search-plugin-not-installed": "Search Plugin not installed", + "notices": "Upozornenie", + "restart-not-required": "Reštart nie je potrebný", + "restart-required": "Reštart je potrebný", + "search-plugin-installed": "Vyhľadávací doplnok bol nainštalovaný", + "search-plugin-not-installed": "Vyhľadávací doplnok nebol nainštalovaný", "search-plugin-tooltip": "Install a search plugin from the plugin page in order to activate search functionality", "control-panel": "System Control", - "reload": "Reload", - "restart": "Restart", + "reload": "Obnoviť", + "restart": "Reštartovať", "restart-warning": "Reloading or Restarting your NodeBB will drop all existing connections for a few seconds.", "maintenance-mode": "Maintenance Mode", "maintenance-mode-title": "Click here to set up maintenance mode for NodeBB", "realtime-chart-updates": "Realtime Chart Updates", - "active-users": "Active Users", - "active-users.users": "Users", - "active-users.guests": "Guests", - "active-users.total": "Total", - "active-users.connections": "Connections", + "active-users": "Aktívny užívatelia", + "active-users.users": "Užívatelia", + "active-users.guests": "Hostia", + "active-users.total": "Celkovo", + "active-users.connections": "Pripojení", - "anonymous-registered-users": "Anonymous vs Registered Users", - "anonymous": "Anonymous", - "registered": "Registered", + "anonymous-registered-users": "Neznámy vs Zaregistrovaný užívatelia", + "anonymous": "Neznámy", + "registered": "Zaregistrovaný", "user-presence": "User Presence", "on-categories": "On categories list", "reading-posts": "Reading posts", "browsing-topics": "Browsing topics", - "recent": "Recent", - "unread": "Unread", + "recent": "Nedávne", + "unread": "Neprečitané", "high-presence-topics": "High Presence Topics", - "graphs.page-views": "Page Views", - "graphs.unique-visitors": "Unique Visitors", - "graphs.registered-users": "Registered Users", - "graphs.anonymous-users": "Anonymous Users" + "graphs.page-views": "Zobrazenia stránok", + "graphs.unique-visitors": "Unikátny navštevníci", + "graphs.registered-users": "Zarestrovaný užívatelia", + "graphs.anonymous-users": "Neznámy užívatelia" } diff --git a/public/language/sk/admin/manage/tags.json b/public/language/sk/admin/manage/tags.json index db40e9f098..775a9aed63 100644 --- a/public/language/sk/admin/manage/tags.json +++ b/public/language/sk/admin/manage/tags.json @@ -6,7 +6,7 @@ "description": "Select tags via clicking and/or dragging, use shift to select multiple.", "create": "Create Tag", "modify": "Modify Tags", - "delete": "Delete Selected Tags", + "delete": "Odstrániť vybraté značky", "search": "Search for tags...", "settings": "Click here to visit the tag settings page.", "name": "Tag Name", diff --git a/public/language/tr/admin/settings/uploads.json b/public/language/tr/admin/settings/uploads.json index b83ea976ce..4daa55400b 100644 --- a/public/language/tr/admin/settings/uploads.json +++ b/public/language/tr/admin/settings/uploads.json @@ -1,7 +1,7 @@ { "posts": "İletiler", "allow-files": "Allow users to upload regular files", - "private": "Make uploaded files private", + "private": "Yüklenen dosyaları gizli yap", "max-image-width": "Resize images down to specified width (in pixels)", "max-image-width-help": "(in pixels, default: 760 pixels, set to 0 to disable)", "max-file-size": "Maksimum Dosya Boyutu (KiB)", @@ -19,10 +19,10 @@ "profile-image-dimension-help": "(in pixels, default: 128 pixels)", "max-profile-image-size": "Maximum Profile Image File Size", "max-profile-image-size-help": "(in kilobytes, default: 256 KiB)", - "max-cover-image-size": "Maximum Cover Image File Size", + "max-cover-image-size": "Maksimum Kapak Görseli Dosya Boyutu", "max-cover-image-size-help": "(in kilobytes, default: 2,048 KiB)", "keep-all-user-images": "Keep old versions of avatars and profile covers on the server", - "profile-covers": "Profile Covers", - "default-covers": "Default Cover Images", + "profile-covers": "Profil Kapakları", + "default-covers": "Varsayılan Kapak Görseli", "default-covers-help": "Add comma-separated default cover images for accounts that don't have an uploaded cover image" } diff --git a/public/less/admin/admin.less b/public/less/admin/admin.less index aa5efff256..23f3bead8c 100644 --- a/public/less/admin/admin.less +++ b/public/less/admin/admin.less @@ -146,7 +146,7 @@ body { color: @gray-dark; &:hover, &.selected { - background: black; + background: @brand-primary; color: white; } } diff --git a/public/less/admin/general/navigation.less b/public/less/admin/general/navigation.less index 3e10639b89..583ec382e1 100644 --- a/public/less/admin/general/navigation.less +++ b/public/less/admin/general/navigation.less @@ -1,10 +1,10 @@ #navigation { #active-navigation { - width: 100%; + float: none; min-height: 50px; border: 1px solid #eee; overflow: auto; - + .active { background-color: #eee; } diff --git a/public/less/admin/manage/groups.less b/public/less/admin/manage/groups.less index f0de916162..57057cc9ff 100644 --- a/public/less/admin/manage/groups.less +++ b/public/less/admin/manage/groups.less @@ -5,10 +5,25 @@ max-height: 500px; display: block; overflow-y: auto; - padding-bottom: 100px; .member-name { width: 100%; } } } -} \ No newline at end of file + + #group-icon { + cursor: pointer; + } +} + +.groups { + #group-search { + margin-bottom: 10px; + } + + .groups-list { + p { + margin: 0; + } + } +} diff --git a/public/less/admin/manage/tags.less b/public/less/admin/manage/tags.less index 34075816b1..fc4ea9f2e1 100644 --- a/public/less/admin/manage/tags.less +++ b/public/less/admin/manage/tags.less @@ -25,30 +25,7 @@ } } - .tag-item { - border: solid 1px @gray-light; - background-color: transparent; - color: @gray-light; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: 700; - white-space: nowrap; - } - .tag-topic-count { - border: solid 1px lighten(@brand-primary, 20%); - background-color: lighten(@brand-primary, 20%); - padding: 6px; - font-size: 75%; - font-weight: 700; - white-space: nowrap; - border-left: none; - padding-right: 5px; - padding-left: 5px; - border-width: 1px 1px 2px medium; - - a { - color: #FFFFFF; - } + font-size: 14px; } } \ No newline at end of file diff --git a/public/src/admin/general/sounds.js b/public/src/admin/general/sounds.js index ae239034b9..fc5f0aa7ee 100644 --- a/public/src/admin/general/sounds.js +++ b/public/src/admin/general/sounds.js @@ -1,7 +1,7 @@ 'use strict'; -define('admin/general/sounds', ['sounds', 'settings'], function (Sounds, Settings) { +define('admin/general/sounds', ['sounds', 'settings', 'admin/settings'], function (Sounds, Settings, AdminSettings) { var SoundsAdmin = {}; SoundsAdmin.init = function () { @@ -9,8 +9,8 @@ define('admin/general/sounds', ['sounds', 'settings'], function (Sounds, Setting $('.sounds').find('button[data-action="play"]').on('click', function (e) { e.preventDefault(); - var fileName = $(this).parent().parent().find('select').val(); - Sounds.playFile(fileName); + var soundName = $(this).parent().parent().find('select').val(); + Sounds.playSound(soundName); }); // Load Form Values @@ -26,6 +26,8 @@ define('admin/general/sounds', ['sounds', 'settings'], function (Sounds, Setting app.alertSuccess('[[admin/general/sounds:saved]]'); }); }); + + AdminSettings.prepare(); }; return SoundsAdmin; diff --git a/public/src/admin/manage/group.js b/public/src/admin/manage/group.js index 8b77b2bf52..a4ed2eab7c 100644 --- a/public/src/admin/manage/group.js +++ b/public/src/admin/manage/group.js @@ -7,7 +7,7 @@ define('admin/manage/group', [ 'admin/modules/colorpicker', 'translator', ], function (memberList, iconSelect, colorpicker, translator) { - var Groups = {}; + var Groups = {}; Groups.init = function () { var groupDetailsSearch = $('#group-details-search'); @@ -40,7 +40,9 @@ define('admin/manage/group', [ var searchText = groupDetailsSearch.val(); var foundUser; - socket.emit('admin.user.search', { query: searchText }, function (err, results) { + socket.emit('admin.user.search', { + query: searchText, + }, function (err, results) { if (!err && results && results.users.length > 0) { var numResults = results.users.length; var x; @@ -53,7 +55,8 @@ define('admin/manage/group', [ for (x = 0; x < numResults; x += 1) { foundUser = $('
  • '); foundUser - .attr({ title: results.users[x].username, + .attr({ + title: results.users[x].username, 'data-uid': results.users[x].uid, 'data-username': results.users[x].username, 'data-userslug': results.users[x].userslug, @@ -96,7 +99,12 @@ define('admin/manage/group', [ 'icon:text': userLabel.attr('data-usericon-text'), }; - templates.parse('partials/groups/memberlist', 'members', { group: { isOwner: ajaxify.data.group.isOwner, members: [member] } }, function (html) { + templates.parse('admin/partials/groups/memberlist', 'members', { + group: { + isOwner: ajaxify.data.group.isOwner, + members: [member], + }, + }, function (html) { translator.translate(html, function (html) { $('[component="groups/members"] tbody').prepend(html); }); @@ -154,7 +162,7 @@ define('admin/manage/group', [ groupLabelPreview.css('background-color', '#' + hex); }); - $('.save').on('click', function () { + $('#save').on('click', function () { socket.emit('admin.groups.update', { groupName: groupName, values: { diff --git a/public/src/admin/manage/tags.js b/public/src/admin/manage/tags.js index e20bd72276..717d4bba1d 100644 --- a/public/src/admin/manage/tags.js +++ b/public/src/admin/manage/tags.js @@ -61,12 +61,16 @@ define('admin/manage/tags', [ } timeoutId = setTimeout(function () { - socket.emit('topics.searchAndLoadTags', { query: $('#tag-search').val() }, function (err, result) { + socket.emit('topics.searchAndLoadTags', { + query: $('#tag-search').val(), + }, function (err, result) { if (err) { return app.alertError(err.message); } - app.parseAndTranslate('admin/manage/tags', 'tags', { tags: result.tags }, function (html) { + app.parseAndTranslate('admin/manage/tags', 'tags', { + tags: result.tags, + }, function (html) { $('.tag-list').html(html); utils.makeNumbersHumanReadable(html.find('.human-readable-number')); timeoutId = 0; @@ -86,7 +90,7 @@ define('admin/manage/tags', [ } var firstTag = $(tagsToModify[0]); - var title = tagsToModify.length > 1 ? '[[admin/manage/tags:alerts.editing-multiple]]' : '[[admin/manage/tags:alerts.editing-x, ' + firstTag.find('.tag-item').text() + ']]'; + var title = tagsToModify.length > 1 ? '[[admin/manage/tags:alerts.editing-multiple]]' : '[[admin/manage/tags:alerts.editing-x, ' + firstTag.find('.tag-item').attr('data-tag') + ']]'; var modal = bootbox.dialog({ title: title, @@ -133,7 +137,9 @@ define('admin/manage/tags', [ tagsToDelete.each(function (index, el) { tags.push($(el).attr('data-tag')); }); - socket.emit('admin.tags.deleteTags', { tags: tags }, function (err) { + socket.emit('admin.tags.deleteTags', { + tags: tags, + }, function (err) { if (err) { return app.alertError(err.message); } diff --git a/public/src/client/account/edit.js b/public/src/client/account/edit.js index 4de3d61be3..20e85bb46b 100644 --- a/public/src/client/account/edit.js +++ b/public/src/client/account/edit.js @@ -70,7 +70,9 @@ define('forum/account/edit', ['forum/account/header', 'translator', 'components' function handleImageChange() { $('#changePictureBtn').on('click', function () { - socket.emit('user.getProfilePictures', { uid: ajaxify.data.uid }, function (err, pictures) { + socket.emit('user.getProfilePictures', { + uid: ajaxify.data.uid, + }, function (err, pictures) { if (err) { return app.alertError(err.message); } @@ -212,10 +214,13 @@ define('forum/account/edit', ['forum/account/header', 'translator', 'components' pictureCropper.show({ socketMethod: 'user.uploadCroppedPicture', - aspectRatio: '1 / 1', + aspectRatio: 1 / 1, paramName: 'uid', paramValue: ajaxify.data.theirid, fileSize: ajaxify.data.maximumProfileImageSize, + allowSkippingCrop: false, + restrictImageDimension: true, + imageDimension: ajaxify.data.profileImageDimension, title: '[[user:upload_picture]]', description: '[[user:upload_a_picture]]', accept: '.png,.jpg,.bmp', @@ -245,6 +250,9 @@ define('forum/account/edit', ['forum/account/header', 'translator', 'components' url: url, socketMethod: 'user.uploadCroppedPicture', aspectRatio: '1 / 1', + allowSkippingCrop: false, + restrictImageDimension: true, + imageDimension: ajaxify.data.profileImageDimension, paramName: 'uid', paramValue: ajaxify.data.theirid, }, onUploadComplete); @@ -258,7 +266,9 @@ define('forum/account/edit', ['forum/account/header', 'translator', 'components' }); modal.find('[data-action="remove-uploaded"]').on('click', function () { - socket.emit('user.removeUploadedPicture', { uid: ajaxify.data.theirid }, function (err) { + socket.emit('user.removeUploadedPicture', { + uid: ajaxify.data.theirid, + }, function (err) { modal.modal('hide'); if (err) { return app.alertError(err.message); diff --git a/public/src/client/account/header.js b/public/src/client/account/header.js index 33756e5b6c..1ff436c7ee 100644 --- a/public/src/client/account/header.js +++ b/public/src/client/account/header.js @@ -83,7 +83,9 @@ define('forum/account/header', [ pictureCropper.show({ title: '[[user:upload_cover_picture]]', socketMethod: 'user.updateCover', - aspectRatio: '16 / 9', + aspectRatio: NaN, + allowSkippingCrop: true, + restrictImageDimension: false, paramName: 'uid', paramValue: ajaxify.data.theirid, accept: '.png,.jpg,.bmp', @@ -131,7 +133,11 @@ define('forum/account/header', [ }, {}); var until = parseInt(formData.length, 10) ? (Date.now() + (formData.length * 1000 * 60 * 60 * (parseInt(formData.unit, 10) ? 24 : 1))) : 0; - socket.emit('user.banUsers', { uids: [ajaxify.data.theirid], until: until, reason: formData.reason || '' }, function (err) { + socket.emit('user.banUsers', { + uids: [ajaxify.data.theirid], + until: until, + reason: formData.reason || '', + }, function (err) { if (err) { return app.alertError(err.message); } diff --git a/public/src/client/account/settings.js b/public/src/client/account/settings.js index 5a853e0da0..537baab5de 100644 --- a/public/src/client/account/settings.js +++ b/public/src/client/account/settings.js @@ -35,8 +35,8 @@ define('forum/account/settings', ['forum/account/header', 'components', 'sounds' $('.account').find('button[data-action="play"]').on('click', function (e) { e.preventDefault(); - var fileName = $(this).parent().parent().find('select').val(); - sounds.playFile(fileName); + var soundName = $(this).parent().parent().find('select').val(); + sounds.playSound(soundName); }); toggleCustomRoute(); @@ -88,7 +88,7 @@ define('forum/account/settings', ['forum/account/header', 'components', 'sounds' } } - sounds.reloadMapping(); + sounds.loadMap(); if (requireReload && parseInt(app.user.uid, 10) === parseInt(ajaxify.data.theirid, 10)) { app.alert({ diff --git a/public/src/client/groups/details.js b/public/src/client/groups/details.js index e334f70ec5..4f7a11a892 100644 --- a/public/src/client/groups/details.js +++ b/public/src/client/groups/details.js @@ -33,7 +33,9 @@ define('forum/groups/details', [ pictureCropper.show({ title: '[[groups:upload-group-cover]]', socketMethod: 'groups.cover.update', - aspectRatio: '16 / 9', + aspectRatio: NaN, + allowSkippingCrop: true, + restrictImageDimension: false, paramName: 'groupName', paramValue: groupName, }, function (imageUrlOnServer) { diff --git a/public/src/modules/chat.js b/public/src/modules/chat.js index 3dc7bc136b..2a226a28a7 100644 --- a/public/src/modules/chat.js +++ b/public/src/modules/chat.js @@ -66,7 +66,7 @@ define('chat', [ if (!isSelf && (!modal.is(':visible') || !app.isFocused)) { app.alternatingTitle('[[modules:chat.user_has_messaged_you, ' + username + ']]'); - sounds.play('chat-incoming'); + sounds.play('chat-incoming', 'chat.incoming:' + data.message.mid); taskbar.push('chat', modal.attr('UUID'), { title: username, @@ -88,7 +88,7 @@ define('chat', [ module.toggleNew(modal.attr('UUID'), !isSelf, true); if (!isSelf) { app.alternatingTitle('[[modules:chat.user_has_messaged_you, ' + username + ']]'); - sounds.play('chat-incoming'); + sounds.play('chat-incoming', 'chat.incoming:' + data.message.mid); } }); }); diff --git a/public/src/modules/notifications.js b/public/src/modules/notifications.js index 22198c0db7..ecbfaadd1b 100644 --- a/public/src/modules/notifications.js +++ b/public/src/modules/notifications.js @@ -1,7 +1,7 @@ 'use strict'; -define('notifications', ['sounds', 'translator', 'components'], function (sound, translator, components) { +define('notifications', ['sounds', 'translator', 'components'], function (sounds, translator, components) { var Notifications = {}; var unreadNotifs = {}; @@ -104,7 +104,7 @@ define('notifications', ['sounds', 'translator', 'components'], function (sound, }); if (!unreadNotifs[notifData.nid]) { - sound.play('notification'); + sounds.play('notification', notifData.nid); unreadNotifs[notifData.nid] = true; } }); diff --git a/public/src/modules/pictureCropper.js b/public/src/modules/pictureCropper.js index 2b6172f82b..0ed62d3d8c 100644 --- a/public/src/modules/pictureCropper.js +++ b/public/src/modules/pictureCropper.js @@ -43,7 +43,30 @@ define('pictureCropper', ['translator', 'cropper'], function (translator, croppe var cropperTool = new cropper.default(img, { aspectRatio: data.aspectRatio, viewMode: 1, + cropmove: function () { + if (data.restrictImageDimension) { + if (cropperTool.cropBoxData.width > data.imageDimension) { + cropperTool.setCropBoxData({ + width: data.imageDimension, + }); + } + if (cropperTool.cropBoxData.height > data.imageDimension) { + cropperTool.setCropBoxData({ + height: data.imageDimension, + }); + } + } + }, ready: function () { + if (data.restrictImageDimension) { + var origDimension = (img.width < img.height) ? img.width : img.height; + var dimension = (origDimension > data.imageDimension) ? data.imageDimension : origDimension; + cropperTool.setCropBoxData({ + width: dimension, + height: dimension, + }); + } + cropperModal.find('.rotate').on('click', function () { var degrees = this.getAttribute('data-degrees'); cropperTool.rotate(degrees); @@ -135,6 +158,9 @@ define('pictureCropper', ['translator', 'cropper'], function (translator, croppe imageType: imageType, socketMethod: data.socketMethod, aspectRatio: data.aspectRatio, + allowSkippingCrop: data.allowSkippingCrop, + restrictImageDimension: data.restrictImageDimension, + imageDimension: data.imageDimension, paramName: data.paramName, paramValue: data.paramValue, }, callback); diff --git a/public/src/modules/sounds.js b/public/src/modules/sounds.js index f3d07acb6c..e81ee889f3 100644 --- a/public/src/modules/sounds.js +++ b/public/src/modules/sounds.js @@ -1,90 +1,95 @@ 'use strict'; -define('sounds', ['buzz'], function (buzz) { +define('sounds', function () { var Sounds = {}; - var loadedSounds = {}; - var eventSoundMapping; - var files; + var fileMap; + var soundMap; + var cache = {}; - socket.on('event:sounds.reloadMapping', function () { - Sounds.reloadMapping(); - }); - - Sounds.reloadMapping = function () { - socket.emit('modules.sounds.getMapping', function (err, mapping) { + Sounds.loadMap = function loadMap(callback) { + socket.emit('modules.sounds.getUserSoundMap', function (err, map) { if (err) { return app.alertError(err.message); } - eventSoundMapping = mapping; + soundMap = map; + if (callback) { + callback(); + } }); }; function loadData(callback) { - socket.emit('modules.sounds.getData', function (err, data) { - if (err) { - return app.alertError('[sounds] Could not load sound mapping!'); - } - eventSoundMapping = data.mapping; - files = data.files; - callback(); - }); - } - - function isSoundLoaded(fileName) { - return loadedSounds[fileName]; - } - - function loadFile(fileName, callback) { - function createSound() { - if (files && files[fileName]) { - loadedSounds[fileName] = new buzz.sound(files[fileName]); - } - callback(); - } - - if (isSoundLoaded(fileName)) { - return callback(); - } - - if (!files || !files[fileName]) { - return loadData(createSound); - } - createSound(); - } - - Sounds.play = function (name) { - function play() { - Sounds.playFile(eventSoundMapping[name]); - } - - if (!eventSoundMapping) { - return loadData(play); - } - - play(); - }; - - Sounds.playFile = function (fileName) { - if (!fileName) { - return; - } - - function play() { - if (loadedSounds[fileName]) { - loadedSounds[fileName].play(); - } else { - app.alertError('[sounds] Not found: ' + fileName); + var outstanding = 2; + function after() { + outstanding -= 1; + if (outstanding === 0 && callback) { + callback(); } } - - if (isSoundLoaded(fileName)) { - play(); + if (fileMap) { + outstanding -= 1; } else { - loadFile(fileName, play); + $.getJSON(config.relative_path + '/assets/sounds/fileMap.json', function (map) { + fileMap = map; + after(); + }); } + + Sounds.loadMap(after); + } + + Sounds.playSound = function playSound(soundName) { + if (!soundMap || !fileMap) { + return loadData(after); + } + + function after() { + if (!fileMap[soundName]) { + return; + } + var audio = cache[soundName] || new Audio(config.relative_path + '/assets/sounds/' + fileMap[soundName]); + cache[soundName] = audio; + audio.pause(); + audio.currentTime = 0; + audio.play(); + } + + after(); }; + Sounds.play = function play(type, id) { + function after() { + if (!soundMap[type]) { + return; + } + + if (id) { + var item = 'sounds.handled:' + id; + if (sessionStorage.getItem(item)) { + return; + } + sessionStorage.setItem(item, true); + + setTimeout(function () { + sessionStorage.removeItem(item); + }, 5000); + } + + Sounds.playSound(soundMap[type]); + } + + if (!soundMap || !fileMap) { + return loadData(after); + } + + after(); + }; + + socket.on('event:sounds.reloadMapping', function () { + Sounds.loadMap(); + }); + return Sounds; }); diff --git a/public/vendor/mdl/mdl.css b/public/vendor/mdl/material.css similarity index 78% rename from public/vendor/mdl/mdl.css rename to public/vendor/mdl/material.css index c037532647..74b6b7b71f 100644 --- a/public/vendor/mdl/mdl.css +++ b/public/vendor/mdl/material.css @@ -1,6 +1,6 @@ /** * material-design-lite - Material Design Components in CSS, JS and HTML - * @version v1.0.3 + * @version v1.3.0 * @license Apache-2.0 * @copyright 2015 Google, Inc. * @link https://github.com/google/material-design-lite @@ -62,6 +62,15 @@ * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -113,6 +122,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -161,7 +171,10 @@ /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -180,6 +193,7 @@ /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -250,6 +264,15 @@ * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -301,6 +324,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -349,7 +373,10 @@ /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /* * What follows is the result of much research on cross-browser styling. * Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal, @@ -496,6 +523,12 @@ textarea { These examples override the primary ('mobile first') styles. Modify as content requires. ========================================================================== */ +@media only screen and (min-width: 35em) { + /* Style adjustments for viewports that meet the condition */ } + +@media print, (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 1.25dppx), (min-resolution: 120dpi) { + /* Style adjustments for high resolution devices */ } + /* ========================================================================== Print styles. Inlined to avoid the additional HTTP request: @@ -505,13 +538,11 @@ textarea { *, *:before, *:after, - *:first-letter, - *:first-line { + *:first-letter { background: transparent !important; color: #000 !important; /* Black prints faster: http://www.sanbeiji.com/archives/953 */ - box-shadow: none !important; - text-shadow: none !important; } + box-shadow: none !important; } a, a:visited { text-decoration: underline; } @@ -660,6 +691,15 @@ main { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -711,6 +751,7 @@ main { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -759,7 +800,10 @@ main { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -778,6 +822,7 @@ main { /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ /*html, body { font-family: "Helvetica", "Arial", sans-serif; font-size: 14px; @@ -1160,6 +1205,21 @@ ul, ol { .mdl-typography--font-black { font-weight: 900 !important; } +.material-icons { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; + line-height: 1; + letter-spacing: normal; + text-transform: none; + display: inline-block; + word-wrap: normal; + -moz-font-feature-settings: 'liga'; + font-feature-settings: 'liga'; + -webkit-font-feature-settings: 'liga'; + -webkit-font-smoothing: antialiased; } + /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -1215,6 +1275,15 @@ ul, ol { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -1266,6 +1335,7 @@ ul, ol { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -1314,7 +1384,10 @@ ul, ol { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ .mdl-color-text--red { color: rgb(244,67,54) !important; } @@ -3050,6 +3123,15 @@ ul, ol { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -3101,6 +3183,7 @@ ul, ol { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -3149,7 +3232,10 @@ ul, ol { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ .mdl-ripple { background: rgb(0,0,0); border-radius: 50%; @@ -3160,13 +3246,13 @@ ul, ol { position: absolute; top: 0; -webkit-transform: translate(-50%, -50%); - -ms-transform: translate(-50%, -50%); transform: translate(-50%, -50%); width: 50px; overflow: hidden; } .mdl-ripple.is-animating { - -webkit-transition: -webkit-transform 0.3s cubic-bezier(0, 0, 0.2, 1), width 0.3s cubic-bezier(0, 0, 0.2, 1), height 0.3s cubic-bezier(0, 0, 0.2, 1), opacity 0.6s cubic-bezier(0, 0, 0.2, 1); - transition: transform 0.3s cubic-bezier(0, 0, 0.2, 1), width 0.3s cubic-bezier(0, 0, 0.2, 1), height 0.3s cubic-bezier(0, 0, 0.2, 1), opacity 0.6s cubic-bezier(0, 0, 0.2, 1); } + transition: width 0.3s cubic-bezier(0, 0, 0.2, 1), height 0.3s cubic-bezier(0, 0, 0.2, 1), opacity 0.6s cubic-bezier(0, 0, 0.2, 1), -webkit-transform 0.3s cubic-bezier(0, 0, 0.2, 1); + transition: transform 0.3s cubic-bezier(0, 0, 0.2, 1), width 0.3s cubic-bezier(0, 0, 0.2, 1), height 0.3s cubic-bezier(0, 0, 0.2, 1), opacity 0.6s cubic-bezier(0, 0, 0.2, 1); + transition: transform 0.3s cubic-bezier(0, 0, 0.2, 1), width 0.3s cubic-bezier(0, 0, 0.2, 1), height 0.3s cubic-bezier(0, 0, 0.2, 1), opacity 0.6s cubic-bezier(0, 0, 0.2, 1), -webkit-transform 0.3s cubic-bezier(0, 0, 0.2, 1); } .mdl-ripple.is-visible { opacity: 0.3; } @@ -3225,6 +3311,15 @@ ul, ol { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -3276,6 +3371,7 @@ ul, ol { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -3324,22 +3420,21 @@ ul, ol { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ .mdl-animation--default { - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } .mdl-animation--fast-out-slow-in { - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } .mdl-animation--linear-out-slow-in { - -webkit-transition-timing-function: cubic-bezier(0, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0, 0, 0.2, 1); } + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); } .mdl-animation--fast-out-linear-in { - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 1, 1); - transition-timing-function: cubic-bezier(0.4, 0, 1, 1); } + transition-timing-function: cubic-bezier(0.4, 0, 1, 1); } /** * Copyright 2015 Google Inc. All Rights Reserved. @@ -3396,6 +3491,15 @@ ul, ol { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -3447,6 +3551,7 @@ ul, ol { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -3495,7 +3600,10 @@ ul, ol { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ .mdl-badge { position: relative; white-space: nowrap; @@ -3504,26 +3612,21 @@ ul, ol { margin-right: auto; } .mdl-badge[data-badge]:after { content: attr(data-badge); - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; -webkit-flex-direction: row; -ms-flex-direction: row; flex-direction: row; -webkit-flex-wrap: wrap; -ms-flex-wrap: wrap; flex-wrap: wrap; - -webkit-box-pack: center; -webkit-justify-content: center; -ms-flex-pack: center; justify-content: center; -webkit-align-content: center; -ms-flex-line-pack: center; align-content: center; - -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; align-items: center; @@ -3545,6 +3648,10 @@ ul, ol { color: rgb(255,64,129); background: rgba(255,255,255,0.2); box-shadow: 0 0 1px gray; } + .mdl-badge.mdl-badge--overlap { + margin-right: 10px; } + .mdl-badge.mdl-badge--overlap:after { + right: -10px; } /** * Copyright 2015 Google Inc. All Rights Reserved. @@ -3601,6 +3708,15 @@ ul, ol { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -3652,6 +3768,7 @@ ul, ol { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -3700,7 +3817,10 @@ ul, ol { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -3719,6 +3839,7 @@ ul, ol { /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ .mdl-button { background: transparent; border: none; @@ -3726,8 +3847,9 @@ ul, ol { color: rgb(0,0,0); position: relative; height: 36px; + margin: 0; min-width: 64px; - padding: 0 8px; + padding: 0 16px; display: inline-block; font-family: "Roboto", "Helvetica", "Arial", sans-serif; font-size: 14px; @@ -3736,9 +3858,8 @@ ul, ol { line-height: 1; letter-spacing: 0; overflow: hidden; - will-change: box-shadow, transform; - -webkit-transition: box-shadow 0.2s cubic-bezier(0.4, 0, 1, 1), background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1); - transition: box-shadow 0.2s cubic-bezier(0.4, 0, 1, 1), background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1); + will-change: box-shadow; + transition: box-shadow 0.2s cubic-bezier(0.4, 0, 1, 1), background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1); outline: none; cursor: pointer; text-decoration: none; @@ -3800,7 +3921,6 @@ input.mdl-button[type="submit"] { top: 50%; left: 50%; -webkit-transform: translate(-12px, -12px); - -ms-transform: translate(-12px, -12px); transform: translate(-12px, -12px); line-height: 24px; width: 24px; } @@ -3846,7 +3966,6 @@ input.mdl-button[type="submit"] { top: 50%; left: 50%; -webkit-transform: translate(-12px, -12px); - -ms-transform: translate(-12px, -12px); transform: translate(-12px, -12px); line-height: 24px; width: 24px; } @@ -3890,26 +4009,21 @@ input.mdl-button[type="submit"] { color: rgb(255,255,255); background-color: rgb(255,64,129); } -.mdl-button[disabled][disabled], -.mdl-button.mdl-button--disabled.mdl-button--disabled { +.mdl-button[disabled][disabled], .mdl-button.mdl-button--disabled.mdl-button--disabled { color: rgba(0,0,0, 0.26); - cursor: auto; + cursor: default; background-color: transparent; } -.mdl-button--fab[disabled][disabled], -.mdl-button--fab.mdl-button--disabled.mdl-button--disabled { +.mdl-button--fab[disabled][disabled], .mdl-button--fab.mdl-button--disabled.mdl-button--disabled { + background-color: rgba(0,0,0, 0.12); + color: rgba(0,0,0, 0.26); } + +.mdl-button--raised[disabled][disabled], .mdl-button--raised.mdl-button--disabled.mdl-button--disabled { background-color: rgba(0,0,0, 0.12); color: rgba(0,0,0, 0.26); - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); } + box-shadow: none; } -.mdl-button--raised[disabled][disabled], -.mdl-button--raised.mdl-button--disabled.mdl-button--disabled { - background-color: rgba(0,0,0, 0.12); - color: rgba(0,0,0, 0.26); - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); } - -.mdl-button--colored[disabled][disabled], -.mdl-button--colored.mdl-button--disabled.mdl-button--disabled { +.mdl-button--colored[disabled][disabled], .mdl-button--colored.mdl-button--disabled.mdl-button--disabled { color: rgba(0,0,0, 0.26); } .mdl-button .material-icons { @@ -3970,6 +4084,15 @@ input.mdl-button[type="submit"] { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -4021,6 +4144,7 @@ input.mdl-button[type="submit"] { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -4069,14 +4193,14 @@ input.mdl-button[type="submit"] { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ .mdl-card { - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; -webkit-flex-direction: column; -ms-flex-direction: column; flex-direction: column; @@ -4101,17 +4225,14 @@ input.mdl-button[type="submit"] { box-sizing: border-box; } .mdl-card__title { - -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; align-items: center; color: rgb(0,0,0); display: block; - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; - -webkit-box-pack: stretch; -webkit-justify-content: stretch; -ms-flex-pack: stretch; justify-content: stretch; @@ -4120,7 +4241,6 @@ input.mdl-button[type="submit"] { -webkit-perspective-origin: 165px 56px; perspective-origin: 165px 56px; -webkit-transform-origin: 165px 56px; - -ms-transform-origin: 165px 56px; transform-origin: 165px 56px; box-sizing: border-box; } .mdl-card__title.mdl-card--border { @@ -4132,7 +4252,6 @@ input.mdl-button[type="submit"] { align-self: flex-end; color: inherit; display: block; - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; @@ -4141,22 +4260,23 @@ input.mdl-button[type="submit"] { line-height: normal; overflow: hidden; -webkit-transform-origin: 149px 48px; - -ms-transform-origin: 149px 48px; transform-origin: 149px 48px; margin: 0; } .mdl-card__subtitle-text { font-size: 14px; - color: grey; + color: rgba(0,0,0, 0.54); margin: 0; } .mdl-card__supporting-text { color: rgba(0,0,0, 0.54); - font-size: 13px; + font-size: 1rem; line-height: 18px; overflow: hidden; padding: 16px 16px; width: 90%; } + .mdl-card__supporting-text.mdl-card--border { + border-bottom: 1px solid rgba(0, 0, 0, 0.1); } .mdl-card__actions { font-size: 16px; @@ -4169,7 +4289,6 @@ input.mdl-button[type="submit"] { border-top: 1px solid rgba(0, 0, 0, 0.1); } .mdl-card--expand { - -webkit-box-flex: 1; -webkit-flex-grow: 1; -ms-flex-positive: 1; flex-grow: 1; } @@ -4234,6 +4353,15 @@ input.mdl-button[type="submit"] { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -4285,6 +4413,7 @@ input.mdl-button[type="submit"] { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -4333,7 +4462,10 @@ input.mdl-button[type="submit"] { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -4352,6 +4484,7 @@ input.mdl-button[type="submit"] { /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ .mdl-checkbox { position: relative; z-index: 1; @@ -4396,6 +4529,7 @@ input.mdl-button[type="submit"] { z-index: 2; } .mdl-checkbox.is-checked .mdl-checkbox__box-outline { border: 2px solid rgb(63,81,181); } + fieldset[disabled] .mdl-checkbox .mdl-checkbox__box-outline, .mdl-checkbox.is-disabled .mdl-checkbox__box-outline { border: 2px solid rgba(0,0,0, 0.26); cursor: auto; } @@ -4426,14 +4560,12 @@ input.mdl-button[type="submit"] { -webkit-mask: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8ZGVmcz4KICAgIDxjbGlwUGF0aCBpZD0iY2xpcCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMCwwIDAsMSAxLDEgMSwwIDAsMCB6IE0gMC44NTM0Mzc1LDAuMTY3MTg3NSAwLjk1OTY4NzUsMC4yNzMxMjUgMC40MjkzNzUsMC44MDM0Mzc1IDAuMzIzMTI1LDAuOTA5Njg3NSAwLjIxNzE4NzUsMC44MDM0Mzc1IDAuMDQwMzEyNSwwLjYyNjg3NSAwLjE0NjU2MjUsMC41MjA2MjUgMC4zMjMxMjUsMC42OTc1IDAuODUzNDM3NSwwLjE2NzE4NzUgeiIKICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDwvY2xpcFBhdGg+CiAgICA8bWFzayBpZD0ibWFzayIgbWFza1VuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgbWFza0NvbnRlbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDAsMCAwLDEgMSwxIDEsMCAwLDAgeiBNIDAuODUzNDM3NSwwLjE2NzE4NzUgMC45NTk2ODc1LDAuMjczMTI1IDAuNDI5Mzc1LDAuODAzNDM3NSAwLjMyMzEyNSwwLjkwOTY4NzUgMC4yMTcxODc1LDAuODAzNDM3NSAwLjA0MDMxMjUsMC42MjY4NzUgMC4xNDY1NjI1LDAuNTIwNjI1IDAuMzIzMTI1LDAuNjk3NSAwLjg1MzQzNzUsMC4xNjcxODc1IHoiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICA8L21hc2s+CiAgPC9kZWZzPgogIDxyZWN0CiAgICAgd2lkdGg9IjEiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjAiCiAgICAgeT0iMCIKICAgICBjbGlwLXBhdGg9InVybCgjY2xpcCkiCiAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KPC9zdmc+Cg=="); mask: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8ZGVmcz4KICAgIDxjbGlwUGF0aCBpZD0iY2xpcCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMCwwIDAsMSAxLDEgMSwwIDAsMCB6IE0gMC44NTM0Mzc1LDAuMTY3MTg3NSAwLjk1OTY4NzUsMC4yNzMxMjUgMC40MjkzNzUsMC44MDM0Mzc1IDAuMzIzMTI1LDAuOTA5Njg3NSAwLjIxNzE4NzUsMC44MDM0Mzc1IDAuMDQwMzEyNSwwLjYyNjg3NSAwLjE0NjU2MjUsMC41MjA2MjUgMC4zMjMxMjUsMC42OTc1IDAuODUzNDM3NSwwLjE2NzE4NzUgeiIKICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDwvY2xpcFBhdGg+CiAgICA8bWFzayBpZD0ibWFzayIgbWFza1VuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgbWFza0NvbnRlbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDAsMCAwLDEgMSwxIDEsMCAwLDAgeiBNIDAuODUzNDM3NSwwLjE2NzE4NzUgMC45NTk2ODc1LDAuMjczMTI1IDAuNDI5Mzc1LDAuODAzNDM3NSAwLjMyMzEyNSwwLjkwOTY4NzUgMC4yMTcxODc1LDAuODAzNDM3NSAwLjA0MDMxMjUsMC42MjY4NzUgMC4xNDY1NjI1LDAuNTIwNjI1IDAuMzIzMTI1LDAuNjk3NSAwLjg1MzQzNzUsMC4xNjcxODc1IHoiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICA8L21hc2s+CiAgPC9kZWZzPgogIDxyZWN0CiAgICAgd2lkdGg9IjEiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjAiCiAgICAgeT0iMCIKICAgICBjbGlwLXBhdGg9InVybCgjY2xpcCkiCiAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KPC9zdmc+Cg=="); background: transparent; - -webkit-transition-duration: 0.28s; - transition-duration: 0.28s; - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - -webkit-transition-property: background; - transition-property: background; } + transition-duration: 0.28s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-property: background; } .mdl-checkbox.is-checked .mdl-checkbox__tick-outline { background: rgb(63,81,181) url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8cGF0aAogICAgIGQ9Ik0gMC4wNDAzODA1OSwwLjYyNjc3NjcgMC4xNDY0NDY2MSwwLjUyMDcxMDY4IDAuNDI5Mjg5MzIsMC44MDM1NTMzOSAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IE0gMC4yMTcxNTcyOSwwLjgwMzU1MzM5IDAuODUzNTUzMzksMC4xNjcxNTcyOSAwLjk1OTYxOTQxLDAuMjczMjIzMyAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IgogICAgIGlkPSJyZWN0Mzc4MCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4K"); } + fieldset[disabled] .mdl-checkbox.is-checked .mdl-checkbox__tick-outline, .mdl-checkbox.is-checked.is-disabled .mdl-checkbox__tick-outline { background: rgba(0,0,0, 0.26) url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8cGF0aAogICAgIGQ9Ik0gMC4wNDAzODA1OSwwLjYyNjc3NjcgMC4xNDY0NDY2MSwwLjUyMDcxMDY4IDAuNDI5Mjg5MzIsMC44MDM1NTMzOSAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IE0gMC4yMTcxNTcyOSwwLjgwMzU1MzM5IDAuODUzNTUzMzksMC4xNjcxNTcyOSAwLjk1OTYxOTQxLDAuMjczMjIzMyAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IgogICAgIGlkPSJyZWN0Mzc4MCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4K"); } @@ -4443,6 +4575,7 @@ input.mdl-button[type="submit"] { font-size: 16px; line-height: 24px; margin: 0; } + fieldset[disabled] .mdl-checkbox .mdl-checkbox__label, .mdl-checkbox.is-disabled .mdl-checkbox__label { color: rgba(0,0,0, 0.26); cursor: auto; } @@ -4461,8 +4594,10 @@ input.mdl-button[type="submit"] { -webkit-mask-image: -webkit-radial-gradient(circle, white, black); } .mdl-checkbox__ripple-container .mdl-ripple { background: rgb(63,81,181); } + fieldset[disabled] .mdl-checkbox .mdl-checkbox__ripple-container, .mdl-checkbox.is-disabled .mdl-checkbox__ripple-container { cursor: auto; } + fieldset[disabled] .mdl-checkbox .mdl-checkbox__ripple-container .mdl-ripple, .mdl-checkbox.is-disabled .mdl-checkbox__ripple-container .mdl-ripple { background: transparent; } @@ -4521,6 +4656,15 @@ input.mdl-button[type="submit"] { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -4572,6 +4716,7 @@ input.mdl-button[type="submit"] { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -4620,7 +4765,10 @@ input.mdl-button[type="submit"] { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -4639,6 +4787,249 @@ input.mdl-button[type="submit"] { /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ +.mdl-chip { + height: 32px; + font-family: "Roboto", "Helvetica", "Arial", sans-serif; + line-height: 32px; + padding: 0 12px; + border: 0; + border-radius: 16px; + background-color: #dedede; + display: inline-block; + color: rgba(0,0,0, 0.87); + margin: 2px 0; + font-size: 0; + white-space: nowrap; } + .mdl-chip__text { + font-size: 13px; + vertical-align: middle; + display: inline-block; } + .mdl-chip__action { + height: 24px; + width: 24px; + background: transparent; + opacity: 0.54; + display: inline-block; + cursor: pointer; + text-align: center; + vertical-align: middle; + padding: 0; + margin: 0 0 0 4px; + font-size: 13px; + text-decoration: none; + color: rgba(0,0,0, 0.87); + border: none; + outline: none; + overflow: hidden; } + .mdl-chip__contact { + height: 32px; + width: 32px; + border-radius: 16px; + display: inline-block; + vertical-align: middle; + margin-right: 8px; + overflow: hidden; + text-align: center; + font-size: 18px; + line-height: 32px; } + .mdl-chip:focus { + outline: 0; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); } + .mdl-chip:active { + background-color: #d6d6d6; } + .mdl-chip--deletable { + padding-right: 4px; } + .mdl-chip--contact { + padding-left: 0; } + +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*------------------------------------* $CONTENTS +\*------------------------------------*/ +/** + * STYLE GUIDE VARIABLES------------------Declarations of Sass variables + * -----Typography + * -----Colors + * -----Textfield + * -----Switch + * -----Spinner + * -----Radio + * -----Menu + * -----List + * -----Layout + * -----Icon toggles + * -----Footer + * -----Column + * -----Checkbox + * -----Card + * -----Button + * -----Animation + * -----Progress + * -----Badge + * -----Shadows + * -----Grid + * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. + */ +/* ========== TYPOGRAPHY ========== */ +/* We're splitting fonts into "preferred" and "performance" in order to optimize + page loading. For important text, such as the body, we want it to load + immediately and not wait for the web font load, whereas for other sections, + such as headers and titles, we're OK with things taking a bit longer to load. + We do have some optional classes and parameters in the mixins, in case you + definitely want to make sure you're using the preferred font and don't mind + the performance hit. + We should be able to improve on this once CSS Font Loading L3 becomes more + widely available. +*/ +/* ========== COLORS ========== */ +/** +* +* Material design color palettes. +* @see http://www.google.com/design/spec/style/color.html +* +**/ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* ========== Color Palettes ========== */ +/* colors.scss */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* ========== IMAGES ========== */ +/* ========== Color & Themes ========== */ +/* ========== Typography ========== */ +/* ========== Components ========== */ +/* ========== Standard Buttons ========== */ +/* ========== Icon Toggles ========== */ +/* ========== Radio Buttons ========== */ +/* ========== Ripple effect ========== */ +/* ========== Layout ========== */ +/* ========== Content Tabs ========== */ +/* ========== Checkboxes ========== */ +/* ========== Switches ========== */ +/* ========== Spinner ========== */ +/* ========== Text fields ========== */ +/* ========== Card ========== */ +/* ========== Sliders ========== */ +/* ========== Progress ========== */ +/* ========== List ========== */ +/* ========== Item ========== */ +/* ========== Dropdown menu ========== */ +/* ========== Tooltips ========== */ +/* ========== Footer ========== */ +/* TEXTFIELD */ +/* SWITCH */ +/* SPINNER */ +/* RADIO */ +/* MENU */ +/* LIST */ +/* LAYOUT */ +/* ICON TOGGLE */ +/* FOOTER */ +/*mega-footer*/ +/*mini-footer*/ +/* CHECKBOX */ +/* CARD */ +/* Card dimensions */ +/* Cover image */ +/* BUTTON */ +/** + * + * Dimensions + * + */ +/* ANIMATION */ +/* PROGRESS */ +/* BADGE */ +/* SHADOWS */ +/* GRID */ +/* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ +/* TOOLTIP */ +/* CHIP */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* Typography */ +/* Shadows */ +/* Animations */ +/* Dialog */ .mdl-data-table { position: relative; border: 1px solid rgba(0, 0, 0, 0.12); @@ -4653,18 +5044,15 @@ input.mdl-button[type="submit"] { .mdl-data-table tbody tr { position: relative; height: 48px; - -webkit-transition-duration: 0.28s; - transition-duration: 0.28s; - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - -webkit-transition-property: background-color; - transition-property: background-color; } + transition-duration: 0.28s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-property: background-color; } .mdl-data-table tbody tr.is-selected { background-color: #e0e0e0; } .mdl-data-table tbody tr:hover { background-color: #eeeeee; } .mdl-data-table td, .mdl-data-table th { - padding: 0 18px 0 18px; + padding: 0 18px 12px 18px; text-align: right; } .mdl-data-table td:first-of-type, .mdl-data-table th:first-of-type { padding-left: 24px; } @@ -4672,16 +5060,14 @@ input.mdl-button[type="submit"] { padding-right: 24px; } .mdl-data-table td { position: relative; - vertical-align: top; + vertical-align: middle; height: 48px; border-top: 1px solid rgba(0, 0, 0, 0.12); border-bottom: 1px solid rgba(0, 0, 0, 0.12); padding-top: 12px; box-sizing: border-box; } .mdl-data-table td .mdl-data-table__select { - vertical-align: top; - position: absolute; - left: 24px; } + vertical-align: middle; } .mdl-data-table th { position: relative; vertical-align: bottom; @@ -4695,10 +5081,32 @@ input.mdl-button[type="submit"] { color: rgba(0, 0, 0, 0.54); padding-bottom: 8px; box-sizing: border-box; } - .mdl-data-table th .mdl-data-table__select { - position: absolute; - bottom: 8px; - left: 24px; } + .mdl-data-table th.mdl-data-table__header--sorted-ascending, .mdl-data-table th.mdl-data-table__header--sorted-descending { + color: rgba(0, 0, 0, 0.87); } + .mdl-data-table th.mdl-data-table__header--sorted-ascending:before, .mdl-data-table th.mdl-data-table__header--sorted-descending:before { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; + line-height: 1; + letter-spacing: normal; + text-transform: none; + display: inline-block; + word-wrap: normal; + -moz-font-feature-settings: 'liga'; + font-feature-settings: 'liga'; + -webkit-font-feature-settings: 'liga'; + -webkit-font-smoothing: antialiased; + font-size: 16px; + content: "\e5d8"; + margin-right: 5px; + vertical-align: sub; } + .mdl-data-table th.mdl-data-table__header--sorted-ascending:hover, .mdl-data-table th.mdl-data-table__header--sorted-descending:hover { + cursor: pointer; } + .mdl-data-table th.mdl-data-table__header--sorted-ascending:hover:before, .mdl-data-table th.mdl-data-table__header--sorted-descending:hover:before { + color: rgba(0, 0, 0, 0.26); } + .mdl-data-table th.mdl-data-table__header--sorted-descending:before { + content: "\e5db"; } .mdl-data-table__select { width: 16px; } @@ -4761,6 +5169,15 @@ input.mdl-button[type="submit"] { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -4812,6 +5229,7 @@ input.mdl-button[type="submit"] { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -4860,7 +5278,10 @@ input.mdl-button[type="submit"] { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -4879,6 +5300,232 @@ input.mdl-button[type="submit"] { /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ +.mdl-dialog { + border: none; + box-shadow: 0 9px 46px 8px rgba(0, 0, 0, 0.14), 0 11px 15px -7px rgba(0, 0, 0, 0.12), 0 24px 38px 3px rgba(0, 0, 0, 0.2); + width: 280px; } + .mdl-dialog__title { + padding: 24px 24px 0; + margin: 0; + font-size: 2.5rem; } + .mdl-dialog__actions { + padding: 8px 8px 8px 24px; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-direction: row-reverse; + -ms-flex-direction: row-reverse; + flex-direction: row-reverse; + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; } + .mdl-dialog__actions > * { + margin-right: 8px; + height: 36px; } + .mdl-dialog__actions > *:first-child { + margin-right: 0; } + .mdl-dialog__actions--full-width { + padding: 0 0 8px 0; } + .mdl-dialog__actions--full-width > * { + height: 48px; + -webkit-flex: 0 0 100%; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + padding-right: 16px; + margin-right: 0; + text-align: right; } + .mdl-dialog__content { + padding: 20px 24px 24px 24px; + color: rgba(0,0,0, 0.54); } + +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*------------------------------------* $CONTENTS +\*------------------------------------*/ +/** + * STYLE GUIDE VARIABLES------------------Declarations of Sass variables + * -----Typography + * -----Colors + * -----Textfield + * -----Switch + * -----Spinner + * -----Radio + * -----Menu + * -----List + * -----Layout + * -----Icon toggles + * -----Footer + * -----Column + * -----Checkbox + * -----Card + * -----Button + * -----Animation + * -----Progress + * -----Badge + * -----Shadows + * -----Grid + * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. + */ +/* ========== TYPOGRAPHY ========== */ +/* We're splitting fonts into "preferred" and "performance" in order to optimize + page loading. For important text, such as the body, we want it to load + immediately and not wait for the web font load, whereas for other sections, + such as headers and titles, we're OK with things taking a bit longer to load. + We do have some optional classes and parameters in the mixins, in case you + definitely want to make sure you're using the preferred font and don't mind + the performance hit. + We should be able to improve on this once CSS Font Loading L3 becomes more + widely available. +*/ +/* ========== COLORS ========== */ +/** +* +* Material design color palettes. +* @see http://www.google.com/design/spec/style/color.html +* +**/ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* ========== Color Palettes ========== */ +/* colors.scss */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* ========== IMAGES ========== */ +/* ========== Color & Themes ========== */ +/* ========== Typography ========== */ +/* ========== Components ========== */ +/* ========== Standard Buttons ========== */ +/* ========== Icon Toggles ========== */ +/* ========== Radio Buttons ========== */ +/* ========== Ripple effect ========== */ +/* ========== Layout ========== */ +/* ========== Content Tabs ========== */ +/* ========== Checkboxes ========== */ +/* ========== Switches ========== */ +/* ========== Spinner ========== */ +/* ========== Text fields ========== */ +/* ========== Card ========== */ +/* ========== Sliders ========== */ +/* ========== Progress ========== */ +/* ========== List ========== */ +/* ========== Item ========== */ +/* ========== Dropdown menu ========== */ +/* ========== Tooltips ========== */ +/* ========== Footer ========== */ +/* TEXTFIELD */ +/* SWITCH */ +/* SPINNER */ +/* RADIO */ +/* MENU */ +/* LIST */ +/* LAYOUT */ +/* ICON TOGGLE */ +/* FOOTER */ +/*mega-footer*/ +/*mini-footer*/ +/* CHECKBOX */ +/* CARD */ +/* Card dimensions */ +/* Cover image */ +/* BUTTON */ +/** + * + * Dimensions + * + */ +/* ANIMATION */ +/* PROGRESS */ +/* BADGE */ +/* SHADOWS */ +/* GRID */ +/* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ +/* TOOLTIP */ +/* CHIP */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* Typography */ +/* Shadows */ +/* Animations */ +/* Dialog */ .mdl-mega-footer { padding: 16px 40px; color: rgb(158,158,158); @@ -4986,21 +5633,27 @@ input.mdl-button[type="submit"] { cursor: pointer; z-index: 1; opacity: 0; } - .mdl-mega-footer--heading-checkbox ~ .mdl-mega-footer--heading:after, - .mdl-mega-footer--heading-checkbox ~ .mdl-mega-footer__heading:after, - .mdl-mega-footer__heading-checkbox ~ .mdl-mega-footer--heading:after, - .mdl-mega-footer__heading-checkbox ~ .mdl-mega-footer__heading:after { + .mdl-mega-footer--heading-checkbox + .mdl-mega-footer--heading:after, + .mdl-mega-footer--heading-checkbox + .mdl-mega-footer__heading:after, + .mdl-mega-footer__heading-checkbox + .mdl-mega-footer--heading:after, + .mdl-mega-footer__heading-checkbox + .mdl-mega-footer__heading:after { font-family: 'Material Icons'; content: '\E5CE'; } -.mdl-mega-footer--heading-checkbox:checked ~ ul, -.mdl-mega-footer__heading-checkbox:checked ~ ul { +.mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer--link-list, +.mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer__link-list, +.mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer--heading + .mdl-mega-footer--link-list, +.mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer__heading + .mdl-mega-footer__link-list, +.mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer--link-list, +.mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer__link-list, +.mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer--heading + .mdl-mega-footer--link-list, +.mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer__heading + .mdl-mega-footer__link-list { display: none; } -.mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer--heading:after, -.mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer__heading:after, -.mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer--heading:after, -.mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer__heading:after { +.mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer--heading:after, +.mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer__heading:after, +.mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer--heading:after, +.mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer__heading:after { font-family: 'Material Icons'; content: '\E5CF'; } @@ -5060,18 +5713,24 @@ input.mdl-button[type="submit"] { .mdl-mega-footer--heading-checkbox, .mdl-mega-footer__heading-checkbox { display: none; } - .mdl-mega-footer--heading-checkbox ~ .mdl-mega-footer--heading:after, - .mdl-mega-footer--heading-checkbox ~ .mdl-mega-footer__heading:after, - .mdl-mega-footer__heading-checkbox ~ .mdl-mega-footer--heading:after, - .mdl-mega-footer__heading-checkbox ~ .mdl-mega-footer__heading:after { - background-image: none; } - .mdl-mega-footer--heading-checkbox:checked ~ ul, - .mdl-mega-footer__heading-checkbox:checked ~ ul { + .mdl-mega-footer--heading-checkbox + .mdl-mega-footer--heading:after, + .mdl-mega-footer--heading-checkbox + .mdl-mega-footer__heading:after, + .mdl-mega-footer__heading-checkbox + .mdl-mega-footer--heading:after, + .mdl-mega-footer__heading-checkbox + .mdl-mega-footer__heading:after { + content: ''; } + .mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer--link-list, + .mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer__link-list, + .mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer__heading + .mdl-mega-footer__link-list, + .mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer--heading + .mdl-mega-footer--link-list, + .mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer--link-list, + .mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer__link-list, + .mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer__heading + .mdl-mega-footer__link-list, + .mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer--heading + .mdl-mega-footer--link-list { display: block; } - .mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer--heading:after, - .mdl-mega-footer--heading-checkbox:checked ~ .mdl-mega-footer__heading:after, - .mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer--heading:after, - .mdl-mega-footer__heading-checkbox:checked ~ .mdl-mega-footer__heading:after { + .mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer--heading:after, + .mdl-mega-footer--heading-checkbox:checked + .mdl-mega-footer__heading:after, + .mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer--heading:after, + .mdl-mega-footer__heading-checkbox:checked + .mdl-mega-footer__heading:after { content: ''; } } .mdl-mega-footer--bottom-section, @@ -5150,6 +5809,15 @@ input.mdl-button[type="submit"] { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -5201,6 +5869,7 @@ input.mdl-button[type="submit"] { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -5249,16 +5918,17 @@ input.mdl-button[type="submit"] { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ .mdl-mini-footer { - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; -webkit-flex-flow: row wrap; -ms-flex-flow: row wrap; flex-flow: row wrap; - -webkit-box-pack: justify; -webkit-justify-content: space-between; -ms-flex-pack: justify; justify-content: space-between; @@ -5273,7 +5943,6 @@ input.mdl-button[type="submit"] { .mdl-mini-footer--link-list, .mdl-mini-footer__link-list { - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; @@ -5300,7 +5969,6 @@ input.mdl-button[type="submit"] { .mdl-mini-footer--left-section, .mdl-mini-footer__left-section { display: inline-block; - -webkit-box-ordinal-group: 1; -webkit-order: 0; -ms-flex-order: 0; order: 0; } @@ -5308,7 +5976,6 @@ input.mdl-button[type="submit"] { .mdl-mini-footer--right-section, .mdl-mini-footer__right-section { display: inline-block; - -webkit-box-ordinal-group: 2; -webkit-order: 1; -ms-flex-order: 1; order: 1; } @@ -5377,6 +6044,15 @@ input.mdl-button[type="submit"] { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -5428,6 +6104,7 @@ input.mdl-button[type="submit"] { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -5476,7 +6153,10 @@ input.mdl-button[type="submit"] { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ .mdl-icon-toggle { position: relative; z-index: 1; @@ -5516,8 +6196,7 @@ input.mdl-button[type="submit"] { text-align: center; background-color: transparent; will-change: background-color; - -webkit-transition: background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1); - transition: background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1); } + transition: background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1); } .mdl-icon-toggle__label.material-icons { line-height: 32px; font-size: 24px; } @@ -5526,8 +6205,7 @@ input.mdl-button[type="submit"] { .mdl-icon-toggle.is-disabled .mdl-icon-toggle__label { color: rgba(0,0,0, 0.26); cursor: auto; - -webkit-transition: none; - transition: none; } + transition: none; } .mdl-icon-toggle.is-focused .mdl-icon-toggle__label { background-color: rgba(0,0,0, 0.12); } .mdl-icon-toggle.is-focused.is-checked .mdl-icon-toggle__label { @@ -5607,6 +6285,15 @@ input.mdl-button[type="submit"] { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -5658,6 +6345,7 @@ input.mdl-button[type="submit"] { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -5706,7 +6394,10 @@ input.mdl-button[type="submit"] { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -5725,6 +6416,328 @@ input.mdl-button[type="submit"] { /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ +.mdl-list { + display: block; + padding: 8px 0; + list-style: none; } + +.mdl-list__item { + font-family: "Roboto", "Helvetica", "Arial", sans-serif; + font-size: 16px; + font-weight: 400; + line-height: 24px; + letter-spacing: 0.04em; + line-height: 1; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + min-height: 48px; + box-sizing: border-box; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + -webkit-flex-wrap: nowrap; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + padding: 16px; + cursor: default; + color: rgba(0,0,0, 0.87); + overflow: hidden; } + .mdl-list__item .mdl-list__item-primary-content { + -webkit-order: 0; + -ms-flex-order: 0; + order: 0; + -webkit-flex-grow: 2; + -ms-flex-positive: 2; + flex-grow: 2; + text-decoration: none; + box-sizing: border-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; } + .mdl-list__item .mdl-list__item-primary-content .mdl-list__item-icon { + margin-right: 32px; } + .mdl-list__item .mdl-list__item-primary-content .mdl-list__item-avatar { + margin-right: 16px; } + .mdl-list__item .mdl-list__item-secondary-content { + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-flex-flow: column; + -ms-flex-flow: column; + flex-flow: column; + -webkit-align-items: flex-end; + -ms-flex-align: end; + align-items: flex-end; + margin-left: 16px; } + .mdl-list__item .mdl-list__item-secondary-content .mdl-list__item-secondary-action label { + display: inline; } + .mdl-list__item .mdl-list__item-secondary-content .mdl-list__item-secondary-info { + font-size: 12px; + font-weight: 400; + line-height: 1; + letter-spacing: 0; + color: rgba(0,0,0, 0.54); } + .mdl-list__item .mdl-list__item-secondary-content .mdl-list__item-sub-header { + padding: 0 0 0 16px; } + +.mdl-list__item-icon, +.mdl-list__item-icon.material-icons { + height: 24px; + width: 24px; + font-size: 24px; + box-sizing: border-box; + color: rgb(117,117,117); } + +.mdl-list__item-avatar, +.mdl-list__item-avatar.material-icons { + height: 40px; + width: 40px; + box-sizing: border-box; + border-radius: 50%; + background-color: rgb(117,117,117); + font-size: 40px; + color: white; } + +.mdl-list__item--two-line { + height: 72px; } + .mdl-list__item--two-line .mdl-list__item-primary-content { + height: 36px; + line-height: 20px; + display: block; } + .mdl-list__item--two-line .mdl-list__item-primary-content .mdl-list__item-avatar { + float: left; } + .mdl-list__item--two-line .mdl-list__item-primary-content .mdl-list__item-icon { + float: left; + margin-top: 6px; } + .mdl-list__item--two-line .mdl-list__item-primary-content .mdl-list__item-secondary-content { + height: 36px; } + .mdl-list__item--two-line .mdl-list__item-primary-content .mdl-list__item-sub-title { + font-size: 14px; + font-weight: 400; + line-height: 24px; + letter-spacing: 0; + line-height: 18px; + color: rgba(0,0,0, 0.54); + display: block; + padding: 0; } + +.mdl-list__item--three-line { + height: 88px; } + .mdl-list__item--three-line .mdl-list__item-primary-content { + height: 52px; + line-height: 20px; + display: block; } + .mdl-list__item--three-line .mdl-list__item-primary-content .mdl-list__item-avatar, + .mdl-list__item--three-line .mdl-list__item-primary-content .mdl-list__item-icon { + float: left; } + .mdl-list__item--three-line .mdl-list__item-secondary-content { + height: 52px; } + .mdl-list__item--three-line .mdl-list__item-text-body { + font-size: 14px; + font-weight: 400; + line-height: 24px; + letter-spacing: 0; + line-height: 18px; + height: 52px; + color: rgba(0,0,0, 0.54); + display: block; + padding: 0; } + +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*------------------------------------* $CONTENTS +\*------------------------------------*/ +/** + * STYLE GUIDE VARIABLES------------------Declarations of Sass variables + * -----Typography + * -----Colors + * -----Textfield + * -----Switch + * -----Spinner + * -----Radio + * -----Menu + * -----List + * -----Layout + * -----Icon toggles + * -----Footer + * -----Column + * -----Checkbox + * -----Card + * -----Button + * -----Animation + * -----Progress + * -----Badge + * -----Shadows + * -----Grid + * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. + */ +/* ========== TYPOGRAPHY ========== */ +/* We're splitting fonts into "preferred" and "performance" in order to optimize + page loading. For important text, such as the body, we want it to load + immediately and not wait for the web font load, whereas for other sections, + such as headers and titles, we're OK with things taking a bit longer to load. + We do have some optional classes and parameters in the mixins, in case you + definitely want to make sure you're using the preferred font and don't mind + the performance hit. + We should be able to improve on this once CSS Font Loading L3 becomes more + widely available. +*/ +/* ========== COLORS ========== */ +/** +* +* Material design color palettes. +* @see http://www.google.com/design/spec/style/color.html +* +**/ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* ========== Color Palettes ========== */ +/* colors.scss */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* ========== IMAGES ========== */ +/* ========== Color & Themes ========== */ +/* ========== Typography ========== */ +/* ========== Components ========== */ +/* ========== Standard Buttons ========== */ +/* ========== Icon Toggles ========== */ +/* ========== Radio Buttons ========== */ +/* ========== Ripple effect ========== */ +/* ========== Layout ========== */ +/* ========== Content Tabs ========== */ +/* ========== Checkboxes ========== */ +/* ========== Switches ========== */ +/* ========== Spinner ========== */ +/* ========== Text fields ========== */ +/* ========== Card ========== */ +/* ========== Sliders ========== */ +/* ========== Progress ========== */ +/* ========== List ========== */ +/* ========== Item ========== */ +/* ========== Dropdown menu ========== */ +/* ========== Tooltips ========== */ +/* ========== Footer ========== */ +/* TEXTFIELD */ +/* SWITCH */ +/* SPINNER */ +/* RADIO */ +/* MENU */ +/* LIST */ +/* LAYOUT */ +/* ICON TOGGLE */ +/* FOOTER */ +/*mega-footer*/ +/*mini-footer*/ +/* CHECKBOX */ +/* CARD */ +/* Card dimensions */ +/* Cover image */ +/* BUTTON */ +/** + * + * Dimensions + * + */ +/* ANIMATION */ +/* PROGRESS */ +/* BADGE */ +/* SHADOWS */ +/* GRID */ +/* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ +/* TOOLTIP */ +/* CHIP */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* Typography */ +/* Shadows */ +/* Animations */ +/* Dialog */ .mdl-menu__container { display: block; margin: 0; @@ -5736,8 +6749,7 @@ input.mdl-button[type="submit"] { width: 0; visibility: hidden; z-index: -1; } - .mdl-menu__container.is-visible, - .mdl-menu__container.is-animating { + .mdl-menu__container.is-visible, .mdl-menu__container.is-animating { z-index: 999; visibility: visible; } @@ -5754,33 +6766,28 @@ input.mdl-button[type="submit"] { overflow: hidden; opacity: 0; -webkit-transform: scale(0); - -ms-transform: scale(0); transform: scale(0); -webkit-transform-origin: 0 0; - -ms-transform-origin: 0 0; transform-origin: 0 0; box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); will-change: transform; - -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1); - transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1); + transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); z-index: -1; } .mdl-menu__container.is-visible .mdl-menu__outline { opacity: 1; -webkit-transform: scale(1); - -ms-transform: scale(1); transform: scale(1); z-index: 999; } .mdl-menu__outline.mdl-menu--bottom-right { -webkit-transform-origin: 100% 0; - -ms-transform-origin: 100% 0; transform-origin: 100% 0; } .mdl-menu__outline.mdl-menu--top-left { -webkit-transform-origin: 0 100%; - -ms-transform-origin: 0 100%; transform-origin: 0 100%; } .mdl-menu__outline.mdl-menu--top-right { -webkit-transform-origin: 100% 100%; - -ms-transform-origin: 100% 100%; transform-origin: 100% 100%; } .mdl-menu { @@ -5800,8 +6807,7 @@ input.mdl-button[type="submit"] { opacity: 1; z-index: 999; } .mdl-menu.is-animating { - -webkit-transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1), clip 0.3s cubic-bezier(0.4, 0, 0.2, 1); - transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1), clip 0.3s cubic-bezier(0.4, 0, 0.2, 1); } + transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1), clip 0.3s cubic-bezier(0.4, 0, 0.2, 1); } .mdl-menu.mdl-menu--bottom-right { left: auto; right: 0; } @@ -5838,8 +6844,7 @@ input.mdl-button[type="submit"] { line-height: 48px; white-space: nowrap; opacity: 0; - -webkit-transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1); - transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1); + transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1); -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; @@ -5848,15 +6853,17 @@ input.mdl-button[type="submit"] { opacity: 1; } .mdl-menu__item::-moz-focus-inner { border: 0; } - .mdl-menu__item[disabled] { + .mdl-menu__item--full-bleed-divider { + border-bottom: 1px solid rgba(0,0,0, 0.12); } + .mdl-menu__item[disabled], .mdl-menu__item[data-mdl-disabled] { color: rgb(189,189,189); background-color: transparent; cursor: auto; } - .mdl-menu__item[disabled]:hover { + .mdl-menu__item[disabled]:hover, .mdl-menu__item[data-mdl-disabled]:hover { background-color: transparent; } - .mdl-menu__item[disabled]:focus { + .mdl-menu__item[disabled]:focus, .mdl-menu__item[data-mdl-disabled]:focus { background-color: transparent; } - .mdl-menu__item[disabled] .mdl-ripple { + .mdl-menu__item[disabled] .mdl-ripple, .mdl-menu__item[data-mdl-disabled] .mdl-ripple { background: transparent; } .mdl-menu__item:hover { background-color: rgb(238,238,238); } @@ -5931,6 +6938,15 @@ input.mdl-button[type="submit"] { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -5982,6 +6998,7 @@ input.mdl-button[type="submit"] { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -6030,12 +7047,16 @@ input.mdl-button[type="submit"] { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ .mdl-progress { display: block; position: relative; height: 4px; - width: 500px; } + width: 500px; + max-width: 100%; } .mdl-progress > .bar { display: block; @@ -6043,8 +7064,7 @@ input.mdl-button[type="submit"] { top: 0; bottom: 0; width: 0%; - -webkit-transition: width 0.2s cubic-bezier(0.4, 0, 0.2, 1); - transition: width 0.2s cubic-bezier(0.4, 0, 0.2, 1); } + transition: width 0.2s cubic-bezier(0.4, 0, 0.2, 1); } .mdl-progress > .progressbar { background-color: rgb(63,81,181); @@ -6052,7 +7072,6 @@ input.mdl-button[type="submit"] { left: 0; } .mdl-progress > .bufferbar { - background-image: -webkit-linear-gradient(left, rgba(255,255,255, 0.7), rgba(255,255,255, 0.7)), -webkit-linear-gradient(left, rgb(63,81,181), rgb(63,81,181)); background-image: linear-gradient(to right, rgba(255,255,255, 0.7), rgba(255,255,255, 0.7)), linear-gradient(to right, rgb(63,81,181), rgb(63,81,181)); z-index: 0; left: 0; } @@ -6061,16 +7080,17 @@ input.mdl-button[type="submit"] { right: 0; } @supports (-webkit-appearance: none) { + .mdl-progress:not(.mdl-progress--indeterminate):not(.mdl-progress--indeterminate) > .auxbar, .mdl-progress:not(.mdl-progress__indeterminate):not(.mdl-progress__indeterminate) > .auxbar { - background-image: -webkit-linear-gradient(left, rgba(255,255,255, 0.7), rgba(255,255,255, 0.7)), -webkit-linear-gradient(left, rgb(63,81,181), rgb(63,81,181)); background-image: linear-gradient(to right, rgba(255,255,255, 0.7), rgba(255,255,255, 0.7)), linear-gradient(to right, rgb(63,81,181), rgb(63,81,181)); -webkit-mask: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxzdmcgd2lkdGg9IjEyIiBoZWlnaHQ9IjQiIHZpZXdQb3J0PSIwIDAgMTIgNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxlbGxpcHNlIGN4PSIyIiBjeT0iMiIgcng9IjIiIHJ5PSIyIj4KICAgIDxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9ImN4IiBmcm9tPSIyIiB0bz0iLTEwIiBkdXI9IjAuNnMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiAvPgogIDwvZWxsaXBzZT4KICA8ZWxsaXBzZSBjeD0iMTQiIGN5PSIyIiByeD0iMiIgcnk9IjIiIGNsYXNzPSJsb2FkZXIiPgogICAgPGFuaW1hdGUgYXR0cmlidXRlTmFtZT0iY3giIGZyb209IjE0IiB0bz0iMiIgZHVyPSIwLjZzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgLz4KICA8L2VsbGlwc2U+Cjwvc3ZnPgo="); mask: url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxzdmcgd2lkdGg9IjEyIiBoZWlnaHQ9IjQiIHZpZXdQb3J0PSIwIDAgMTIgNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxlbGxpcHNlIGN4PSIyIiBjeT0iMiIgcng9IjIiIHJ5PSIyIj4KICAgIDxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9ImN4IiBmcm9tPSIyIiB0bz0iLTEwIiBkdXI9IjAuNnMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiAvPgogIDwvZWxsaXBzZT4KICA8ZWxsaXBzZSBjeD0iMTQiIGN5PSIyIiByeD0iMiIgcnk9IjIiIGNsYXNzPSJsb2FkZXIiPgogICAgPGFuaW1hdGUgYXR0cmlidXRlTmFtZT0iY3giIGZyb209IjE0IiB0bz0iMiIgZHVyPSIwLjZzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgLz4KICA8L2VsbGlwc2U+Cjwvc3ZnPgo="); } } +.mdl-progress:not(.mdl-progress--indeterminate) > .auxbar, .mdl-progress:not(.mdl-progress__indeterminate) > .auxbar { - background-image: -webkit-linear-gradient(left, rgba(255,255,255, 0.9), rgba(255,255,255, 0.9)), -webkit-linear-gradient(left, rgb(63,81,181), rgb(63,81,181)); background-image: linear-gradient(to right, rgba(255,255,255, 0.9), rgba(255,255,255, 0.9)), linear-gradient(to right, rgb(63,81,181), rgb(63,81,181)); } +.mdl-progress.mdl-progress--indeterminate > .bar1, .mdl-progress.mdl-progress__indeterminate > .bar1 { background-color: rgb(63,81,181); -webkit-animation-name: indeterminate1; @@ -6082,6 +7102,7 @@ input.mdl-button[type="submit"] { -webkit-animation-timing-function: linear; animation-timing-function: linear; } +.mdl-progress.mdl-progress--indeterminate > .bar3, .mdl-progress.mdl-progress__indeterminate > .bar3 { background-image: none; background-color: rgb(63,81,181); @@ -6199,6 +7220,15 @@ input.mdl-button[type="submit"] { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -6250,6 +7280,7 @@ input.mdl-button[type="submit"] { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -6298,7 +7329,10 @@ input.mdl-button[type="submit"] { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -6317,8 +7351,8 @@ input.mdl-button[type="submit"] { /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ .mdl-navigation { - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; @@ -6330,19 +7364,21 @@ input.mdl-button[type="submit"] { .mdl-navigation__link { color: rgb(66,66,66); text-decoration: none; - font-weight: 500; - font-size: 13px; - margin: 0; } + margin: 0; + font-size: 14px; + font-weight: 400; + line-height: 24px; + letter-spacing: 0; + opacity: 0.87; } + .mdl-navigation__link .material-icons { + vertical-align: middle; } .mdl-layout { width: 100%; height: 100%; - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; -webkit-flex-direction: column; -ms-flex-direction: column; flex-direction: column; @@ -6362,6 +7398,7 @@ input.mdl-button[type="submit"] { width: 100%; height: 100%; } +.mdl-layout__title, .mdl-layout-title { display: block; position: relative; @@ -6374,18 +7411,14 @@ input.mdl-button[type="submit"] { box-sizing: border-box; } .mdl-layout-spacer { - -webkit-box-flex: 1; -webkit-flex-grow: 1; -ms-flex-positive: 1; flex-grow: 1; } .mdl-layout__drawer { - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; -webkit-flex-direction: column; -ms-flex-direction: column; flex-direction: column; @@ -6403,43 +7436,41 @@ input.mdl-button[type="submit"] { border-right: 1px solid rgb(224,224,224); background: rgb(250,250,250); -webkit-transform: translateX(-250px); - -ms-transform: translateX(-250px); transform: translateX(-250px); -webkit-transform-style: preserve-3d; transform-style: preserve-3d; will-change: transform; - -webkit-transition-duration: 0.2s; - transition-duration: 0.2s; - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - -webkit-transition-property: -webkit-transform; - transition-property: transform; + transition-duration: 0.2s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-property: -webkit-transform; + transition-property: transform; + transition-property: transform, -webkit-transform; color: rgb(66,66,66); overflow: visible; overflow-y: auto; z-index: 5; } .mdl-layout__drawer.is-visible { -webkit-transform: translateX(0); - -ms-transform: translateX(0); transform: translateX(0); } + .mdl-layout__drawer.is-visible ~ .mdl-layout__content.mdl-layout__content { + overflow: hidden; } .mdl-layout__drawer > * { -webkit-flex-shrink: 0; -ms-flex-negative: 0; flex-shrink: 0; } + .mdl-layout__drawer > .mdl-layout__title, .mdl-layout__drawer > .mdl-layout-title { line-height: 64px; padding-left: 40px; } @media screen and (max-width: 1024px) { + .mdl-layout__drawer > .mdl-layout__title, .mdl-layout__drawer > .mdl-layout-title { line-height: 56px; padding-left: 16px; } } .mdl-layout__drawer .mdl-navigation { - -webkit-box-orient: vertical; - -webkit-box-direction: normal; -webkit-flex-direction: column; -ms-flex-direction: column; flex-direction: column; - -webkit-box-align: stretch; -webkit-align-items: stretch; -ms-flex-align: stretch; align-items: stretch; @@ -6458,12 +7489,11 @@ input.mdl-button[type="submit"] { .mdl-layout__drawer .mdl-navigation .mdl-navigation__link:hover { background-color: rgb(224,224,224); } .mdl-layout__drawer .mdl-navigation .mdl-navigation__link--current { - background-color: rgb(0,0,0); - color: rgb(63,81,181); } + background-color: rgb(224,224,224); + color: rgb(0,0,0); } @media screen and (min-width: 1025px) { .mdl-layout--fixed-drawer > .mdl-layout__drawer { -webkit-transform: translateX(0); - -ms-transform: translateX(0); transform: translateX(0); } } .mdl-layout__drawer-button { @@ -6479,9 +7509,9 @@ input.mdl-button[type="submit"] { text-align: center; cursor: pointer; font-size: 26px; - line-height: 50px; + line-height: 56px; font-family: Helvetica, Arial, sans-serif; - margin: 10px 12px; + margin: 8px 12px; top: 0; left: 0; color: rgb(255,255,255); @@ -6498,23 +7528,23 @@ input.mdl-button[type="submit"] { margin: 4px; color: rgba(0, 0, 0, 0.5); } } @media screen and (min-width: 1025px) { - .mdl-layout--fixed-drawer > .mdl-layout__drawer-button { - display: none; } } + .mdl-layout__drawer-button { + line-height: 54px; } + .mdl-layout--no-desktop-drawer-button .mdl-layout__drawer-button, + .mdl-layout--fixed-drawer > .mdl-layout__drawer-button, + .mdl-layout--no-drawer-button .mdl-layout__drawer-button { + display: none; } } .mdl-layout__header { - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; -webkit-flex-direction: column; -ms-flex-direction: column; flex-direction: column; -webkit-flex-wrap: nowrap; -ms-flex-wrap: nowrap; flex-wrap: nowrap; - -webkit-box-pack: start; -webkit-justify-content: flex-start; -ms-flex-pack: start; justify-content: flex-start; @@ -6532,19 +7562,16 @@ input.mdl-button[type="submit"] { background-color: rgb(63,81,181); color: rgb(255,255,255); box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); - -webkit-transition-duration: 0.2s; - transition-duration: 0.2s; - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - -webkit-transition-property: max-height, box-shadow; - transition-property: max-height, box-shadow; } + transition-duration: 0.2s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-property: max-height, box-shadow; } @media screen and (max-width: 1024px) { .mdl-layout__header { min-height: 56px; } } - .mdl-layout--fixed-drawer:not(.is-small-screen) > .mdl-layout__header { + .mdl-layout--fixed-drawer.is-upgraded:not(.is-small-screen) > .mdl-layout__header { margin-left: 240px; width: calc(100% - 240px); } - @media screen and (min-width: 1024px) { + @media screen and (min-width: 1025px) { .mdl-layout--fixed-drawer > .mdl-layout__header .mdl-layout__header-row { padding-left: 40px; } } .mdl-layout__header > .mdl-layout-icon { @@ -6576,7 +7603,6 @@ input.mdl-button[type="submit"] { .mdl-layout__header { display: none; } .mdl-layout--fixed-header > .mdl-layout__header { - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; } } @@ -6596,14 +7622,15 @@ input.mdl-button[type="submit"] { overflow: hidden; } .mdl-layout__header--waterfall.is-casting-shadow { box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); } + .mdl-layout__header--waterfall.mdl-layout__header--waterfall-hide-top { + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; } .mdl-layout__header-row { - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; -webkit-flex-direction: row; -ms-flex-direction: row; flex-direction: row; @@ -6617,17 +7644,23 @@ input.mdl-button[type="submit"] { -webkit-align-self: stretch; -ms-flex-item-align: stretch; align-self: stretch; - -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; align-items: center; height: 64px; margin: 0; padding: 0 40px 0 80px; } + .mdl-layout--no-drawer-button .mdl-layout__header-row { + padding-left: 40px; } + @media screen and (min-width: 1025px) { + .mdl-layout--no-desktop-drawer-button .mdl-layout__header-row { + padding-left: 40px; } } @media screen and (max-width: 1024px) { .mdl-layout__header-row { height: 56px; - padding: 0 16px 0 72px; } } + padding: 0 16px 0 72px; } + .mdl-layout--no-drawer-button .mdl-layout__header-row { + padding-left: 16px; } } .mdl-layout__header-row > * { -webkit-flex-shrink: 0; -ms-flex-negative: 0; @@ -6638,12 +7671,9 @@ input.mdl-button[type="submit"] { margin: 0; padding: 0; height: 64px; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; -webkit-flex-direction: row; -ms-flex-direction: row; flex-direction: row; - -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; align-items: center; } @@ -6669,22 +7699,29 @@ input.mdl-button[type="submit"] { width: 100%; z-index: 4; visibility: hidden; - -webkit-transition-property: background-color; - transition-property: background-color; - -webkit-transition-duration: 0.2s; - transition-duration: 0.2s; - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } - .mdl-layout__drawer.is-visible ~ .mdl-layout__obfuscator { + transition-property: background-color; + transition-duration: 0.2s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } + .mdl-layout__obfuscator.is-visible { background-color: rgba(0, 0, 0, 0.5); visibility: visible; } + @supports (pointer-events: auto) { + .mdl-layout__obfuscator { + background-color: rgba(0, 0, 0, 0.5); + opacity: 0; + transition-property: opacity; + visibility: visible; + pointer-events: none; } + .mdl-layout__obfuscator.is-visible { + pointer-events: auto; + opacity: 1; } } .mdl-layout__content { -ms-flex: 0 1 auto; + position: relative; display: inline-block; overflow-y: auto; overflow-x: hidden; - -webkit-box-flex: 1; -webkit-flex-grow: 1; -ms-flex-positive: 1; flex-grow: 1; @@ -6704,9 +7741,8 @@ input.mdl-button[type="submit"] { .mdl-layout__tab-bar { height: 96px; margin: 0; - width: calc(100% - 112px); + width: calc(100% - 112px); padding: 0 0 0 56px; - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; @@ -6715,10 +7751,20 @@ input.mdl-button[type="submit"] { overflow-x: scroll; } .mdl-layout__tab-bar::-webkit-scrollbar { display: none; } + .mdl-layout--no-drawer-button .mdl-layout__tab-bar { + padding-left: 16px; + width: calc(100% - 32px); } + @media screen and (min-width: 1025px) { + .mdl-layout--no-desktop-drawer-button .mdl-layout__tab-bar { + padding-left: 16px; + width: calc(100% - 32px); } } @media screen and (max-width: 1024px) { .mdl-layout__tab-bar { - width: calc(100% - 60px); - padding: 0 0 0 60px; } } + width: calc(100% - 60px); + padding: 0 0 0 60px; } + .mdl-layout--no-drawer-button .mdl-layout__tab-bar { + width: calc(100% - 8px); + padding-left: 4px; } } .mdl-layout--fixed-tabs .mdl-layout__tab-bar { padding: 0; overflow: hidden; @@ -6731,7 +7777,6 @@ input.mdl-button[type="submit"] { border: none; margin: 0; z-index: 2; - -webkit-box-flex: 0; -webkit-flex-grow: 0; -ms-flex-positive: 0; flex-grow: 0; @@ -6759,9 +7804,15 @@ input.mdl-button[type="submit"] { -moz-user-select: none; -ms-user-select: none; user-select: none; } + .mdl-layout--no-desktop-drawer-button .mdl-layout__tab-bar-button, + .mdl-layout--no-drawer-button .mdl-layout__tab-bar-button { + width: 16px; } + .mdl-layout--no-desktop-drawer-button .mdl-layout__tab-bar-button .material-icons, + .mdl-layout--no-drawer-button .mdl-layout__tab-bar-button .material-icons { + position: relative; + left: -4px; } @media screen and (max-width: 1024px) { .mdl-layout__tab-bar-button { - display: none; width: 60px; } } .mdl-layout--fixed-tabs .mdl-layout__tab-bar-button { display: none; } @@ -6783,7 +7834,6 @@ input.mdl-button[type="submit"] { float: left; position: relative; display: block; - -webkit-box-flex: 0; -webkit-flex-grow: 0; -ms-flex-positive: 0; flex-grow: 0; @@ -6804,7 +7854,6 @@ input.mdl-button[type="submit"] { padding: 0 12px 0 12px; } } .mdl-layout--fixed-tabs .mdl-layout__tab { float: none; - -webkit-box-flex: 1; -webkit-flex-grow: 1; -ms-flex-positive: 1; flex-grow: 1; @@ -6822,8 +7871,7 @@ input.mdl-button[type="submit"] { background: rgb(255,64,129); -webkit-animation: border-expand 0.2s cubic-bezier(0.4, 0, 0.4, 1) 0.01s alternate forwards; animation: border-expand 0.2s cubic-bezier(0.4, 0, 0.4, 1) 0.01s alternate forwards; - -webkit-transition: all 1s cubic-bezier(0.4, 0, 1, 1); - transition: all 1s cubic-bezier(0.4, 0, 1, 1); } + transition: all 1s cubic-bezier(0.4, 0, 1, 1); } .mdl-layout__tab .mdl-layout__tab-ripple-container { display: block; position: absolute; @@ -6898,6 +7946,15 @@ input.mdl-button[type="submit"] { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -6949,6 +8006,7 @@ input.mdl-button[type="submit"] { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -6997,7 +8055,10 @@ input.mdl-button[type="submit"] { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -7016,12 +8077,15 @@ input.mdl-button[type="submit"] { /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ .mdl-radio { position: relative; font-size: 16px; line-height: 24px; display: inline-block; + vertical-align: middle; box-sizing: border-box; + height: 24px; margin: 0; padding-left: 0; } .mdl-radio.is-upgraded { @@ -7057,6 +8121,7 @@ input.mdl-button[type="submit"] { z-index: 2; } .mdl-radio.is-checked .mdl-radio__outer-circle { border: 2px solid rgb(63,81,181); } + .mdl-radio__outer-circle fieldset[disabled] .mdl-radio, .mdl-radio.is-disabled .mdl-radio__outer-circle { border: 2px solid rgba(0,0,0, 0.26); cursor: auto; } @@ -7071,19 +8136,19 @@ input.mdl-button[type="submit"] { width: 8px; height: 8px; cursor: pointer; - -webkit-transition-duration: 0.28s; - transition-duration: 0.28s; - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - -webkit-transition-property: -webkit-transform; - transition-property: transform; - -webkit-transform: scale3d(0, 0, 0); - transform: scale3d(0, 0, 0); + transition-duration: 0.28s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-property: -webkit-transform; + transition-property: transform; + transition-property: transform, -webkit-transform; + -webkit-transform: scale(0, 0); + transform: scale(0, 0); border-radius: 50%; background: rgb(63,81,181); } .mdl-radio.is-checked .mdl-radio__inner-circle { - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); } + -webkit-transform: scale(1, 1); + transform: scale(1, 1); } + fieldset[disabled] .mdl-radio .mdl-radio__inner-circle, .mdl-radio.is-disabled .mdl-radio__inner-circle { background: rgba(0,0,0, 0.26); cursor: auto; } @@ -7092,6 +8157,7 @@ input.mdl-button[type="submit"] { .mdl-radio__label { cursor: pointer; } + fieldset[disabled] .mdl-radio .mdl-radio__label, .mdl-radio.is-disabled .mdl-radio__label { color: rgba(0,0,0, 0.26); cursor: auto; } @@ -7110,8 +8176,10 @@ input.mdl-button[type="submit"] { -webkit-mask-image: -webkit-radial-gradient(circle, white, black); } .mdl-radio__ripple-container .mdl-ripple { background: rgb(63,81,181); } + fieldset[disabled] .mdl-radio .mdl-radio__ripple-container, .mdl-radio.is-disabled .mdl-radio__ripple-container { cursor: auto; } + fieldset[disabled] .mdl-radio .mdl-radio__ripple-container .mdl-ripple, .mdl-radio.is-disabled .mdl-radio__ripple-container .mdl-ripple { background: transparent; } @@ -7170,6 +8238,15 @@ input.mdl-button[type="submit"] { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -7221,6 +8298,7 @@ input.mdl-button[type="submit"] { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -7269,7 +8347,10 @@ input.mdl-button[type="submit"] { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { -ms-appearance: none; height: 32px; @@ -7293,6 +8374,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { color: rgb(63,81,181); -webkit-align-self: center; -ms-flex-item-align: center; + -ms-grid-row-align: center; align-self: center; z-index: 1; cursor: pointer; @@ -7329,8 +8411,9 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { border-radius: 50%; background: rgb(63,81,181); border: none; - -webkit-transition: -webkit-transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), border 0.18s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1); - transition: transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), border 0.18s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1); } + transition: border 0.18s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 0.18s cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), border 0.18s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), border 0.18s cubic-bezier(0.4, 0, 0.2, 1), box-shadow 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 0.18s cubic-bezier(0.4, 0, 0.2, 1); } .mdl-slider.is-upgraded::-moz-range-thumb { -moz-appearance: none; width: 12px; @@ -7359,24 +8442,23 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { border: none; border-radius: 50%; background: rgb(63,81,181); - -ms-transform: scale(0.375); - transform: scale(0.375); - transition: transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1); } + transform: scale(0.375); + transition: background 0.28s cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 0.18s cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1); + transition: transform 0.18s cubic-bezier(0.4, 0, 0.2, 1), background 0.28s cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 0.18s cubic-bezier(0.4, 0, 0.2, 1); } .mdl-slider.is-upgraded:focus:not(:active)::-ms-thumb { background: radial-gradient(circle closest-side, rgb(63,81,181) 0%, rgb(63,81,181) 37.5%, rgba(63,81,181, 0.26) 37.5%, rgba(63,81,181, 0.26) 100%); - -ms-transform: scale(1); - transform: scale(1); } + transform: scale(1); } .mdl-slider.is-upgraded:active::-ms-thumb { background: rgb(63,81,181); - -ms-transform: scale(0.5625); - transform: scale(0.5625); } + transform: scale(0.5625); } .mdl-slider.is-upgraded.is-lowest-value::-webkit-slider-thumb { border: 2px solid rgba(0,0,0, 0.26); background: transparent; } .mdl-slider.is-upgraded.is-lowest-value::-moz-range-thumb { border: 2px solid rgba(0,0,0, 0.26); background: transparent; } - .mdl-slider.is-upgraded.is-lowest-value ~ + .mdl-slider.is-upgraded.is-lowest-value + .mdl-slider__background-flex > .mdl-slider__background-upper { left: 6px; } .mdl-slider.is-upgraded.is-lowest-value:focus:not(:active)::-webkit-slider-thumb { @@ -7389,7 +8471,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { border: 1.6px solid rgba(0,0,0, 0.26); -webkit-transform: scale(1.5); transform: scale(1.5); } - .mdl-slider.is-upgraded.is-lowest-value:active ~ + .mdl-slider.is-upgraded.is-lowest-value:active + .mdl-slider__background-flex > .mdl-slider__background-upper { left: 9px; } .mdl-slider.is-upgraded.is-lowest-value:active::-moz-range-thumb { @@ -7399,11 +8481,9 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { background: radial-gradient(circle closest-side, transparent 0%, transparent 66.67%, rgba(0,0,0, 0.26) 66.67%, rgba(0,0,0, 0.26) 100%); } .mdl-slider.is-upgraded.is-lowest-value:focus:not(:active)::-ms-thumb { background: radial-gradient(circle closest-side, rgba(0,0,0, 0.12) 0%, rgba(0,0,0, 0.12) 25%, rgba(0,0,0, 0.26) 25%, rgba(0,0,0, 0.26) 37.5%, rgba(0,0,0, 0.12) 37.5%, rgba(0,0,0, 0.12) 100%); - -ms-transform: scale(1); - transform: scale(1); } + transform: scale(1); } .mdl-slider.is-upgraded.is-lowest-value:active::-ms-thumb { - -ms-transform: scale(0.5625); - transform: scale(0.5625); + transform: scale(0.5625); background: radial-gradient(circle closest-side, transparent 0%, transparent 77.78%, rgba(0,0,0, 0.26) 77.78%, rgba(0,0,0, 0.26) 100%); } .mdl-slider.is-upgraded.is-lowest-value::-ms-fill-lower { background: transparent; } @@ -7411,51 +8491,37 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { margin-left: 6px; } .mdl-slider.is-upgraded.is-lowest-value:active::-ms-fill-upper { margin-left: 9px; } - .mdl-slider.is-upgraded:disabled:focus::-webkit-slider-thumb, - .mdl-slider.is-upgraded:disabled:active::-webkit-slider-thumb, - .mdl-slider.is-upgraded:disabled::-webkit-slider-thumb { + .mdl-slider.is-upgraded:disabled:focus::-webkit-slider-thumb, .mdl-slider.is-upgraded:disabled:active::-webkit-slider-thumb, .mdl-slider.is-upgraded:disabled::-webkit-slider-thumb { -webkit-transform: scale(0.667); transform: scale(0.667); background: rgba(0,0,0, 0.26); } - .mdl-slider.is-upgraded:disabled:focus::-moz-range-thumb, - .mdl-slider.is-upgraded:disabled:active::-moz-range-thumb, - .mdl-slider.is-upgraded:disabled::-moz-range-thumb { + .mdl-slider.is-upgraded:disabled:focus::-moz-range-thumb, .mdl-slider.is-upgraded:disabled:active::-moz-range-thumb, .mdl-slider.is-upgraded:disabled::-moz-range-thumb { transform: scale(0.667); background: rgba(0,0,0, 0.26); } - .mdl-slider.is-upgraded:disabled ~ + .mdl-slider.is-upgraded:disabled + .mdl-slider__background-flex > .mdl-slider__background-lower { background-color: rgba(0,0,0, 0.26); left: -6px; } - .mdl-slider.is-upgraded:disabled ~ + .mdl-slider.is-upgraded:disabled + .mdl-slider__background-flex > .mdl-slider__background-upper { left: 6px; } - .mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-webkit-slider-thumb, - .mdl-slider.is-upgraded.is-lowest-value:disabled:active::-webkit-slider-thumb, - .mdl-slider.is-upgraded.is-lowest-value:disabled::-webkit-slider-thumb { + .mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-webkit-slider-thumb, .mdl-slider.is-upgraded.is-lowest-value:disabled:active::-webkit-slider-thumb, .mdl-slider.is-upgraded.is-lowest-value:disabled::-webkit-slider-thumb { border: 3px solid rgba(0,0,0, 0.26); background: transparent; -webkit-transform: scale(0.667); transform: scale(0.667); } - .mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-moz-range-thumb, - .mdl-slider.is-upgraded.is-lowest-value:disabled:active::-moz-range-thumb, - .mdl-slider.is-upgraded.is-lowest-value:disabled::-moz-range-thumb { + .mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-moz-range-thumb, .mdl-slider.is-upgraded.is-lowest-value:disabled:active::-moz-range-thumb, .mdl-slider.is-upgraded.is-lowest-value:disabled::-moz-range-thumb { border: 3px solid rgba(0,0,0, 0.26); background: transparent; transform: scale(0.667); } - .mdl-slider.is-upgraded.is-lowest-value:disabled:active ~ + .mdl-slider.is-upgraded.is-lowest-value:disabled:active + .mdl-slider__background-flex > .mdl-slider__background-upper { left: 6px; } - .mdl-slider.is-upgraded:disabled:focus::-ms-thumb, - .mdl-slider.is-upgraded:disabled:active::-ms-thumb, - .mdl-slider.is-upgraded:disabled::-ms-thumb { - -ms-transform: scale(0.25); - transform: scale(0.25); + .mdl-slider.is-upgraded:disabled:focus::-ms-thumb, .mdl-slider.is-upgraded:disabled:active::-ms-thumb, .mdl-slider.is-upgraded:disabled::-ms-thumb { + transform: scale(0.25); background: rgba(0,0,0, 0.26); } - .mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-ms-thumb, - .mdl-slider.is-upgraded.is-lowest-value:disabled:active::-ms-thumb, - .mdl-slider.is-upgraded.is-lowest-value:disabled::-ms-thumb { - -ms-transform: scale(0.25); - transform: scale(0.25); + .mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-ms-thumb, .mdl-slider.is-upgraded.is-lowest-value:disabled:active::-ms-thumb, .mdl-slider.is-upgraded.is-lowest-value:disabled::-ms-thumb { + transform: scale(0.25); background: radial-gradient(circle closest-side, transparent 0%, transparent 50%, rgba(0,0,0, 0.26) 50%, rgba(0,0,0, 0.26) 100%); } .mdl-slider.is-upgraded:disabled::-ms-fill-lower { margin-right: 6px; @@ -7476,12 +8542,9 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { height: 18px; position: relative; background: none; - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; -webkit-flex-direction: row; -ms-flex-direction: row; flex-direction: row; } @@ -7494,7 +8557,6 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { top: 50%; left: 0; margin: 0 26px; - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; @@ -7502,12 +8564,10 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { border: 0; padding: 0; -webkit-transform: translate(0, -1px); - -ms-transform: translate(0, -1px); transform: translate(0, -1px); } .mdl-slider__background-lower { background: rgb(63,81,181); - -webkit-box-flex: 0; -webkit-flex: 0; -ms-flex: 0; flex: 0; @@ -7517,15 +8577,13 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { .mdl-slider__background-upper { background: rgba(0,0,0, 0.26); - -webkit-box-flex: 0; -webkit-flex: 0; -ms-flex: 0; flex: 0; position: relative; border: 0; padding: 0; - -webkit-transition: left 0.18s cubic-bezier(0.4, 0, 0.2, 1); - transition: left 0.18s cubic-bezier(0.4, 0, 0.2, 1); } + transition: left 0.18s cubic-bezier(0.4, 0, 0.2, 1); } /** * Copyright 2015 Google Inc. All Rights Reserved. @@ -7582,6 +8640,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -7633,6 +8700,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -7681,7 +8749,278 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* Typography */ +/* Shadows */ +/* Animations */ +/* Dialog */ +.mdl-snackbar { + position: fixed; + bottom: 0; + left: 50%; + cursor: default; + background-color: #323232; + z-index: 3; + display: block; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; + font-family: "Roboto", "Helvetica", "Arial", sans-serif; + will-change: transform; + -webkit-transform: translate(0, 80px); + transform: translate(0, 80px); + transition: -webkit-transform 0.25s cubic-bezier(0.4, 0, 1, 1); + transition: transform 0.25s cubic-bezier(0.4, 0, 1, 1); + transition: transform 0.25s cubic-bezier(0.4, 0, 1, 1), -webkit-transform 0.25s cubic-bezier(0.4, 0, 1, 1); + pointer-events: none; } + @media (max-width: 479px) { + .mdl-snackbar { + width: 100%; + left: 0; + min-height: 48px; + max-height: 80px; } } + @media (min-width: 480px) { + .mdl-snackbar { + min-width: 288px; + max-width: 568px; + border-radius: 2px; + -webkit-transform: translate(-50%, 80px); + transform: translate(-50%, 80px); } } + .mdl-snackbar--active { + -webkit-transform: translate(0, 0); + transform: translate(0, 0); + pointer-events: auto; + transition: -webkit-transform 0.25s cubic-bezier(0, 0, 0.2, 1); + transition: transform 0.25s cubic-bezier(0, 0, 0.2, 1); + transition: transform 0.25s cubic-bezier(0, 0, 0.2, 1), -webkit-transform 0.25s cubic-bezier(0, 0, 0.2, 1); } + @media (min-width: 480px) { + .mdl-snackbar--active { + -webkit-transform: translate(-50%, 0); + transform: translate(-50%, 0); } } + .mdl-snackbar__text { + padding: 14px 12px 14px 24px; + vertical-align: middle; + color: white; + float: left; } + .mdl-snackbar__action { + background: transparent; + border: none; + color: rgb(255,64,129); + float: right; + text-transform: uppercase; + padding: 14px 24px 14px 12px; + font-family: "Roboto", "Helvetica", "Arial", sans-serif; + font-size: 14px; + font-weight: 500; + text-transform: uppercase; + line-height: 1; + letter-spacing: 0; + overflow: hidden; + outline: none; + opacity: 0; + pointer-events: none; + cursor: pointer; + text-decoration: none; + text-align: center; + -webkit-align-self: center; + -ms-flex-item-align: center; + -ms-grid-row-align: center; + align-self: center; } + .mdl-snackbar__action::-moz-focus-inner { + border: 0; } + .mdl-snackbar__action:not([aria-hidden]) { + opacity: 1; + pointer-events: auto; } + +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/*------------------------------------* $CONTENTS +\*------------------------------------*/ +/** + * STYLE GUIDE VARIABLES------------------Declarations of Sass variables + * -----Typography + * -----Colors + * -----Textfield + * -----Switch + * -----Spinner + * -----Radio + * -----Menu + * -----List + * -----Layout + * -----Icon toggles + * -----Footer + * -----Column + * -----Checkbox + * -----Card + * -----Button + * -----Animation + * -----Progress + * -----Badge + * -----Shadows + * -----Grid + * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. + */ +/* ========== TYPOGRAPHY ========== */ +/* We're splitting fonts into "preferred" and "performance" in order to optimize + page loading. For important text, such as the body, we want it to load + immediately and not wait for the web font load, whereas for other sections, + such as headers and titles, we're OK with things taking a bit longer to load. + We do have some optional classes and parameters in the mixins, in case you + definitely want to make sure you're using the preferred font and don't mind + the performance hit. + We should be able to improve on this once CSS Font Loading L3 becomes more + widely available. +*/ +/* ========== COLORS ========== */ +/** +* +* Material design color palettes. +* @see http://www.google.com/design/spec/style/color.html +* +**/ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* ========== Color Palettes ========== */ +/* colors.scss */ +/** + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* ========== IMAGES ========== */ +/* ========== Color & Themes ========== */ +/* ========== Typography ========== */ +/* ========== Components ========== */ +/* ========== Standard Buttons ========== */ +/* ========== Icon Toggles ========== */ +/* ========== Radio Buttons ========== */ +/* ========== Ripple effect ========== */ +/* ========== Layout ========== */ +/* ========== Content Tabs ========== */ +/* ========== Checkboxes ========== */ +/* ========== Switches ========== */ +/* ========== Spinner ========== */ +/* ========== Text fields ========== */ +/* ========== Card ========== */ +/* ========== Sliders ========== */ +/* ========== Progress ========== */ +/* ========== List ========== */ +/* ========== Item ========== */ +/* ========== Dropdown menu ========== */ +/* ========== Tooltips ========== */ +/* ========== Footer ========== */ +/* TEXTFIELD */ +/* SWITCH */ +/* SPINNER */ +/* RADIO */ +/* MENU */ +/* LIST */ +/* LAYOUT */ +/* ICON TOGGLE */ +/* FOOTER */ +/*mega-footer*/ +/*mini-footer*/ +/* CHECKBOX */ +/* CARD */ +/* Card dimensions */ +/* Cover image */ +/* BUTTON */ +/** + * + * Dimensions + * + */ +/* ANIMATION */ +/* PROGRESS */ +/* BADGE */ +/* SHADOWS */ +/* GRID */ +/* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ +/* TOOLTIP */ +/* CHIP */ .mdl-spinner { display: inline-block; position: relative; @@ -7929,6 +9268,10 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { height: 100%; overflow: hidden; border-color: inherit; } + .mdl-spinner__circle-clipper.mdl-spinner__left { + float: left; } + .mdl-spinner__circle-clipper.mdl-spinner__right { + float: right; } .mdl-spinner__circle-clipper .mdl-spinner__circle { width: 200%; } @@ -7950,7 +9293,6 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { .mdl-spinner__left .mdl-spinner__circle { border-right-color: transparent !important; -webkit-transform: rotate(129deg); - -ms-transform: rotate(129deg); transform: rotate(129deg); } .mdl-spinner.is-active .mdl-spinner__left .mdl-spinner__circle { -webkit-animation: mdl-spinner__left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; @@ -7959,7 +9301,6 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { left: -100%; border-left-color: transparent !important; -webkit-transform: rotate(-129deg); - -ms-transform: rotate(-129deg); transform: rotate(-129deg); } .mdl-spinner.is-active .mdl-spinner__right .mdl-spinner__circle { -webkit-animation: mdl-spinner__right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both; @@ -8064,6 +9405,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -8115,6 +9465,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -8163,7 +9514,10 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -8182,6 +9536,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ .mdl-switch { position: relative; z-index: 1; @@ -8227,6 +9582,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { cursor: pointer; } .mdl-switch.is-checked .mdl-switch__track { background: rgba(63,81,181, 0.5); } + .mdl-switch__track fieldset[disabled] .mdl-switch, .mdl-switch.is-disabled .mdl-switch__track { background: rgba(0,0,0, 0.12); cursor: auto; } @@ -8241,16 +9597,14 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { border-radius: 50%; cursor: pointer; box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); - -webkit-transition-duration: 0.28s; - transition-duration: 0.28s; - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - -webkit-transition-property: left; - transition-property: left; } + transition-duration: 0.28s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-property: left; } .mdl-switch.is-checked .mdl-switch__thumb { background: rgb(63,81,181); left: 16px; box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.14), 0 3px 3px -2px rgba(0, 0, 0, 0.2), 0 1px 8px 0 rgba(0, 0, 0, 0.12); } + .mdl-switch__thumb fieldset[disabled] .mdl-switch, .mdl-switch.is-disabled .mdl-switch__thumb { background: rgb(189,189,189); cursor: auto; } @@ -8260,7 +9614,6 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { top: 50%; left: 50%; -webkit-transform: translate(-4px, -4px); - -ms-transform: translate(-4px, -4px); transform: translate(-4px, -4px); display: inline-block; box-sizing: border-box; @@ -8282,6 +9635,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { line-height: 24px; margin: 0; left: 24px; } + .mdl-switch__label fieldset[disabled] .mdl-switch, .mdl-switch.is-disabled .mdl-switch__label { color: rgb(189,189,189); cursor: auto; } @@ -8298,20 +9652,18 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { cursor: pointer; overflow: hidden; -webkit-mask-image: -webkit-radial-gradient(circle, white, black); - -webkit-transition-duration: 0.40s; - transition-duration: 0.40s; - -webkit-transition-timing-function: step-end; - transition-timing-function: step-end; - -webkit-transition-property: left; - transition-property: left; } + transition-duration: 0.40s; + transition-timing-function: step-end; + transition-property: left; } .mdl-switch__ripple-container .mdl-ripple { background: rgb(63,81,181); } + .mdl-switch__ripple-container fieldset[disabled] .mdl-switch, .mdl-switch.is-disabled .mdl-switch__ripple-container { cursor: auto; } + fieldset[disabled] .mdl-switch .mdl-switch__ripple-container .mdl-ripple, .mdl-switch.is-disabled .mdl-switch__ripple-container .mdl-ripple { background: transparent; } .mdl-switch.is-checked .mdl-switch__ripple-container { - cursor: auto; left: 2px; } /** @@ -8369,6 +9721,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -8420,6 +9781,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -8468,29 +9830,27 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ .mdl-tabs { display: block; width: 100%; } .mdl-tabs__tab-bar { - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; -webkit-flex-direction: row; -ms-flex-direction: row; flex-direction: row; - -webkit-box-pack: center; -webkit-justify-content: center; -ms-flex-pack: center; justify-content: center; -webkit-align-content: space-between; -ms-flex-line-pack: justify; align-content: space-between; - -webkit-box-align: start; -webkit-align-items: flex-start; -ms-flex-align: start; align-items: flex-start; @@ -8506,7 +9866,6 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { float: left; position: relative; display: block; - color: red; text-decoration: none; height: 48px; line-height: 48px; @@ -8529,8 +9888,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { background: rgb(63,81,181); -webkit-animation: border-expand 0.2s cubic-bezier(0.4, 0, 0.4, 1) 0.01s alternate forwards; animation: border-expand 0.2s cubic-bezier(0.4, 0, 0.4, 1) 0.01s alternate forwards; - -webkit-transition: all 1s cubic-bezier(0.4, 0, 1, 1); - transition: all 1s cubic-bezier(0.4, 0, 1, 1); } + transition: all 1s cubic-bezier(0.4, 0, 1, 1); } .mdl-tabs__tab .mdl-tabs__ripple-container { display: block; position: absolute; @@ -8621,6 +9979,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -8672,6 +10039,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -8720,7 +10088,10 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -8739,6 +10110,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ .mdl-textfield { position: relative; font-size: 16px; @@ -8762,22 +10134,32 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { min-width: 32px; width: auto; min-height: 32px; } + .mdl-textfield--expandable .mdl-button--icon { + top: 16px; } .mdl-textfield__input { border: none; border-bottom: 1px solid rgba(0,0,0, 0.12); display: block; font-size: 16px; + font-family: "Helvetica", "Arial", sans-serif; margin: 0; padding: 4px 0; width: 100%; + background: none; text-align: left; color: inherit; } + .mdl-textfield__input[type="number"] { + -moz-appearance: textfield; } + .mdl-textfield__input[type="number"]::-webkit-inner-spin-button, .mdl-textfield__input[type="number"]::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; } .mdl-textfield.is-focused .mdl-textfield__input { outline: none; } .mdl-textfield.is-invalid .mdl-textfield__input { - border-color: rgb(222, 50, 38); + border-color: rgb(213,0,0); box-shadow: none; } + fieldset[disabled] .mdl-textfield .mdl-textfield__input, .mdl-textfield.is-disabled .mdl-textfield__input { background-color: transparent; border-bottom: 1px dotted rgba(0,0,0, 0.12); @@ -8800,26 +10182,30 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { overflow: hidden; white-space: nowrap; text-align: left; } - .mdl-textfield.is-dirty .mdl-textfield__label { + .mdl-textfield.is-dirty .mdl-textfield__label, + .mdl-textfield.has-placeholder .mdl-textfield__label { visibility: hidden; } .mdl-textfield--floating-label .mdl-textfield__label { - -webkit-transition-duration: 0.2s; - transition-duration: 0.2s; - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } + transition-duration: 0.2s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); } + .mdl-textfield--floating-label.has-placeholder .mdl-textfield__label { + transition: none; } + fieldset[disabled] .mdl-textfield .mdl-textfield__label, .mdl-textfield.is-disabled.is-disabled .mdl-textfield__label { color: rgba(0,0,0, 0.26); } .mdl-textfield--floating-label.is-focused .mdl-textfield__label, - .mdl-textfield--floating-label.is-dirty .mdl-textfield__label { + .mdl-textfield--floating-label.is-dirty .mdl-textfield__label, + .mdl-textfield--floating-label.has-placeholder .mdl-textfield__label { color: rgb(63,81,181); font-size: 12px; top: 4px; visibility: visible; } .mdl-textfield--floating-label.is-focused .mdl-textfield__expandable-holder .mdl-textfield__label, - .mdl-textfield--floating-label.is-dirty .mdl-textfield__expandable-holder .mdl-textfield__label { + .mdl-textfield--floating-label.is-dirty .mdl-textfield__expandable-holder .mdl-textfield__label, + .mdl-textfield--floating-label.has-placeholder .mdl-textfield__expandable-holder .mdl-textfield__label { top: -16px; } .mdl-textfield--floating-label.is-invalid .mdl-textfield__label { - color: rgb(222, 50, 38); + color: rgb(213,0,0); font-size: 12px; } .mdl-textfield__label:after { background-color: rgb(63,81,181); @@ -8828,10 +10214,8 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { height: 2px; left: 45%; position: absolute; - -webkit-transition-duration: 0.2s; - transition-duration: 0.2s; - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 0.2s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); visibility: hidden; width: 10px; } .mdl-textfield.is-focused .mdl-textfield__label:after { @@ -8839,10 +10223,10 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { visibility: visible; width: 100%; } .mdl-textfield.is-invalid .mdl-textfield__label:after { - background-color: rgb(222, 50, 38); } + background-color: rgb(213,0,0); } .mdl-textfield__error { - color: rgb(222, 50, 38); + color: rgb(213,0,0); position: absolute; font-size: 12px; margin-top: 3px; @@ -8855,10 +10239,8 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { display: inline-block; position: relative; margin-left: 32px; - -webkit-transition-duration: 0.2s; - transition-duration: 0.2s; - -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 0.2s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); display: inline-block; max-width: 0.1px; } .mdl-textfield.is-focused .mdl-textfield__expandable-holder, .mdl-textfield.is-dirty .mdl-textfield__expandable-holder { @@ -8921,6 +10303,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -8972,6 +10363,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -9020,15 +10412,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ .mdl-tooltip { -webkit-transform: scale(0); - -ms-transform: scale(0); transform: scale(0); -webkit-transform-origin: top center; - -ms-transform-origin: top center; transform-origin: top center; - will-change: transform; z-index: 999; background: rgba(97,97,97, 0.9); border-radius: 2px; @@ -9136,6 +10528,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -9187,6 +10588,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -9235,7 +10637,10 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -9254,6 +10659,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { /* Typography */ /* Shadows */ /* Animations */ +/* Dialog */ .mdl-shadow--2dp { box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); } @@ -9272,6 +10678,9 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { .mdl-shadow--16dp { box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2); } +.mdl-shadow--24dp { + box-shadow: 0 9px 46px 8px rgba(0, 0, 0, 0.14), 0 11px 15px -7px rgba(0, 0, 0, 0.12), 0 24px 38px 3px rgba(0, 0, 0, 0.2); } + /** * Copyright 2015 Google Inc. All Rights Reserved. * @@ -9332,6 +10741,15 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * -----Shadows * -----Grid * -----Data table + * -----Dialog + * -----Snackbar + * -----Tooltip + * -----Chip + * + * Even though all variables have the `!default` directive, most of them + * should not be changed as they are dependent one another. This can cause + * visual distortions (like alignment issues) that are hard to track down + * and fix. */ /* ========== TYPOGRAPHY ========== */ /* We're splitting fonts into "preferred" and "performance" in order to optimize @@ -9383,6 +10801,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { * See the License for the specific language governing permissions and * limitations under the License. */ +/* ========== IMAGES ========== */ /* ========== Color & Themes ========== */ /* ========== Typography ========== */ /* ========== Components ========== */ @@ -9431,9 +10850,11 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { /* SHADOWS */ /* GRID */ /* DATA TABLE */ +/* DIALOG */ +/* SNACKBAR */ /* TOOLTIP */ +/* CHIP */ .mdl-grid { - display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; @@ -9441,7 +10862,6 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { -ms-flex-flow: row wrap; flex-flow: row wrap; margin: 0 auto 0 auto; - -webkit-box-align: stretch; -webkit-align-items: stretch; -ms-flex-align: stretch; align-items: stretch; } @@ -9459,6 +10879,7 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { .mdl-cell--middle { -webkit-align-self: center; -ms-flex-item-align: center; + -ms-grid-row-align: center; align-self: center; } .mdl-cell--bottom { @@ -9469,11 +10890,72 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { .mdl-cell--stretch { -webkit-align-self: stretch; -ms-flex-item-align: stretch; + -ms-grid-row-align: stretch; align-self: stretch; } .mdl-grid.mdl-grid--no-spacing > .mdl-cell { margin: 0; } +.mdl-cell--order-1 { + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; } + +.mdl-cell--order-2 { + -webkit-order: 2; + -ms-flex-order: 2; + order: 2; } + +.mdl-cell--order-3 { + -webkit-order: 3; + -ms-flex-order: 3; + order: 3; } + +.mdl-cell--order-4 { + -webkit-order: 4; + -ms-flex-order: 4; + order: 4; } + +.mdl-cell--order-5 { + -webkit-order: 5; + -ms-flex-order: 5; + order: 5; } + +.mdl-cell--order-6 { + -webkit-order: 6; + -ms-flex-order: 6; + order: 6; } + +.mdl-cell--order-7 { + -webkit-order: 7; + -ms-flex-order: 7; + order: 7; } + +.mdl-cell--order-8 { + -webkit-order: 8; + -ms-flex-order: 8; + order: 8; } + +.mdl-cell--order-9 { + -webkit-order: 9; + -ms-flex-order: 9; + order: 9; } + +.mdl-cell--order-10 { + -webkit-order: 10; + -ms-flex-order: 10; + order: 10; } + +.mdl-cell--order-11 { + -webkit-order: 11; + -ms-flex-order: 11; + order: 11; } + +.mdl-cell--order-12 { + -webkit-order: 12; + -ms-flex-order: 12; + order: 12; } + @media (max-width: 479px) { .mdl-grid { padding: 8px; } @@ -9484,78 +10966,144 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { width: 100%; } .mdl-cell--hide-phone { display: none !important; } + .mdl-cell--order-1-phone.mdl-cell--order-1-phone { + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; } + .mdl-cell--order-2-phone.mdl-cell--order-2-phone { + -webkit-order: 2; + -ms-flex-order: 2; + order: 2; } + .mdl-cell--order-3-phone.mdl-cell--order-3-phone { + -webkit-order: 3; + -ms-flex-order: 3; + order: 3; } + .mdl-cell--order-4-phone.mdl-cell--order-4-phone { + -webkit-order: 4; + -ms-flex-order: 4; + order: 4; } + .mdl-cell--order-5-phone.mdl-cell--order-5-phone { + -webkit-order: 5; + -ms-flex-order: 5; + order: 5; } + .mdl-cell--order-6-phone.mdl-cell--order-6-phone { + -webkit-order: 6; + -ms-flex-order: 6; + order: 6; } + .mdl-cell--order-7-phone.mdl-cell--order-7-phone { + -webkit-order: 7; + -ms-flex-order: 7; + order: 7; } + .mdl-cell--order-8-phone.mdl-cell--order-8-phone { + -webkit-order: 8; + -ms-flex-order: 8; + order: 8; } + .mdl-cell--order-9-phone.mdl-cell--order-9-phone { + -webkit-order: 9; + -ms-flex-order: 9; + order: 9; } + .mdl-cell--order-10-phone.mdl-cell--order-10-phone { + -webkit-order: 10; + -ms-flex-order: 10; + order: 10; } + .mdl-cell--order-11-phone.mdl-cell--order-11-phone { + -webkit-order: 11; + -ms-flex-order: 11; + order: 11; } + .mdl-cell--order-12-phone.mdl-cell--order-12-phone { + -webkit-order: 12; + -ms-flex-order: 12; + order: 12; } .mdl-cell--1-col, .mdl-cell--1-col-phone.mdl-cell--1-col-phone { width: calc(25% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--1-col, - .mdl-grid--no-spacing > .mdl-cell--1-col-phone.mdl-cell--1-col-phone { + .mdl-grid--no-spacing > .mdl-cell--1-col, .mdl-grid--no-spacing > + .mdl-cell--1-col-phone.mdl-cell--1-col-phone { width: 25%; } .mdl-cell--2-col, .mdl-cell--2-col-phone.mdl-cell--2-col-phone { width: calc(50% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--2-col, - .mdl-grid--no-spacing > .mdl-cell--2-col-phone.mdl-cell--2-col-phone { + .mdl-grid--no-spacing > .mdl-cell--2-col, .mdl-grid--no-spacing > + .mdl-cell--2-col-phone.mdl-cell--2-col-phone { width: 50%; } .mdl-cell--3-col, .mdl-cell--3-col-phone.mdl-cell--3-col-phone { width: calc(75% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--3-col, - .mdl-grid--no-spacing > .mdl-cell--3-col-phone.mdl-cell--3-col-phone { + .mdl-grid--no-spacing > .mdl-cell--3-col, .mdl-grid--no-spacing > + .mdl-cell--3-col-phone.mdl-cell--3-col-phone { width: 75%; } .mdl-cell--4-col, .mdl-cell--4-col-phone.mdl-cell--4-col-phone { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--4-col, - .mdl-grid--no-spacing > .mdl-cell--4-col-phone.mdl-cell--4-col-phone { + .mdl-grid--no-spacing > .mdl-cell--4-col, .mdl-grid--no-spacing > + .mdl-cell--4-col-phone.mdl-cell--4-col-phone { width: 100%; } .mdl-cell--5-col, .mdl-cell--5-col-phone.mdl-cell--5-col-phone { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--5-col, - .mdl-grid--no-spacing > .mdl-cell--5-col-phone.mdl-cell--5-col-phone { + .mdl-grid--no-spacing > .mdl-cell--5-col, .mdl-grid--no-spacing > + .mdl-cell--5-col-phone.mdl-cell--5-col-phone { width: 100%; } .mdl-cell--6-col, .mdl-cell--6-col-phone.mdl-cell--6-col-phone { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--6-col, - .mdl-grid--no-spacing > .mdl-cell--6-col-phone.mdl-cell--6-col-phone { + .mdl-grid--no-spacing > .mdl-cell--6-col, .mdl-grid--no-spacing > + .mdl-cell--6-col-phone.mdl-cell--6-col-phone { width: 100%; } .mdl-cell--7-col, .mdl-cell--7-col-phone.mdl-cell--7-col-phone { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--7-col, - .mdl-grid--no-spacing > .mdl-cell--7-col-phone.mdl-cell--7-col-phone { + .mdl-grid--no-spacing > .mdl-cell--7-col, .mdl-grid--no-spacing > + .mdl-cell--7-col-phone.mdl-cell--7-col-phone { width: 100%; } .mdl-cell--8-col, .mdl-cell--8-col-phone.mdl-cell--8-col-phone { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--8-col, - .mdl-grid--no-spacing > .mdl-cell--8-col-phone.mdl-cell--8-col-phone { + .mdl-grid--no-spacing > .mdl-cell--8-col, .mdl-grid--no-spacing > + .mdl-cell--8-col-phone.mdl-cell--8-col-phone { width: 100%; } .mdl-cell--9-col, .mdl-cell--9-col-phone.mdl-cell--9-col-phone { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--9-col, - .mdl-grid--no-spacing > .mdl-cell--9-col-phone.mdl-cell--9-col-phone { + .mdl-grid--no-spacing > .mdl-cell--9-col, .mdl-grid--no-spacing > + .mdl-cell--9-col-phone.mdl-cell--9-col-phone { width: 100%; } .mdl-cell--10-col, .mdl-cell--10-col-phone.mdl-cell--10-col-phone { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--10-col, - .mdl-grid--no-spacing > .mdl-cell--10-col-phone.mdl-cell--10-col-phone { + .mdl-grid--no-spacing > .mdl-cell--10-col, .mdl-grid--no-spacing > + .mdl-cell--10-col-phone.mdl-cell--10-col-phone { width: 100%; } .mdl-cell--11-col, .mdl-cell--11-col-phone.mdl-cell--11-col-phone { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--11-col, - .mdl-grid--no-spacing > .mdl-cell--11-col-phone.mdl-cell--11-col-phone { + .mdl-grid--no-spacing > .mdl-cell--11-col, .mdl-grid--no-spacing > + .mdl-cell--11-col-phone.mdl-cell--11-col-phone { width: 100%; } .mdl-cell--12-col, .mdl-cell--12-col-phone.mdl-cell--12-col-phone { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--12-col, - .mdl-grid--no-spacing > .mdl-cell--12-col-phone.mdl-cell--12-col-phone { - width: 100%; } } + .mdl-grid--no-spacing > .mdl-cell--12-col, .mdl-grid--no-spacing > + .mdl-cell--12-col-phone.mdl-cell--12-col-phone { + width: 100%; } + .mdl-cell--1-offset, + .mdl-cell--1-offset-phone.mdl-cell--1-offset-phone { + margin-left: calc(25% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--1-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--1-offset-phone.mdl-cell--1-offset-phone { + margin-left: 25%; } + .mdl-cell--2-offset, + .mdl-cell--2-offset-phone.mdl-cell--2-offset-phone { + margin-left: calc(50% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--2-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--2-offset-phone.mdl-cell--2-offset-phone { + margin-left: 50%; } + .mdl-cell--3-offset, + .mdl-cell--3-offset-phone.mdl-cell--3-offset-phone { + margin-left: calc(75% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--3-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--3-offset-phone.mdl-cell--3-offset-phone { + margin-left: 75%; } } @media (min-width: 480px) and (max-width: 839px) { .mdl-grid { @@ -9567,78 +11115,168 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { width: 50%; } .mdl-cell--hide-tablet { display: none !important; } + .mdl-cell--order-1-tablet.mdl-cell--order-1-tablet { + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; } + .mdl-cell--order-2-tablet.mdl-cell--order-2-tablet { + -webkit-order: 2; + -ms-flex-order: 2; + order: 2; } + .mdl-cell--order-3-tablet.mdl-cell--order-3-tablet { + -webkit-order: 3; + -ms-flex-order: 3; + order: 3; } + .mdl-cell--order-4-tablet.mdl-cell--order-4-tablet { + -webkit-order: 4; + -ms-flex-order: 4; + order: 4; } + .mdl-cell--order-5-tablet.mdl-cell--order-5-tablet { + -webkit-order: 5; + -ms-flex-order: 5; + order: 5; } + .mdl-cell--order-6-tablet.mdl-cell--order-6-tablet { + -webkit-order: 6; + -ms-flex-order: 6; + order: 6; } + .mdl-cell--order-7-tablet.mdl-cell--order-7-tablet { + -webkit-order: 7; + -ms-flex-order: 7; + order: 7; } + .mdl-cell--order-8-tablet.mdl-cell--order-8-tablet { + -webkit-order: 8; + -ms-flex-order: 8; + order: 8; } + .mdl-cell--order-9-tablet.mdl-cell--order-9-tablet { + -webkit-order: 9; + -ms-flex-order: 9; + order: 9; } + .mdl-cell--order-10-tablet.mdl-cell--order-10-tablet { + -webkit-order: 10; + -ms-flex-order: 10; + order: 10; } + .mdl-cell--order-11-tablet.mdl-cell--order-11-tablet { + -webkit-order: 11; + -ms-flex-order: 11; + order: 11; } + .mdl-cell--order-12-tablet.mdl-cell--order-12-tablet { + -webkit-order: 12; + -ms-flex-order: 12; + order: 12; } .mdl-cell--1-col, .mdl-cell--1-col-tablet.mdl-cell--1-col-tablet { width: calc(12.5% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--1-col, - .mdl-grid--no-spacing > .mdl-cell--1-col-tablet.mdl-cell--1-col-tablet { + .mdl-grid--no-spacing > .mdl-cell--1-col, .mdl-grid--no-spacing > + .mdl-cell--1-col-tablet.mdl-cell--1-col-tablet { width: 12.5%; } .mdl-cell--2-col, .mdl-cell--2-col-tablet.mdl-cell--2-col-tablet { width: calc(25% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--2-col, - .mdl-grid--no-spacing > .mdl-cell--2-col-tablet.mdl-cell--2-col-tablet { + .mdl-grid--no-spacing > .mdl-cell--2-col, .mdl-grid--no-spacing > + .mdl-cell--2-col-tablet.mdl-cell--2-col-tablet { width: 25%; } .mdl-cell--3-col, .mdl-cell--3-col-tablet.mdl-cell--3-col-tablet { width: calc(37.5% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--3-col, - .mdl-grid--no-spacing > .mdl-cell--3-col-tablet.mdl-cell--3-col-tablet { + .mdl-grid--no-spacing > .mdl-cell--3-col, .mdl-grid--no-spacing > + .mdl-cell--3-col-tablet.mdl-cell--3-col-tablet { width: 37.5%; } .mdl-cell--4-col, .mdl-cell--4-col-tablet.mdl-cell--4-col-tablet { width: calc(50% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--4-col, - .mdl-grid--no-spacing > .mdl-cell--4-col-tablet.mdl-cell--4-col-tablet { + .mdl-grid--no-spacing > .mdl-cell--4-col, .mdl-grid--no-spacing > + .mdl-cell--4-col-tablet.mdl-cell--4-col-tablet { width: 50%; } .mdl-cell--5-col, .mdl-cell--5-col-tablet.mdl-cell--5-col-tablet { width: calc(62.5% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--5-col, - .mdl-grid--no-spacing > .mdl-cell--5-col-tablet.mdl-cell--5-col-tablet { + .mdl-grid--no-spacing > .mdl-cell--5-col, .mdl-grid--no-spacing > + .mdl-cell--5-col-tablet.mdl-cell--5-col-tablet { width: 62.5%; } .mdl-cell--6-col, .mdl-cell--6-col-tablet.mdl-cell--6-col-tablet { width: calc(75% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--6-col, - .mdl-grid--no-spacing > .mdl-cell--6-col-tablet.mdl-cell--6-col-tablet { + .mdl-grid--no-spacing > .mdl-cell--6-col, .mdl-grid--no-spacing > + .mdl-cell--6-col-tablet.mdl-cell--6-col-tablet { width: 75%; } .mdl-cell--7-col, .mdl-cell--7-col-tablet.mdl-cell--7-col-tablet { width: calc(87.5% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--7-col, - .mdl-grid--no-spacing > .mdl-cell--7-col-tablet.mdl-cell--7-col-tablet { + .mdl-grid--no-spacing > .mdl-cell--7-col, .mdl-grid--no-spacing > + .mdl-cell--7-col-tablet.mdl-cell--7-col-tablet { width: 87.5%; } .mdl-cell--8-col, .mdl-cell--8-col-tablet.mdl-cell--8-col-tablet { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--8-col, - .mdl-grid--no-spacing > .mdl-cell--8-col-tablet.mdl-cell--8-col-tablet { + .mdl-grid--no-spacing > .mdl-cell--8-col, .mdl-grid--no-spacing > + .mdl-cell--8-col-tablet.mdl-cell--8-col-tablet { width: 100%; } .mdl-cell--9-col, .mdl-cell--9-col-tablet.mdl-cell--9-col-tablet { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--9-col, - .mdl-grid--no-spacing > .mdl-cell--9-col-tablet.mdl-cell--9-col-tablet { + .mdl-grid--no-spacing > .mdl-cell--9-col, .mdl-grid--no-spacing > + .mdl-cell--9-col-tablet.mdl-cell--9-col-tablet { width: 100%; } .mdl-cell--10-col, .mdl-cell--10-col-tablet.mdl-cell--10-col-tablet { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--10-col, - .mdl-grid--no-spacing > .mdl-cell--10-col-tablet.mdl-cell--10-col-tablet { + .mdl-grid--no-spacing > .mdl-cell--10-col, .mdl-grid--no-spacing > + .mdl-cell--10-col-tablet.mdl-cell--10-col-tablet { width: 100%; } .mdl-cell--11-col, .mdl-cell--11-col-tablet.mdl-cell--11-col-tablet { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--11-col, - .mdl-grid--no-spacing > .mdl-cell--11-col-tablet.mdl-cell--11-col-tablet { + .mdl-grid--no-spacing > .mdl-cell--11-col, .mdl-grid--no-spacing > + .mdl-cell--11-col-tablet.mdl-cell--11-col-tablet { width: 100%; } .mdl-cell--12-col, .mdl-cell--12-col-tablet.mdl-cell--12-col-tablet { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--12-col, - .mdl-grid--no-spacing > .mdl-cell--12-col-tablet.mdl-cell--12-col-tablet { - width: 100%; } } + .mdl-grid--no-spacing > .mdl-cell--12-col, .mdl-grid--no-spacing > + .mdl-cell--12-col-tablet.mdl-cell--12-col-tablet { + width: 100%; } + .mdl-cell--1-offset, + .mdl-cell--1-offset-tablet.mdl-cell--1-offset-tablet { + margin-left: calc(12.5% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--1-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--1-offset-tablet.mdl-cell--1-offset-tablet { + margin-left: 12.5%; } + .mdl-cell--2-offset, + .mdl-cell--2-offset-tablet.mdl-cell--2-offset-tablet { + margin-left: calc(25% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--2-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--2-offset-tablet.mdl-cell--2-offset-tablet { + margin-left: 25%; } + .mdl-cell--3-offset, + .mdl-cell--3-offset-tablet.mdl-cell--3-offset-tablet { + margin-left: calc(37.5% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--3-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--3-offset-tablet.mdl-cell--3-offset-tablet { + margin-left: 37.5%; } + .mdl-cell--4-offset, + .mdl-cell--4-offset-tablet.mdl-cell--4-offset-tablet { + margin-left: calc(50% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--4-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--4-offset-tablet.mdl-cell--4-offset-tablet { + margin-left: 50%; } + .mdl-cell--5-offset, + .mdl-cell--5-offset-tablet.mdl-cell--5-offset-tablet { + margin-left: calc(62.5% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--5-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--5-offset-tablet.mdl-cell--5-offset-tablet { + margin-left: 62.5%; } + .mdl-cell--6-offset, + .mdl-cell--6-offset-tablet.mdl-cell--6-offset-tablet { + margin-left: calc(75% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--6-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--6-offset-tablet.mdl-cell--6-offset-tablet { + margin-left: 75%; } + .mdl-cell--7-offset, + .mdl-cell--7-offset-tablet.mdl-cell--7-offset-tablet { + margin-left: calc(87.5% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--7-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--7-offset-tablet.mdl-cell--7-offset-tablet { + margin-left: 87.5%; } } @media (min-width: 840px) { .mdl-grid { @@ -9650,75 +11288,189 @@ _:-ms-input-placeholder, :root .mdl-slider.mdl-slider.is-upgraded { width: 33.3333333333%; } .mdl-cell--hide-desktop { display: none !important; } + .mdl-cell--order-1-desktop.mdl-cell--order-1-desktop { + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; } + .mdl-cell--order-2-desktop.mdl-cell--order-2-desktop { + -webkit-order: 2; + -ms-flex-order: 2; + order: 2; } + .mdl-cell--order-3-desktop.mdl-cell--order-3-desktop { + -webkit-order: 3; + -ms-flex-order: 3; + order: 3; } + .mdl-cell--order-4-desktop.mdl-cell--order-4-desktop { + -webkit-order: 4; + -ms-flex-order: 4; + order: 4; } + .mdl-cell--order-5-desktop.mdl-cell--order-5-desktop { + -webkit-order: 5; + -ms-flex-order: 5; + order: 5; } + .mdl-cell--order-6-desktop.mdl-cell--order-6-desktop { + -webkit-order: 6; + -ms-flex-order: 6; + order: 6; } + .mdl-cell--order-7-desktop.mdl-cell--order-7-desktop { + -webkit-order: 7; + -ms-flex-order: 7; + order: 7; } + .mdl-cell--order-8-desktop.mdl-cell--order-8-desktop { + -webkit-order: 8; + -ms-flex-order: 8; + order: 8; } + .mdl-cell--order-9-desktop.mdl-cell--order-9-desktop { + -webkit-order: 9; + -ms-flex-order: 9; + order: 9; } + .mdl-cell--order-10-desktop.mdl-cell--order-10-desktop { + -webkit-order: 10; + -ms-flex-order: 10; + order: 10; } + .mdl-cell--order-11-desktop.mdl-cell--order-11-desktop { + -webkit-order: 11; + -ms-flex-order: 11; + order: 11; } + .mdl-cell--order-12-desktop.mdl-cell--order-12-desktop { + -webkit-order: 12; + -ms-flex-order: 12; + order: 12; } .mdl-cell--1-col, .mdl-cell--1-col-desktop.mdl-cell--1-col-desktop { width: calc(8.3333333333% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--1-col, - .mdl-grid--no-spacing > .mdl-cell--1-col-desktop.mdl-cell--1-col-desktop { + .mdl-grid--no-spacing > .mdl-cell--1-col, .mdl-grid--no-spacing > + .mdl-cell--1-col-desktop.mdl-cell--1-col-desktop { width: 8.3333333333%; } .mdl-cell--2-col, .mdl-cell--2-col-desktop.mdl-cell--2-col-desktop { width: calc(16.6666666667% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--2-col, - .mdl-grid--no-spacing > .mdl-cell--2-col-desktop.mdl-cell--2-col-desktop { + .mdl-grid--no-spacing > .mdl-cell--2-col, .mdl-grid--no-spacing > + .mdl-cell--2-col-desktop.mdl-cell--2-col-desktop { width: 16.6666666667%; } .mdl-cell--3-col, .mdl-cell--3-col-desktop.mdl-cell--3-col-desktop { width: calc(25% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--3-col, - .mdl-grid--no-spacing > .mdl-cell--3-col-desktop.mdl-cell--3-col-desktop { + .mdl-grid--no-spacing > .mdl-cell--3-col, .mdl-grid--no-spacing > + .mdl-cell--3-col-desktop.mdl-cell--3-col-desktop { width: 25%; } .mdl-cell--4-col, .mdl-cell--4-col-desktop.mdl-cell--4-col-desktop { width: calc(33.3333333333% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--4-col, - .mdl-grid--no-spacing > .mdl-cell--4-col-desktop.mdl-cell--4-col-desktop { + .mdl-grid--no-spacing > .mdl-cell--4-col, .mdl-grid--no-spacing > + .mdl-cell--4-col-desktop.mdl-cell--4-col-desktop { width: 33.3333333333%; } .mdl-cell--5-col, .mdl-cell--5-col-desktop.mdl-cell--5-col-desktop { width: calc(41.6666666667% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--5-col, - .mdl-grid--no-spacing > .mdl-cell--5-col-desktop.mdl-cell--5-col-desktop { + .mdl-grid--no-spacing > .mdl-cell--5-col, .mdl-grid--no-spacing > + .mdl-cell--5-col-desktop.mdl-cell--5-col-desktop { width: 41.6666666667%; } .mdl-cell--6-col, .mdl-cell--6-col-desktop.mdl-cell--6-col-desktop { width: calc(50% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--6-col, - .mdl-grid--no-spacing > .mdl-cell--6-col-desktop.mdl-cell--6-col-desktop { + .mdl-grid--no-spacing > .mdl-cell--6-col, .mdl-grid--no-spacing > + .mdl-cell--6-col-desktop.mdl-cell--6-col-desktop { width: 50%; } .mdl-cell--7-col, .mdl-cell--7-col-desktop.mdl-cell--7-col-desktop { width: calc(58.3333333333% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--7-col, - .mdl-grid--no-spacing > .mdl-cell--7-col-desktop.mdl-cell--7-col-desktop { + .mdl-grid--no-spacing > .mdl-cell--7-col, .mdl-grid--no-spacing > + .mdl-cell--7-col-desktop.mdl-cell--7-col-desktop { width: 58.3333333333%; } .mdl-cell--8-col, .mdl-cell--8-col-desktop.mdl-cell--8-col-desktop { width: calc(66.6666666667% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--8-col, - .mdl-grid--no-spacing > .mdl-cell--8-col-desktop.mdl-cell--8-col-desktop { + .mdl-grid--no-spacing > .mdl-cell--8-col, .mdl-grid--no-spacing > + .mdl-cell--8-col-desktop.mdl-cell--8-col-desktop { width: 66.6666666667%; } .mdl-cell--9-col, .mdl-cell--9-col-desktop.mdl-cell--9-col-desktop { width: calc(75% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--9-col, - .mdl-grid--no-spacing > .mdl-cell--9-col-desktop.mdl-cell--9-col-desktop { + .mdl-grid--no-spacing > .mdl-cell--9-col, .mdl-grid--no-spacing > + .mdl-cell--9-col-desktop.mdl-cell--9-col-desktop { width: 75%; } .mdl-cell--10-col, .mdl-cell--10-col-desktop.mdl-cell--10-col-desktop { width: calc(83.3333333333% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--10-col, - .mdl-grid--no-spacing > .mdl-cell--10-col-desktop.mdl-cell--10-col-desktop { + .mdl-grid--no-spacing > .mdl-cell--10-col, .mdl-grid--no-spacing > + .mdl-cell--10-col-desktop.mdl-cell--10-col-desktop { width: 83.3333333333%; } .mdl-cell--11-col, .mdl-cell--11-col-desktop.mdl-cell--11-col-desktop { width: calc(91.6666666667% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--11-col, - .mdl-grid--no-spacing > .mdl-cell--11-col-desktop.mdl-cell--11-col-desktop { + .mdl-grid--no-spacing > .mdl-cell--11-col, .mdl-grid--no-spacing > + .mdl-cell--11-col-desktop.mdl-cell--11-col-desktop { width: 91.6666666667%; } .mdl-cell--12-col, .mdl-cell--12-col-desktop.mdl-cell--12-col-desktop { width: calc(100% - 16px); } - .mdl-grid--no-spacing > .mdl-cell--12-col, - .mdl-grid--no-spacing > .mdl-cell--12-col-desktop.mdl-cell--12-col-desktop { - width: 100%; } } + .mdl-grid--no-spacing > .mdl-cell--12-col, .mdl-grid--no-spacing > + .mdl-cell--12-col-desktop.mdl-cell--12-col-desktop { + width: 100%; } + .mdl-cell--1-offset, + .mdl-cell--1-offset-desktop.mdl-cell--1-offset-desktop { + margin-left: calc(8.3333333333% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--1-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--1-offset-desktop.mdl-cell--1-offset-desktop { + margin-left: 8.3333333333%; } + .mdl-cell--2-offset, + .mdl-cell--2-offset-desktop.mdl-cell--2-offset-desktop { + margin-left: calc(16.6666666667% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--2-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--2-offset-desktop.mdl-cell--2-offset-desktop { + margin-left: 16.6666666667%; } + .mdl-cell--3-offset, + .mdl-cell--3-offset-desktop.mdl-cell--3-offset-desktop { + margin-left: calc(25% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--3-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--3-offset-desktop.mdl-cell--3-offset-desktop { + margin-left: 25%; } + .mdl-cell--4-offset, + .mdl-cell--4-offset-desktop.mdl-cell--4-offset-desktop { + margin-left: calc(33.3333333333% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--4-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--4-offset-desktop.mdl-cell--4-offset-desktop { + margin-left: 33.3333333333%; } + .mdl-cell--5-offset, + .mdl-cell--5-offset-desktop.mdl-cell--5-offset-desktop { + margin-left: calc(41.6666666667% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--5-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--5-offset-desktop.mdl-cell--5-offset-desktop { + margin-left: 41.6666666667%; } + .mdl-cell--6-offset, + .mdl-cell--6-offset-desktop.mdl-cell--6-offset-desktop { + margin-left: calc(50% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--6-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--6-offset-desktop.mdl-cell--6-offset-desktop { + margin-left: 50%; } + .mdl-cell--7-offset, + .mdl-cell--7-offset-desktop.mdl-cell--7-offset-desktop { + margin-left: calc(58.3333333333% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--7-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--7-offset-desktop.mdl-cell--7-offset-desktop { + margin-left: 58.3333333333%; } + .mdl-cell--8-offset, + .mdl-cell--8-offset-desktop.mdl-cell--8-offset-desktop { + margin-left: calc(66.6666666667% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--8-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--8-offset-desktop.mdl-cell--8-offset-desktop { + margin-left: 66.6666666667%; } + .mdl-cell--9-offset, + .mdl-cell--9-offset-desktop.mdl-cell--9-offset-desktop { + margin-left: calc(75% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--9-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--9-offset-desktop.mdl-cell--9-offset-desktop { + margin-left: 75%; } + .mdl-cell--10-offset, + .mdl-cell--10-offset-desktop.mdl-cell--10-offset-desktop { + margin-left: calc(83.3333333333% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--10-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--10-offset-desktop.mdl-cell--10-offset-desktop { + margin-left: 83.3333333333%; } + .mdl-cell--11-offset, + .mdl-cell--11-offset-desktop.mdl-cell--11-offset-desktop { + margin-left: calc(91.6666666667% + 8px); } + .mdl-grid.mdl-grid--no-spacing > .mdl-cell--11-offset, .mdl-grid.mdl-grid--no-spacing > + .mdl-cell--11-offset-desktop.mdl-cell--11-offset-desktop { + margin-left: 91.6666666667%; } } diff --git a/public/vendor/mdl/mdl.min.css b/public/vendor/mdl/mdl.min.css deleted file mode 100644 index 3815742333..0000000000 --- a/public/vendor/mdl/mdl.min.css +++ /dev/null @@ -1 +0,0 @@ -@charset "UTF-8";.mdl-button,.mdl-button .material-icons,.mdl-checkbox,audio,canvas,iframe,img,svg,video{vertical-align:middle}.visuallyhidden,hr{border:0;height:1px}.mdl-typography--display-4,.mdl-typography--display-4-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;font-size:112px;font-weight:300;line-height:1;letter-spacing:-.04em}.mdl-typography--display-3,.mdl-typography--display-4,.mdl-typography--display-4-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif}.mdl-card,.mdl-card__media,.mdl-card__title{box-sizing:border-box}.mdl-badge[data-badge]:after,.mdl-card,.mdl-layout,.mdl-layout__drawer,.mdl-layout__header{-webkit-box-direction:normal}::-moz-selection{background:#b3d4fc;text-shadow:none}::selection{background:#b3d4fc;text-shadow:none}hr{display:block;border-top:1px solid #ccc;margin:1em 0;padding:0}fieldset{border:0;margin:0;padding:0}textarea{resize:vertical}.browserupgrade{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.hidden{display:none!important}.visuallyhidden{clip:rect(0 0 0 0);margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}body,html{width:100%}.invisible{visibility:hidden}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both}@media print{blockquote,img,pre,tr{page-break-inside:avoid}*,:after,:before,:first-letter,:first-line{background:0 0!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{border:1px solid #999}thead{display:table-header-group}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}}.mdl-accordion,.mdl-button,.mdl-card,.mdl-checkbox,.mdl-dropdown-menu,.mdl-icon-toggle,.mdl-item,.mdl-radio,.mdl-slider,.mdl-switch,.mdl-tabs__tab,a{-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:rgba(255,255,255,0)}html{height:100%;-ms-touch-action:manipulation;touch-action:manipulation}body{min-height:100%;margin:0}main{display:block}[hidden]{display:none!important}.mdl-typography--display-4-color-contrast{opacity:.54}.mdl-typography--display-3,.mdl-typography--display-3-color-contrast{font-size:56px;font-weight:400;line-height:1.35;letter-spacing:-.02em}.mdl-typography--display-3-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;opacity:.54}.mdl-typography--display-2,.mdl-typography--display-2-color-contrast{font-weight:400;font-family:Roboto,Helvetica,Arial,sans-serif;font-size:45px;line-height:48px}.mdl-typography--display-2-color-contrast{opacity:.54}.mdl-typography--display-1{font-family:Roboto,Helvetica,Arial,sans-serif;font-size:34px;font-weight:400;line-height:40px}.mdl-typography--display-1-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;font-size:34px;font-weight:400;line-height:40px;opacity:.54}.mdl-typography--headline,.mdl-typography--headline-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;font-size:24px;font-weight:400;line-height:32px;-moz-osx-font-smoothing:grayscale}.mdl-typography--headline-color-contrast{opacity:.87}.mdl-typography--title,.mdl-typography--title-color-contrast{font-size:20px;font-weight:500;line-height:1;letter-spacing:.02em}.mdl-typography--title{font-family:Roboto,Helvetica,Arial,sans-serif}.mdl-typography--title-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;opacity:.87}.mdl-typography--subhead,.mdl-typography--subhead-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;line-height:24px;font-size:16px;font-weight:400;letter-spacing:.04em}.mdl-typography--subhead-color-contrast{opacity:.87}.mdl-typography--body-2{font-size:14px;font-weight:700;line-height:24px;letter-spacing:0}.mdl-typography--body-2-color-contrast{font-size:14px;font-weight:700;line-height:24px;letter-spacing:0;opacity:.87}.mdl-typography--body-1,.mdl-typography--body-1-color-contrast{line-height:24px;letter-spacing:0;font-size:14px;font-weight:400}.mdl-typography--body-1-color-contrast{opacity:.87}.mdl-typography--body-2-force-preferred-font{font-family:Roboto,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:24px;letter-spacing:0}.mdl-typography--body-2-force-preferred-font-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;line-height:24px;letter-spacing:0;opacity:.87}.mdl-typography--body-1-force-preferred-font,.mdl-typography--body-1-force-preferred-font-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;font-size:14px;font-weight:400;line-height:24px;letter-spacing:0}.mdl-typography--body-1-force-preferred-font-color-contrast{opacity:.87}.mdl-typography--caption,.mdl-typography--caption-color-contrast,.mdl-typography--caption-force-preferred-font,.mdl-typography--caption-force-preferred-font-color-contrast{font-size:12px;font-weight:400;line-height:1;letter-spacing:0}.mdl-typography--caption-force-preferred-font{font-family:Roboto,Helvetica,Arial,sans-serif}.mdl-typography--caption-color-contrast{opacity:.54}.mdl-typography--caption-force-preferred-font-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;opacity:.54}.mdl-typography--button,.mdl-typography--button-color-contrast,.mdl-typography--menu,.mdl-typography--menu-color-contrast{font-family:Roboto,Helvetica,Arial,sans-serif;letter-spacing:0;font-weight:500;font-size:14px;line-height:1}.mdl-typography--menu-color-contrast{opacity:.87}.mdl-typography--button{text-transform:uppercase}.mdl-typography--button-color-contrast{text-transform:uppercase;opacity:.87}.mdl-typography--text-left{text-align:left}.mdl-typography--text-right{text-align:right}.mdl-typography--text-center{text-align:center}.mdl-typography--text-justify{text-align:justify}.mdl-typography--text-nowrap{white-space:nowrap}.mdl-typography--text-lowercase{text-transform:lowercase}.mdl-typography--text-uppercase{text-transform:uppercase}.mdl-typography--text-capitalize{text-transform:capitalize}.mdl-button,.mdl-layout__tab,.mdl-tabs__tab{text-decoration:none;text-transform:uppercase}.mdl-typography--font-thin{font-weight:200!important}.mdl-typography--font-light{font-weight:300!important}.mdl-typography--font-regular{font-weight:400!important}.mdl-typography--font-medium{font-weight:500!important}.mdl-typography--font-bold{font-weight:700!important}.mdl-typography--font-black{font-weight:900!important}.mdl-color-text--red{color:#f44336!important}.mdl-color--red{background-color:#f44336!important}.mdl-color-text--red-50{color:#ffebee!important}.mdl-color--red-50{background-color:#ffebee!important}.mdl-color-text--red-100{color:#ffcdd2!important}.mdl-color--red-100{background-color:#ffcdd2!important}.mdl-color-text--red-200{color:#ef9a9a!important}.mdl-color--red-200{background-color:#ef9a9a!important}.mdl-color-text--red-300{color:#e57373!important}.mdl-color--red-300{background-color:#e57373!important}.mdl-color-text--red-400{color:#ef5350!important}.mdl-color--red-400{background-color:#ef5350!important}.mdl-color-text--red-500{color:#f44336!important}.mdl-color--red-500{background-color:#f44336!important}.mdl-color-text--red-600{color:#e53935!important}.mdl-color--red-600{background-color:#e53935!important}.mdl-color-text--red-700{color:#d32f2f!important}.mdl-color--red-700{background-color:#d32f2f!important}.mdl-color-text--red-800{color:#c62828!important}.mdl-color--red-800{background-color:#c62828!important}.mdl-color-text--red-900{color:#b71c1c!important}.mdl-color--red-900{background-color:#b71c1c!important}.mdl-color-text--red-A100{color:#ff8a80!important}.mdl-color--red-A100{background-color:#ff8a80!important}.mdl-color-text--red-A200{color:#ff5252!important}.mdl-color--red-A200{background-color:#ff5252!important}.mdl-color-text--red-A400{color:#ff1744!important}.mdl-color--red-A400{background-color:#ff1744!important}.mdl-color-text--red-A700{color:#d50000!important}.mdl-color--red-A700{background-color:#d50000!important}.mdl-color-text--pink{color:#e91e63!important}.mdl-color--pink{background-color:#e91e63!important}.mdl-color-text--pink-50{color:#fce4ec!important}.mdl-color--pink-50{background-color:#fce4ec!important}.mdl-color-text--pink-100{color:#f8bbd0!important}.mdl-color--pink-100{background-color:#f8bbd0!important}.mdl-color-text--pink-200{color:#f48fb1!important}.mdl-color--pink-200{background-color:#f48fb1!important}.mdl-color-text--pink-300{color:#f06292!important}.mdl-color--pink-300{background-color:#f06292!important}.mdl-color-text--pink-400{color:#ec407a!important}.mdl-color--pink-400{background-color:#ec407a!important}.mdl-color-text--pink-500{color:#e91e63!important}.mdl-color--pink-500{background-color:#e91e63!important}.mdl-color-text--pink-600{color:#d81b60!important}.mdl-color--pink-600{background-color:#d81b60!important}.mdl-color-text--pink-700{color:#c2185b!important}.mdl-color--pink-700{background-color:#c2185b!important}.mdl-color-text--pink-800{color:#ad1457!important}.mdl-color--pink-800{background-color:#ad1457!important}.mdl-color-text--pink-900{color:#880e4f!important}.mdl-color--pink-900{background-color:#880e4f!important}.mdl-color-text--pink-A100{color:#ff80ab!important}.mdl-color--pink-A100{background-color:#ff80ab!important}.mdl-color-text--pink-A200{color:#ff4081!important}.mdl-color--pink-A200{background-color:#ff4081!important}.mdl-color-text--pink-A400{color:#f50057!important}.mdl-color--pink-A400{background-color:#f50057!important}.mdl-color-text--pink-A700{color:#c51162!important}.mdl-color--pink-A700{background-color:#c51162!important}.mdl-color-text--purple{color:#9c27b0!important}.mdl-color--purple{background-color:#9c27b0!important}.mdl-color-text--purple-50{color:#f3e5f5!important}.mdl-color--purple-50{background-color:#f3e5f5!important}.mdl-color-text--purple-100{color:#e1bee7!important}.mdl-color--purple-100{background-color:#e1bee7!important}.mdl-color-text--purple-200{color:#ce93d8!important}.mdl-color--purple-200{background-color:#ce93d8!important}.mdl-color-text--purple-300{color:#ba68c8!important}.mdl-color--purple-300{background-color:#ba68c8!important}.mdl-color-text--purple-400{color:#ab47bc!important}.mdl-color--purple-400{background-color:#ab47bc!important}.mdl-color-text--purple-500{color:#9c27b0!important}.mdl-color--purple-500{background-color:#9c27b0!important}.mdl-color-text--purple-600{color:#8e24aa!important}.mdl-color--purple-600{background-color:#8e24aa!important}.mdl-color-text--purple-700{color:#7b1fa2!important}.mdl-color--purple-700{background-color:#7b1fa2!important}.mdl-color-text--purple-800{color:#6a1b9a!important}.mdl-color--purple-800{background-color:#6a1b9a!important}.mdl-color-text--purple-900{color:#4a148c!important}.mdl-color--purple-900{background-color:#4a148c!important}.mdl-color-text--purple-A100{color:#ea80fc!important}.mdl-color--purple-A100{background-color:#ea80fc!important}.mdl-color-text--purple-A200{color:#e040fb!important}.mdl-color--purple-A200{background-color:#e040fb!important}.mdl-color-text--purple-A400{color:#d500f9!important}.mdl-color--purple-A400{background-color:#d500f9!important}.mdl-color-text--purple-A700{color:#a0f!important}.mdl-color--purple-A700{background-color:#a0f!important}.mdl-color-text--deep-purple{color:#673ab7!important}.mdl-color--deep-purple{background-color:#673ab7!important}.mdl-color-text--deep-purple-50{color:#ede7f6!important}.mdl-color--deep-purple-50{background-color:#ede7f6!important}.mdl-color-text--deep-purple-100{color:#d1c4e9!important}.mdl-color--deep-purple-100{background-color:#d1c4e9!important}.mdl-color-text--deep-purple-200{color:#b39ddb!important}.mdl-color--deep-purple-200{background-color:#b39ddb!important}.mdl-color-text--deep-purple-300{color:#9575cd!important}.mdl-color--deep-purple-300{background-color:#9575cd!important}.mdl-color-text--deep-purple-400{color:#7e57c2!important}.mdl-color--deep-purple-400{background-color:#7e57c2!important}.mdl-color-text--deep-purple-500{color:#673ab7!important}.mdl-color--deep-purple-500{background-color:#673ab7!important}.mdl-color-text--deep-purple-600{color:#5e35b1!important}.mdl-color--deep-purple-600{background-color:#5e35b1!important}.mdl-color-text--deep-purple-700{color:#512da8!important}.mdl-color--deep-purple-700{background-color:#512da8!important}.mdl-color-text--deep-purple-800{color:#4527a0!important}.mdl-color--deep-purple-800{background-color:#4527a0!important}.mdl-color-text--deep-purple-900{color:#311b92!important}.mdl-color--deep-purple-900{background-color:#311b92!important}.mdl-color-text--deep-purple-A100{color:#b388ff!important}.mdl-color--deep-purple-A100{background-color:#b388ff!important}.mdl-color-text--deep-purple-A200{color:#7c4dff!important}.mdl-color--deep-purple-A200{background-color:#7c4dff!important}.mdl-color-text--deep-purple-A400{color:#651fff!important}.mdl-color--deep-purple-A400{background-color:#651fff!important}.mdl-color-text--deep-purple-A700{color:#6200ea!important}.mdl-color--deep-purple-A700{background-color:#6200ea!important}.mdl-color-text--indigo{color:#3f51b5!important}.mdl-color--indigo{background-color:#3f51b5!important}.mdl-color-text--indigo-50{color:#e8eaf6!important}.mdl-color--indigo-50{background-color:#e8eaf6!important}.mdl-color-text--indigo-100{color:#c5cae9!important}.mdl-color--indigo-100{background-color:#c5cae9!important}.mdl-color-text--indigo-200{color:#9fa8da!important}.mdl-color--indigo-200{background-color:#9fa8da!important}.mdl-color-text--indigo-300{color:#7986cb!important}.mdl-color--indigo-300{background-color:#7986cb!important}.mdl-color-text--indigo-400{color:#5c6bc0!important}.mdl-color--indigo-400{background-color:#5c6bc0!important}.mdl-color-text--indigo-500{color:#3f51b5!important}.mdl-color--indigo-500{background-color:#3f51b5!important}.mdl-color-text--indigo-600{color:#3949ab!important}.mdl-color--indigo-600{background-color:#3949ab!important}.mdl-color-text--indigo-700{color:#303f9f!important}.mdl-color--indigo-700{background-color:#303f9f!important}.mdl-color-text--indigo-800{color:#283593!important}.mdl-color--indigo-800{background-color:#283593!important}.mdl-color-text--indigo-900{color:#1a237e!important}.mdl-color--indigo-900{background-color:#1a237e!important}.mdl-color-text--indigo-A100{color:#8c9eff!important}.mdl-color--indigo-A100{background-color:#8c9eff!important}.mdl-color-text--indigo-A200{color:#536dfe!important}.mdl-color--indigo-A200{background-color:#536dfe!important}.mdl-color-text--indigo-A400{color:#3d5afe!important}.mdl-color--indigo-A400{background-color:#3d5afe!important}.mdl-color-text--indigo-A700{color:#304ffe!important}.mdl-color--indigo-A700{background-color:#304ffe!important}.mdl-color-text--blue{color:#2196f3!important}.mdl-color--blue{background-color:#2196f3!important}.mdl-color-text--blue-50{color:#e3f2fd!important}.mdl-color--blue-50{background-color:#e3f2fd!important}.mdl-color-text--blue-100{color:#bbdefb!important}.mdl-color--blue-100{background-color:#bbdefb!important}.mdl-color-text--blue-200{color:#90caf9!important}.mdl-color--blue-200{background-color:#90caf9!important}.mdl-color-text--blue-300{color:#64b5f6!important}.mdl-color--blue-300{background-color:#64b5f6!important}.mdl-color-text--blue-400{color:#42a5f5!important}.mdl-color--blue-400{background-color:#42a5f5!important}.mdl-color-text--blue-500{color:#2196f3!important}.mdl-color--blue-500{background-color:#2196f3!important}.mdl-color-text--blue-600{color:#1e88e5!important}.mdl-color--blue-600{background-color:#1e88e5!important}.mdl-color-text--blue-700{color:#1976d2!important}.mdl-color--blue-700{background-color:#1976d2!important}.mdl-color-text--blue-800{color:#1565c0!important}.mdl-color--blue-800{background-color:#1565c0!important}.mdl-color-text--blue-900{color:#0d47a1!important}.mdl-color--blue-900{background-color:#0d47a1!important}.mdl-color-text--blue-A100{color:#82b1ff!important}.mdl-color--blue-A100{background-color:#82b1ff!important}.mdl-color-text--blue-A200{color:#448aff!important}.mdl-color--blue-A200{background-color:#448aff!important}.mdl-color-text--blue-A400{color:#2979ff!important}.mdl-color--blue-A400{background-color:#2979ff!important}.mdl-color-text--blue-A700{color:#2962ff!important}.mdl-color--blue-A700{background-color:#2962ff!important}.mdl-color-text--light-blue{color:#03a9f4!important}.mdl-color--light-blue{background-color:#03a9f4!important}.mdl-color-text--light-blue-50{color:#e1f5fe!important}.mdl-color--light-blue-50{background-color:#e1f5fe!important}.mdl-color-text--light-blue-100{color:#b3e5fc!important}.mdl-color--light-blue-100{background-color:#b3e5fc!important}.mdl-color-text--light-blue-200{color:#81d4fa!important}.mdl-color--light-blue-200{background-color:#81d4fa!important}.mdl-color-text--light-blue-300{color:#4fc3f7!important}.mdl-color--light-blue-300{background-color:#4fc3f7!important}.mdl-color-text--light-blue-400{color:#29b6f6!important}.mdl-color--light-blue-400{background-color:#29b6f6!important}.mdl-color-text--light-blue-500{color:#03a9f4!important}.mdl-color--light-blue-500{background-color:#03a9f4!important}.mdl-color-text--light-blue-600{color:#039be5!important}.mdl-color--light-blue-600{background-color:#039be5!important}.mdl-color-text--light-blue-700{color:#0288d1!important}.mdl-color--light-blue-700{background-color:#0288d1!important}.mdl-color-text--light-blue-800{color:#0277bd!important}.mdl-color--light-blue-800{background-color:#0277bd!important}.mdl-color-text--light-blue-900{color:#01579b!important}.mdl-color--light-blue-900{background-color:#01579b!important}.mdl-color-text--light-blue-A100{color:#80d8ff!important}.mdl-color--light-blue-A100{background-color:#80d8ff!important}.mdl-color-text--light-blue-A200{color:#40c4ff!important}.mdl-color--light-blue-A200{background-color:#40c4ff!important}.mdl-color-text--light-blue-A400{color:#00b0ff!important}.mdl-color--light-blue-A400{background-color:#00b0ff!important}.mdl-color-text--light-blue-A700{color:#0091ea!important}.mdl-color--light-blue-A700{background-color:#0091ea!important}.mdl-color-text--cyan{color:#00bcd4!important}.mdl-color--cyan{background-color:#00bcd4!important}.mdl-color-text--cyan-50{color:#e0f7fa!important}.mdl-color--cyan-50{background-color:#e0f7fa!important}.mdl-color-text--cyan-100{color:#b2ebf2!important}.mdl-color--cyan-100{background-color:#b2ebf2!important}.mdl-color-text--cyan-200{color:#80deea!important}.mdl-color--cyan-200{background-color:#80deea!important}.mdl-color-text--cyan-300{color:#4dd0e1!important}.mdl-color--cyan-300{background-color:#4dd0e1!important}.mdl-color-text--cyan-400{color:#26c6da!important}.mdl-color--cyan-400{background-color:#26c6da!important}.mdl-color-text--cyan-500{color:#00bcd4!important}.mdl-color--cyan-500{background-color:#00bcd4!important}.mdl-color-text--cyan-600{color:#00acc1!important}.mdl-color--cyan-600{background-color:#00acc1!important}.mdl-color-text--cyan-700{color:#0097a7!important}.mdl-color--cyan-700{background-color:#0097a7!important}.mdl-color-text--cyan-800{color:#00838f!important}.mdl-color--cyan-800{background-color:#00838f!important}.mdl-color-text--cyan-900{color:#006064!important}.mdl-color--cyan-900{background-color:#006064!important}.mdl-color-text--cyan-A100{color:#84ffff!important}.mdl-color--cyan-A100{background-color:#84ffff!important}.mdl-color-text--cyan-A200{color:#18ffff!important}.mdl-color--cyan-A200{background-color:#18ffff!important}.mdl-color-text--cyan-A400{color:#00e5ff!important}.mdl-color--cyan-A400{background-color:#00e5ff!important}.mdl-color-text--cyan-A700{color:#00b8d4!important}.mdl-color--cyan-A700{background-color:#00b8d4!important}.mdl-color-text--teal{color:#009688!important}.mdl-color--teal{background-color:#009688!important}.mdl-color-text--teal-50{color:#e0f2f1!important}.mdl-color--teal-50{background-color:#e0f2f1!important}.mdl-color-text--teal-100{color:#b2dfdb!important}.mdl-color--teal-100{background-color:#b2dfdb!important}.mdl-color-text--teal-200{color:#80cbc4!important}.mdl-color--teal-200{background-color:#80cbc4!important}.mdl-color-text--teal-300{color:#4db6ac!important}.mdl-color--teal-300{background-color:#4db6ac!important}.mdl-color-text--teal-400{color:#26a69a!important}.mdl-color--teal-400{background-color:#26a69a!important}.mdl-color-text--teal-500{color:#009688!important}.mdl-color--teal-500{background-color:#009688!important}.mdl-color-text--teal-600{color:#00897b!important}.mdl-color--teal-600{background-color:#00897b!important}.mdl-color-text--teal-700{color:#00796b!important}.mdl-color--teal-700{background-color:#00796b!important}.mdl-color-text--teal-800{color:#00695c!important}.mdl-color--teal-800{background-color:#00695c!important}.mdl-color-text--teal-900{color:#004d40!important}.mdl-color--teal-900{background-color:#004d40!important}.mdl-color-text--teal-A100{color:#a7ffeb!important}.mdl-color--teal-A100{background-color:#a7ffeb!important}.mdl-color-text--teal-A200{color:#64ffda!important}.mdl-color--teal-A200{background-color:#64ffda!important}.mdl-color-text--teal-A400{color:#1de9b6!important}.mdl-color--teal-A400{background-color:#1de9b6!important}.mdl-color-text--teal-A700{color:#00bfa5!important}.mdl-color--teal-A700{background-color:#00bfa5!important}.mdl-color-text--green{color:#4caf50!important}.mdl-color--green{background-color:#4caf50!important}.mdl-color-text--green-50{color:#e8f5e9!important}.mdl-color--green-50{background-color:#e8f5e9!important}.mdl-color-text--green-100{color:#c8e6c9!important}.mdl-color--green-100{background-color:#c8e6c9!important}.mdl-color-text--green-200{color:#a5d6a7!important}.mdl-color--green-200{background-color:#a5d6a7!important}.mdl-color-text--green-300{color:#81c784!important}.mdl-color--green-300{background-color:#81c784!important}.mdl-color-text--green-400{color:#66bb6a!important}.mdl-color--green-400{background-color:#66bb6a!important}.mdl-color-text--green-500{color:#4caf50!important}.mdl-color--green-500{background-color:#4caf50!important}.mdl-color-text--green-600{color:#43a047!important}.mdl-color--green-600{background-color:#43a047!important}.mdl-color-text--green-700{color:#388e3c!important}.mdl-color--green-700{background-color:#388e3c!important}.mdl-color-text--green-800{color:#2e7d32!important}.mdl-color--green-800{background-color:#2e7d32!important}.mdl-color-text--green-900{color:#1b5e20!important}.mdl-color--green-900{background-color:#1b5e20!important}.mdl-color-text--green-A100{color:#b9f6ca!important}.mdl-color--green-A100{background-color:#b9f6ca!important}.mdl-color-text--green-A200{color:#69f0ae!important}.mdl-color--green-A200{background-color:#69f0ae!important}.mdl-color-text--green-A400{color:#00e676!important}.mdl-color--green-A400{background-color:#00e676!important}.mdl-color-text--green-A700{color:#00c853!important}.mdl-color--green-A700{background-color:#00c853!important}.mdl-color-text--light-green{color:#8bc34a!important}.mdl-color--light-green{background-color:#8bc34a!important}.mdl-color-text--light-green-50{color:#f1f8e9!important}.mdl-color--light-green-50{background-color:#f1f8e9!important}.mdl-color-text--light-green-100{color:#dcedc8!important}.mdl-color--light-green-100{background-color:#dcedc8!important}.mdl-color-text--light-green-200{color:#c5e1a5!important}.mdl-color--light-green-200{background-color:#c5e1a5!important}.mdl-color-text--light-green-300{color:#aed581!important}.mdl-color--light-green-300{background-color:#aed581!important}.mdl-color-text--light-green-400{color:#9ccc65!important}.mdl-color--light-green-400{background-color:#9ccc65!important}.mdl-color-text--light-green-500{color:#8bc34a!important}.mdl-color--light-green-500{background-color:#8bc34a!important}.mdl-color-text--light-green-600{color:#7cb342!important}.mdl-color--light-green-600{background-color:#7cb342!important}.mdl-color-text--light-green-700{color:#689f38!important}.mdl-color--light-green-700{background-color:#689f38!important}.mdl-color-text--light-green-800{color:#558b2f!important}.mdl-color--light-green-800{background-color:#558b2f!important}.mdl-color-text--light-green-900{color:#33691e!important}.mdl-color--light-green-900{background-color:#33691e!important}.mdl-color-text--light-green-A100{color:#ccff90!important}.mdl-color--light-green-A100{background-color:#ccff90!important}.mdl-color-text--light-green-A200{color:#b2ff59!important}.mdl-color--light-green-A200{background-color:#b2ff59!important}.mdl-color-text--light-green-A400{color:#76ff03!important}.mdl-color--light-green-A400{background-color:#76ff03!important}.mdl-color-text--light-green-A700{color:#64dd17!important}.mdl-color--light-green-A700{background-color:#64dd17!important}.mdl-color-text--lime{color:#cddc39!important}.mdl-color--lime{background-color:#cddc39!important}.mdl-color-text--lime-50{color:#f9fbe7!important}.mdl-color--lime-50{background-color:#f9fbe7!important}.mdl-color-text--lime-100{color:#f0f4c3!important}.mdl-color--lime-100{background-color:#f0f4c3!important}.mdl-color-text--lime-200{color:#e6ee9c!important}.mdl-color--lime-200{background-color:#e6ee9c!important}.mdl-color-text--lime-300{color:#dce775!important}.mdl-color--lime-300{background-color:#dce775!important}.mdl-color-text--lime-400{color:#d4e157!important}.mdl-color--lime-400{background-color:#d4e157!important}.mdl-color-text--lime-500{color:#cddc39!important}.mdl-color--lime-500{background-color:#cddc39!important}.mdl-color-text--lime-600{color:#c0ca33!important}.mdl-color--lime-600{background-color:#c0ca33!important}.mdl-color-text--lime-700{color:#afb42b!important}.mdl-color--lime-700{background-color:#afb42b!important}.mdl-color-text--lime-800{color:#9e9d24!important}.mdl-color--lime-800{background-color:#9e9d24!important}.mdl-color-text--lime-900{color:#827717!important}.mdl-color--lime-900{background-color:#827717!important}.mdl-color-text--lime-A100{color:#f4ff81!important}.mdl-color--lime-A100{background-color:#f4ff81!important}.mdl-color-text--lime-A200{color:#eeff41!important}.mdl-color--lime-A200{background-color:#eeff41!important}.mdl-color-text--lime-A400{color:#c6ff00!important}.mdl-color--lime-A400{background-color:#c6ff00!important}.mdl-color-text--lime-A700{color:#aeea00!important}.mdl-color--lime-A700{background-color:#aeea00!important}.mdl-color-text--yellow{color:#ffeb3b!important}.mdl-color--yellow{background-color:#ffeb3b!important}.mdl-color-text--yellow-50{color:#fffde7!important}.mdl-color--yellow-50{background-color:#fffde7!important}.mdl-color-text--yellow-100{color:#fff9c4!important}.mdl-color--yellow-100{background-color:#fff9c4!important}.mdl-color-text--yellow-200{color:#fff59d!important}.mdl-color--yellow-200{background-color:#fff59d!important}.mdl-color-text--yellow-300{color:#fff176!important}.mdl-color--yellow-300{background-color:#fff176!important}.mdl-color-text--yellow-400{color:#ffee58!important}.mdl-color--yellow-400{background-color:#ffee58!important}.mdl-color-text--yellow-500{color:#ffeb3b!important}.mdl-color--yellow-500{background-color:#ffeb3b!important}.mdl-color-text--yellow-600{color:#fdd835!important}.mdl-color--yellow-600{background-color:#fdd835!important}.mdl-color-text--yellow-700{color:#fbc02d!important}.mdl-color--yellow-700{background-color:#fbc02d!important}.mdl-color-text--yellow-800{color:#f9a825!important}.mdl-color--yellow-800{background-color:#f9a825!important}.mdl-color-text--yellow-900{color:#f57f17!important}.mdl-color--yellow-900{background-color:#f57f17!important}.mdl-color-text--yellow-A100{color:#ffff8d!important}.mdl-color--yellow-A100{background-color:#ffff8d!important}.mdl-color-text--yellow-A200{color:#ff0!important}.mdl-color--yellow-A200{background-color:#ff0!important}.mdl-color-text--yellow-A400{color:#ffea00!important}.mdl-color--yellow-A400{background-color:#ffea00!important}.mdl-color-text--yellow-A700{color:#ffd600!important}.mdl-color--yellow-A700{background-color:#ffd600!important}.mdl-color-text--amber{color:#ffc107!important}.mdl-color--amber{background-color:#ffc107!important}.mdl-color-text--amber-50{color:#fff8e1!important}.mdl-color--amber-50{background-color:#fff8e1!important}.mdl-color-text--amber-100{color:#ffecb3!important}.mdl-color--amber-100{background-color:#ffecb3!important}.mdl-color-text--amber-200{color:#ffe082!important}.mdl-color--amber-200{background-color:#ffe082!important}.mdl-color-text--amber-300{color:#ffd54f!important}.mdl-color--amber-300{background-color:#ffd54f!important}.mdl-color-text--amber-400{color:#ffca28!important}.mdl-color--amber-400{background-color:#ffca28!important}.mdl-color-text--amber-500{color:#ffc107!important}.mdl-color--amber-500{background-color:#ffc107!important}.mdl-color-text--amber-600{color:#ffb300!important}.mdl-color--amber-600{background-color:#ffb300!important}.mdl-color-text--amber-700{color:#ffa000!important}.mdl-color--amber-700{background-color:#ffa000!important}.mdl-color-text--amber-800{color:#ff8f00!important}.mdl-color--amber-800{background-color:#ff8f00!important}.mdl-color-text--amber-900{color:#ff6f00!important}.mdl-color--amber-900{background-color:#ff6f00!important}.mdl-color-text--amber-A100{color:#ffe57f!important}.mdl-color--amber-A100{background-color:#ffe57f!important}.mdl-color-text--amber-A200{color:#ffd740!important}.mdl-color--amber-A200{background-color:#ffd740!important}.mdl-color-text--amber-A400{color:#ffc400!important}.mdl-color--amber-A400{background-color:#ffc400!important}.mdl-color-text--amber-A700{color:#ffab00!important}.mdl-color--amber-A700{background-color:#ffab00!important}.mdl-color-text--orange{color:#ff9800!important}.mdl-color--orange{background-color:#ff9800!important}.mdl-color-text--orange-50{color:#fff3e0!important}.mdl-color--orange-50{background-color:#fff3e0!important}.mdl-color-text--orange-100{color:#ffe0b2!important}.mdl-color--orange-100{background-color:#ffe0b2!important}.mdl-color-text--orange-200{color:#ffcc80!important}.mdl-color--orange-200{background-color:#ffcc80!important}.mdl-color-text--orange-300{color:#ffb74d!important}.mdl-color--orange-300{background-color:#ffb74d!important}.mdl-color-text--orange-400{color:#ffa726!important}.mdl-color--orange-400{background-color:#ffa726!important}.mdl-color-text--orange-500{color:#ff9800!important}.mdl-color--orange-500{background-color:#ff9800!important}.mdl-color-text--orange-600{color:#fb8c00!important}.mdl-color--orange-600{background-color:#fb8c00!important}.mdl-color-text--orange-700{color:#f57c00!important}.mdl-color--orange-700{background-color:#f57c00!important}.mdl-color-text--orange-800{color:#ef6c00!important}.mdl-color--orange-800{background-color:#ef6c00!important}.mdl-color-text--orange-900{color:#e65100!important}.mdl-color--orange-900{background-color:#e65100!important}.mdl-color-text--orange-A100{color:#ffd180!important}.mdl-color--orange-A100{background-color:#ffd180!important}.mdl-color-text--orange-A200{color:#ffab40!important}.mdl-color--orange-A200{background-color:#ffab40!important}.mdl-color-text--orange-A400{color:#ff9100!important}.mdl-color--orange-A400{background-color:#ff9100!important}.mdl-color-text--orange-A700{color:#ff6d00!important}.mdl-color--orange-A700{background-color:#ff6d00!important}.mdl-color-text--deep-orange{color:#ff5722!important}.mdl-color--deep-orange{background-color:#ff5722!important}.mdl-color-text--deep-orange-50{color:#fbe9e7!important}.mdl-color--deep-orange-50{background-color:#fbe9e7!important}.mdl-color-text--deep-orange-100{color:#ffccbc!important}.mdl-color--deep-orange-100{background-color:#ffccbc!important}.mdl-color-text--deep-orange-200{color:#ffab91!important}.mdl-color--deep-orange-200{background-color:#ffab91!important}.mdl-color-text--deep-orange-300{color:#ff8a65!important}.mdl-color--deep-orange-300{background-color:#ff8a65!important}.mdl-color-text--deep-orange-400{color:#ff7043!important}.mdl-color--deep-orange-400{background-color:#ff7043!important}.mdl-color-text--deep-orange-500{color:#ff5722!important}.mdl-color--deep-orange-500{background-color:#ff5722!important}.mdl-color-text--deep-orange-600{color:#f4511e!important}.mdl-color--deep-orange-600{background-color:#f4511e!important}.mdl-color-text--deep-orange-700{color:#e64a19!important}.mdl-color--deep-orange-700{background-color:#e64a19!important}.mdl-color-text--deep-orange-800{color:#d84315!important}.mdl-color--deep-orange-800{background-color:#d84315!important}.mdl-color-text--deep-orange-900{color:#bf360c!important}.mdl-color--deep-orange-900{background-color:#bf360c!important}.mdl-color-text--deep-orange-A100{color:#ff9e80!important}.mdl-color--deep-orange-A100{background-color:#ff9e80!important}.mdl-color-text--deep-orange-A200{color:#ff6e40!important}.mdl-color--deep-orange-A200{background-color:#ff6e40!important}.mdl-color-text--deep-orange-A400{color:#ff3d00!important}.mdl-color--deep-orange-A400{background-color:#ff3d00!important}.mdl-color-text--deep-orange-A700{color:#dd2c00!important}.mdl-color--deep-orange-A700{background-color:#dd2c00!important}.mdl-color-text--brown{color:#795548!important}.mdl-color--brown{background-color:#795548!important}.mdl-color-text--brown-50{color:#efebe9!important}.mdl-color--brown-50{background-color:#efebe9!important}.mdl-color-text--brown-100{color:#d7ccc8!important}.mdl-color--brown-100{background-color:#d7ccc8!important}.mdl-color-text--brown-200{color:#bcaaa4!important}.mdl-color--brown-200{background-color:#bcaaa4!important}.mdl-color-text--brown-300{color:#a1887f!important}.mdl-color--brown-300{background-color:#a1887f!important}.mdl-color-text--brown-400{color:#8d6e63!important}.mdl-color--brown-400{background-color:#8d6e63!important}.mdl-color-text--brown-500{color:#795548!important}.mdl-color--brown-500{background-color:#795548!important}.mdl-color-text--brown-600{color:#6d4c41!important}.mdl-color--brown-600{background-color:#6d4c41!important}.mdl-color-text--brown-700{color:#5d4037!important}.mdl-color--brown-700{background-color:#5d4037!important}.mdl-color-text--brown-800{color:#4e342e!important}.mdl-color--brown-800{background-color:#4e342e!important}.mdl-color-text--brown-900{color:#3e2723!important}.mdl-color--brown-900{background-color:#3e2723!important}.mdl-color-text--grey{color:#9e9e9e!important}.mdl-color--grey{background-color:#9e9e9e!important}.mdl-color-text--grey-50{color:#fafafa!important}.mdl-color--grey-50{background-color:#fafafa!important}.mdl-color-text--grey-100{color:#f5f5f5!important}.mdl-color--grey-100{background-color:#f5f5f5!important}.mdl-color-text--grey-200{color:#eee!important}.mdl-color--grey-200{background-color:#eee!important}.mdl-color-text--grey-300{color:#e0e0e0!important}.mdl-color--grey-300{background-color:#e0e0e0!important}.mdl-color-text--grey-400{color:#bdbdbd!important}.mdl-color--grey-400{background-color:#bdbdbd!important}.mdl-color-text--grey-500{color:#9e9e9e!important}.mdl-color--grey-500{background-color:#9e9e9e!important}.mdl-color-text--grey-600{color:#757575!important}.mdl-color--grey-600{background-color:#757575!important}.mdl-color-text--grey-700{color:#616161!important}.mdl-color--grey-700{background-color:#616161!important}.mdl-color-text--grey-800{color:#424242!important}.mdl-color--grey-800{background-color:#424242!important}.mdl-color-text--grey-900{color:#212121!important}.mdl-color--grey-900{background-color:#212121!important}.mdl-color-text--blue-grey{color:#607d8b!important}.mdl-color--blue-grey{background-color:#607d8b!important}.mdl-color-text--blue-grey-50{color:#eceff1!important}.mdl-color--blue-grey-50{background-color:#eceff1!important}.mdl-color-text--blue-grey-100{color:#cfd8dc!important}.mdl-color--blue-grey-100{background-color:#cfd8dc!important}.mdl-color-text--blue-grey-200{color:#b0bec5!important}.mdl-color--blue-grey-200{background-color:#b0bec5!important}.mdl-color-text--blue-grey-300{color:#90a4ae!important}.mdl-color--blue-grey-300{background-color:#90a4ae!important}.mdl-color-text--blue-grey-400{color:#78909c!important}.mdl-color--blue-grey-400{background-color:#78909c!important}.mdl-color-text--blue-grey-500{color:#607d8b!important}.mdl-color--blue-grey-500{background-color:#607d8b!important}.mdl-color-text--blue-grey-600{color:#546e7a!important}.mdl-color--blue-grey-600{background-color:#546e7a!important}.mdl-color-text--blue-grey-700{color:#455a64!important}.mdl-color--blue-grey-700{background-color:#455a64!important}.mdl-color-text--blue-grey-800{color:#37474f!important}.mdl-color--blue-grey-800{background-color:#37474f!important}.mdl-color-text--blue-grey-900{color:#263238!important}.mdl-color--blue-grey-900{background-color:#263238!important}.mdl-color--black{background-color:#000!important}.mdl-color-text--black{color:#000!important}.mdl-color--white{background-color:#fff!important}.mdl-color-text--white{color:#fff!important}.mdl-color--primary{background-color:#3f51b5!important}.mdl-color--primary-contrast{background-color:#fff!important}.mdl-color--primary-dark{background-color:#303f9f!important}.mdl-color--accent{background-color:#ff4081!important}.mdl-color--accent-contrast{background-color:#fff!important}.mdl-color-text--primary{color:#3f51b5!important}.mdl-color-text--primary-contrast{color:#fff!important}.mdl-color-text--primary-dark{color:#303f9f!important}.mdl-color-text--accent{color:#ff4081!important}.mdl-color-text--accent-contrast{color:#fff!important}.mdl-ripple{background:#000;border-radius:50%;height:50px;left:0;opacity:0;pointer-events:none;position:absolute;top:0;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);width:50px;overflow:hidden}.mdl-ripple.is-animating{-webkit-transition:-webkit-transform .3s cubic-bezier(0,0,.2,1),width .3s cubic-bezier(0,0,.2,1),height .3s cubic-bezier(0,0,.2,1),opacity .6s cubic-bezier(0,0,.2,1);transition:transform .3s cubic-bezier(0,0,.2,1),width .3s cubic-bezier(0,0,.2,1),height .3s cubic-bezier(0,0,.2,1),opacity .6s cubic-bezier(0,0,.2,1)}.mdl-ripple.is-visible{opacity:.3}.mdl-animation--default,.mdl-animation--fast-out-slow-in{-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.mdl-animation--linear-out-slow-in{-webkit-transition-timing-function:cubic-bezier(0,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1)}.mdl-animation--fast-out-linear-in{-webkit-transition-timing-function:cubic-bezier(.4,0,1,1);transition-timing-function:cubic-bezier(.4,0,1,1)}.mdl-badge{position:relative;white-space:nowrap;margin-right:24px}.mdl-badge:not([data-badge]){margin-right:auto}.mdl-badge[data-badge]:after{content:attr(data-badge);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;position:absolute;top:-11px;right:-24px;font-family:Roboto,Helvetica,Arial,sans-serif;font-weight:600;font-size:12px;width:22px;height:22px;border-radius:50%;background:#ff4081;color:#fff}.mdl-button .mdl-badge[data-badge]:after{top:-10px;right:-5px}.mdl-badge.mdl-badge--no-background[data-badge]:after{color:#ff4081;background:rgba(255,255,255,.2);box-shadow:0 0 1px gray}.mdl-button{background:0 0;border:none;border-radius:2px;color:#000;position:relative;height:36px;min-width:64px;padding:0 8px;display:inline-block;font-family:Roboto,Helvetica,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:0;overflow:hidden;will-change:box-shadow,transform;-webkit-transition:box-shadow .2s cubic-bezier(.4,0,1,1),background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1);transition:box-shadow .2s cubic-bezier(.4,0,1,1),background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1);outline:0;cursor:pointer;text-align:center;line-height:36px}.mdl-button--fab,.mdl-button--icon{overflow:hidden;font-size:24px;padding:0}.mdl-button::-moz-focus-inner{border:0}.mdl-button:hover{background-color:rgba(158,158,158,.2)}.mdl-button:focus:not(:active){background-color:rgba(0,0,0,.12)}.mdl-button:active{background-color:rgba(158,158,158,.4)}.mdl-button.mdl-button--colored{color:#3f51b5}.mdl-button.mdl-button--colored:focus:not(:active){background-color:rgba(0,0,0,.12)}input.mdl-button[type=submit]{-webkit-appearance:none}.mdl-button--raised{background:rgba(158,158,158,.2);box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.mdl-button--raised:active{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.2);background-color:rgba(158,158,158,.4)}.mdl-button--raised:focus:not(:active){box-shadow:0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36);background-color:rgba(158,158,158,.4)}.mdl-button--raised.mdl-button--colored{background:#3f51b5;color:#fff}.mdl-button--raised.mdl-button--colored:active,.mdl-button--raised.mdl-button--colored:focus:not(:active),.mdl-button--raised.mdl-button--colored:hover{background-color:#3f51b5}.mdl-button--raised.mdl-button--colored .mdl-ripple{background:#fff}.mdl-button--fab{border-radius:50%;height:56px;margin:auto;min-width:56px;width:56px;background:rgba(158,158,158,.2);box-shadow:0 1px 1.5px 0 rgba(0,0,0,.12),0 1px 1px 0 rgba(0,0,0,.24);position:relative;line-height:normal}.mdl-button--fab .material-icons{transform:translate(-12px,-12px);line-height:24px;width:24px}.mdl-button--fab .material-icons,.mdl-button--icon .material-icons{position:absolute;top:50%;left:50%;-webkit-transform:translate(-12px,-12px);-ms-transform:translate(-12px,-12px)}.mdl-button--fab.mdl-button--mini-fab{height:40px;min-width:40px;width:40px}.mdl-button--fab .mdl-button__ripple-container{border-radius:50%;-webkit-mask-image:-webkit-radial-gradient(circle,#fff,#000)}.mdl-button--fab:active{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.2);background-color:rgba(158,158,158,.4)}.mdl-button--fab:focus:not(:active){box-shadow:0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36);background-color:rgba(158,158,158,.4)}.mdl-button--fab.mdl-button--colored{background:#ff4081;color:#fff}.mdl-button--fab.mdl-button--colored:active,.mdl-button--fab.mdl-button--colored:focus:not(:active),.mdl-button--fab.mdl-button--colored:hover{background-color:#ff4081}.mdl-button--fab.mdl-button--colored .mdl-ripple{background:#fff}.mdl-button--icon{border-radius:50%;height:32px;margin-left:0;margin-right:0;min-width:32px;width:32px;color:inherit;line-height:normal}.mdl-button--icon .material-icons{transform:translate(-12px,-12px);line-height:24px;width:24px}.mdl-button--icon.mdl-button--mini-icon{height:24px;min-width:24px;width:24px}.mdl-button--icon.mdl-button--mini-icon .material-icons{top:0;left:0}.mdl-button--icon .mdl-button__ripple-container{border-radius:50%;-webkit-mask-image:-webkit-radial-gradient(circle,#fff,#000)}.mdl-button__ripple-container{display:block;height:100%;left:0;position:absolute;top:0;width:100%;z-index:0;overflow:hidden}.mdl-button.mdl-button--disabled .mdl-button__ripple-container .mdl-ripple,.mdl-button[disabled] .mdl-button__ripple-container .mdl-ripple{background-color:transparent}.mdl-button--primary.mdl-button--primary{color:#3f51b5}.mdl-button--primary.mdl-button--primary .mdl-ripple{background:#fff}.mdl-button--primary.mdl-button--primary.mdl-button--fab,.mdl-button--primary.mdl-button--primary.mdl-button--raised{color:#fff;background-color:#3f51b5}.mdl-button--accent.mdl-button--accent{color:#ff4081}.mdl-button--accent.mdl-button--accent .mdl-ripple{background:#fff}.mdl-button--accent.mdl-button--accent.mdl-button--fab,.mdl-button--accent.mdl-button--accent.mdl-button--raised{color:#fff;background-color:#ff4081}.mdl-button.mdl-button--disabled.mdl-button--disabled,.mdl-button[disabled][disabled]{color:rgba(0,0,0,.26);cursor:auto;background-color:transparent}.mdl-button--fab.mdl-button--disabled.mdl-button--disabled,.mdl-button--fab[disabled][disabled],.mdl-button--raised.mdl-button--disabled.mdl-button--disabled,.mdl-button--raised[disabled][disabled]{background-color:rgba(0,0,0,.12);color:rgba(0,0,0,.26);box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.mdl-button--colored.mdl-button--disabled.mdl-button--disabled,.mdl-button--colored[disabled][disabled]{color:rgba(0,0,0,.26)}.mdl-card{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;font-size:16px;font-weight:400;min-height:200px;overflow:hidden;width:330px;z-index:1;position:relative;background:#fff;border-radius:2px}.mdl-card__media{background-color:#ff4081;background-repeat:repeat;background-position:50% 50%;background-size:cover;background-origin:padding-box;background-attachment:scroll}.mdl-card__title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#000;display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:stretch;-webkit-justify-content:stretch;-ms-flex-pack:stretch;justify-content:stretch;line-height:normal;padding:16px;-webkit-perspective-origin:165px 56px;perspective-origin:165px 56px;-webkit-transform-origin:165px 56px;-ms-transform-origin:165px 56px;transform-origin:165px 56px}.mdl-card__title.mdl-card--border{border-bottom:1px solid rgba(0,0,0,.1)}.mdl-card__title-text{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;color:inherit;display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;font-size:24px;font-weight:300;line-height:normal;overflow:hidden;-webkit-transform-origin:149px 48px;-ms-transform-origin:149px 48px;transform-origin:149px 48px;margin:0}.mdl-card__subtitle-text{font-size:14px;color:grey;margin:0}.mdl-card__supporting-text{color:rgba(0,0,0,.54);font-size:13px;line-height:18px;overflow:hidden;padding:16px;width:90%}.mdl-card__actions,.mdl-checkbox{box-sizing:border-box;width:100%}.mdl-card__actions{font-size:16px;line-height:normal;background-color:transparent;padding:8px}.mdl-card__actions.mdl-card--border{border-top:1px solid rgba(0,0,0,.1)}.mdl-card--expand{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.mdl-card__menu{position:absolute;right:16px;top:16px}.mdl-checkbox{position:relative;z-index:1;display:inline-block;height:24px;margin:0;padding:0}.mdl-checkbox.is-upgraded{padding-left:24px}.mdl-checkbox__input{line-height:24px}.mdl-checkbox.is-upgraded .mdl-checkbox__input{position:absolute;width:0;height:0;margin:0;padding:0;opacity:0;-ms-appearance:none;-moz-appearance:none;-webkit-appearance:none;appearance:none;border:none}.mdl-checkbox__box-outline,.mdl-checkbox__focus-helper{position:absolute;left:0;top:3px;display:inline-block;box-sizing:border-box;width:16px;height:16px}.mdl-checkbox__box-outline{margin:0;cursor:pointer;overflow:hidden;border:2px solid rgba(0,0,0,.54);border-radius:2px;z-index:2}.mdl-checkbox.is-checked .mdl-checkbox__box-outline{border:2px solid #3f51b5}.mdl-checkbox.is-disabled .mdl-checkbox__box-outline{border:2px solid rgba(0,0,0,.26);cursor:auto}.mdl-checkbox__focus-helper{border-radius:50%;background-color:transparent}.mdl-checkbox.is-focused .mdl-checkbox__focus-helper{box-shadow:0 0 0 8px rgba(0,0,0,.1);background-color:rgba(0,0,0,.1)}.mdl-checkbox.is-focused.is-checked .mdl-checkbox__focus-helper{box-shadow:0 0 0 8px rgba(63,81,181,.26);background-color:rgba(63,81,181,.26)}.mdl-layout__drawer,.mdl-layout__header,.mdl-menu__outline{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.mdl-checkbox__tick-outline{position:absolute;top:0;left:0;height:100%;width:100%;-webkit-mask:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8ZGVmcz4KICAgIDxjbGlwUGF0aCBpZD0iY2xpcCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMCwwIDAsMSAxLDEgMSwwIDAsMCB6IE0gMC44NTM0Mzc1LDAuMTY3MTg3NSAwLjk1OTY4NzUsMC4yNzMxMjUgMC40MjkzNzUsMC44MDM0Mzc1IDAuMzIzMTI1LDAuOTA5Njg3NSAwLjIxNzE4NzUsMC44MDM0Mzc1IDAuMDQwMzEyNSwwLjYyNjg3NSAwLjE0NjU2MjUsMC41MjA2MjUgMC4zMjMxMjUsMC42OTc1IDAuODUzNDM3NSwwLjE2NzE4NzUgeiIKICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDwvY2xpcFBhdGg+CiAgICA8bWFzayBpZD0ibWFzayIgbWFza1VuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgbWFza0NvbnRlbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDAsMCAwLDEgMSwxIDEsMCAwLDAgeiBNIDAuODUzNDM3NSwwLjE2NzE4NzUgMC45NTk2ODc1LDAuMjczMTI1IDAuNDI5Mzc1LDAuODAzNDM3NSAwLjMyMzEyNSwwLjkwOTY4NzUgMC4yMTcxODc1LDAuODAzNDM3NSAwLjA0MDMxMjUsMC42MjY4NzUgMC4xNDY1NjI1LDAuNTIwNjI1IDAuMzIzMTI1LDAuNjk3NSAwLjg1MzQzNzUsMC4xNjcxODc1IHoiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICA8L21hc2s+CiAgPC9kZWZzPgogIDxyZWN0CiAgICAgd2lkdGg9IjEiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjAiCiAgICAgeT0iMCIKICAgICBjbGlwLXBhdGg9InVybCgjY2xpcCkiCiAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KPC9zdmc+Cg==);mask:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8ZGVmcz4KICAgIDxjbGlwUGF0aCBpZD0iY2xpcCI+CiAgICAgIDxwYXRoCiAgICAgICAgIGQ9Ik0gMCwwIDAsMSAxLDEgMSwwIDAsMCB6IE0gMC44NTM0Mzc1LDAuMTY3MTg3NSAwLjk1OTY4NzUsMC4yNzMxMjUgMC40MjkzNzUsMC44MDM0Mzc1IDAuMzIzMTI1LDAuOTA5Njg3NSAwLjIxNzE4NzUsMC44MDM0Mzc1IDAuMDQwMzEyNSwwLjYyNjg3NSAwLjE0NjU2MjUsMC41MjA2MjUgMC4zMjMxMjUsMC42OTc1IDAuODUzNDM3NSwwLjE2NzE4NzUgeiIKICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KICAgIDwvY2xpcFBhdGg+CiAgICA8bWFzayBpZD0ibWFzayIgbWFza1VuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgbWFza0NvbnRlbnRVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPgogICAgICA8cGF0aAogICAgICAgICBkPSJNIDAsMCAwLDEgMSwxIDEsMCAwLDAgeiBNIDAuODUzNDM3NSwwLjE2NzE4NzUgMC45NTk2ODc1LDAuMjczMTI1IDAuNDI5Mzc1LDAuODAzNDM3NSAwLjMyMzEyNSwwLjkwOTY4NzUgMC4yMTcxODc1LDAuODAzNDM3NSAwLjA0MDMxMjUsMC42MjY4NzUgMC4xNDY1NjI1LDAuNTIwNjI1IDAuMzIzMTI1LDAuNjk3NSAwLjg1MzQzNzUsMC4xNjcxODc1IHoiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiIC8+CiAgICA8L21hc2s+CiAgPC9kZWZzPgogIDxyZWN0CiAgICAgd2lkdGg9IjEiCiAgICAgaGVpZ2h0PSIxIgogICAgIHg9IjAiCiAgICAgeT0iMCIKICAgICBjbGlwLXBhdGg9InVybCgjY2xpcCkiCiAgICAgc3R5bGU9ImZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIgLz4KPC9zdmc+Cg==);background:0 0;-webkit-transition-duration:.28s;transition-duration:.28s;transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-property:background;transition-property:background}.mdl-checkbox__tick-outline,.mdl-data-table tbody tr{-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1)}.mdl-checkbox__ripple-container,.mdl-icon-toggle__ripple-container{box-sizing:border-box;overflow:hidden;-webkit-mask-image:-webkit-radial-gradient(circle,#fff,#000)}.mdl-checkbox.is-checked .mdl-checkbox__tick-outline{background:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8cGF0aAogICAgIGQ9Ik0gMC4wNDAzODA1OSwwLjYyNjc3NjcgMC4xNDY0NDY2MSwwLjUyMDcxMDY4IDAuNDI5Mjg5MzIsMC44MDM1NTMzOSAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IE0gMC4yMTcxNTcyOSwwLjgwMzU1MzM5IDAuODUzNTUzMzksMC4xNjcxNTcyOSAwLjk1OTYxOTQxLDAuMjczMjIzMyAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IgogICAgIGlkPSJyZWN0Mzc4MCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4K) #3f51b5}.mdl-checkbox.is-checked.is-disabled .mdl-checkbox__tick-outline{background:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB2aWV3Qm94PSIwIDAgMSAxIgogICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0Ij4KICA8cGF0aAogICAgIGQ9Ik0gMC4wNDAzODA1OSwwLjYyNjc3NjcgMC4xNDY0NDY2MSwwLjUyMDcxMDY4IDAuNDI5Mjg5MzIsMC44MDM1NTMzOSAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IE0gMC4yMTcxNTcyOSwwLjgwMzU1MzM5IDAuODUzNTUzMzksMC4xNjcxNTcyOSAwLjk1OTYxOTQxLDAuMjczMjIzMyAwLjMyMzIyMzMsMC45MDk2MTk0MSB6IgogICAgIGlkPSJyZWN0Mzc4MCIKICAgICBzdHlsZT0iZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lIiAvPgo8L3N2Zz4K) rgba(0,0,0,.26)}.mdl-checkbox__label{position:relative;cursor:pointer;font-size:16px;line-height:24px;margin:0}.mdl-checkbox.is-disabled .mdl-checkbox__label{color:rgba(0,0,0,.26);cursor:auto}.mdl-checkbox__ripple-container{position:absolute;z-index:2;top:-6px;left:-10px;width:36px;height:36px;border-radius:50%;cursor:pointer}.mdl-checkbox__ripple-container .mdl-ripple{background:#3f51b5}.mdl-checkbox.is-disabled .mdl-checkbox__ripple-container{cursor:auto}.mdl-checkbox.is-disabled .mdl-checkbox__ripple-container .mdl-ripple{background:0 0}.mdl-data-table{position:relative;border:1px solid rgba(0,0,0,.12);border-collapse:collapse;white-space:nowrap;font-size:13px;background-color:#fff}.mdl-data-table thead{padding-bottom:3px}.mdl-data-table thead .mdl-data-table__select{margin-top:0}.mdl-data-table tbody tr{position:relative;height:48px;-webkit-transition-duration:.28s;transition-duration:.28s;transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-property:background-color;transition-property:background-color}.mdl-data-table tbody tr.is-selected{background-color:#e0e0e0}.mdl-data-table tbody tr:hover{background-color:#eee}.mdl-data-table td,.mdl-data-table th{padding:0 18px;text-align:right}.mdl-data-table td:first-of-type,.mdl-data-table th:first-of-type{padding-left:24px}.mdl-data-table td:last-of-type,.mdl-data-table th:last-of-type{padding-right:24px}.mdl-data-table td{position:relative;vertical-align:top;height:48px;border-top:1px solid rgba(0,0,0,.12);border-bottom:1px solid rgba(0,0,0,.12);padding-top:12px;box-sizing:border-box}.mdl-data-table td .mdl-data-table__select{vertical-align:top;position:absolute;left:24px}.mdl-data-table th{position:relative;vertical-align:bottom;text-overflow:ellipsis;font-weight:700;line-height:24px;letter-spacing:0;height:48px;font-size:12px;color:rgba(0,0,0,.54);padding-bottom:8px;box-sizing:border-box}.mdl-data-table th .mdl-data-table__select{position:absolute;bottom:8px;left:24px}.mdl-data-table__select{width:16px}.mdl-data-table__cell--non-numeric.mdl-data-table__cell--non-numeric{text-align:left}.mdl-mega-footer{padding:16px 40px;color:#9e9e9e;background-color:#424242}.mdl-mega-footer--bottom-section:after,.mdl-mega-footer--middle-section:after,.mdl-mega-footer--top-section:after,.mdl-mega-footer__bottom-section:after,.mdl-mega-footer__middle-section:after,.mdl-mega-footer__top-section:after{content:'';display:block;clear:both}.mdl-mega-footer--left-section,.mdl-mega-footer--right-section,.mdl-mega-footer__left-section,.mdl-mega-footer__right-section{margin-bottom:16px}.mdl-mega-footer--right-section a,.mdl-mega-footer__right-section a{display:block;margin-bottom:16px;color:inherit;text-decoration:none}@media screen and (min-width:760px){.mdl-mega-footer--left-section,.mdl-mega-footer__left-section{float:left}.mdl-mega-footer--right-section,.mdl-mega-footer__right-section{float:right}.mdl-mega-footer--right-section a,.mdl-mega-footer__right-section a{display:inline-block;margin-left:16px;line-height:36px;vertical-align:middle}}.mdl-mega-footer--social-btn,.mdl-mega-footer__social-btn{width:36px;height:36px;padding:0;margin:0;background-color:#9e9e9e;border:none}.mdl-mega-footer--drop-down-section,.mdl-mega-footer__drop-down-section{display:block;position:relative}@media screen and (min-width:760px){.mdl-mega-footer--drop-down-section,.mdl-mega-footer__drop-down-section{width:33%}.mdl-mega-footer--drop-down-section:nth-child(1),.mdl-mega-footer--drop-down-section:nth-child(2),.mdl-mega-footer__drop-down-section:nth-child(1),.mdl-mega-footer__drop-down-section:nth-child(2){float:left}.mdl-mega-footer--drop-down-section:nth-child(3),.mdl-mega-footer__drop-down-section:nth-child(3){float:right}.mdl-mega-footer--drop-down-section:nth-child(3):after,.mdl-mega-footer__drop-down-section:nth-child(3):after{clear:right}.mdl-mega-footer--drop-down-section:nth-child(4),.mdl-mega-footer__drop-down-section:nth-child(4){clear:right;float:right}.mdl-mega-footer--middle-section:after,.mdl-mega-footer__middle-section:after{content:'';display:block;clear:both}.mdl-mega-footer--bottom-section,.mdl-mega-footer__bottom-section{padding-top:0}}@media screen and (min-width:1024px){.mdl-mega-footer--drop-down-section,.mdl-mega-footer--drop-down-section:nth-child(3),.mdl-mega-footer--drop-down-section:nth-child(4),.mdl-mega-footer__drop-down-section,.mdl-mega-footer__drop-down-section:nth-child(3),.mdl-mega-footer__drop-down-section:nth-child(4){width:24%;float:left}}.mdl-mega-footer--heading-checkbox,.mdl-mega-footer__heading-checkbox{position:absolute;width:100%;height:55.8px;padding:32px;margin:-16px 0 0;cursor:pointer;z-index:1;opacity:0}.mdl-mega-footer--heading-checkbox~.mdl-mega-footer--heading:after,.mdl-mega-footer--heading-checkbox~.mdl-mega-footer__heading:after,.mdl-mega-footer__heading-checkbox~.mdl-mega-footer--heading:after,.mdl-mega-footer__heading-checkbox~.mdl-mega-footer__heading:after{font-family:'Material Icons';content:'\E5CE'}.mdl-mega-footer--heading-checkbox:checked~ul,.mdl-mega-footer__heading-checkbox:checked~ul{display:none}.mdl-mega-footer--heading-checkbox:checked~.mdl-mega-footer--heading:after,.mdl-mega-footer--heading-checkbox:checked~.mdl-mega-footer__heading:after,.mdl-mega-footer__heading-checkbox:checked~.mdl-mega-footer--heading:after,.mdl-mega-footer__heading-checkbox:checked~.mdl-mega-footer__heading:after{font-family:'Material Icons';content:'\E5CF'}.mdl-mega-footer--heading,.mdl-mega-footer__heading{position:relative;width:100%;padding-right:39.8px;margin-bottom:16px;box-sizing:border-box;font-size:14px;line-height:23.8px;font-weight:500;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;color:#e0e0e0}.mdl-mega-footer--heading:after,.mdl-mega-footer__heading:after{content:'';position:absolute;top:0;right:0;display:block;width:23.8px;height:23.8px;background-size:cover}.mdl-mega-footer--link-list,.mdl-mega-footer__link-list{list-style:none;margin:0 0 32px;padding:0}.mdl-mega-footer--link-list:after,.mdl-mega-footer__link-list:after{clear:both;display:block;content:''}.mdl-mega-footer--link-list li,.mdl-mega-footer__link-list li{font-size:14px;font-weight:400;letter-spacing:0;line-height:20px}.mdl-mega-footer--link-list a,.mdl-mega-footer__link-list a{color:inherit;text-decoration:none;white-space:nowrap}.mdl-mega-footer--bottom-section,.mdl-mega-footer__bottom-section{padding-top:16px;margin-bottom:16px}.mdl-logo{margin-bottom:16px;color:#fff}.mdl-mega-footer--bottom-section .mdl-mega-footer--link-list li,.mdl-mega-footer__bottom-section .mdl-mega-footer__link-list li{float:left;margin-bottom:0;margin-right:16px}@media screen and (min-width:760px){.mdl-mega-footer--heading-checkbox,.mdl-mega-footer__heading-checkbox{display:none}.mdl-mega-footer--heading-checkbox~.mdl-mega-footer--heading:after,.mdl-mega-footer--heading-checkbox~.mdl-mega-footer__heading:after,.mdl-mega-footer__heading-checkbox~.mdl-mega-footer--heading:after,.mdl-mega-footer__heading-checkbox~.mdl-mega-footer__heading:after{background-image:none}.mdl-mega-footer--heading-checkbox:checked~ul,.mdl-mega-footer__heading-checkbox:checked~ul{display:block}.mdl-mega-footer--heading-checkbox:checked~.mdl-mega-footer--heading:after,.mdl-mega-footer--heading-checkbox:checked~.mdl-mega-footer__heading:after,.mdl-mega-footer__heading-checkbox:checked~.mdl-mega-footer--heading:after,.mdl-mega-footer__heading-checkbox:checked~.mdl-mega-footer__heading:after{content:''}.mdl-logo{float:left;margin-bottom:0;margin-right:16px}}.mdl-mini-footer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:32px 16px;color:#9e9e9e;background-color:#424242}.mdl-mini-footer:after{content:'';display:block}.mdl-mini-footer .mdl-logo{line-height:36px}.mdl-mini-footer--link-list,.mdl-mini-footer__link-list{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row nowrap;-ms-flex-flow:row nowrap;flex-flow:row nowrap;list-style:none;margin:0;padding:0}.mdl-mini-footer--link-list li,.mdl-mini-footer__link-list li{margin-bottom:0;margin-right:16px}@media screen and (min-width:760px){.mdl-mini-footer--link-list li,.mdl-mini-footer__link-list li{line-height:36px}}.mdl-mini-footer--link-list a,.mdl-mini-footer__link-list a{color:inherit;text-decoration:none;white-space:nowrap}.mdl-mini-footer--left-section,.mdl-mini-footer__left-section{display:inline-block;-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.mdl-mini-footer--right-section,.mdl-mini-footer__right-section{display:inline-block;-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.mdl-mini-footer--social-btn,.mdl-mini-footer__social-btn{width:36px;height:36px;padding:0;margin:0;background-color:#9e9e9e;border:none}.mdl-icon-toggle{position:relative;z-index:1;vertical-align:middle;display:inline-block;height:32px;margin:0;padding:0}.mdl-icon-toggle__input{line-height:32px}.mdl-icon-toggle.is-upgraded .mdl-icon-toggle__input{position:absolute;width:0;height:0;margin:0;padding:0;opacity:0;-ms-appearance:none;-moz-appearance:none;-webkit-appearance:none;appearance:none;border:none}.mdl-icon-toggle__label{display:inline-block;position:relative;cursor:pointer;height:32px;width:32px;min-width:32px;color:#616161;border-radius:50%;padding:0;margin-left:0;margin-right:0;text-align:center;background-color:transparent;will-change:background-color;-webkit-transition:background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1);transition:background-color .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1)}.mdl-icon-toggle__label.material-icons{line-height:32px;font-size:24px}.mdl-icon-toggle.is-checked .mdl-icon-toggle__label{color:#3f51b5}.mdl-icon-toggle.is-disabled .mdl-icon-toggle__label{color:rgba(0,0,0,.26);cursor:auto;-webkit-transition:none;transition:none}.mdl-icon-toggle.is-focused .mdl-icon-toggle__label{background-color:rgba(0,0,0,.12)}.mdl-icon-toggle.is-focused.is-checked .mdl-icon-toggle__label{background-color:rgba(63,81,181,.26)}.mdl-icon-toggle__ripple-container{position:absolute;z-index:2;top:-2px;left:-2px;width:36px;height:36px;border-radius:50%;cursor:pointer}.mdl-menu,.mdl-menu__outline{position:absolute;top:0;left:0}.mdl-icon-toggle__ripple-container .mdl-ripple{background:#616161}.mdl-icon-toggle.is-disabled .mdl-icon-toggle__ripple-container{cursor:auto}.mdl-icon-toggle.is-disabled .mdl-icon-toggle__ripple-container .mdl-ripple{background:0 0}.mdl-menu__container{display:block;margin:0;padding:0;border:none;position:absolute;overflow:visible;height:0;width:0;visibility:hidden;z-index:-1}.mdl-menu__container.is-animating,.mdl-menu__container.is-visible{z-index:999;visibility:visible}.mdl-menu__outline{background:#fff;padding:0;border-radius:2px;overflow:hidden;opacity:0;-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;will-change:transform;-webkit-transition:-webkit-transform .3s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);z-index:-1}.mdl-menu__item,.mdl-menu__outline{margin:0;display:block;border:none}.mdl-menu__item,.mdl-menu__item[disabled],.mdl-menu__item[disabled]:focus,.mdl-menu__item[disabled]:hover{background-color:transparent}.mdl-menu__container.is-visible .mdl-menu__outline{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);z-index:999}.mdl-menu__outline.mdl-menu--bottom-right{-webkit-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0}.mdl-menu__outline.mdl-menu--top-left{-webkit-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%}.mdl-menu__outline.mdl-menu--top-right{-webkit-transform-origin:100% 100%;-ms-transform-origin:100% 100%;transform-origin:100% 100%}.mdl-menu{list-style:none;height:auto;width:auto;min-width:124px;padding:8px 0;margin:0;opacity:0;clip:rect(0 0 0 0);z-index:-1}.mdl-menu__container.is-visible .mdl-menu{opacity:1;z-index:999}.mdl-menu.is-animating{-webkit-transition:opacity .2s cubic-bezier(.4,0,.2,1),clip .3s cubic-bezier(.4,0,.2,1);transition:opacity .2s cubic-bezier(.4,0,.2,1),clip .3s cubic-bezier(.4,0,.2,1)}.mdl-menu.mdl-menu--bottom-right{left:auto;right:0}.mdl-menu.mdl-menu--top-left{top:auto;bottom:0}.mdl-menu.mdl-menu--top-right{top:auto;left:auto;bottom:0;right:0}.mdl-menu.mdl-menu--unaligned{top:auto;left:auto}.mdl-menu__item{color:rgba(0,0,0,.87);text-align:left;padding:0 16px;outline-color:#bdbdbd;position:relative;overflow:hidden;font-size:14px;font-weight:400;letter-spacing:0;text-decoration:none;cursor:pointer;height:48px;line-height:48px;white-space:nowrap;opacity:0;-webkit-transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity .2s cubic-bezier(.4,0,.2,1);user-select:none}.mdl-layout__tab-bar-button,.mdl-menu__item{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.mdl-menu__item:focus,.mdl-textfield.is-focused .mdl-textfield__input{outline:0}.mdl-menu__container.is-visible .mdl-menu__item{opacity:1}.mdl-menu__item::-moz-focus-inner{border:0}.mdl-menu__item[disabled]{color:#bdbdbd;cursor:auto}.mdl-menu__item[disabled] .mdl-ripple{background:0 0}.mdl-menu__item:focus,.mdl-menu__item:hover{background-color:#eee}.mdl-menu__item:active{background-color:#e0e0e0}.mdl-menu__item--ripple-container{display:block;height:100%;left:0;position:absolute;top:0;width:100%;z-index:0;overflow:hidden}.mdl-progress{display:block;position:relative;height:4px;width:500px}.mdl-progress>.bar{display:block;position:absolute;top:0;bottom:0;width:0;-webkit-transition:width .2s cubic-bezier(.4,0,.2,1);transition:width .2s cubic-bezier(.4,0,.2,1)}.mdl-layout,.mdl-navigation{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.mdl-progress>.progressbar{background-color:#3f51b5;z-index:1;left:0}.mdl-progress>.bufferbar{background-image:-webkit-linear-gradient(left,rgba(255,255,255,.7),rgba(255,255,255,.7)),-webkit-linear-gradient(left,#3f51b5,#3f51b5);background-image:linear-gradient(to right,rgba(255,255,255,.7),rgba(255,255,255,.7)),linear-gradient(to right,#3f51b5,#3f51b5);z-index:0;left:0}.mdl-progress>.auxbar{right:0}@supports (-webkit-appearance:none){.mdl-progress:not(.mdl-progress__indeterminate):not(.mdl-progress__indeterminate)>.auxbar{background-image:-webkit-linear-gradient(left,rgba(255,255,255,.7),rgba(255,255,255,.7)),-webkit-linear-gradient(left,#3f51b5,#3f51b5);background-image:linear-gradient(to right,rgba(255,255,255,.7),rgba(255,255,255,.7)),linear-gradient(to right,#3f51b5,#3f51b5);-webkit-mask:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxzdmcgd2lkdGg9IjEyIiBoZWlnaHQ9IjQiIHZpZXdQb3J0PSIwIDAgMTIgNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxlbGxpcHNlIGN4PSIyIiBjeT0iMiIgcng9IjIiIHJ5PSIyIj4KICAgIDxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9ImN4IiBmcm9tPSIyIiB0bz0iLTEwIiBkdXI9IjAuNnMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiAvPgogIDwvZWxsaXBzZT4KICA8ZWxsaXBzZSBjeD0iMTQiIGN5PSIyIiByeD0iMiIgcnk9IjIiIGNsYXNzPSJsb2FkZXIiPgogICAgPGFuaW1hdGUgYXR0cmlidXRlTmFtZT0iY3giIGZyb209IjE0IiB0bz0iMiIgZHVyPSIwLjZzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgLz4KICA8L2VsbGlwc2U+Cjwvc3ZnPgo=);mask:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIj8+Cjxzdmcgd2lkdGg9IjEyIiBoZWlnaHQ9IjQiIHZpZXdQb3J0PSIwIDAgMTIgNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxlbGxpcHNlIGN4PSIyIiBjeT0iMiIgcng9IjIiIHJ5PSIyIj4KICAgIDxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9ImN4IiBmcm9tPSIyIiB0bz0iLTEwIiBkdXI9IjAuNnMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiAvPgogIDwvZWxsaXBzZT4KICA8ZWxsaXBzZSBjeD0iMTQiIGN5PSIyIiByeD0iMiIgcnk9IjIiIGNsYXNzPSJsb2FkZXIiPgogICAgPGFuaW1hdGUgYXR0cmlidXRlTmFtZT0iY3giIGZyb209IjE0IiB0bz0iMiIgZHVyPSIwLjZzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSIgLz4KICA8L2VsbGlwc2U+Cjwvc3ZnPgo=)}}.mdl-progress:not(.mdl-progress__indeterminate)>.auxbar{background-image:-webkit-linear-gradient(left,rgba(255,255,255,.9),rgba(255,255,255,.9)),-webkit-linear-gradient(left,#3f51b5,#3f51b5);background-image:linear-gradient(to right,rgba(255,255,255,.9),rgba(255,255,255,.9)),linear-gradient(to right,#3f51b5,#3f51b5)}.mdl-progress.mdl-progress__indeterminate>.bar1{background-color:#3f51b5;-webkit-animation-name:indeterminate1;animation-name:indeterminate1;animation-duration:2s;animation-iteration-count:infinite;animation-timing-function:linear}.mdl-progress.mdl-progress__indeterminate>.bar1,.mdl-progress.mdl-progress__indeterminate>.bar3{-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear}.mdl-progress.mdl-progress__indeterminate>.bar3{background-image:none;background-color:#3f51b5;-webkit-animation-name:indeterminate2;animation-name:indeterminate2;animation-duration:2s;animation-iteration-count:infinite;animation-timing-function:linear}@-webkit-keyframes indeterminate1{0%{left:0;width:0}50%{left:25%;width:75%}75%{left:100%;width:0}}@keyframes indeterminate1{0%{left:0;width:0}50%{left:25%;width:75%}75%{left:100%;width:0}}@-webkit-keyframes indeterminate2{0%,50%{left:0;width:0}75%{left:0;width:25%}100%{left:100%;width:0}}@keyframes indeterminate2{0%,50%{left:0;width:0}75%{left:0;width:25%}100%{left:100%;width:0}}.mdl-navigation{display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;box-sizing:border-box}.mdl-navigation__link{color:#424242;text-decoration:none;font-weight:500;font-size:13px;margin:0}.mdl-layout{width:100%;height:100%;display:flex;-webkit-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;overflow-y:auto;overflow-x:hidden;position:relative;-webkit-overflow-scrolling:touch}.mdl-layout.is-small-screen .mdl-layout--large-screen-only,.mdl-layout:not(.is-small-screen) .mdl-layout--small-screen-only{display:none}.mdl-layout__container{position:absolute;width:100%;height:100%}.mdl-layout-title{display:block;position:relative;font-family:Roboto,Helvetica,Arial,sans-serif;font-size:20px;line-height:1;letter-spacing:.02em;font-weight:400;box-sizing:border-box}.mdl-layout-spacer{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.mdl-layout__drawer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;width:240px;height:100%;max-height:100%;position:absolute;top:0;left:0;box-sizing:border-box;border-right:1px solid #e0e0e0;background:#fafafa;-webkit-transform:translateX(-250px);-ms-transform:translateX(-250px);transform:translateX(-250px);-webkit-transform-style:preserve-3d;transform-style:preserve-3d;will-change:transform;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-property:-webkit-transform;transition-property:transform;color:#424242;overflow:visible;overflow-y:auto;z-index:5}.mdl-layout__drawer.is-visible{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}.mdl-layout__drawer>*{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.mdl-layout__drawer>.mdl-layout-title{line-height:64px;padding-left:40px}@media screen and (max-width:1024px){.mdl-layout__drawer>.mdl-layout-title{line-height:56px;padding-left:16px}}.mdl-layout__drawer .mdl-navigation{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;padding-top:16px}.mdl-layout__drawer .mdl-navigation .mdl-navigation__link{display:block;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:16px 40px;margin:0;color:#757575}.mdl-layout__drawer .mdl-navigation .mdl-navigation__link:hover{background-color:#e0e0e0}.mdl-layout__drawer .mdl-navigation .mdl-navigation__link--current{background-color:#000;color:#3f51b5}.mdl-layout__drawer-button{display:block;position:absolute;height:48px;width:48px;border:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;overflow:hidden;text-align:center;cursor:pointer;font-size:26px;line-height:50px;font-family:Helvetica,Arial,sans-serif;margin:10px 12px;top:0;left:0;color:#fff;z-index:4}.mdl-layout__header .mdl-layout__drawer-button{position:absolute;color:#fff;background-color:inherit}@media screen and (max-width:1024px){.mdl-layout__drawer .mdl-navigation .mdl-navigation__link{padding:16px}.mdl-layout__header .mdl-layout__drawer-button{margin:4px}.mdl-layout__drawer-button{margin:4px;color:rgba(0,0,0,.5)}}@media screen and (min-width:1025px){.mdl-layout--fixed-drawer>.mdl-layout__drawer{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}.mdl-layout--fixed-drawer>.mdl-layout__drawer-button{display:none}}.mdl-layout__header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;box-sizing:border-box;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:100%;margin:0;padding:0;border:none;min-height:64px;max-height:1000px;z-index:3;background-color:#3f51b5;color:#fff;-webkit-transition-duration:.2s;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-property:max-height,box-shadow;transition-property:max-height,box-shadow}.mdl-layout__header,.mdl-layout__obfuscator{-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1)}.mdl-layout--fixed-drawer:not(.is-small-screen)>.mdl-layout__header{margin-left:240px;width:calc(100% - 240px)}.mdl-layout__header-row,.mdl-layout__header-row .mdl-navigation{-webkit-box-orient:horizontal;-webkit-box-direction:normal;margin:0}@media screen and (min-width:1024px){.mdl-layout--fixed-drawer>.mdl-layout__header .mdl-layout__header-row{padding-left:40px}}.mdl-layout__header>.mdl-layout-icon{position:absolute;left:40px;top:16px;height:32px;width:32px;overflow:hidden;z-index:3;display:block}.mdl-layout.has-drawer .mdl-layout__header>.mdl-layout-icon{display:none}.mdl-layout__header.is-compact{max-height:64px}.mdl-layout__header.is-compact.has-tabs{height:112px}@media screen and (max-width:1024px){.mdl-layout__header{min-height:56px;display:none}.mdl-layout__header>.mdl-layout-icon{left:16px;top:12px}.mdl-layout__header.is-compact{max-height:56px}.mdl-layout__header.is-compact.has-tabs{min-height:104px}.mdl-layout--fixed-header>.mdl-layout__header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}}.mdl-layout__header--transparent.mdl-layout__header--transparent{background-color:transparent;box-shadow:none}.mdl-layout__header--scroll,.mdl-layout__header--seamed{box-shadow:none}.mdl-layout__header--waterfall{box-shadow:none;overflow:hidden}.mdl-layout__header--waterfall.is-casting-shadow,.mdl-switch__thumb{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.mdl-layout__header-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;box-sizing:border-box;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:64px;padding:0 40px 0 80px}@media screen and (max-width:1024px){.mdl-layout__header-row{height:56px;padding:0 16px 0 72px}}.mdl-layout__header-row>*{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.mdl-layout__header--scroll .mdl-layout__header-row{width:100%}.mdl-layout__header-row .mdl-navigation{padding:0;height:64px;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.mdl-layout__header-row .mdl-navigation__link{display:block;color:#fff;line-height:64px;padding:0 24px}@media screen and (max-width:1024px){.mdl-layout__header-row .mdl-navigation{height:56px}.mdl-layout__header-row .mdl-navigation__link{line-height:56px;padding:0 16px}}.mdl-layout__tab,.mdl-layout__tab-bar-button .material-icons{line-height:48px}.mdl-layout__obfuscator{background-color:transparent;position:absolute;top:0;left:0;height:100%;width:100%;z-index:4;visibility:hidden;-webkit-transition-property:background-color;transition-property:background-color;-webkit-transition-duration:.2s;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.mdl-layout__drawer.is-visible~.mdl-layout__obfuscator{background-color:rgba(0,0,0,.5);visibility:visible}.mdl-layout__content{-ms-flex:0 1 auto;display:inline-block;overflow-y:auto;overflow-x:hidden;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;z-index:1;-webkit-overflow-scrolling:touch}.mdl-layout--fixed-drawer>.mdl-layout__content{margin-left:240px}.mdl-layout__container.has-scrolling-header .mdl-layout__content{overflow:visible}@media screen and (max-width:1024px){.mdl-layout--fixed-drawer>.mdl-layout__content{margin-left:0}.mdl-layout__container.has-scrolling-header .mdl-layout__content{overflow-y:auto;overflow-x:hidden}}.mdl-layout__tab-bar{height:96px;margin:0;width:calc(100% - 112px);padding:0 0 0 56px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;background-color:#3f51b5;overflow-y:hidden;overflow-x:scroll}.mdl-layout__tab-bar::-webkit-scrollbar{display:none}@media screen and (max-width:1024px){.mdl-layout__tab-bar{width:calc(100% - 60px);padding:0 0 0 60px}}.mdl-layout--fixed-tabs .mdl-layout__tab-bar{padding:0;overflow:hidden;width:100%}.mdl-layout__tab-bar-container{position:relative;height:48px;width:100%;border:none;margin:0;z-index:2;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;overflow:hidden}.mdl-layout__container>.mdl-layout__tab-bar-container{position:absolute;top:0;left:0}.mdl-layout__tab-bar-button{display:inline-block;position:absolute;top:0;height:48px;width:56px;z-index:4;text-align:center;background-color:#3f51b5;color:transparent;cursor:pointer;user-select:none}@media screen and (max-width:1024px){.mdl-layout__tab-bar-button{display:none;width:60px}}.mdl-layout--fixed-tabs .mdl-layout__tab-bar-button{display:none}.mdl-layout__tab-bar-button.is-active{color:#fff}.mdl-layout__tab-bar-left-button{left:0}.mdl-layout__tab-bar-right-button{right:0}.mdl-layout__tab{margin:0;border:none;padding:0 24px;float:left;position:relative;display:block;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;height:48px;text-align:center;font-weight:500;font-size:14px;color:rgba(255,255,255,.6);overflow:hidden}.mdl-radio,.mdl-radio__button,.mdl-switch__input{line-height:24px}@media screen and (max-width:1024px){.mdl-layout__tab{padding:0 12px}}.mdl-layout--fixed-tabs .mdl-layout__tab{float:none;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0}.mdl-layout.is-upgraded .mdl-layout__tab.is-active{color:#fff}.mdl-layout.is-upgraded .mdl-layout__tab.is-active::after{height:2px;width:100%;display:block;content:" ";bottom:0;left:0;position:absolute;background:#ff4081;-webkit-animation:border-expand .2s cubic-bezier(.4,0,.4,1) .01s alternate forwards;animation:border-expand .2s cubic-bezier(.4,0,.4,1) .01s alternate forwards;-webkit-transition:all 1s cubic-bezier(.4,0,1,1);transition:all 1s cubic-bezier(.4,0,1,1)}.mdl-layout__tab .mdl-layout__tab-ripple-container{display:block;position:absolute;height:100%;width:100%;left:0;top:0;z-index:1;overflow:hidden}.mdl-layout__tab .mdl-layout__tab-ripple-container .mdl-ripple{background-color:#fff}.mdl-layout__tab-panel{display:block}.mdl-layout.is-upgraded .mdl-layout__tab-panel{display:none}.mdl-layout.is-upgraded .mdl-layout__tab-panel.is-active{display:block}.mdl-radio,.mdl-radio__outer-circle{margin:0;box-sizing:border-box;display:inline-block}.mdl-radio{position:relative;font-size:16px;padding-left:0}.mdl-radio.is-upgraded{padding-left:24px}.mdl-radio.is-upgraded .mdl-radio__button{position:absolute;width:0;height:0;margin:0;padding:0;opacity:0;-ms-appearance:none;-moz-appearance:none;-webkit-appearance:none;appearance:none;border:none}.mdl-radio__outer-circle{position:absolute;top:4px;left:0;width:16px;height:16px;cursor:pointer;border:2px solid rgba(0,0,0,.54);border-radius:50%;z-index:2}.mdl-radio.is-checked .mdl-radio__outer-circle{border:2px solid #3f51b5}.mdl-radio.is-disabled .mdl-radio__outer-circle{border:2px solid rgba(0,0,0,.26);cursor:auto}.mdl-radio__inner-circle{position:absolute;z-index:1;margin:0;top:8px;left:4px;box-sizing:border-box;width:8px;height:8px;cursor:pointer;-webkit-transition-duration:.28s;transition-duration:.28s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-property:-webkit-transform;transition-property:transform;-webkit-transform:scale3d(0,0,0);transform:scale3d(0,0,0);border-radius:50%;background:#3f51b5}.mdl-radio__ripple-container,.mdl-switch__ripple-container{box-sizing:border-box;z-index:2;-webkit-mask-image:-webkit-radial-gradient(circle,#fff,#000)}.mdl-radio.is-checked .mdl-radio__inner-circle{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}.mdl-radio.is-disabled .mdl-radio__inner-circle{background:rgba(0,0,0,.26);cursor:auto}.mdl-radio.is-focused .mdl-radio__inner-circle{box-shadow:0 0 0 10px rgba(0,0,0,.1)}.mdl-radio__label{cursor:pointer}.mdl-radio.is-disabled .mdl-radio__label{color:rgba(0,0,0,.26);cursor:auto}.mdl-radio__ripple-container{position:absolute;top:-9px;left:-13px;width:42px;height:42px;border-radius:50%;cursor:pointer;overflow:hidden}.mdl-radio__ripple-container .mdl-ripple{background:#3f51b5}.mdl-radio.is-disabled .mdl-radio__ripple-container{cursor:auto}.mdl-radio.is-disabled .mdl-radio__ripple-container .mdl-ripple{background:0 0}:root .mdl-slider.mdl-slider.is-upgraded,_:-ms-input-placeholder{-ms-appearance:none;height:32px;margin:0}.mdl-slider{width:calc(100% - 40px);margin:0 20px}.mdl-slider.is-upgraded{-webkit-appearance:none;-moz-appearance:none;appearance:none;height:2px;background:0 0;user-select:none;outline:0;padding:0;color:#3f51b5;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;z-index:1;cursor:pointer}.mdl-slider.is-upgraded,.mdl-switch{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.mdl-slider.is-upgraded::-moz-focus-outer{border:0}.mdl-slider.is-upgraded::-ms-tooltip{display:none}.mdl-slider.is-upgraded::-webkit-slider-runnable-track{background:0 0}.mdl-slider.is-upgraded::-moz-range-track{background:0 0;border:none}.mdl-slider.is-upgraded::-ms-track{background:0 0;color:transparent;height:2px;width:100%;border:none}.mdl-slider.is-upgraded::-ms-fill-lower{padding:0;background:linear-gradient(to right,transparent,transparent 16px,#3f51b5 16px,#3f51b5 0)}.mdl-slider.is-upgraded::-ms-fill-upper{padding:0;background:linear-gradient(to left,transparent,transparent 16px,rgba(0,0,0,.26) 16px,rgba(0,0,0,.26) 0)}.mdl-slider.is-upgraded::-webkit-slider-thumb{-webkit-appearance:none;width:12px;height:12px;box-sizing:border-box;border-radius:50%;background:#3f51b5;border:none;-webkit-transition:-webkit-transform .18s cubic-bezier(.4,0,.2,1),border .18s cubic-bezier(.4,0,.2,1),box-shadow .18s cubic-bezier(.4,0,.2,1),background .28s cubic-bezier(.4,0,.2,1);transition:transform .18s cubic-bezier(.4,0,.2,1),border .18s cubic-bezier(.4,0,.2,1),box-shadow .18s cubic-bezier(.4,0,.2,1),background .28s cubic-bezier(.4,0,.2,1)}.mdl-slider.is-upgraded::-moz-range-thumb{-moz-appearance:none;width:12px;height:12px;box-sizing:border-box;border-radius:50%;background:#3f51b5;border:none}.mdl-slider.is-upgraded:focus:not(:active)::-webkit-slider-thumb{box-shadow:0 0 0 10px rgba(63,81,181,.26)}.mdl-slider.is-upgraded:focus:not(:active)::-moz-range-thumb{box-shadow:0 0 0 10px rgba(63,81,181,.26)}.mdl-slider.is-upgraded:active::-webkit-slider-thumb{background:#3f51b5;-webkit-transform:scale(1.5);transform:scale(1.5)}.mdl-slider.is-upgraded:active::-moz-range-thumb{background:#3f51b5;transform:scale(1.5)}.mdl-slider.is-upgraded::-ms-thumb{width:32px;height:32px;border:none;border-radius:50%;background:#3f51b5;-ms-transform:scale(.375);transform:scale(.375);transition:transform .18s cubic-bezier(.4,0,.2,1),background .28s cubic-bezier(.4,0,.2,1)}.mdl-slider.is-upgraded:focus:not(:active)::-ms-thumb{background:radial-gradient(circle closest-side,#3f51b5 0,#3f51b5 37.5%,rgba(63,81,181,.26) 37.5%,rgba(63,81,181,.26) 100%);-ms-transform:scale(1);transform:scale(1)}.mdl-slider.is-upgraded:active::-ms-thumb{background:#3f51b5;-ms-transform:scale(.5625);transform:scale(.5625)}.mdl-slider.is-upgraded.is-lowest-value::-webkit-slider-thumb{border:2px solid rgba(0,0,0,.26);background:0 0}.mdl-slider.is-upgraded.is-lowest-value::-moz-range-thumb{border:2px solid rgba(0,0,0,.26);background:0 0}.mdl-slider.is-upgraded.is-lowest-value~.mdl-slider__background-flex>.mdl-slider__background-upper{left:6px}.mdl-slider.is-upgraded.is-lowest-value:focus:not(:active)::-webkit-slider-thumb{box-shadow:0 0 0 10px rgba(0,0,0,.12);background:rgba(0,0,0,.12)}.mdl-slider.is-upgraded.is-lowest-value:focus:not(:active)::-moz-range-thumb{box-shadow:0 0 0 10px rgba(0,0,0,.12);background:rgba(0,0,0,.12)}.mdl-slider.is-upgraded.is-lowest-value:active::-webkit-slider-thumb{border:1.6px solid rgba(0,0,0,.26);-webkit-transform:scale(1.5);transform:scale(1.5)}.mdl-slider.is-upgraded.is-lowest-value:active~.mdl-slider__background-flex>.mdl-slider__background-upper{left:9px}.mdl-slider.is-upgraded.is-lowest-value:active::-moz-range-thumb{border:1.5px solid rgba(0,0,0,.26);transform:scale(1.5)}.mdl-slider.is-upgraded.is-lowest-value::-ms-thumb{background:radial-gradient(circle closest-side,transparent 0,transparent 66.67%,rgba(0,0,0,.26) 66.67%,rgba(0,0,0,.26) 100%)}.mdl-slider.is-upgraded.is-lowest-value:focus:not(:active)::-ms-thumb{background:radial-gradient(circle closest-side,rgba(0,0,0,.12) 0,rgba(0,0,0,.12) 25%,rgba(0,0,0,.26) 25%,rgba(0,0,0,.26) 37.5%,rgba(0,0,0,.12) 37.5%,rgba(0,0,0,.12) 100%);-ms-transform:scale(1);transform:scale(1)}.mdl-slider.is-upgraded.is-lowest-value:active::-ms-thumb{-ms-transform:scale(.5625);transform:scale(.5625);background:radial-gradient(circle closest-side,transparent 0,transparent 77.78%,rgba(0,0,0,.26) 77.78%,rgba(0,0,0,.26) 100%)}.mdl-slider.is-upgraded.is-lowest-value::-ms-fill-lower{background:0 0}.mdl-slider.is-upgraded.is-lowest-value::-ms-fill-upper{margin-left:6px}.mdl-slider.is-upgraded.is-lowest-value:active::-ms-fill-upper{margin-left:9px}.mdl-slider.is-upgraded:disabled::-webkit-slider-thumb,.mdl-slider.is-upgraded:disabled:active::-webkit-slider-thumb,.mdl-slider.is-upgraded:disabled:focus::-webkit-slider-thumb{-webkit-transform:scale(.667);transform:scale(.667);background:rgba(0,0,0,.26)}.mdl-slider.is-upgraded:disabled::-moz-range-thumb,.mdl-slider.is-upgraded:disabled:active::-moz-range-thumb,.mdl-slider.is-upgraded:disabled:focus::-moz-range-thumb{transform:scale(.667);background:rgba(0,0,0,.26)}.mdl-slider.is-upgraded:disabled~.mdl-slider__background-flex>.mdl-slider__background-lower{background-color:rgba(0,0,0,.26);left:-6px}.mdl-slider.is-upgraded.is-lowest-value:disabled:active~.mdl-slider__background-flex>.mdl-slider__background-upper,.mdl-slider.is-upgraded:disabled~.mdl-slider__background-flex>.mdl-slider__background-upper{left:6px}.mdl-slider.is-upgraded.is-lowest-value:disabled::-webkit-slider-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled:active::-webkit-slider-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-webkit-slider-thumb{border:3px solid rgba(0,0,0,.26);background:0 0;-webkit-transform:scale(.667);transform:scale(.667)}.mdl-slider.is-upgraded.is-lowest-value:disabled::-moz-range-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled:active::-moz-range-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-moz-range-thumb{border:3px solid rgba(0,0,0,.26);background:0 0;transform:scale(.667)}.mdl-slider.is-upgraded:disabled::-ms-thumb,.mdl-slider.is-upgraded:disabled:active::-ms-thumb,.mdl-slider.is-upgraded:disabled:focus::-ms-thumb{-ms-transform:scale(.25);transform:scale(.25);background:rgba(0,0,0,.26)}.mdl-slider.is-upgraded.is-lowest-value:disabled::-ms-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled:active::-ms-thumb,.mdl-slider.is-upgraded.is-lowest-value:disabled:focus::-ms-thumb{-ms-transform:scale(.25);transform:scale(.25);background:radial-gradient(circle closest-side,transparent 0,transparent 50%,rgba(0,0,0,.26) 50%,rgba(0,0,0,.26) 100%)}.mdl-slider.is-upgraded:disabled::-ms-fill-lower{margin-right:6px;background:linear-gradient(to right,transparent,transparent 25px,rgba(0,0,0,.26) 25px,rgba(0,0,0,.26) 0)}.mdl-slider__background-flex,.mdl-slider__container{background:0 0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.mdl-slider.is-upgraded:disabled::-ms-fill-upper{margin-left:6px}.mdl-slider.is-upgraded.is-lowest-value:disabled:active::-ms-fill-upper{margin-left:6px}.mdl-slider__ie-container{height:18px;overflow:visible;border:none;margin:none;padding:none}.mdl-slider__container{height:18px;position:relative;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.mdl-slider__background-flex{position:absolute;height:2px;width:calc(100% - 52px);top:50%;left:0;margin:0 26px;display:flex;overflow:hidden;border:0;padding:0;-webkit-transform:translate(0,-1px);-ms-transform:translate(0,-1px);transform:translate(0,-1px)}.mdl-slider__background-lower{background:#3f51b5;-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;position:relative;border:0;padding:0}.mdl-slider__background-upper{background:rgba(0,0,0,.26);-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;position:relative;border:0;padding:0;-webkit-transition:left .18s cubic-bezier(.4,0,.2,1);transition:left .18s cubic-bezier(.4,0,.2,1)}.mdl-spinner{display:inline-block;position:relative;width:28px;height:28px}.mdl-spinner:not(.is-upgraded).is-active:after{content:"Loading..."}.mdl-spinner.is-upgraded.is-active{-webkit-animation:mdl-spinner__container-rotate 1568.23529412ms linear infinite;animation:mdl-spinner__container-rotate 1568.23529412ms linear infinite}@-webkit-keyframes mdl-spinner__container-rotate{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes mdl-spinner__container-rotate{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.mdl-spinner__layer{position:absolute;width:100%;height:100%;opacity:0}.mdl-spinner__layer-1{border-color:#42a5f5}.mdl-spinner--single-color .mdl-spinner__layer-1{border-color:#3f51b5}.mdl-spinner.is-active .mdl-spinner__layer-1{-webkit-animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-1-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-1-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.mdl-spinner__layer-2{border-color:#f44336}.mdl-spinner--single-color .mdl-spinner__layer-2{border-color:#3f51b5}.mdl-spinner.is-active .mdl-spinner__layer-2{-webkit-animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-2-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-2-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.mdl-spinner__layer-3{border-color:#fdd835}.mdl-spinner--single-color .mdl-spinner__layer-3{border-color:#3f51b5}.mdl-spinner.is-active .mdl-spinner__layer-3{-webkit-animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-3-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-3-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.mdl-spinner__layer-4{border-color:#4caf50}.mdl-spinner--single-color .mdl-spinner__layer-4{border-color:#3f51b5}.mdl-spinner.is-active .mdl-spinner__layer-4{-webkit-animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-4-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdl-spinner__fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,mdl-spinner__layer-4-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}@-webkit-keyframes mdl-spinner__fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}@keyframes mdl-spinner__fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}to{-webkit-transform:rotate(1080deg);transform:rotate(1080deg)}}@-webkit-keyframes mdl-spinner__layer-1-fade-in-out{100%,25%,90%,from{opacity:.99}26%,89%{opacity:0}}@keyframes mdl-spinner__layer-1-fade-in-out{100%,25%,90%,from{opacity:.99}26%,89%{opacity:0}}@-webkit-keyframes mdl-spinner__layer-2-fade-in-out{15%,51%,from{opacity:0}25%,50%{opacity:.99}}@keyframes mdl-spinner__layer-2-fade-in-out{15%,51%,from{opacity:0}25%,50%{opacity:.99}}@-webkit-keyframes mdl-spinner__layer-3-fade-in-out{40%,76%,from{opacity:0}50%,75%{opacity:.99}}@keyframes mdl-spinner__layer-3-fade-in-out{40%,76%,from{opacity:0}50%,75%{opacity:.99}}@-webkit-keyframes mdl-spinner__layer-4-fade-in-out{100%,65%,from{opacity:0}75%,90%{opacity:.99}}@keyframes mdl-spinner__layer-4-fade-in-out{100%,65%,from{opacity:0}75%,90%{opacity:.99}}.mdl-spinner__gap-patch{position:absolute;box-sizing:border-box;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.mdl-spinner__gap-patch .mdl-spinner__circle{width:1000%;left:-450%}.mdl-spinner__circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.mdl-spinner__circle-clipper .mdl-spinner__circle{width:200%}.mdl-spinner__circle{box-sizing:border-box;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent!important;border-radius:50%;-webkit-animation:none;animation:none;position:absolute;top:0;right:0;bottom:0;left:0}.mdl-spinner__left .mdl-spinner__circle{border-right-color:transparent!important;-webkit-transform:rotate(129deg);-ms-transform:rotate(129deg);transform:rotate(129deg)}.mdl-spinner.is-active .mdl-spinner__left .mdl-spinner__circle{-webkit-animation:mdl-spinner__left-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdl-spinner__left-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both}.mdl-spinner__right .mdl-spinner__circle{left:-100%;border-left-color:transparent!important;-webkit-transform:rotate(-129deg);-ms-transform:rotate(-129deg);transform:rotate(-129deg)}.mdl-spinner.is-active .mdl-spinner__right .mdl-spinner__circle{-webkit-animation:mdl-spinner__right-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both;animation:mdl-spinner__right-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both}@-webkit-keyframes mdl-spinner__left-spin{from,to{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}}@keyframes mdl-spinner__left-spin{from,to{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}}@-webkit-keyframes mdl-spinner__right-spin{from,to{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}}@keyframes mdl-spinner__right-spin{from,to{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}}.mdl-switch{position:relative;z-index:1;vertical-align:middle;display:inline-block;box-sizing:border-box;width:100%;height:24px;margin:0;padding:0;overflow:visible;-webkit-touch-callout:none;user-select:none}.mdl-switch.is-upgraded{padding-left:28px}.mdl-switch.is-upgraded .mdl-switch__input{position:absolute;width:0;height:0;margin:0;padding:0;opacity:0;-ms-appearance:none;-moz-appearance:none;-webkit-appearance:none;appearance:none;border:none}.mdl-switch__track{background:rgba(0,0,0,.26);position:absolute;left:0;top:5px;height:14px;width:36px;border-radius:14px;cursor:pointer}.mdl-switch.is-checked .mdl-switch__track{background:rgba(63,81,181,.5)}.mdl-switch.is-disabled .mdl-switch__track{background:rgba(0,0,0,.12);cursor:auto}.mdl-switch__thumb{background:#fafafa;position:absolute;left:0;top:2px;height:20px;width:20px;cursor:pointer;-webkit-transition-duration:.28s;transition-duration:.28s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);transition-property:left}.mdl-switch__ripple-container,.mdl-switch__thumb{border-radius:50%;-webkit-transition-property:left}.mdl-switch.is-checked .mdl-switch__thumb{background:#3f51b5;left:16px;box-shadow:0 3px 4px 0 rgba(0,0,0,.14),0 3px 3px -2px rgba(0,0,0,.2),0 1px 8px 0 rgba(0,0,0,.12)}.mdl-switch.is-disabled .mdl-switch__thumb{background:#bdbdbd;cursor:auto}.mdl-switch__focus-helper{position:absolute;top:50%;left:50%;-webkit-transform:translate(-4px,-4px);-ms-transform:translate(-4px,-4px);transform:translate(-4px,-4px);display:inline-block;box-sizing:border-box;width:8px;height:8px;border-radius:50%;background-color:transparent}.mdl-switch.is-focused .mdl-switch__focus-helper{box-shadow:0 0 0 20px rgba(0,0,0,.1);background-color:rgba(0,0,0,.1)}.mdl-switch.is-focused.is-checked .mdl-switch__focus-helper{box-shadow:0 0 0 20px rgba(63,81,181,.26);background-color:rgba(63,81,181,.26)}.mdl-switch__label{position:relative;cursor:pointer;font-size:16px;line-height:24px;margin:0;left:24px}.mdl-switch.is-disabled .mdl-switch__label{color:#bdbdbd;cursor:auto}.mdl-switch__ripple-container{position:absolute;top:-12px;left:-14px;width:48px;height:48px;cursor:pointer;overflow:hidden;-webkit-transition-duration:.4s;transition-duration:.4s;-webkit-transition-timing-function:step-end;transition-timing-function:step-end;transition-property:left}.mdl-switch__ripple-container .mdl-ripple{background:#3f51b5}.mdl-switch.is-disabled .mdl-switch__ripple-container{cursor:auto}.mdl-switch.is-disabled .mdl-switch__ripple-container .mdl-ripple{background:0 0}.mdl-switch.is-checked .mdl-switch__ripple-container{cursor:auto;left:2px}.mdl-tabs{display:block;width:100%}.mdl-tabs__tab-bar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;height:48px;padding:0;margin:0;border-bottom:1px solid #e0e0e0}.mdl-tabs__tab{margin:0;border:none;padding:0 24px;float:left;position:relative;display:block;color:red;height:48px;line-height:48px;text-align:center;font-weight:500;font-size:14px;color:rgba(0,0,0,.54);overflow:hidden}.mdl-tabs.is-upgraded .mdl-tabs__tab.is-active{color:rgba(0,0,0,.87)}.mdl-tabs.is-upgraded .mdl-tabs__tab.is-active:after{height:2px;width:100%;display:block;content:" ";bottom:0;left:0;position:absolute;background:#3f51b5;-webkit-animation:border-expand .2s cubic-bezier(.4,0,.4,1) .01s alternate forwards;animation:border-expand .2s cubic-bezier(.4,0,.4,1) .01s alternate forwards;-webkit-transition:all 1s cubic-bezier(.4,0,1,1);transition:all 1s cubic-bezier(.4,0,1,1)}.mdl-tabs__tab .mdl-tabs__ripple-container{display:block;position:absolute;height:100%;width:100%;left:0;top:0;z-index:1;overflow:hidden}.mdl-tabs__tab .mdl-tabs__ripple-container .mdl-ripple{background:#3f51b5}.mdl-tabs__panel{display:block}.mdl-tabs.is-upgraded .mdl-tabs__panel{display:none}.mdl-tabs.is-upgraded .mdl-tabs__panel.is-active{display:block}@-webkit-keyframes border-expand{0%{opacity:0;width:0}100%{opacity:1;width:100%}}@keyframes border-expand{0%{opacity:0;width:0}100%{opacity:1;width:100%}}.mdl-textfield{position:relative;font-size:16px;display:inline-block;box-sizing:border-box;width:300px;max-width:100%;margin:0;padding:20px 0}.mdl-textfield .mdl-button{position:absolute;bottom:20px}.mdl-textfield--align-right{text-align:right}.mdl-textfield--full-width{width:100%}.mdl-textfield--expandable{min-width:32px;width:auto;min-height:32px}.mdl-textfield__input,.mdl-textfield__label{display:block;font-size:16px;width:100%;text-align:left}.mdl-textfield__input{border:none;border-bottom:1px solid rgba(0,0,0,.12);margin:0;padding:4px 0;color:inherit}.mdl-textfield.is-disabled.is-disabled .mdl-textfield__label,.mdl-textfield__label{color:rgba(0,0,0,.26)}.mdl-textfield.is-invalid .mdl-textfield__input{border-color:#de3226;box-shadow:none}.mdl-textfield.is-disabled .mdl-textfield__input{background-color:transparent;border-bottom:1px dotted rgba(0,0,0,.12);color:rgba(0,0,0,.26)}.mdl-textfield textarea.mdl-textfield__input{display:block}.mdl-textfield__label{bottom:0;left:0;right:0;pointer-events:none;position:absolute;top:24px;overflow:hidden;white-space:nowrap}.mdl-textfield.is-dirty .mdl-textfield__label{visibility:hidden}.mdl-textfield--floating-label .mdl-textfield__label{-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.mdl-textfield--floating-label.is-dirty .mdl-textfield__label,.mdl-textfield--floating-label.is-focused .mdl-textfield__label{color:#3f51b5;font-size:12px;top:4px;visibility:visible}.mdl-textfield--floating-label.is-invalid .mdl-textfield__label,.mdl-textfield__error{color:#de3226;font-size:12px}.mdl-textfield--floating-label.is-dirty .mdl-textfield__expandable-holder .mdl-textfield__label,.mdl-textfield--floating-label.is-focused .mdl-textfield__expandable-holder .mdl-textfield__label{top:-16px}.mdl-textfield__label:after{background-color:#3f51b5;bottom:20px;content:'';height:2px;left:45%;position:absolute;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);visibility:hidden;width:10px}.mdl-textfield__expandable-holder,.mdl-textfield__label:after{-webkit-transition-duration:.2s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1)}.mdl-textfield.is-focused .mdl-textfield__label:after{left:0;visibility:visible;width:100%}.mdl-textfield.is-invalid .mdl-textfield__label:after{background-color:#de3226}.mdl-textfield__error{position:absolute;margin-top:3px;visibility:hidden;display:block}.mdl-textfield.is-invalid .mdl-textfield__error{visibility:visible}.mdl-textfield__expandable-holder{position:relative;margin-left:32px;transition-duration:.2s;transition-timing-function:cubic-bezier(.4,0,.2,1);display:inline-block;max-width:.1px}.mdl-textfield.is-dirty .mdl-textfield__expandable-holder,.mdl-textfield.is-focused .mdl-textfield__expandable-holder{max-width:600px}.mdl-textfield__expandable-holder .mdl-textfield__label:after{bottom:0}.mdl-tooltip{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-transform-origin:top center;-ms-transform-origin:top center;transform-origin:top center;will-change:transform;z-index:999;background:rgba(97,97,97,.9);border-radius:2px;color:#fff;display:inline-block;font-size:10px;font-weight:500;line-height:14px;max-width:170px;position:fixed;top:-500px;left:-500px;padding:8px;text-align:center}.mdl-tooltip.is-active{-webkit-animation:pulse 200ms cubic-bezier(0,0,.2,1) forwards;animation:pulse 200ms cubic-bezier(0,0,.2,1) forwards}.mdl-tooltip--large{line-height:14px;font-size:14px;padding:16px}@-webkit-keyframes pulse{0%{-webkit-transform:scale(0);transform:scale(0);opacity:0}50%{-webkit-transform:scale(.99);transform:scale(.99)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:1;visibility:visible}}@keyframes pulse{0%{-webkit-transform:scale(0);transform:scale(0);opacity:0}50%{-webkit-transform:scale(.99);transform:scale(.99)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:1;visibility:visible}}.mdl-shadow--2dp{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12)}.mdl-shadow--3dp{box-shadow:0 3px 4px 0 rgba(0,0,0,.14),0 3px 3px -2px rgba(0,0,0,.2),0 1px 8px 0 rgba(0,0,0,.12)}.mdl-shadow--4dp{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.2)}.mdl-shadow--6dp{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.2)}.mdl-shadow--8dp{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.mdl-shadow--16dp{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -5px rgba(0,0,0,.2)}.mdl-grid{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;margin:0 auto;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch}.mdl-grid.mdl-grid--no-spacing{padding:0}.mdl-cell{box-sizing:border-box}.mdl-cell--top{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.mdl-cell--middle{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.mdl-cell--bottom{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.mdl-cell--stretch{-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch}.mdl-grid.mdl-grid--no-spacing>.mdl-cell{margin:0}@media (max-width:479px){.mdl-grid{padding:8px}.mdl-cell{margin:8px;width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell{width:100%}.mdl-cell--hide-phone{display:none!important}.mdl-cell--1-col,.mdl-cell--1-col-phone.mdl-cell--1-col-phone{width:calc(25% - 16px)}.mdl-grid--no-spacing>.mdl-cell--1-col,.mdl-grid--no-spacing>.mdl-cell--1-col-phone.mdl-cell--1-col-phone{width:25%}.mdl-cell--2-col,.mdl-cell--2-col-phone.mdl-cell--2-col-phone{width:calc(50% - 16px)}.mdl-grid--no-spacing>.mdl-cell--2-col,.mdl-grid--no-spacing>.mdl-cell--2-col-phone.mdl-cell--2-col-phone{width:50%}.mdl-cell--3-col,.mdl-cell--3-col-phone.mdl-cell--3-col-phone{width:calc(75% - 16px)}.mdl-grid--no-spacing>.mdl-cell--3-col,.mdl-grid--no-spacing>.mdl-cell--3-col-phone.mdl-cell--3-col-phone{width:75%}.mdl-cell--4-col,.mdl-cell--4-col-phone.mdl-cell--4-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--4-col,.mdl-grid--no-spacing>.mdl-cell--4-col-phone.mdl-cell--4-col-phone{width:100%}.mdl-cell--5-col,.mdl-cell--5-col-phone.mdl-cell--5-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--5-col,.mdl-grid--no-spacing>.mdl-cell--5-col-phone.mdl-cell--5-col-phone{width:100%}.mdl-cell--6-col,.mdl-cell--6-col-phone.mdl-cell--6-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--6-col,.mdl-grid--no-spacing>.mdl-cell--6-col-phone.mdl-cell--6-col-phone{width:100%}.mdl-cell--7-col,.mdl-cell--7-col-phone.mdl-cell--7-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--7-col,.mdl-grid--no-spacing>.mdl-cell--7-col-phone.mdl-cell--7-col-phone{width:100%}.mdl-cell--8-col,.mdl-cell--8-col-phone.mdl-cell--8-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--8-col,.mdl-grid--no-spacing>.mdl-cell--8-col-phone.mdl-cell--8-col-phone{width:100%}.mdl-cell--9-col,.mdl-cell--9-col-phone.mdl-cell--9-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--9-col,.mdl-grid--no-spacing>.mdl-cell--9-col-phone.mdl-cell--9-col-phone{width:100%}.mdl-cell--10-col,.mdl-cell--10-col-phone.mdl-cell--10-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--10-col,.mdl-grid--no-spacing>.mdl-cell--10-col-phone.mdl-cell--10-col-phone{width:100%}.mdl-cell--11-col,.mdl-cell--11-col-phone.mdl-cell--11-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--11-col,.mdl-grid--no-spacing>.mdl-cell--11-col-phone.mdl-cell--11-col-phone{width:100%}.mdl-cell--12-col,.mdl-cell--12-col-phone.mdl-cell--12-col-phone{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--12-col,.mdl-grid--no-spacing>.mdl-cell--12-col-phone.mdl-cell--12-col-phone{width:100%}}@media (min-width:480px) and (max-width:839px){.mdl-grid{padding:8px}.mdl-cell{margin:8px;width:calc(50% - 16px)}.mdl-grid--no-spacing>.mdl-cell{width:50%}.mdl-cell--hide-tablet{display:none!important}.mdl-cell--1-col,.mdl-cell--1-col-tablet.mdl-cell--1-col-tablet{width:calc(12.5% - 16px)}.mdl-grid--no-spacing>.mdl-cell--1-col,.mdl-grid--no-spacing>.mdl-cell--1-col-tablet.mdl-cell--1-col-tablet{width:12.5%}.mdl-cell--2-col,.mdl-cell--2-col-tablet.mdl-cell--2-col-tablet{width:calc(25% - 16px)}.mdl-grid--no-spacing>.mdl-cell--2-col,.mdl-grid--no-spacing>.mdl-cell--2-col-tablet.mdl-cell--2-col-tablet{width:25%}.mdl-cell--3-col,.mdl-cell--3-col-tablet.mdl-cell--3-col-tablet{width:calc(37.5% - 16px)}.mdl-grid--no-spacing>.mdl-cell--3-col,.mdl-grid--no-spacing>.mdl-cell--3-col-tablet.mdl-cell--3-col-tablet{width:37.5%}.mdl-cell--4-col,.mdl-cell--4-col-tablet.mdl-cell--4-col-tablet{width:calc(50% - 16px)}.mdl-grid--no-spacing>.mdl-cell--4-col,.mdl-grid--no-spacing>.mdl-cell--4-col-tablet.mdl-cell--4-col-tablet{width:50%}.mdl-cell--5-col,.mdl-cell--5-col-tablet.mdl-cell--5-col-tablet{width:calc(62.5% - 16px)}.mdl-grid--no-spacing>.mdl-cell--5-col,.mdl-grid--no-spacing>.mdl-cell--5-col-tablet.mdl-cell--5-col-tablet{width:62.5%}.mdl-cell--6-col,.mdl-cell--6-col-tablet.mdl-cell--6-col-tablet{width:calc(75% - 16px)}.mdl-grid--no-spacing>.mdl-cell--6-col,.mdl-grid--no-spacing>.mdl-cell--6-col-tablet.mdl-cell--6-col-tablet{width:75%}.mdl-cell--7-col,.mdl-cell--7-col-tablet.mdl-cell--7-col-tablet{width:calc(87.5% - 16px)}.mdl-grid--no-spacing>.mdl-cell--7-col,.mdl-grid--no-spacing>.mdl-cell--7-col-tablet.mdl-cell--7-col-tablet{width:87.5%}.mdl-cell--8-col,.mdl-cell--8-col-tablet.mdl-cell--8-col-tablet{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--8-col,.mdl-grid--no-spacing>.mdl-cell--8-col-tablet.mdl-cell--8-col-tablet{width:100%}.mdl-cell--9-col,.mdl-cell--9-col-tablet.mdl-cell--9-col-tablet{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--9-col,.mdl-grid--no-spacing>.mdl-cell--9-col-tablet.mdl-cell--9-col-tablet{width:100%}.mdl-cell--10-col,.mdl-cell--10-col-tablet.mdl-cell--10-col-tablet{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--10-col,.mdl-grid--no-spacing>.mdl-cell--10-col-tablet.mdl-cell--10-col-tablet{width:100%}.mdl-cell--11-col,.mdl-cell--11-col-tablet.mdl-cell--11-col-tablet{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--11-col,.mdl-grid--no-spacing>.mdl-cell--11-col-tablet.mdl-cell--11-col-tablet{width:100%}.mdl-cell--12-col,.mdl-cell--12-col-tablet.mdl-cell--12-col-tablet{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--12-col,.mdl-grid--no-spacing>.mdl-cell--12-col-tablet.mdl-cell--12-col-tablet{width:100%}}@media (min-width:840px){.mdl-grid{padding:8px}.mdl-cell{margin:8px;width:calc(33.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell{width:33.3333333333%}.mdl-cell--hide-desktop{display:none!important}.mdl-cell--1-col,.mdl-cell--1-col-desktop.mdl-cell--1-col-desktop{width:calc(8.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell--1-col,.mdl-grid--no-spacing>.mdl-cell--1-col-desktop.mdl-cell--1-col-desktop{width:8.3333333333%}.mdl-cell--2-col,.mdl-cell--2-col-desktop.mdl-cell--2-col-desktop{width:calc(16.6666666667% - 16px)}.mdl-grid--no-spacing>.mdl-cell--2-col,.mdl-grid--no-spacing>.mdl-cell--2-col-desktop.mdl-cell--2-col-desktop{width:16.6666666667%}.mdl-cell--3-col,.mdl-cell--3-col-desktop.mdl-cell--3-col-desktop{width:calc(25% - 16px)}.mdl-grid--no-spacing>.mdl-cell--3-col,.mdl-grid--no-spacing>.mdl-cell--3-col-desktop.mdl-cell--3-col-desktop{width:25%}.mdl-cell--4-col,.mdl-cell--4-col-desktop.mdl-cell--4-col-desktop{width:calc(33.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell--4-col,.mdl-grid--no-spacing>.mdl-cell--4-col-desktop.mdl-cell--4-col-desktop{width:33.3333333333%}.mdl-cell--5-col,.mdl-cell--5-col-desktop.mdl-cell--5-col-desktop{width:calc(41.6666666667% - 16px)}.mdl-grid--no-spacing>.mdl-cell--5-col,.mdl-grid--no-spacing>.mdl-cell--5-col-desktop.mdl-cell--5-col-desktop{width:41.6666666667%}.mdl-cell--6-col,.mdl-cell--6-col-desktop.mdl-cell--6-col-desktop{width:calc(50% - 16px)}.mdl-grid--no-spacing>.mdl-cell--6-col,.mdl-grid--no-spacing>.mdl-cell--6-col-desktop.mdl-cell--6-col-desktop{width:50%}.mdl-cell--7-col,.mdl-cell--7-col-desktop.mdl-cell--7-col-desktop{width:calc(58.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell--7-col,.mdl-grid--no-spacing>.mdl-cell--7-col-desktop.mdl-cell--7-col-desktop{width:58.3333333333%}.mdl-cell--8-col,.mdl-cell--8-col-desktop.mdl-cell--8-col-desktop{width:calc(66.6666666667% - 16px)}.mdl-grid--no-spacing>.mdl-cell--8-col,.mdl-grid--no-spacing>.mdl-cell--8-col-desktop.mdl-cell--8-col-desktop{width:66.6666666667%}.mdl-cell--9-col,.mdl-cell--9-col-desktop.mdl-cell--9-col-desktop{width:calc(75% - 16px)}.mdl-grid--no-spacing>.mdl-cell--9-col,.mdl-grid--no-spacing>.mdl-cell--9-col-desktop.mdl-cell--9-col-desktop{width:75%}.mdl-cell--10-col,.mdl-cell--10-col-desktop.mdl-cell--10-col-desktop{width:calc(83.3333333333% - 16px)}.mdl-grid--no-spacing>.mdl-cell--10-col,.mdl-grid--no-spacing>.mdl-cell--10-col-desktop.mdl-cell--10-col-desktop{width:83.3333333333%}.mdl-cell--11-col,.mdl-cell--11-col-desktop.mdl-cell--11-col-desktop{width:calc(91.6666666667% - 16px)}.mdl-grid--no-spacing>.mdl-cell--11-col,.mdl-grid--no-spacing>.mdl-cell--11-col-desktop.mdl-cell--11-col-desktop{width:91.6666666667%}.mdl-cell--12-col,.mdl-cell--12-col-desktop.mdl-cell--12-col-desktop{width:calc(100% - 16px)}.mdl-grid--no-spacing>.mdl-cell--12-col,.mdl-grid--no-spacing>.mdl-cell--12-col-desktop.mdl-cell--12-col-desktop{width:100%}} \ No newline at end of file diff --git a/src/controllers/accounts/edit.js b/src/controllers/accounts/edit.js index 7006672853..25f1112556 100644 --- a/src/controllers/accounts/edit.js +++ b/src/controllers/accounts/edit.js @@ -27,6 +27,7 @@ editController.get = function (req, res, callback) { userData.maximumProfileImageSize = parseInt(meta.config.maximumProfileImageSize, 10); userData.allowProfileImageUploads = parseInt(meta.config.allowProfileImageUploads, 10) === 1; userData.allowAccountDelete = parseInt(meta.config.allowAccountDelete, 10) === 1; + userData.profileImageDimension = parseInt(meta.config.profileImageDimension, 10) || 128; userData.groups = userData.groups.filter(function (group) { return group && group.userTitleEnabled && !groups.isPrivilegeGroup(group.name) && group.name !== 'registered-users'; @@ -36,7 +37,15 @@ editController.get = function (req, res, callback) { }); userData.title = '[[pages:account/edit, ' + userData.username + ']]'; - userData.breadcrumbs = helpers.buildBreadcrumbs([{ text: userData.username, url: '/user/' + userData.userslug }, { text: '[[user:edit]]' }]); + userData.breadcrumbs = helpers.buildBreadcrumbs([ + { + text: userData.username, + url: '/user/' + userData.userslug, + }, + { + text: '[[user:edit]]', + }, + ]); userData.editButtons = []; plugins.fireHook('filter:user.account.edit', userData, function (err, userData) { @@ -76,9 +85,17 @@ function renderRoute(name, req, res, next) { userData.title = '[[pages:account/edit/' + name + ', ' + userData.username + ']]'; userData.breadcrumbs = helpers.buildBreadcrumbs([ - { text: userData.username, url: '/user/' + userData.userslug }, - { text: '[[user:edit]]', url: '/user/' + userData.userslug + '/edit' }, - { text: '[[user:' + name + ']]' }, + { + text: userData.username, + url: '/user/' + userData.userslug, + }, + { + text: '[[user:edit]]', + url: '/user/' + userData.userslug + '/edit', + }, + { + text: '[[user:' + name + ']]', + }, ]); res.render('account/edit/' + name, userData); @@ -139,7 +156,10 @@ editController.uploadPicture = function (req, res, next) { return next(err); } - res.json([{ name: userPhoto.name, url: image.url.startsWith('http') ? image.url : nconf.get('relative_path') + image.url }]); + res.json([{ + name: userPhoto.name, + url: image.url.startsWith('http') ? image.url : nconf.get('relative_path') + image.url, + }]); }); }; @@ -154,7 +174,9 @@ editController.uploadCoverPicture = function (req, res, next) { return next(err); } - res.json([{ url: image.url }]); + res.json([{ + url: image.url, + }]); }); }; diff --git a/src/controllers/accounts/settings.js b/src/controllers/accounts/settings.js index 0644dad9e8..edd5d58282 100644 --- a/src/controllers/accounts/settings.js +++ b/src/controllers/accounts/settings.js @@ -37,11 +37,8 @@ settingsController.get = function (req, res, callback) { homePageRoutes: function (next) { getHomePageRoutes(next); }, - sounds: function (next) { - meta.sounds.getFiles(next); - }, soundsMapping: function (next) { - meta.sounds.getMapping(userData.uid, next); + meta.sounds.getUserSoundMap(userData.uid, next); }, }, next); }, @@ -50,16 +47,44 @@ settingsController.get = function (req, res, callback) { userData.languages = results.languages; userData.homePageRoutes = results.homePageRoutes; - var soundSettings = { - notificationSound: 'notification', - incomingChatSound: 'chat-incoming', - outgoingChatSound: 'chat-outgoing', + var types = [ + 'notification', + 'chat-incoming', + 'chat-outgoing', + ]; + var aliases = { + notification: 'notificationSound', + 'chat-incoming': 'incomingChatSound', + 'chat-outgoing': 'outgoingChatSound', }; - Object.keys(soundSettings).forEach(function (setting) { - userData[setting] = Object.keys(results.sounds).map(function (name) { - return { name: name, selected: name === results.soundsMapping[soundSettings[setting]] }; + types.forEach(function (type) { + var soundpacks = plugins.soundpacks.map(function (pack) { + var sounds = Object.keys(pack.sounds).map(function (soundName) { + var value = pack.name + ' | ' + soundName; + return { + name: soundName, + value: value, + selected: value === results.soundsMapping[type], + }; + }); + + return { + name: pack.name, + sounds: sounds, + }; }); + + userData[type + '-sound'] = soundpacks; + // fallback + userData[aliases[type]] = soundpacks.concat.apply([], soundpacks.map(function (pack) { + return pack.sounds.map(function (sound) { + return { + name: sound.value, + selected: sound.selected, + }; + }); + })); }); plugins.fireHook('filter:user.customSettings', { settings: results.settings, customSettings: [], uid: req.uid }, next); diff --git a/src/controllers/admin/dashboard.js b/src/controllers/admin/dashboard.js index 63ccc5eb7d..70149e580e 100644 --- a/src/controllers/admin/dashboard.js +++ b/src/controllers/admin/dashboard.js @@ -30,6 +30,14 @@ dashboardController.get = function (req, res, next) { link: '/admin/extend/plugins', }, ]; + + if (global.env !== 'production') { + notices.push({ + done: false, + notDoneText: '[[admin/general/dashboard:running-in-development]]', + }); + } + plugins.fireHook('filter:admin.notices', notices, next); }, }, function (err, results) { diff --git a/src/controllers/admin/sounds.js b/src/controllers/admin/sounds.js index 97dac0099a..bc4730a865 100644 --- a/src/controllers/admin/sounds.js +++ b/src/controllers/admin/sounds.js @@ -1,24 +1,46 @@ 'use strict'; -var meta = require('../../meta'); +var plugins = require('../../plugins'); +var db = require('../../database'); var soundsController = {}; soundsController.get = function (req, res, next) { - meta.sounds.getFiles(function (err, sounds) { + db.getObject('settings:sounds', function (err, settings) { if (err) { return next(err); } - sounds = Object.keys(sounds).map(function (name) { - return { - name: name, - }; + settings = settings || {}; + + var types = [ + 'notification', + 'chat-incoming', + 'chat-outgoing', + ]; + var output = {}; + + types.forEach(function (type) { + var soundpacks = plugins.soundpacks.map(function (pack) { + var sounds = Object.keys(pack.sounds).map(function (soundName) { + var value = pack.name + ' | ' + soundName; + return { + name: soundName, + value: value, + selected: value === settings[type], + }; + }); + + return { + name: pack.name, + sounds: sounds, + }; + }); + + output[type + '-sound'] = soundpacks; }); - res.render('admin/general/sounds', { - sounds: sounds, - }); + res.render('admin/general/sounds', output); }); }; diff --git a/src/controllers/admin/uploads.js b/src/controllers/admin/uploads.js index 0f53dcb8f3..02bd065c0b 100644 --- a/src/controllers/admin/uploads.js +++ b/src/controllers/admin/uploads.js @@ -5,6 +5,8 @@ var path = require('path'); var async = require('async'); var nconf = require('nconf'); var winston = require('winston'); + +var meta = require('../../meta'); var file = require('../../file'); var image = require('../../image'); var plugins = require('../../plugins'); @@ -105,12 +107,7 @@ uploadsController.uploadSound = function (req, res, next) { return next(err); } - var soundsPath = path.join(__dirname, '../../../build/public/sounds'); - var filePath = path.join(nconf.get('upload_path'), 'sounds', uploadedFile.name); - - file.link(filePath, path.join(soundsPath, path.basename(filePath))); - - fs.unlink(uploadedFile.path, function (err) { + meta.sounds.build(function (err) { if (err) { return next(err); } diff --git a/src/groups/cover.js b/src/groups/cover.js index d7dd9a8b79..a7d7550fa0 100644 --- a/src/groups/cover.js +++ b/src/groups/cover.js @@ -1,15 +1,13 @@ 'use strict'; var async = require('async'); -var nconf = require('nconf'); -var path = require('path'); var fs = require('fs'); -var crypto = require('crypto'); var Jimp = require('jimp'); var mime = require('mime'); var winston = require('winston'); var db = require('../database'); +var image = require('../image'); var uploadsController = require('../controllers/uploads'); module.exports = function (Groups) { @@ -35,7 +33,7 @@ module.exports = function (Groups) { if (tempPath) { return next(null, tempPath); } - writeImageDataToFile(data.imageData, next); + image.writeImageDataToTempFile(data.imageData, next); }, function (_tempPath, next) { tempPath = _tempPath; @@ -95,24 +93,6 @@ module.exports = function (Groups) { }); } - function writeImageDataToFile(imageData, callback) { - // Calculate md5sum of image - // This is required because user data can be private - var md5sum = crypto.createHash('md5'); - md5sum.update(imageData); - md5sum = md5sum.digest('hex'); - - // Save image - var tempPath = path.join(nconf.get('upload_path'), md5sum + '.png'); - var buffer = new Buffer(imageData.slice(imageData.indexOf('base64') + 7), 'base64'); - - fs.writeFile(tempPath, buffer, { - encoding: 'base64', - }, function (err) { - callback(err, tempPath); - }); - } - Groups.removeCover = function (data, callback) { db.deleteObjectFields('group:' + data.groupName, ['cover:url', 'cover:thumb:url', 'cover:position'], callback); }; diff --git a/src/image.js b/src/image.js index 82d8886895..1609993731 100644 --- a/src/image.js +++ b/src/image.js @@ -1,8 +1,13 @@ 'use strict'; +var os = require('os'); var fs = require('fs'); +var path = require('path'); var Jimp = require('jimp'); var async = require('async'); +var crypto = require('crypto'); + +var file = require('./file'); var plugins = require('./plugins'); var image = module.exports; @@ -65,9 +70,6 @@ image.resizeImage = function (data, callback) { } }, function (image, next) { - if (data.write === false) { - return next(); - } image.write(data.target || data.path, next); }, ], function (err) { @@ -83,7 +85,7 @@ image.normalise = function (path, extension, callback) { path: path, extension: extension, }, function (err) { - callback(err); + callback(err, path + '.png'); }); } else { new Jimp(path, function (err, image) { @@ -91,7 +93,7 @@ image.normalise = function (path, extension, callback) { return callback(err); } image.write(path + '.png', function (err) { - callback(err); + callback(err, path + '.png'); }); }); } @@ -116,3 +118,28 @@ image.convertImageToBase64 = function (path, callback) { callback(err, data ? data.toString('base64') : null); }); }; + +image.mimeFromBase64 = function (imageData) { + return imageData.slice(5, imageData.indexOf('base64') - 1); +}; + +image.extensionFromBase64 = function (imageData) { + return file.typeToExtension(image.mimeFromBase64(imageData)); +}; + +image.writeImageDataToTempFile = function (imageData, callback) { + var filename = crypto.createHash('md5').update(imageData).digest('hex'); + + var type = image.mimeFromBase64(imageData); + var extension = file.typeToExtension(type); + + var filepath = path.join(os.tmpdir(), filename + extension); + + var buffer = new Buffer(imageData.slice(imageData.indexOf('base64') + 7), 'base64'); + + fs.writeFile(filepath, buffer, { + encoding: 'base64', + }, function (err) { + callback(err, filepath); + }); +}; diff --git a/src/messaging/notifications.js b/src/messaging/notifications.js index 674fa77c3a..eb7a1a1a74 100644 --- a/src/messaging/notifications.js +++ b/src/messaging/notifications.js @@ -13,72 +13,76 @@ var sockets = require('../socket.io'); module.exports = function (Messaging) { Messaging.notifyQueue = {}; // Only used to notify a user of a new chat message, see Messaging.notifyUser + Messaging.notificationSendDelay = 1000 * 60; + Messaging.notifyUsersInRoom = function (fromUid, roomId, messageObj) { - Messaging.getUidsInRoom(roomId, 0, -1, function (err, uids) { - if (err) { - return; - } - - var data = { - roomId: roomId, - fromUid: fromUid, - message: messageObj, - }; - uids.forEach(function (uid) { - data.self = parseInt(uid, 10) === parseInt(fromUid, 10) ? 1 : 0; - Messaging.pushUnreadCount(uid); - sockets.in('uid_' + uid).emit('event:chats.receive', data); - }); - - // Delayed notifications - var queueObj = Messaging.notifyQueue[fromUid + ':' + roomId]; - if (queueObj) { - queueObj.message.content += '\n' + messageObj.content; - clearTimeout(queueObj.timeout); - } else { - queueObj = { + async.waterfall([ + function (next) { + Messaging.getUidsInRoom(roomId, 0, -1, next); + }, + function (uids, next) { + var data = { + roomId: roomId, + fromUid: fromUid, message: messageObj, }; - Messaging.notifyQueue[fromUid + ':' + roomId] = queueObj; - } - queueObj.timeout = setTimeout(function () { - sendNotifications(fromUid, uids, roomId, queueObj.message, function (err) { - if (!err) { - delete Messaging.notifyQueue[fromUid + ':' + roomId]; - } + uids.forEach(function (uid) { + data.self = parseInt(uid, 10) === parseInt(fromUid, 10) ? 1 : 0; + Messaging.pushUnreadCount(uid); + sockets.in('uid_' + uid).emit('event:chats.receive', data); }); - }, 1000 * 60); // wait 60s before sending - }); + + // Delayed notifications + var queueObj = Messaging.notifyQueue[fromUid + ':' + roomId]; + if (queueObj) { + queueObj.message.content += '\n' + messageObj.content; + clearTimeout(queueObj.timeout); + } else { + queueObj = { + message: messageObj, + }; + Messaging.notifyQueue[fromUid + ':' + roomId] = queueObj; + } + + queueObj.timeout = setTimeout(function () { + sendNotifications(fromUid, uids, roomId, queueObj.message); + }, Messaging.notificationSendDelay); + next(); + }, + ]); }; - function sendNotifications(fromuid, uids, roomId, messageObj, callback) { - user.isOnline(uids, function (err, isOnline) { - if (err) { - return callback(err); - } + function sendNotifications(fromuid, uids, roomId, messageObj) { + async.waterfall([ + function (next) { + user.isOnline(uids, next); + }, + function (isOnline, next) { + uids = uids.filter(function (uid, index) { + return !isOnline[index] && parseInt(fromuid, 10) !== parseInt(uid, 10); + }); - uids = uids.filter(function (uid, index) { - return !isOnline[index] && parseInt(fromuid, 10) !== parseInt(uid, 10); - }); - - if (!uids.length) { - return callback(); - } - - notifications.create({ - bodyShort: '[[notifications:new_message_from, ' + messageObj.fromUser.username + ']]', - bodyLong: messageObj.content, - nid: 'chat_' + fromuid + '_' + roomId, - from: fromuid, - path: '/chats/' + messageObj.roomId, - }, function (err, notification) { - if (!err && notification) { - notifications.push(notification, uids, callback); + if (!uids.length) { + return; } - }); - sendNotificationEmails(uids, messageObj); + notifications.create({ + bodyShort: '[[notifications:new_message_from, ' + messageObj.fromUser.username + ']]', + bodyLong: messageObj.content, + nid: 'chat_' + fromuid + '_' + roomId, + from: fromuid, + path: '/chats/' + messageObj.roomId, + }, next); + }, + ], function (err, notification) { + if (!err) { + delete Messaging.notifyQueue[fromuid + ':' + roomId]; + if (notification) { + notifications.push(notification, uids); + } + sendNotificationEmails(uids, messageObj); + } }); } @@ -87,38 +91,39 @@ module.exports = function (Messaging) { return; } - async.parallel({ - userData: function (next) { - user.getUsersFields(uids, ['uid', 'username', 'userslug'], next); + async.waterfall([ + function (next) { + async.parallel({ + userData: function (next) { + user.getUsersFields(uids, ['uid', 'username', 'userslug'], next); + }, + userSettings: function (next) { + user.getMultipleUserSettings(uids, next); + }, + }, next); }, - userSettings: function (next) { - user.getMultipleUserSettings(uids, next); + + function (results, next) { + results.userData = results.userData.filter(function (userData, index) { + return userData && results.userSettings[index] && results.userSettings[index].sendChatNotifications; + }); + async.each(results.userData, function (userData, next) { + emailer.send('notif_chat', userData.uid, { + subject: '[[email:notif.chat.subject, ' + messageObj.fromUser.username + ']]', + summary: '[[notifications:new_message_from, ' + messageObj.fromUser.username + ']]', + message: messageObj, + site_title: meta.config.title || 'NodeBB', + url: nconf.get('url'), + roomId: messageObj.roomId, + username: userData.username, + userslug: userData.userslug, + }, next); + }, next); }, - }, function (err, results) { + ], function (err) { if (err) { return winston.error(err); } - - results.userData = results.userData.filter(function (userData, index) { - return userData && results.userSettings[index] && results.userSettings[index].sendChatNotifications; - }); - - async.each(results.userData, function (userData, next) { - emailer.send('notif_chat', userData.uid, { - subject: '[[email:notif.chat.subject, ' + messageObj.fromUser.username + ']]', - summary: '[[notifications:new_message_from, ' + messageObj.fromUser.username + ']]', - message: messageObj, - site_title: meta.config.title || 'NodeBB', - url: nconf.get('url'), - roomId: messageObj.roomId, - username: userData.username, - userslug: userData.userslug, - }, next); - }, function (err) { - if (err) { - winston.error(err); - } - }); }); } }; diff --git a/src/meta/blacklist.js b/src/meta/blacklist.js index 2c17c488b1..31ce06af8c 100644 --- a/src/meta/blacklist.js +++ b/src/meta/blacklist.js @@ -3,16 +3,19 @@ var ip = require('ip'); var winston = require('winston'); var async = require('async'); + var db = require('../database'); +var pubsub = require('../pubsub'); var Blacklist = { _rules: [], }; Blacklist.load = function (callback) { + callback = callback || function () {}; async.waterfall([ - async.apply(db.get, 'ip-blacklist-rules'), - async.apply(Blacklist.validate), + Blacklist.get, + Blacklist.validate, ], function (err, rules) { if (err) { return callback(err); @@ -33,13 +36,18 @@ Blacklist.load = function (callback) { }); }; +pubsub.on('blacklist:reload', Blacklist.load); + Blacklist.save = function (rules, callback) { - db.set('ip-blacklist-rules', rules, function (err) { - if (err) { - return callback(err); - } - Blacklist.load(callback); - }); + async.waterfall([ + function (next) { + db.set('ip-blacklist-rules', rules, next); + }, + function (next) { + Blacklist.load(next); + pubsub.publish('blacklist:reload'); + }, + ], callback); }; Blacklist.get = function (callback) { @@ -48,14 +56,14 @@ Blacklist.get = function (callback) { Blacklist.test = function (clientIp, callback) { if ( - Blacklist._rules.ipv4.indexOf(clientIp) === -1 // not explicitly specified in ipv4 list - && Blacklist._rules.ipv6.indexOf(clientIp) === -1 // not explicitly specified in ipv6 list - && !Blacklist._rules.cidr.some(function (subnet) { + Blacklist._rules.ipv4.indexOf(clientIp) === -1 &&// not explicitly specified in ipv4 list + Blacklist._rules.ipv6.indexOf(clientIp) === -1 &&// not explicitly specified in ipv6 list + !Blacklist._rules.cidr.some(function (subnet) { return ip.cidrSubnet(subnet).contains(clientIp); }) // not in a blacklisted cidr range ) { if (typeof callback === 'function') { - callback(); + setImmediate(callback); } else { return false; } @@ -64,7 +72,7 @@ Blacklist.test = function (clientIp, callback) { err.code = 'blacklisted-ip'; if (typeof callback === 'function') { - callback(err); + setImmediate(callback, err); } else { return true; } diff --git a/src/meta/build.js b/src/meta/build.js index cdebd8572e..9ba5ec89bf 100644 --- a/src/meta/build.js +++ b/src/meta/build.js @@ -5,7 +5,7 @@ var winston = require('winston'); var buildStart; -var valid = ['js', 'clientCSS', 'acpCSS', 'tpl', 'lang']; +var valid = ['js', 'clientCSS', 'acpCSS', 'tpl', 'lang', 'sound']; exports.buildAll = function (callback) { exports.build(valid.join(','), callback); @@ -46,32 +46,32 @@ exports.buildTargets = function (targets, callback) { var cacheBuster = require('./cacheBuster'); var meta = require('../meta'); var numCpus = require('os').cpus().length; - var strategy = (targets.length > 1 && numCpus > 1); + var parallel = targets.length > 1 && numCpus > 1; buildStart = buildStart || Date.now(); var step = function (startTime, target, next, err) { if (err) { - winston.error('Build failed: ' + err.message); + winston.error('Build failed: ' + err.stack); process.exit(1); } winston.info('[build] ' + target + ' => Completed in ' + ((Date.now() - startTime) / 1000) + 's'); next(); }; - if (strategy) { + if (parallel) { winston.verbose('[build] Utilising multiple cores/processes'); } else { winston.verbose('[build] Utilising single-core'); } - async[strategy ? 'parallel' : 'series']([ + async[parallel ? 'parallel' : 'series']([ function (next) { if (targets.indexOf('js') !== -1) { winston.info('[build] Building javascript'); var startTime = Date.now(); async.series([ - meta.js.linkModules, + meta.js.buildModules, meta.js.linkStatics, async.apply(meta.js.minify, 'nodebb.min.js'), async.apply(meta.js.minify, 'acp.min.js'), @@ -111,6 +111,12 @@ exports.buildTargets = function (targets, callback) { meta.languages.build(step.bind(this, startTime, target, next)); break; + case 'sound': + winston.info('[build] Linking sound files'); + startTime = Date.now(); + meta.sounds.build(step.bind(this, startTime, target, next)); + break; + default: winston.warn('[build] Unknown build target: \'' + target + '\''); setImmediate(next); diff --git a/src/meta/css.js b/src/meta/css.js index 5454f29e46..33bd0877e0 100644 --- a/src/meta/css.js +++ b/src/meta/css.js @@ -31,7 +31,9 @@ module.exports = function (Meta) { '@import "../../public/less/generics.less";', '@import "../../public/less/mixins.less";', '@import "../../public/less/global.less";', - ].map(function (str) { return str.replace(/\//g, path.sep); }).join('\n'); + ].map(function (str) { + return str.replace(/\//g, path.sep); + }).join('\n'); }, admin: function (source) { return source + '\n' + [ @@ -41,7 +43,10 @@ module.exports = function (Meta) { '@import (inline) "../public/vendor/colorpicker/colorpicker.css";', '@import (inline) "../public/vendor/jquery/css/smoothness/jquery-ui.css";', '@import (inline) "../public/vendor/jquery/bootstrap-tagsinput/bootstrap-tagsinput.css";', - ].map(function (str) { return str.replace(/\//g, path.sep); }).join('\n'); + '@import (inline) "../public/vendor/mdl/material.css";', + ].map(function (str) { + return str.replace(/\//g, path.sep); + }).join('\n'); }, }; diff --git a/src/meta/js.js b/src/meta/js.js index 18701349f8..679236d9c8 100644 --- a/src/meta/js.js +++ b/src/meta/js.js @@ -7,11 +7,14 @@ var async = require('async'); var fs = require('fs'); var mkdirp = require('mkdirp'); var rimraf = require('rimraf'); +var uglifyjs = require('uglify-js'); var file = require('../file'); var plugins = require('../plugins'); var utils = require('../../public/src/utils'); +var minifierPath = path.join(__dirname, 'minifier.js'); + module.exports = function (Meta) { Meta.js = { target: {}, @@ -78,7 +81,7 @@ module.exports = function (Meta) { 'public/src/modules/string.js', ], - // modules listed below are routed through express (/src/modules) so they can be defined anonymously + // modules listed below are built (/src/modules) so they can be defined anonymously modules: { 'Chart.js': './node_modules/chart.js/dist/Chart.min.js', 'mousetrap.js': './node_modules/mousetrap/mousetrap.min.js', @@ -89,24 +92,123 @@ module.exports = function (Meta) { }, }; - Meta.js.linkModules = function (callback) { - rimraf(path.join(__dirname, '../../build/public/src/modules'), function (err) { - if (err) { - return callback(err); - } - async.eachLimit(Object.keys(Meta.js.scripts.modules), 1000, function (relPath, next) { - var filePath = path.join(__dirname, '../../', Meta.js.scripts.modules[relPath]); - var destPath = path.join(__dirname, '../../build/public/src/modules', relPath); + function minifyModules(modules, callback) { + async.eachLimit(modules, 500, function (mod, next) { + var filePath = mod.filePath; + var destPath = mod.destPath; + var minified; - mkdirp(path.dirname(destPath), function (err) { - if (err) { - return next(err); - } + async.parallel([ + function (cb) { + mkdirp(path.dirname(destPath), cb); + }, + function (cb) { + fs.readFile(filePath, function (err, buffer) { + if (err) { + return cb(err); + } + try { + minified = uglifyjs.minify(buffer.toString(), { + fromString: true, + compress: false, + }); + } catch (e) { + return cb(e); + } - file.link(filePath, destPath, next); - }); - }, callback); + cb(); + }); + }, + ], function (err) { + if (err) { + return next(err); + } + + fs.writeFile(destPath, minified.code, next); + }); + }, callback); + } + + function linkModules(callback) { + var modules = Meta.js.scripts.modules; + + async.eachLimit(Object.keys(modules), 1000, function (relPath, next) { + var filePath = path.join(__dirname, '../../', modules[relPath]); + var destPath = path.join(__dirname, '../../build/public/src/modules', relPath); + + mkdirp(path.dirname(destPath), function (err) { + if (err) { + return next(err); + } + + file.link(filePath, destPath, next); + }); + }, callback); + } + + var moduleDirs = ['modules', 'admin', 'client']; + + function getModuleList(callback) { + var modules = Object.keys(Meta.js.scripts.modules).map(function (relPath) { + return { + filePath: path.join(__dirname, '../../', Meta.js.scripts.modules[relPath]), + destPath: path.join(__dirname, '../../build/public/src/modules', relPath), + }; }); + + var dirs = moduleDirs.map(function (dir) { + return path.join(__dirname, '../../public/src', dir); + }); + + async.each(dirs, function (dir, next) { + utils.walk(dir, function (err, files) { + if (err) { + return next(err); + } + + var mods = files.filter(function (filePath) { + return path.extname(filePath) === '.js'; + }).map(function (filePath) { + return { + filePath: filePath, + destPath: path.join(__dirname, '../../build/public/src', path.relative(path.dirname(dir), filePath)), + }; + }); + + modules = modules.concat(mods); + + next(); + }); + }, function (err) { + callback(err, modules); + }); + } + + function clearModules(callback) { + var builtPaths = moduleDirs.map(function (p) { + return '../../build/public/src/' + p; + }); + async.each(builtPaths, function (builtPath, next) { + rimraf(path.join(__dirname, builtPath), next); + }, function (err) { + callback(err); + }); + } + + Meta.js.buildModules = function (callback) { + async.waterfall([ + clearModules, + function (next) { + if (global.env === 'development') { + return linkModules(callback); + } + + getModuleList(next); + }, + function (modules, next) { + minifyModules(modules, next); + }, + ], callback); }; Meta.js.linkStatics = function (callback) { @@ -133,7 +235,7 @@ module.exports = function (Meta) { winston.verbose('[meta/js] Minifying ' + target); var forkProcessParams = setupDebugging(); - var minifier = fork('minifier.js', [], forkProcessParams); + var minifier = fork(minifierPath, [], forkProcessParams); Meta.js.minifierProc = minifier; Meta.js.target[target] = {}; diff --git a/minifier.js b/src/meta/minifier.js similarity index 98% rename from minifier.js rename to src/meta/minifier.js index a68aca8fde..6152112c59 100644 --- a/minifier.js +++ b/src/meta/minifier.js @@ -3,7 +3,7 @@ var uglifyjs = require('uglify-js'); var async = require('async'); var fs = require('fs'); -var file = require('./src/file'); +var file = require('../file'); var Minifier = { js: {}, diff --git a/src/meta/sounds.js b/src/meta/sounds.js index 0205e56396..af6cbe3a2a 100644 --- a/src/meta/sounds.js +++ b/src/meta/sounds.js @@ -2,68 +2,102 @@ var path = require('path'); var fs = require('fs'); -var nconf = require('nconf'); -var winston = require('winston'); var rimraf = require('rimraf'); var mkdirp = require('mkdirp'); var async = require('async'); var file = require('../file'); var plugins = require('../plugins'); +var user = require('../user'); var db = require('../database'); + +var soundsPath = path.join(__dirname, '../../build/public/sounds'); +var uploadsPath = path.join(__dirname, '../../public/uploads/sounds'); + module.exports = function (Meta) { Meta.sounds = {}; - Meta.sounds.init = function (callback) { - if (nconf.get('isPrimary') === 'true') { - setupSounds(callback); - } else if (typeof callback === 'function') { - callback(); - } - }; - - Meta.sounds.getFiles = function (callback) { - async.waterfall([ - function (next) { - fs.readdir(path.join(__dirname, '../../build/public/sounds'), next); - }, - function (sounds, next) { - fs.readdir(path.join(nconf.get('upload_path'), 'sounds'), function (err, uploaded) { - if (err) { - if (err.code === 'ENOENT') { - return next(null, sounds); - } - return next(err); - } - next(null, sounds.concat(uploaded)); - }); - }, - ], function (err, files) { + Meta.sounds.addUploads = function addUploads(callback) { + fs.readdir(uploadsPath, function (err, files) { if (err) { - winston.error('Could not get local sound files:' + err.message); - console.log(err.stack); - return callback(null, []); + if (err.code !== 'ENOENT') { + return callback(err); + } + + files = []; } - var localList = {}; + var uploadSounds = files.reduce(function (prev, fileName) { + var name = fileName.split('.'); + if (!name.length || !name[0].length) { + return prev; + } + name = name[0]; + name = name[0].toUpperCase() + name.slice(1); - // Filter out hidden files - files = files.filter(function (filename) { - return !filename.startsWith('.'); + prev[name] = fileName; + return prev; + }, {}); + + plugins.soundpacks = plugins.soundpacks.filter(function (pack) { + return pack.name !== 'Uploads'; }); + if (Object.keys(uploadSounds).length) { + plugins.soundpacks.push({ + name: 'Uploads', + id: 'uploads', + dir: uploadsPath, + sounds: uploadSounds, + }); + } - // Return proper paths - files.forEach(function (filename) { - localList[filename] = nconf.get('relative_path') + '/assets/sounds/' + filename; - }); - - callback(null, localList); + callback(); }); }; - Meta.sounds.getMapping = function (uid, callback) { - var user = require('../user'); + Meta.sounds.build = function build(callback) { + Meta.sounds.addUploads(function (err) { + if (err) { + return callback(err); + } + + var map = plugins.soundpacks.map(function (pack) { + return Object.keys(pack.sounds).reduce(function (prev, soundName) { + var soundPath = pack.sounds[soundName]; + prev[pack.name + ' | ' + soundName] = pack.id + '/' + soundPath; + return prev; + }, {}); + }); + map.unshift({}); + map = Object.assign.apply(null, map); + + async.series([ + function (next) { + rimraf(soundsPath, next); + }, + function (next) { + mkdirp(soundsPath, next); + }, + function (cb) { + async.parallel([ + function (next) { + fs.writeFile(path.join(soundsPath, 'fileMap.json'), JSON.stringify(map), next); + }, + function (next) { + async.each(plugins.soundpacks, function (pack, next) { + file.linkDirs(pack.dir, path.join(soundsPath, pack.id), next); + }, next); + }, + ], cb); + }, + ], callback); + }); + }; + + var keys = ['chat-incoming', 'chat-outgoing', 'notification']; + + Meta.sounds.getUserSoundMap = function getUserSoundMap(uid, callback) { async.parallel({ defaultMapping: function (next) { db.getObject('settings:sounds', next); @@ -75,82 +109,25 @@ module.exports = function (Meta) { if (err) { return callback(err); } + var userSettings = results.userSettings; + userSettings = { + notification: userSettings.notificationSound, + 'chat-incoming': userSettings.incomingChatSound, + 'chat-outgoing': userSettings.outgoingChatSound, + }; var defaultMapping = results.defaultMapping || {}; var soundMapping = {}; - soundMapping.notification = (userSettings.notificationSound || userSettings.notificationSound === '') ? - userSettings.notificationSound : defaultMapping.notification || ''; - soundMapping['chat-incoming'] = (userSettings.incomingChatSound || userSettings.incomingChatSound === '') ? - userSettings.incomingChatSound : defaultMapping['chat-incoming'] || ''; - - soundMapping['chat-outgoing'] = (userSettings.outgoingChatSound || userSettings.outgoingChatSound === '') ? - userSettings.outgoingChatSound : defaultMapping['chat-outgoing'] || ''; + keys.forEach(function (key) { + if (userSettings[key] || userSettings[key] === '') { + soundMapping[key] = userSettings[key] || null; + } else { + soundMapping[key] = defaultMapping[key] || null; + } + }); callback(null, soundMapping); }); }; - - function setupSounds(callback) { - var soundsPath = path.join(__dirname, '../../build/public/sounds'); - - async.waterfall([ - function (next) { - fs.readdir(path.join(nconf.get('upload_path'), 'sounds'), function (err, files) { - if (err) { - if (err.code === 'ENOENT') { - return next(null, []); - } - return next(err); - } - - next(null, files); - }); - }, - function (uploaded, next) { - uploaded = uploaded.filter(function (filename) { - return !filename.startsWith('.'); - }).map(function (filename) { - return path.join(nconf.get('upload_path'), 'sounds', filename); - }); - - plugins.fireHook('filter:sounds.get', uploaded, function (err, filePaths) { - if (err) { - winston.error('Could not initialise sound files:' + err.message); - return; - } - - // Clear the sounds directory - async.series([ - function (next) { - rimraf(soundsPath, next); - }, - function (next) { - mkdirp(soundsPath, next); - }, - ], function (err) { - if (err) { - winston.error('Could not initialise sound files:' + err.message); - return; - } - - // Link paths - async.each(filePaths, function (filePath, next) { - file.link(filePath, path.join(soundsPath, path.basename(filePath)), next); - }, function (err) { - if (!err) { - winston.verbose('[sounds] Sounds OK'); - } else { - winston.error('[sounds] Could not initialise sounds: ' + err.message); - } - - if (typeof next === 'function') { - next(); - } - }); - }); - }); - }, - ], callback); - } }; diff --git a/src/middleware/header.js b/src/middleware/header.js index 1928169ae6..accbbf2fe6 100644 --- a/src/middleware/header.js +++ b/src/middleware/header.js @@ -59,114 +59,122 @@ module.exports = function (middleware) { templateValues.configJSON = JSON.stringify(res.locals.config); - async.parallel({ - scripts: function (next) { - plugins.fireHook('filter:scripts.get', [], next); + async.waterfall([ + function (next) { + async.parallel({ + scripts: function (next) { + plugins.fireHook('filter:scripts.get', [], next); + }, + isAdmin: function (next) { + user.isAdministrator(req.uid, next); + }, + isGlobalMod: function (next) { + user.isGlobalModerator(req.uid, next); + }, + isModerator: function (next) { + user.isModeratorOfAnyCategory(req.uid, next); + }, + user: function (next) { + var userData = { + uid: 0, + username: '[[global:guest]]', + userslug: '', + email: '', + picture: meta.config.defaultAvatar, + status: 'offline', + reputation: 0, + 'email:confirmed': false, + }; + if (req.uid) { + user.getUserFields(req.uid, Object.keys(userData), next); + } else { + next(null, userData); + } + }, + isEmailConfirmSent: function (next) { + if (!meta.config.requireEmailConfirmation || !req.uid) { + return next(null, false); + } + db.get('uid:' + req.uid + ':confirm:email:sent', next); + }, + navigation: async.apply(navigation.get), + tags: async.apply(meta.tags.parse, res.locals.metaTags, res.locals.linkTags), + banned: async.apply(user.isBanned, req.uid), + banReason: async.apply(user.getBannedReason, req.uid), + }, next); }, - isAdmin: function (next) { - user.isAdministrator(req.uid, next); - }, - isGlobalMod: function (next) { - user.isGlobalModerator(req.uid, next); - }, - isModerator: function (next) { - user.isModeratorOfAnyCategory(req.uid, next); - }, - user: function (next) { - var userData = { - uid: 0, - username: '[[global:guest]]', - userslug: '', - email: '', - picture: meta.config.defaultAvatar, - status: 'offline', - reputation: 0, - 'email:confirmed': false, - }; - if (req.uid) { - user.getUserFields(req.uid, Object.keys(userData), next); - } else { - next(null, userData); - } - }, - isEmailConfirmSent: function (next) { - if (!meta.config.requireEmailConfirmation || !req.uid) { - return next(null, false); - } - db.get('uid:' + req.uid + ':confirm:email:sent', next); - }, - navigation: async.apply(navigation.get), - tags: async.apply(meta.tags.parse, res.locals.metaTags, res.locals.linkTags), - banned: async.apply(user.isBanned, req.uid), - banReason: async.apply(user.getBannedReason, req.uid), - }, function (err, results) { - if (err) { - return callback(err); - } - - if (results.banned) { - req.logout(); - return res.redirect('/?banned=' + (results.banReason || 'no-reason')); - } - - results.user.isAdmin = results.isAdmin; - results.user.isGlobalMod = results.isGlobalMod; - results.user.isMod = !!results.isModerator; - results.user.uid = parseInt(results.user.uid, 10); - results.user.email = String(results.user.email).replace(/\\/g, '\\\\').replace(/"/g, '\\"'); - results.user['email:confirmed'] = parseInt(results.user['email:confirmed'], 10) === 1; - results.user.isEmailConfirmSent = !!results.isEmailConfirmSent; - - if (res.locals.config && parseInt(meta.config.disableCustomUserSkins, 10) !== 1 && res.locals.config.bootswatchSkin !== 'default') { - templateValues.bootswatchCSS = '//maxcdn.bootstrapcdn.com/bootswatch/latest/' + res.locals.config.bootswatchSkin + '/bootstrap.min.css'; - } - - templateValues.browserTitle = controllers.helpers.buildTitle(data.title); - templateValues.navigation = results.navigation; - templateValues.metaTags = results.tags.meta; - templateValues.linkTags = results.tags.link; - templateValues.isAdmin = results.user.isAdmin; - templateValues.isGlobalMod = results.user.isGlobalMod; - templateValues.showModMenu = results.user.isAdmin || results.user.isGlobalMod || results.user.isMod; - templateValues.user = results.user; - templateValues.userJSON = JSON.stringify(results.user); - templateValues.useCustomCSS = parseInt(meta.config.useCustomCSS, 10) === 1 && meta.config.customCSS; - templateValues.customCSS = templateValues.useCustomCSS ? (meta.config.renderedCustomCSS || '') : ''; - templateValues.useCustomJS = parseInt(meta.config.useCustomJS, 10) === 1; - templateValues.customJS = templateValues.useCustomJS ? meta.config.customJS : ''; - templateValues.maintenanceHeader = parseInt(meta.config.maintenanceMode, 10) === 1 && !results.isAdmin; - templateValues.defaultLang = meta.config.defaultLang || 'en-GB'; - templateValues.privateUserInfo = parseInt(meta.config.privateUserInfo, 10) === 1; - templateValues.privateTagListing = parseInt(meta.config.privateTagListing, 10) === 1; - - templateValues.template = { name: res.locals.template }; - templateValues.template[res.locals.template] = true; - - templateValues.scripts = results.scripts.map(function (script) { - return { src: script }; - }); - - if (req.route && req.route.path === '/') { - modifyTitle(templateValues); - } - - plugins.fireHook('filter:middleware.renderHeader', { templateValues: templateValues, req: req, res: res }, function (err, data) { - if (err) { - return callback(err); + function (results, next) { + if (results.banned) { + req.logout(); + return res.redirect('/?banned=' + (results.banReason || 'no-reason')); } - req.app.render('header', data.templateValues, callback); - }); - }); + results.user.isAdmin = results.isAdmin; + results.user.isGlobalMod = results.isGlobalMod; + results.user.isMod = !!results.isModerator; + results.user.uid = parseInt(results.user.uid, 10); + results.user.email = String(results.user.email).replace(/\\/g, '\\\\').replace(/"/g, '\\"'); + results.user['email:confirmed'] = parseInt(results.user['email:confirmed'], 10) === 1; + results.user.isEmailConfirmSent = !!results.isEmailConfirmSent; + + if (res.locals.config && parseInt(meta.config.disableCustomUserSkins, 10) !== 1 && res.locals.config.bootswatchSkin !== 'default') { + templateValues.bootswatchCSS = '//maxcdn.bootstrapcdn.com/bootswatch/latest/' + res.locals.config.bootswatchSkin + '/bootstrap.min.css'; + } + + templateValues.browserTitle = controllers.helpers.buildTitle(data.title); + templateValues.navigation = results.navigation; + templateValues.metaTags = results.tags.meta; + templateValues.linkTags = results.tags.link; + templateValues.isAdmin = results.user.isAdmin; + templateValues.isGlobalMod = results.user.isGlobalMod; + templateValues.showModMenu = results.user.isAdmin || results.user.isGlobalMod || results.user.isMod; + templateValues.user = results.user; + templateValues.userJSON = JSON.stringify(results.user); + templateValues.useCustomCSS = parseInt(meta.config.useCustomCSS, 10) === 1 && meta.config.customCSS; + templateValues.customCSS = templateValues.useCustomCSS ? (meta.config.renderedCustomCSS || '') : ''; + templateValues.useCustomJS = parseInt(meta.config.useCustomJS, 10) === 1; + templateValues.customJS = templateValues.useCustomJS ? meta.config.customJS : ''; + templateValues.maintenanceHeader = parseInt(meta.config.maintenanceMode, 10) === 1 && !results.isAdmin; + templateValues.defaultLang = meta.config.defaultLang || 'en-GB'; + templateValues.privateUserInfo = parseInt(meta.config.privateUserInfo, 10) === 1; + templateValues.privateTagListing = parseInt(meta.config.privateTagListing, 10) === 1; + + templateValues.template = { name: res.locals.template }; + templateValues.template[res.locals.template] = true; + + templateValues.scripts = results.scripts.map(function (script) { + return { src: script }; + }); + + if (req.route && req.route.path === '/') { + modifyTitle(templateValues); + } + + plugins.fireHook('filter:middleware.renderHeader', { + req: req, + res: res, + templateValues: templateValues, + }, next); + }, + function (data, next) { + req.app.render('header', data.templateValues, next); + }, + ], callback); }; middleware.renderFooter = function (req, res, data, callback) { - plugins.fireHook('filter:middleware.renderFooter', { templateValues: data, req: req, res: res }, function (err, data) { - if (err) { - return callback(err); - } - req.app.render('footer', data.templateValues, callback); - }); + async.waterfall([ + function (next) { + plugins.fireHook('filter:middleware.renderFooter', { + req: req, + res: res, + templateValues: data, + }, next); + }, + function (data, next) { + req.app.render('footer', data.templateValues, next); + }, + ], callback); }; function modifyTitle(obj) { diff --git a/src/navigation/admin.js b/src/navigation/admin.js index b186e332eb..0917e9e524 100644 --- a/src/navigation/admin.js +++ b/src/navigation/admin.js @@ -1,13 +1,12 @@ 'use strict'; - var async = require('async'); var plugins = require('../plugins'); var db = require('../database'); var translator = require('../../public/src/modules/translator'); var pubsub = require('../pubsub'); -var admin = {}; +var admin = module.exports; admin.cache = null; pubsub.on('admin:navigation:save', function () { @@ -70,5 +69,3 @@ function getAvailable(callback) { plugins.fireHook('filter:navigation.available', core, callback); } - -module.exports = admin; diff --git a/src/plugins.js b/src/plugins.js index 0b2611ae25..3c2f8ce790 100644 --- a/src/plugins.js +++ b/src/plugins.js @@ -32,6 +32,7 @@ var middleware; Plugins.libraryPaths = []; Plugins.versionWarning = []; Plugins.languageCodes = []; + Plugins.soundpacks = []; Plugins.initialized = false; diff --git a/src/plugins/load.js b/src/plugins/load.js index 49e4b26e2a..3c1c61df73 100644 --- a/src/plugins/load.js +++ b/src/plugins/load.js @@ -41,6 +41,7 @@ module.exports = function (Plugins) { Plugins.lessFiles.length = 0; Plugins.clientScripts.length = 0; Plugins.acpScripts.length = 0; + Plugins.soundpacks.length = 0; async.waterfall([ async.apply(Plugins.getPluginPaths), @@ -57,6 +58,7 @@ module.exports = function (Plugins) { async.apply(mapClientSideScripts, pluginData), async.apply(mapClientModules, pluginData), async.apply(mapStaticDirectories, pluginData, pluginData.path), + async.apply(mapSoundpack, pluginData), ], next); }, next); }, @@ -93,6 +95,9 @@ module.exports = function (Plugins) { function (next) { mapClientModules(pluginData, next); }, + function (next) { + mapSoundpack(pluginData, next); + }, ], function (err) { if (err) { winston.verbose('[plugins] Could not load plugin : ' + pluginData.id); @@ -251,6 +256,35 @@ module.exports = function (Plugins) { callback(); } + function mapSoundpack(pluginData, callback) { + var soundpack = pluginData.soundpack; + if (!soundpack || !soundpack.dir || !soundpack.sounds) { + return callback(); + } + soundpack.name = soundpack.name || pluginData.name; + soundpack.id = pluginData.id; + soundpack.dir = path.join(pluginData.path, soundpack.dir); + async.each(Object.keys(soundpack.sounds), function (key, next) { + file.exists(path.join(soundpack.dir, soundpack.sounds[key]), function (exists) { + if (!exists) { + delete soundpack.sounds[key]; + } + + next(); + }); + }, function (err) { + if (err) { + return callback(err); + } + + if (Object.keys(soundpack.sounds).length) { + Plugins.soundpacks.push(soundpack); + } + + callback(); + }); + } + function resolveModulePath(fullPath, relPath) { /** * With npm@3, dependencies can become flattened, and appear at the root level. diff --git a/src/socket.io/index.js b/src/socket.io/index.js index d6907538fd..253f5628e1 100644 --- a/src/socket.io/index.js +++ b/src/socket.io/index.js @@ -33,6 +33,28 @@ Sockets.init = function (server) { io.on('connection', onConnection); + /* + * Restrict socket.io listener to cookie domain. If none is set, infer based on url. + * Production only so you don't get accidentally locked out. + * Can be overridden via config (socket.io:origins) + */ + if (process.env.NODE_ENV !== 'development') { + var domain = nconf.get('cookieDomain'); + var parsedUrl = url.parse(nconf.get('url')); + var override = nconf.get('socket.io:origins'); + if (!domain) { + domain = parsedUrl.hostname; // cookies don't provide isolation by port: http://stackoverflow.com/a/16328399/122353 + } + + if (!override) { + io.origins(parsedUrl.protocol + '//' + domain + ':*'); + winston.info('[socket.io] Restricting access to origin: ' + parsedUrl.protocol + '//' + domain + ':*'); + } else { + io.origins(override); + winston.info('[socket.io] Restricting access to origin: ' + override); + } + } + io.listen(server, { transports: nconf.get('socket.io:transports'), }); diff --git a/src/socket.io/modules.js b/src/socket.io/modules.js index cdcc01f08b..f0309e8d30 100644 --- a/src/socket.io/modules.js +++ b/src/socket.io/modules.js @@ -342,20 +342,8 @@ SocketModules.chats.getMessages = function (socket, data, callback) { }; /* Sounds */ -SocketModules.sounds.getSounds = function (socket, data, callback) { - // Read sounds from local directory - meta.sounds.getFiles(callback); -}; - -SocketModules.sounds.getMapping = function (socket, data, callback) { - meta.sounds.getMapping(socket.uid, callback); -}; - -SocketModules.sounds.getData = function (socket, data, callback) { - async.parallel({ - mapping: async.apply(meta.sounds.getMapping, socket.uid), - files: async.apply(meta.sounds.getFiles), - }, callback); +SocketModules.sounds.getUserSoundMap = function getUserSoundMap(socket, data, callback) { + meta.sounds.getUserSoundMap(socket.uid, callback); }; module.exports = SocketModules; diff --git a/src/socket.io/posts.js b/src/socket.io/posts.js index 0a31f8427b..b4b5ac40cd 100644 --- a/src/socket.io/posts.js +++ b/src/socket.io/posts.js @@ -1,6 +1,6 @@ 'use strict'; -var async = require('async'); +var async = require('async'); var posts = require('../posts'); var privileges = require('../privileges'); @@ -31,25 +31,26 @@ SocketPosts.reply = function (socket, data, callback) { data.req = websockets.reqFromSocket(socket); data.timestamp = Date.now(); - topics.reply(data, function (err, postData) { - if (err) { - return callback(err); - } + async.waterfall([ + function (next) { + topics.reply(data, next); + }, + function (postData, next) { + var result = { + posts: [postData], + 'reputation:disabled': parseInt(meta.config['reputation:disabled'], 10) === 1, + 'downvote:disabled': parseInt(meta.config['downvote:disabled'], 10) === 1, + }; - var result = { - posts: [postData], - 'reputation:disabled': parseInt(meta.config['reputation:disabled'], 10) === 1, - 'downvote:disabled': parseInt(meta.config['downvote:disabled'], 10) === 1, - }; + next(null, postData); - callback(null, postData); + websockets.in('uid_' + socket.uid).emit('event:new_post', result); - websockets.in('uid_' + socket.uid).emit('event:new_post', result); + user.updateOnlineUsers(socket.uid); - user.updateOnlineUsers(socket.uid); - - socketHelpers.notifyNew(socket.uid, 'newPost', result); - }); + socketHelpers.notifyNew(socket.uid, 'newPost', result); + }, + ], callback); }; SocketPosts.getRawPost = function (socket, pid, callback) { @@ -120,7 +121,7 @@ SocketPosts.getPidIndex = function (socket, data, callback) { SocketPosts.getReplies = function (socket, pid, callback) { if (!utils.isNumber(pid)) { - return callback(new Error('[[error:invalid-data]')); + return callback(new Error('[[error:invalid-data]]')); } var postPrivileges; async.waterfall([ diff --git a/src/socket.io/user.js b/src/socket.io/user.js index bef5eb9d77..f7208b116a 100644 --- a/src/socket.io/user.js +++ b/src/socket.io/user.js @@ -272,34 +272,34 @@ SocketUser.invite = function (socket, email, callback) { return callback(new Error('[[error:forum-not-invite-only]]')); } - var max = meta.config.maximumInvites; + async.waterfall([ + function (next) { + user.isAdministrator(socket.uid, next); + }, + function (isAdmin, next) { + if (registrationType === 'admin-invite-only' && !isAdmin) { + return next(new Error('[[error:no-privileges]]')); + } + + var max = parseInt(meta.config.maximumInvites, 10); + if (!max) { + return user.sendInvitationEmail(socket.uid, email, callback); + } - user.isAdministrator(socket.uid, function (err, admin) { - if (err) { - return callback(err); - } - if (registrationType === 'admin-invite-only' && !admin) { - return callback(new Error('[[error:no-privileges]]')); - } - if (max) { async.waterfall([ function (next) { user.getInvitesNumber(socket.uid, next); }, function (invites, next) { - if (!admin && invites > max) { + if (!isAdmin && invites >= max) { return next(new Error('[[error:invite-maximum-met, ' + invites + ', ' + max + ']]')); } - next(); - }, - function (next) { + user.sendInvitationEmail(socket.uid, email, next); }, - ], callback); - } else { - user.sendInvitationEmail(socket.uid, email, callback); - } - }); + ], next); + }, + ], callback); }; SocketUser.getUserByUID = function (socket, uid, callback) { diff --git a/src/topics/posts.js b/src/topics/posts.js index 65c180d784..909de0caa4 100644 --- a/src/topics/posts.js +++ b/src/topics/posts.js @@ -27,23 +27,23 @@ module.exports = function (Topics) { }; Topics.getTopicPosts = function (tid, set, start, stop, uid, reverse, callback) { - callback = callback || function () {}; - async.parallel({ - posts: function (next) { - posts.getPostsFromSet(set, start, stop, uid, reverse, next); + async.waterfall([ + function (next) { + async.parallel({ + posts: function (next) { + posts.getPostsFromSet(set, start, stop, uid, reverse, next); + }, + postCount: function (next) { + Topics.getTopicField(tid, 'postcount', next); + }, + }, next); }, - postCount: function (next) { - Topics.getTopicField(tid, 'postcount', next); + function (results, next) { + Topics.calculatePostIndices(results.posts, start, stop, results.postCount, reverse); + + Topics.addPostData(results.posts, uid, next); }, - }, function (err, results) { - if (err) { - return callback(err); - } - - Topics.calculatePostIndices(results.posts, start, stop, results.postCount, reverse); - - Topics.addPostData(results.posts, uid, callback); - }); + ], callback); }; Topics.addPostData = function (postData, uid, callback) { @@ -58,88 +58,81 @@ module.exports = function (Topics) { return callback(null, []); } - async.parallel({ - bookmarks: function (next) { - posts.hasBookmarked(pids, uid, next); - }, - voteData: function (next) { - posts.getVoteStatusByPostIDs(pids, uid, next); - }, - userData: function (next) { - var uids = []; + function getPostUserData(field, method, callback) { + var uids = []; - for (var i = 0; i < postData.length; i += 1) { - if (postData[i] && uids.indexOf(postData[i].uid) === -1) { - uids.push(postData[i].uid); - } + postData.forEach(function (postData) { + if (postData && postData[field] && uids.indexOf(postData[field]) === -1) { + uids.push(postData[field]); } + }); - posts.getUserInfoForPosts(uids, uid, function (err, users) { - if (err) { - return next(err); - } - + async.waterfall([ + function (next) { + method(uids, next); + }, + function (users, next) { var userData = {}; users.forEach(function (user, index) { userData[uids[index]] = user; }); - next(null, userData); + }, + ], callback); + } + + async.waterfall([ + function (next) { + async.parallel({ + bookmarks: function (next) { + posts.hasBookmarked(pids, uid, next); + }, + voteData: function (next) { + posts.getVoteStatusByPostIDs(pids, uid, next); + }, + userData: function (next) { + getPostUserData('uid', function (uids, next) { + posts.getUserInfoForPosts(uids, uid, next); + }, next); + }, + editors: function (next) { + getPostUserData('editor', function (uids, next) { + user.getUsersFields(uids, ['uid', 'username', 'userslug'], next); + }, next); + }, + parents: function (next) { + Topics.addParentPosts(postData, next); + }, + }, next); + }, + function (results, next) { + postData.forEach(function (postObj, i) { + if (postObj) { + postObj.deleted = parseInt(postObj.deleted, 10) === 1; + postObj.user = parseInt(postObj.uid, 10) ? results.userData[postObj.uid] : _.clone(results.userData[postObj.uid]); + postObj.editor = postObj.editor ? results.editors[postObj.editor] : null; + postObj.bookmarked = results.bookmarks[i]; + postObj.upvoted = results.voteData.upvotes[i]; + postObj.downvoted = results.voteData.downvotes[i]; + postObj.votes = postObj.votes || 0; + postObj.replies = postObj.replies || 0; + postObj.selfPost = !!parseInt(uid, 10) && parseInt(uid, 10) === parseInt(postObj.uid, 10); + + // Username override for guests, if enabled + if (parseInt(meta.config.allowGuestHandles, 10) === 1 && parseInt(postObj.uid, 10) === 0 && postObj.handle) { + postObj.user.username = validator.escape(String(postObj.handle)); + } + } }); + plugins.fireHook('filter:topics.addPostData', { + posts: postData, + uid: uid, + }, next); }, - editors: function (next) { - var editors = []; - for (var i = 0; i < postData.length; i += 1) { - if (postData[i] && postData[i].editor && editors.indexOf(postData[i].editor) === -1) { - editors.push(postData[i].editor); - } - } - - user.getUsersFields(editors, ['uid', 'username', 'userslug'], function (err, editors) { - if (err) { - return next(err); - } - var editorData = {}; - editors.forEach(function (editor) { - editorData[editor.uid] = editor; - }); - next(null, editorData); - }); + function (data, next) { + next(null, data.posts); }, - parents: function (next) { - Topics.addParentPosts(postData, next); - }, - }, function (err, results) { - if (err) { - return callback(err); - } - - postData.forEach(function (postObj, i) { - if (postObj) { - postObj.deleted = parseInt(postObj.deleted, 10) === 1; - postObj.user = parseInt(postObj.uid, 10) ? results.userData[postObj.uid] : _.clone(results.userData[postObj.uid]); - postObj.editor = postObj.editor ? results.editors[postObj.editor] : null; - postObj.bookmarked = results.bookmarks[i]; - postObj.upvoted = results.voteData.upvotes[i]; - postObj.downvoted = results.voteData.downvotes[i]; - postObj.votes = postObj.votes || 0; - postObj.replies = postObj.replies || 0; - postObj.selfPost = !!parseInt(uid, 10) && parseInt(uid, 10) === parseInt(postObj.uid, 10); - - // Username override for guests, if enabled - if (parseInt(meta.config.allowGuestHandles, 10) === 1 && parseInt(postObj.uid, 10) === 0 && postObj.handle) { - postObj.user.username = validator.escape(String(postObj.handle)); - } - } - }); - - plugins.fireHook('filter:topics.addPostData', { - posts: postData, - uid: uid, - }, function (err, data) { - callback(err, data ? data.posts : null); - }); - }); + ], callback); }; Topics.modifyPostsByPrivilege = function (topicData, topicPrivileges) { @@ -172,7 +165,9 @@ module.exports = function (Topics) { async.apply(posts.getPostsFields, parentPids, ['uid']), function (_parentPosts, next) { parentPosts = _parentPosts; - var parentUids = parentPosts.map(function (postObj) { return parseInt(postObj.uid, 10); }).filter(function (uid, idx, users) { + var parentUids = parentPosts.map(function (postObj) { + return parseInt(postObj.uid, 10); + }).filter(function (uid, idx, users) { return users.indexOf(uid) === idx; }); @@ -231,31 +226,31 @@ module.exports = function (Topics) { var done = false; var latestPid = null; var index = 0; + var pids; async.doWhilst( function (next) { - db.getSortedSetRevRange('tid:' + tid + ':posts', index, index, function (err, pids) { - if (err) { - return next(err); - } - - if (!Array.isArray(pids) || !pids.length) { - done = true; - return next(); - } - - posts.getPostField(pids[0], 'deleted', function (err, deleted) { - if (err) { - return next(err); + async.waterfall([ + function (_next) { + db.getSortedSetRevRange('tid:' + tid + ':posts', index, index, _next); + }, + function (_pids, _next) { + pids = _pids; + if (!Array.isArray(pids) || !pids.length) { + done = true; + return next(); } + posts.getPostField(pids[0], 'deleted', _next); + }, + function (deleted, _next) { isDeleted = parseInt(deleted, 10) === 1; if (!isDeleted) { latestPid = pids[0]; } index += 1; - next(); - }); - }); + _next(); + }, + ], next); }, function () { return isDeleted && !done; @@ -317,22 +312,24 @@ module.exports = function (Topics) { }; Topics.getPids = function (tid, callback) { - async.parallel({ - mainPid: function (next) { - Topics.getTopicField(tid, 'mainPid', next); + async.waterfall([ + function (next) { + async.parallel({ + mainPid: function (next) { + Topics.getTopicField(tid, 'mainPid', next); + }, + pids: function (next) { + db.getSortedSetRange('tid:' + tid + ':posts', 0, -1, next); + }, + }, next); }, - pids: function (next) { - db.getSortedSetRange('tid:' + tid + ':posts', 0, -1, next); + function (results, next) { + if (results.mainPid) { + results.pids = [results.mainPid].concat(results.pids); + } + next(null, results.pids); }, - }, function (err, results) { - if (err) { - return callback(err); - } - if (results.mainPid) { - results.pids = [results.mainPid].concat(results.pids); - } - callback(null, results.pids); - }); + ], callback); }; Topics.increasePostCount = function (tid, callback) { @@ -349,12 +346,14 @@ module.exports = function (Topics) { function incrementFieldAndUpdateSortedSet(tid, field, by, set, callback) { callback = callback || function () {}; - db.incrObjectFieldBy('topic:' + tid, field, by, function (err, value) { - if (err) { - return callback(err); - } - db.sortedSetAdd(set, value, tid, callback); - }); + async.waterfall([ + function (next) { + db.incrObjectFieldBy('topic:' + tid, field, by, next); + }, + function (value, next) { + db.sortedSetAdd(set, value, tid, next); + }, + ], callback); } Topics.getTitleByPid = function (pid, callback) { @@ -362,21 +361,25 @@ module.exports = function (Topics) { }; Topics.getTopicFieldByPid = function (field, pid, callback) { - posts.getPostField(pid, 'tid', function (err, tid) { - if (err) { - return callback(err); - } - Topics.getTopicField(tid, field, callback); - }); + async.waterfall([ + function (next) { + posts.getPostField(pid, 'tid', next); + }, + function (tid, next) { + Topics.getTopicField(tid, field, next); + }, + ], callback); }; Topics.getTopicDataByPid = function (pid, callback) { - posts.getPostField(pid, 'tid', function (err, tid) { - if (err) { - return callback(err); - } - Topics.getTopicData(tid, callback); - }); + async.waterfall([ + function (next) { + posts.getPostField(pid, 'tid', next); + }, + function (tid, next) { + Topics.getTopicData(tid, next); + }, + ], callback); }; Topics.getPostCount = function (tid, callback) { diff --git a/src/user/invite.js b/src/user/invite.js index 7e1b8c9866..4e41b824a5 100644 --- a/src/user/invite.js +++ b/src/user/invite.js @@ -60,9 +60,7 @@ module.exports = function (User) { if (exists) { return next(new Error('[[error:email-taken]]')); } - next(); - }, - function (next) { + async.parallel([ function (next) { db.setAdd('invitation:uid:' + uid, email, next); @@ -130,10 +128,10 @@ module.exports = function (User) { return next(new Error('[[error:invalid-username]]')); } async.parallel([ - function deleteFromReferenceList(next) { - db.setRemove('invitation:uid:' + invitedByUid, email, next); + function (next) { + deleteFromReferenceList(invitedByUid, email, next); }, - function deleteInviteKey(next) { + function (next) { db.delete('invitation:email:' + email, next); }, ], function (err) { @@ -145,6 +143,36 @@ module.exports = function (User) { User.deleteInvitationKey = function (email, callback) { callback = callback || function () {}; - db.delete('invitation:email:' + email, callback); + + async.waterfall([ + function (next) { + User.getInvitingUsers(next); + }, + function (uids, next) { + async.each(uids, function (uid, next) { + deleteFromReferenceList(uid, email, next); + }, next); + }, + function (next) { + db.delete('invitation:email:' + email, next); + }, + ], callback); }; + + function deleteFromReferenceList(uid, email, callback) { + async.waterfall([ + function (next) { + db.setRemove('invitation:uid:' + uid, email, next); + }, + function (next) { + db.setCount('invitation:uid:' + uid, next); + }, + function (count, next) { + if (count === 0) { + return db.setRemove('invitation:uids', uid, next); + } + setImmediate(next); + }, + ], callback); + } }; diff --git a/src/user/picture.js b/src/user/picture.js index 1fc3b05ffd..be489364b9 100644 --- a/src/user/picture.js +++ b/src/user/picture.js @@ -1,11 +1,8 @@ 'use strict'; var async = require('async'); -var path = require('path'); var fs = require('fs'); -var os = require('os'); var nconf = require('nconf'); -var crypto = require('crypto'); var winston = require('winston'); var request = require('request'); var mime = require('mime'); @@ -18,77 +15,7 @@ var db = require('../database'); module.exports = function (User) { User.uploadPicture = function (uid, picture, callback) { - var uploadSize = parseInt(meta.config.maximumProfileImageSize, 10) || 256; - var extension = path.extname(picture.name); - var updateUid = uid; - var imageDimension = parseInt(meta.config.profileImageDimension, 10) || 128; - var convertToPNG = parseInt(meta.config['profile:convertProfileImageToPNG'], 10) === 1; - var keepAllVersions = parseInt(meta.config['profile:keepAllUserImages'], 10) === 1; - var uploadedImage; - - if (parseInt(meta.config.allowProfileImageUploads, 10) !== 1) { - return callback(new Error('[[error:profile-image-uploads-disabled]]')); - } - - if (picture.size > uploadSize * 1024) { - return callback(new Error('[[error:file-too-big, ' + uploadSize + ']]')); - } - - if (!extension) { - return callback(new Error('[[error:invalid-image-extension]]')); - } - - async.waterfall([ - function (next) { - if (plugins.hasListeners('filter:uploadImage')) { - return plugins.fireHook('filter:uploadImage', { - image: picture, - uid: updateUid, - }, next); - } - - var filename = updateUid + '-profileimg' + (keepAllVersions ? '-' + Date.now() : '') + (convertToPNG ? '.png' : extension); - - async.waterfall([ - function (next) { - file.isFileTypeAllowed(picture.path, next); - }, - function (next) { - image.resizeImage({ - path: picture.path, - extension: extension, - width: imageDimension, - height: imageDimension, - write: false, - }, next); - }, - function (next) { - if (!convertToPNG) { - return next(); - } - async.series([ - async.apply(image.normalise, picture.path, extension), - async.apply(fs.rename, picture.path + '.png', picture.path), - ], function (err) { - next(err); - }); - }, - function (next) { - file.saveFileToLocal(filename, 'profile', picture.path, next); - }, - ], next); - }, - function (_image, next) { - uploadedImage = _image; - User.setUserFields(updateUid, { - uploadedpicture: uploadedImage.url, - picture: uploadedImage.url, - }, next); - }, - function (next) { - next(null, uploadedImage); - }, - ], callback); + User.uploadCroppedPicture({ uid: uid, file: picture }, callback); }; User.uploadFromUrl = function (uid, url, callback) { @@ -139,7 +66,7 @@ module.exports = function (User) { User.updateCoverPicture = function (data, callback) { var url; - var image = { + var picture = { name: 'profileCover', uid: data.uid, }; @@ -164,12 +91,14 @@ module.exports = function (User) { return setImmediate(next, null, data.file.path); } - saveImageDataToTempFile(data.imageData, next); + image.writeImageDataToTempFile(data.imageData, next); }, function (path, next) { - image.path = path; + picture.path = path; - uploadProfileOrCover('profilecover', image, data.imageData, next); + var extension = data.file ? file.typeToExtension(data.file.type) : image.extensionFromBase64(data.imageData); + var filename = generateProfileImageFilename(data.uid, 'profilecover', extension); + uploadProfileOrCover(filename, picture, next); }, function (uploadData, next) { url = uploadData.url; @@ -183,7 +112,7 @@ module.exports = function (User) { } }, ], function (err) { - deleteFile(image.path); + deleteFile(picture.path); callback(err, { url: url, }); @@ -191,75 +120,102 @@ module.exports = function (User) { }; User.uploadCroppedPicture = function (data, callback) { - var url; - var image = { + if (parseInt(meta.config.allowProfileImageUploads, 10) !== 1) { + return callback(new Error('[[error:profile-image-uploads-disabled]]')); + } + + if (!data.imageData && !data.file) { + return callback(new Error('[[error:invalid-data]]')); + } + + var size = data.file ? data.file.size : data.imageData.length; + var uploadSize = parseInt(meta.config.maximumProfileImageSize, 10) || 256; + if (size > uploadSize * 1024) { + return callback(new Error('[[error:file-too-big, ' + meta.config.maximumProfileImageSize + ']]')); + } + + var type = data.file ? data.file.type : image.mimeFromBase64(data.imageData); + var extension = file.typeToExtension(type); + if (!extension) { + return callback(new Error('[[error:invalid-image-extension]]')); + } + + var uploadedImage; + + var picture = { name: 'profileAvatar', uid: data.uid, }; - if (!data.imageData) { - return callback(new Error('[[error:invalid-data]]')); - } - async.waterfall([ function (next) { - var size = data.imageData.length; - var uploadSize = parseInt(meta.config.maximumProfileImageSize, 10) || 256; - if (size > uploadSize * 1024) { - return next(new Error('[[error:file-too-big, ' + meta.config.maximumProfileImageSize + ']]')); + if (data.file) { + return setImmediate(next, null, data.file.path); } - - saveImageDataToTempFile(data.imageData, next); + image.writeImageDataToTempFile(data.imageData, next); }, function (path, next) { - image.path = path; - - uploadProfileOrCover('profileavatar', image, data.imageData, next); + convertToPNG(path, extension, next); }, - function (uploadData, next) { - url = uploadData.url; + function (path, next) { + picture.path = path; + + var imageDimension = parseInt(meta.config.profileImageDimension, 10) || 128; + image.resizeImage({ + path: picture.path, + extension: extension, + width: imageDimension, + height: imageDimension, + }, next); + }, + function (next) { + var filename = generateProfileImageFilename(data.uid, 'profileavatar', extension); + uploadProfileOrCover(filename, picture, next); + }, + function (_uploadedImage, next) { + uploadedImage = _uploadedImage; + User.setUserFields(data.uid, { - uploadedpicture: url, - picture: url, + uploadedpicture: uploadedImage.url, + picture: uploadedImage.url, }, next); }, ], function (err) { - deleteFile(image.path); - callback(err, { - url: url, - }); + deleteFile(picture.path); + callback(err, uploadedImage); }); }; - function saveImageDataToTempFile(imageData, callback) { - var filename = crypto.createHash('md5').update(imageData).digest('hex'); - var filepath = path.join(os.tmpdir(), filename); + function convertToPNG(path, extension, callback) { + var convertToPNG = parseInt(meta.config['profile:convertProfileImageToPNG'], 10) === 1; + if (!convertToPNG) { + return setImmediate(callback, null, path); + } - var buffer = new Buffer(imageData.slice(imageData.indexOf('base64') + 7), 'base64'); - - fs.writeFile(filepath, buffer, { - encoding: 'base64', - }, function (err) { - callback(err, filepath); + image.normalise(path, extension, function (err, newPath) { + if (err) { + return callback(err); + } + deleteFile(path); + callback(null, newPath); }); } - function uploadProfileOrCover(type, image, imageData, callback) { + function uploadProfileOrCover(filename, image, callback) { if (plugins.hasListeners('filter:uploadImage')) { return plugins.fireHook('filter:uploadImage', { image: image, uid: image.uid, }, callback); } - var filename = generateProfileImageFilename(image.uid, type, imageData); + saveFileToLocal(filename, image, callback); } - function generateProfileImageFilename(uid, type, imageData) { - var extension = file.typeToExtension(imageData.slice(5, imageData.indexOf('base64') - 1)); + function generateProfileImageFilename(uid, type, extension) { var keepAllVersions = parseInt(meta.config['profile:keepAllUserImages'], 10) === 1; - var filename = uid + '-' + type + (keepAllVersions ? '-' + Date.now() : '') + (extension || ''); - return filename; + var convertToPNG = parseInt(meta.config['profile:convertProfileImageToPNG'], 10) === 1; + return uid + '-' + type + (keepAllVersions ? '-' + Date.now() : '') + (convertToPNG ? '.png' : extension); } function saveFileToLocal(filename, image, callback) { @@ -273,6 +229,7 @@ module.exports = function (User) { function (upload, next) { next(null, { url: nconf.get('relative_path') + upload.url, + path: upload.path, name: image.name, }); }, diff --git a/src/views/admin/advanced/cache.tpl b/src/views/admin/advanced/cache.tpl index 70f82ab5db..126cba8db0 100644 --- a/src/views/admin/advanced/cache.tpl +++ b/src/views/admin/advanced/cache.tpl @@ -1,5 +1,5 @@ -
    +
    [[admin/advanced/cache:post-cache]]
    diff --git a/src/views/admin/advanced/database.tpl b/src/views/admin/advanced/database.tpl index 973cacf1aa..c9003e52f9 100644 --- a/src/views/admin/advanced/database.tpl +++ b/src/views/admin/advanced/database.tpl @@ -1,4 +1,4 @@ -
    +
    diff --git a/src/views/admin/advanced/events.tpl b/src/views/admin/advanced/events.tpl index b80f56ed6e..65c707920f 100644 --- a/src/views/admin/advanced/events.tpl +++ b/src/views/admin/advanced/events.tpl @@ -1,4 +1,4 @@ -
    +
    [[admin/advanced/events:events]]
    diff --git a/src/views/admin/advanced/logs.tpl b/src/views/admin/advanced/logs.tpl index a8f8a501a3..4f7772bd22 100644 --- a/src/views/admin/advanced/logs.tpl +++ b/src/views/admin/advanced/logs.tpl @@ -1,4 +1,4 @@ -
    +
    [[admin/advanced/logs:logs]]
    diff --git a/src/views/admin/appearance/skins.tpl b/src/views/admin/appearance/skins.tpl index c5d1355f08..6e87580557 100644 --- a/src/views/admin/appearance/skins.tpl +++ b/src/views/admin/appearance/skins.tpl @@ -1,4 +1,4 @@ -
    +
    [[admin/appearance/skins:loading]]
    diff --git a/src/views/admin/development/logger.tpl b/src/views/admin/development/logger.tpl index 7b33625931..dc8704a52b 100644 --- a/src/views/admin/development/logger.tpl +++ b/src/views/admin/development/logger.tpl @@ -1,4 +1,4 @@ -
    +
    [[admin/development/logger:logger-settings]]
    diff --git a/src/views/admin/extend/rewards.tpl b/src/views/admin/extend/rewards.tpl index b4256a41d3..5177d1a77e 100644 --- a/src/views/admin/extend/rewards.tpl +++ b/src/views/admin/extend/rewards.tpl @@ -1,4 +1,4 @@ -
    +
    [[admin/extend/rewards:rewards]]
    diff --git a/src/views/admin/general/navigation.tpl b/src/views/admin/general/navigation.tpl index 3d3d17f096..5b5f95cfb1 100644 --- a/src/views/admin/general/navigation.tpl +++ b/src/views/admin/general/navigation.tpl @@ -1,4 +1,4 @@ -