diff --git a/.ddev/config.yaml b/.ddev/config.yaml new file mode 100644 index 0000000..843a8ed --- /dev/null +++ b/.ddev/config.yaml @@ -0,0 +1,261 @@ +name: cs-ia +type: php +docroot: public +php_version: "8.2" +webserver_type: apache-fpm +router_http_port: "80" +router_https_port: "443" +xdebug_enabled: false +additional_hostnames: [] +additional_fqdns: [] +database: + type: mysql + version: "8.0" +nfs_mount_enabled: false +mutagen_enabled: false +webimage_extra_packages: [php-bcmath, php-intl, php-ldap, php-soap, php-zip] +project_tld: test +use_dns_when_possible: true +timezone: America/Vancouver +composer_version: "2" +disable_settings_management: true +web_environment: [] +nodejs_version: "16" + +# Key features of ddev's config.yaml: + +# name: # Name of the project, automatically provides +# http://projectname.ddev.site and https://projectname.ddev.site + +# type: # drupal6/7/8, backdrop, typo3, wordpress, php + +# docroot: # Relative path to the directory containing index.php. + +# php_version: "7.4" # PHP version to use, "5.6", "7.0", "7.1", "7.2", "7.3", "7.4", "8.0", "8.1", "8.2" + +# You can explicitly specify the webimage but this +# is not recommended, as the images are often closely tied to ddev's' behavior, +# so this can break upgrades. + +# webimage: # nginx/php docker image. + +# database: +# type: # mysql, mariadb +# version: # database version, like "10.3" or "8.0" +# Note that mariadb_version or mysql_version from v1.18 and earlier +# will automatically be converted to this notation with just a "ddev config --auto" + +# router_http_port: # Port to be used for http (defaults to port 80) +# router_https_port: # Port for https (defaults to 443) + +# xdebug_enabled: false # Set to true to enable xdebug and "ddev start" or "ddev restart" +# Note that for most people the commands +# "ddev xdebug" to enable xdebug and "ddev xdebug off" to disable it work better, +# as leaving xdebug enabled all the time is a big performance hit. + +# xhprof_enabled: false # Set to true to enable xhprof and "ddev start" or "ddev restart" +# Note that for most people the commands +# "ddev xhprof" to enable xhprof and "ddev xhprof off" to disable it work better, +# as leaving xhprof enabled all the time is a big performance hit. + +# webserver_type: nginx-fpm # or apache-fpm + +# timezone: Europe/Berlin +# This is the timezone used in the containers and by PHP; +# it can be set to any valid timezone, +# see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones +# For example Europe/Dublin or MST7MDT + +# composer_root: +# Relative path to the composer root directory from the project root. This is +# the directory which contains the composer.json and where all Composer related +# commands are executed. + +# composer_version: "2" +# You can set it to "" or "2" (default) for Composer v2 or "1" for Composer v1 +# to use the latest major version available at the time your container is built. +# It is also possible to use each other Composer version channel. This includes: +# - 2.2 (latest Composer LTS version) +# - stable +# - preview +# - snapshot +# Alternatively, an explicit Composer version may be specified, for example "2.2.18". +# To reinstall Composer after the image was built, run "ddev debug refresh". + +# nodejs_version: "16" +# change from the default system Node.js version to another supported version, like 12, 14, 17, 18. +# Note that you can use 'ddev nvm' or nvm inside the web container to provide nearly any +# Node.js version, including v6, etc. + +# additional_hostnames: +# - somename +# - someothername +# would provide http and https URLs for "somename.ddev.site" +# and "someothername.ddev.site". + +# additional_fqdns: +# - example.com +# - sub1.example.com +# would provide http and https URLs for "example.com" and "sub1.example.com" +# Please take care with this because it can cause great confusion. + +# upload_dir: custom/upload/dir +# would set the destination path for ddev import-files to /custom/upload/dir +# When mutagen is enabled this path is bind-mounted so that all the files +# in the upload_dir don't have to be synced into mutagen + +# working_dir: +# web: /var/www/html +# db: /home +# would set the default working directory for the web and db services. +# These values specify the destination directory for ddev ssh and the +# directory in which commands passed into ddev exec are run. + +# omit_containers: [db, dba, ddev-ssh-agent] +# Currently only these containers are supported. Some containers can also be +# omitted globally in the ~/.ddev/global_config.yaml. Note that if you omit +# the "db" container, several standard features of ddev that access the +# database container will be unusable. In the global configuration it is also +# possible to omit ddev-router, but not here. + +# nfs_mount_enabled: false +# Great performance improvement but requires host configuration first. +# See https://ddev.readthedocs.io/en/latest/users/install/performance/#nfs + +# mutagen_enabled: false +# Performance improvement using mutagen asynchronous updates. +# See https://ddev.readthedocs.io/en/latest/users/install/performance/#mutagen + +# fail_on_hook_fail: False +# Decide whether 'ddev start' should be interrupted by a failing hook + +# host_https_port: "59002" +# The host port binding for https can be explicitly specified. It is +# dynamic unless otherwise specified. +# This is not used by most people, most people use the *router* instead +# of the localhost port. + +# host_webserver_port: "59001" +# The host port binding for the ddev-webserver can be explicitly specified. It is +# dynamic unless otherwise specified. +# This is not used by most people, most people use the *router* instead +# of the localhost port. + +# host_db_port: "59002" +# The host port binding for the ddev-dbserver can be explicitly specified. It is dynamic +# unless explicitly specified. + +# phpmyadmin_port: "8036" +# phpmyadmin_https_port: "8037" +# The PHPMyAdmin ports can be changed from the default 8036 and 8037 + +# host_phpmyadmin_port: "8036" +# The phpmyadmin (dba) port is not normally bound on the host at all, instead being routed +# through ddev-router, but it can be specified and bound. + +# mailhog_port: "8025" +# mailhog_https_port: "8026" +# The MailHog ports can be changed from the default 8025 and 8026 + +# host_mailhog_port: "8025" +# The mailhog port is not normally bound on the host at all, instead being routed +# through ddev-router, but it can be bound directly to localhost if specified here. + +# webimage_extra_packages: [php7.4-tidy, php-bcmath] +# Extra Debian packages that are needed in the webimage can be added here + +# dbimage_extra_packages: [telnet,netcat] +# Extra Debian packages that are needed in the dbimage can be added here + +# use_dns_when_possible: true +# If the host has internet access and the domain configured can +# successfully be looked up, DNS will be used for hostname resolution +# instead of editing /etc/hosts +# Defaults to true + +# project_tld: ddev.site +# The top-level domain used for project URLs +# The default "ddev.site" allows DNS lookup via a wildcard +# If you prefer you can change this to "ddev.local" to preserve +# pre-v1.9 behavior. + +# ngrok_args: --basic-auth username:pass1234 +# Provide extra flags to the "ngrok http" command, see +# https://ngrok.com/docs#http or run "ngrok http -h" + +# disable_settings_management: false +# If true, ddev will not create CMS-specific settings files like +# Drupal's settings.php/settings.ddev.php or TYPO3's AdditionalConfiguration.php +# In this case the user must provide all such settings. + +# You can inject environment variables into the web container with: +# web_environment: +# - SOMEENV=somevalue +# - SOMEOTHERENV=someothervalue + +# no_project_mount: false +# (Experimental) If true, ddev will not mount the project into the web container; +# the user is responsible for mounting it manually or via a script. +# This is to enable experimentation with alternate file mounting strategies. +# For advanced users only! + +# bind_all_interfaces: false +# If true, host ports will be bound on all network interfaces, +# not just the localhost interface. This means that ports +# will be available on the local network if the host firewall +# allows it. + +# default_container_timeout: 120 +# The default time that ddev waits for all containers to become ready can be increased from +# the default 120. This helps in importing huge databases, for example. + +#web_extra_exposed_ports: +#- name: nodejs +# container_port: 3000 +# http_port: 2999 +# https_port: 3000 +#- name: something +# container_port: 4000 +# https_port: 4000 +# http_port: 3999 +# Allows a set of extra ports to be exposed via ddev-router +# The port behavior on the ddev-webserver must be arranged separately, for example +# using web_extra_daemons. +# For example, with a web app on port 3000 inside the container, this config would +# expose that web app on https://.ddev.site:9999 and http://.ddev.site:9998 +# web_extra_exposed_ports: +# - container_port: 3000 +# http_port: 9998 +# https_port: 9999 + +#web_extra_daemons: +#- name: "http-1" +# command: "/var/www/html/node_modules/.bin/http-server -p 3000" +# directory: /var/www/html +#- name: "http-2" +# command: "/var/www/html/node_modules/.bin/http-server /var/www/html/sub -p 3000" +# directory: /var/www/html + +# override_config: false +# By default, config.*.yaml files are *merged* into the configuration +# But this means that some things can't be overridden +# For example, if you have 'nfs_mount_enabled: true'' you can't override it with a merge +# and you can't erase existing hooks or all environment variables. +# However, with "override_config: true" in a particular config.*.yaml file, +# 'nfs_mount_enabled: false' can override the existing values, and +# hooks: +# post-start: [] +# or +# web_environment: [] +# or +# additional_hostnames: [] +# can have their intended affect. 'override_config' affects only behavior of the +# config.*.yaml file it exists in. + +# Many ddev commands can be extended to run tasks before or after the +# ddev command is executed, for example "post-start", "post-import-db", +# "pre-composer", "post-composer" +# See https://ddev.readthedocs.io/en/stable/users/extend/custom-commands/ for more +# information on the commands that can be extended and the tasks you can define +# for them. Example: +#hooks: diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..1671c9b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[docker-compose.yml] +indent_size = 4 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..d176c51 --- /dev/null +++ b/.env.example @@ -0,0 +1,7 @@ +# This file is a "template" of which env vars need to be defined for your application +# Copy this file to .env file for development, create environment variables when deploying to production +# https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration + +AC_URL='https://www.cs.ubc.ca/collab' +AC_USER='[YOUR ACCOUNT@cs.ubc.ca]' +AC_PASS='[YOUR CWL PASSWWORD]' diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..22b6e82 --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +# Ignore directories generated by Composer. +/vendor/ + +# Ignore directories generated by NPM/Yarn +node_modules + +# Ignore files generated by PhpStorm +/.idea/ + +# Ignore .env files as they are personal +/.env + +# Deployer Build Directory. +/.build/ + +# Local backups. +/backups + +# Logs and databases. +*.log +*.sql +*.sqlite + +# OS generated files. +.DS_Store* +ehthumbs.db +Thumbs.db + +# Patch generated files. +*.orig +*.rej +*.bak + +# Tool generated. +.svn +.sass-cache +*.swp +*.map + +# IDE files & folders (PHPStorm, Netbeans, etc). +.idea +nbproject +*.project +.vscode diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..53d838a --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +lts/gallium diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..45a8b54 --- /dev/null +++ b/composer.json @@ -0,0 +1,25 @@ +{ + "name": "ubc-cpsc/cs-ia", + "type": "project", + "require": { + "twig/twig": "^3.0", + "vlucas/phpdotenv": "^5.0" + }, + "require-dev": { + "roave/security-advisories": "dev-latest" + }, + "autoload": { + "files": [ + "load.environment.php" + ] + }, + "config": { + "discard-changes": true, + "platform": { + "php": "8.2" + }, + "sort-packages": true + }, + "minimum-stability": "stable", + "prefer-stable": true +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..1438fbc --- /dev/null +++ b/composer.lock @@ -0,0 +1,260 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "092d508925283b79b5639cc677431314", + "packages": [ + { + "name": "symfony/polyfill-ctype", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.27.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "twig/twig", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "a6e0510cc793912b451fd40ab983a1d28f611c15" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/a6e0510cc793912b451fd40ab983a1d28f611c15", + "reference": "a6e0510cc793912b451fd40ab983a1d28f611c15", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3" + }, + "require-dev": { + "psr/container": "^1.0", + "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.5-dev" + } + }, + "autoload": { + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], + "support": { + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v3.5.1" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2023-02-08T07:49:20+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/load.environment.php b/load.environment.php new file mode 100644 index 0000000..eb5e3a0 --- /dev/null +++ b/load.environment.php @@ -0,0 +1,17 @@ +safeLoad(); diff --git a/package.json b/package.json new file mode 100644 index 0000000..1fbe0eb --- /dev/null +++ b/package.json @@ -0,0 +1,34 @@ +{ + "private": true, + "scripts": { + "build:sass": "sass sass:public/css", + "autoprefixer": "postcss --no-map -u autoprefixer --autoprefixer.browsers -r public/css/*.css", + "build:css": "npm run build:sass && npm run autoprefixer", + "watch:css": "onchange 'sass/**/*.scss' -- npm run build:css" + }, + "dependencies": { + "bootstrap": "^5.0.0", + "jszip": "^3.10.1", + "normalize.css": "^8.0.0", + "prism-themes": "^1.0.0", + "prismjs": "^1.0.0" + }, + "devDependencies": { + "autoprefixer": "^10.0.0", + "onchange": "^7.0.0", + "postcss-cli": "^10.0.0", + "sass": "^1.0.0" + }, + "copyFiles": [ + { + "from": "node_modules/prismjs/dist/*", + "to": "js/vendor/fancybox" + } + ], + "copyFilesSettings": { + "whenFileExists": "overwrite" + }, + "browserslist": [ + "> 1%" + ] +} diff --git a/public/css/details.css b/public/css/details.css new file mode 100644 index 0000000..2073bda --- /dev/null +++ b/public/css/details.css @@ -0,0 +1,43 @@ +details { + /*background: #282828;*/ + margin: 1rem auto; + box-shadow: 0 .1rem 1rem -.5rem rgba(0,0,0,.4); + border-radius: 5px; + overflow: hidden; +} + +summary { + display: block; + background: #333; + color: #fff; + padding: 1rem 1rem 1rem 2.2rem; + position: relative; + cursor: pointer; +} + +summary:before { + content: ''; + border-width: .4rem; + border-style: solid; + border-color: transparent transparent transparent #fff; + position: absolute; + top: 1.3rem; + left: 1rem; + transform: rotate(0); + transform-origin: .2rem 50%; + transition: .25s transform ease; +} + +/* THE MAGIC 🧙‍♀️ */ +details[open] > summary:before { + transform: rotate(90deg); +} + + +details summary::-webkit-details-marker { + display:none; +} + +details > summary + * { + padding: 1rem; +} diff --git a/public/ia/img/banner.jpg b/public/ia/img/banner.jpg new file mode 100644 index 0000000..f72b6a6 Binary files /dev/null and b/public/ia/img/banner.jpg differ diff --git a/public/ia/img/grads/awards-financial-support.jpg b/public/ia/img/grads/awards-financial-support.jpg new file mode 100644 index 0000000..e64a1a8 Binary files /dev/null and b/public/ia/img/grads/awards-financial-support.jpg differ diff --git a/public/ia/img/grads/dempster-bldg.jpg b/public/ia/img/grads/dempster-bldg.jpg new file mode 100644 index 0000000..b5df56d Binary files /dev/null and b/public/ia/img/grads/dempster-bldg.jpg differ diff --git a/public/ia/img/grads/poojav_viswanathan_photo_by_martin_dee_public_affairs_1_cropped.jpg b/public/ia/img/grads/poojav_viswanathan_photo_by_martin_dee_public_affairs_1_cropped.jpg new file mode 100644 index 0000000..e92f40f Binary files /dev/null and b/public/ia/img/grads/poojav_viswanathan_photo_by_martin_dee_public_affairs_1_cropped.jpg differ diff --git a/public/ia/img/grads/prospective-grads-w290.jpg b/public/ia/img/grads/prospective-grads-w290.jpg new file mode 100644 index 0000000..0a4db66 Binary files /dev/null and b/public/ia/img/grads/prospective-grads-w290.jpg differ diff --git a/public/ia/img/grads/resources-links.jpg b/public/ia/img/grads/resources-links.jpg new file mode 100644 index 0000000..87aa937 Binary files /dev/null and b/public/ia/img/grads/resources-links.jpg differ diff --git a/public/ia/img/placeholder290x190-2.png b/public/ia/img/placeholder290x190-2.png new file mode 100644 index 0000000..0f55cd8 Binary files /dev/null and b/public/ia/img/placeholder290x190-2.png differ diff --git a/public/ia/img/placeholder290x190.png b/public/ia/img/placeholder290x190.png new file mode 100644 index 0000000..adf4d65 Binary files /dev/null and b/public/ia/img/placeholder290x190.png differ diff --git a/public/ia/patterns/index.php b/public/ia/patterns/index.php new file mode 100644 index 0000000..49cecf3 --- /dev/null +++ b/public/ia/patterns/index.php @@ -0,0 +1,39 @@ + dirname(dirname(dirname(__DIR__))) . '/private/cache', + 'autoescape' => TRUE, + 'strict_variables' => FALSE, + 'debug' => FALSE, + 'auto_reload' => TRUE, +); +$loader = new Twig_Loader_Filesystem(dirname(__DIR__) . '/templates'); +$twig = new Twig_Environment($loader, $twig_options); + +$patterns = []; +$iterator = new DirectoryIterator('../templates/patterns'); + +foreach ($iterator as $fileInfo) { + if ($fileInfo->isDot()) { + continue; + } + + $patterns[] = $fileInfo->getFilename(); +} +sort($patterns); + +echo $twig->render('patterns.twig', [ + 'patterns' => $patterns, + 'title' => 'IA Patterns - UBC CS', +]); diff --git a/public/ia/prototype/.gitignore b/public/ia/prototype/.gitignore new file mode 100644 index 0000000..8d4aaf4 --- /dev/null +++ b/public/ia/prototype/.gitignore @@ -0,0 +1,2 @@ +node_modules +*.map \ No newline at end of file diff --git a/public/ia/prototype/.htaccess b/public/ia/prototype/.htaccess new file mode 100644 index 0000000..2c5a84d --- /dev/null +++ b/public/ia/prototype/.htaccess @@ -0,0 +1,8 @@ + + RewriteEngine on + + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule ^ index.php [L] + + diff --git a/public/ia/prototype/css/prototype.css b/public/ia/prototype/css/prototype.css new file mode 100644 index 0000000..e96b0df --- /dev/null +++ b/public/ia/prototype/css/prototype.css @@ -0,0 +1,43 @@ +.jumbotron { + height: 455px; +} + +.jumbotron .title { + position: relative; + bottom: 60px; + left: 0; + height: 53px; + width: 100%; + padding: 12px 0 0 10px; + background: rgba(0, 0, 0, 0.6); +} + +@media (min-width: 768px) { + .jumbotron .title { + bottom: 0; + top: 220px; + height: 130px; + width: 625px; + padding: 20px 0 0 30px; + } +} + +.jumbotron .title h1 { + font-size: 18px; + color: #fff; +} + +@media (min-width: 768px) { + .jumbotron .title h1 { + font-size: 39px; + } +} + +.jumbotron--full-width { + width: 100vw; + position: relative; + left: 50%; + right: 50%; + margin-left: -50vw; + margin-right: -50vw; +} \ No newline at end of file diff --git a/public/ia/prototype/index.php b/public/ia/prototype/index.php new file mode 100644 index 0000000..89693ee --- /dev/null +++ b/public/ia/prototype/index.php @@ -0,0 +1,36 @@ + dirname(__DIR__, 3) . '/private/cache', + 'auto_reload' => TRUE, +]; + +$templates_directory = dirname(__DIR__) . '/templates'; +$loader = new FilesystemLoader($templates_directory); +$twig = new Environment($loader, $twig_options); + +$directory_name = dirname($_SERVER['SCRIPT_NAME']); + +$page = str_replace($directory_name, '', $_SERVER['REQUEST_URI']); +$page = trim($page, '/'); +$template_path = $templates_directory . '/prototypes/' . $page . '.twig'; +if (!file_exists($template_path)) { + $page = 'key-landing'; +} + +print $twig->render('prototypes/' . $page . '.twig', ['title' => 'IA Prototype - UBC CS ' . $page]); diff --git a/public/ia/prototype/package-lock.json b/public/ia/prototype/package-lock.json new file mode 100644 index 0000000..1653829 --- /dev/null +++ b/public/ia/prototype/package-lock.json @@ -0,0 +1,3969 @@ +{ + "name": "ubccs", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@blakeembrey/deque": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@blakeembrey/deque/-/deque-1.0.5.tgz", + "integrity": "sha512-6xnwtvp9DY1EINIKdTfvfeAtCYw4OqBZJhtiqkT3ivjnEfa25VQ3TsKvaFfKm8MyGIEfE95qLe+bNEt3nB0Ylg==" + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" + }, + "@types/node": { + "version": "12.12.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.16.tgz", + "integrity": "sha512-vRuMyoOr5yfNf8QWxXegOjeyjpWJxFePzHzmBOIzDIzo+rSqF94RW0PkS6y4T2+VjAWLXHWrfbIJY3E3aS7lUw==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "autoprefixer": { + "version": "9.7.3", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.3.tgz", + "integrity": "sha512-8T5Y1C5Iyj6PgkPSFd0ODvK9DIleuPKUPYniNxybS47g2k2wFgLZ46lGQHlBuGKIAEV8fbCDfKCCRS1tvOgc3Q==", + "requires": { + "browserslist": "^4.8.0", + "caniuse-lite": "^1.0.30001012", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.23", + "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", + "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "binary-extensions": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", + "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==" + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "~2.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "browserslist": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.2.tgz", + "integrity": "sha512-+M4oeaTplPm/f1pXDw84YohEv7B1i/2Aisei8s4s6k3QsoSHa7i5sz8u/cGQkkatCPxMASKxPualR4wwYgVboA==", + "requires": { + "caniuse-lite": "^1.0.30001015", + "electron-to-chromium": "^1.3.322", + "node-releases": "^1.1.42" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001015", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001015.tgz", + "integrity": "sha512-/xL2AbW/XWHNu1gnIrO8UitBGoFthcsDgU9VLK1/dpsoxbaD5LscHozKze05R6WLsBvLhqv78dAPozMFQBYLbQ==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concurrently": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-4.1.2.tgz", + "integrity": "sha512-Kim9SFrNr2jd8/0yNYqDTFALzUX1tvimmwFWxmp/D4mRI+kbqIIwE2RkBDrxS2ic25O1UgQMI5AtBqdtX3ynYg==", + "requires": { + "chalk": "^2.4.2", + "date-fns": "^1.30.1", + "lodash": "^4.17.15", + "read-pkg": "^4.0.1", + "rxjs": "^6.5.2", + "spawn-command": "^0.0.2-1", + "supports-color": "^4.5.0", + "tree-kill": "^1.2.1", + "yargs": "^12.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "requires": { + "has-flag": "^2.0.0" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + } + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "^1.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "dependency-graph": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.8.1.tgz", + "integrity": "sha512-g213uqF8fyk40W8SBjm079n3CZB4qSpCrA2ye1fLGzH/4HEgB6tzuW2CbLE7leb4t45/6h44Ud59Su1/ROTfqw==" + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "requires": { + "path-type": "^3.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "electron-to-chromium": { + "version": "1.3.322", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz", + "integrity": "sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": "^2.1.0" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "optional": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "optional": true + } + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "requires": { + "globule": "^1.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + } + } + }, + "globule": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "requires": { + "resolve-from": "^3.0.0" + } + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=" + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "^2.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "js-base64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "requires": { + "chalk": "^2.0.1" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "merge2": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mime-db": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", + "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==" + }, + "mime-types": { + "version": "2.1.25", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", + "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", + "requires": { + "mime-db": "1.42.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "nan": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", + "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "http://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + } + } + }, + "node-releases": { + "version": "1.1.42", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.42.tgz", + "integrity": "sha512-OQ/ESmUqGawI2PRX+XIRao44qWYBBfN54ImQYdWVTQqUckuejOg76ysSqDBK8NG3zwySRVnX36JwDQ6x+9GxzA==", + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "node-sass": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.0.tgz", + "integrity": "sha512-W1XBrvoJ1dy7VsvTAS5q1V45lREbTlZQqFbiHb3R3OTTCma0XBtuG6xZ6Z4506nR4lmHPTqVRwxT6KgtWC97CA==", + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash": "^4.17.15", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onchange": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/onchange/-/onchange-6.1.0.tgz", + "integrity": "sha512-T0wvi3yzNd+Lut2ymJp2e6fTiob0TLrXnjqGaiK9MAFB8MYo/k/ZClx6ps7YhTtQ88dDm+hDHmtJXP1nJT5WNA==", + "requires": { + "@blakeembrey/deque": "^1.0.3", + "arrify": "^2.0.0", + "chokidar": "^3.0.0", + "cross-spawn": "^6.0.0", + "ignore": "^5.1.4", + "minimist": "^1.2.0", + "supports-color": "^7.0.0", + "tree-kill": "^1.2.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==" + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "optional": true + }, + "glob-parent": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", + "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "requires": { + "picomatch": "^2.0.4" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "picomatch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.1.1.tgz", + "integrity": "sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA==" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "postcss": { + "version": "7.0.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.24.tgz", + "integrity": "sha512-Xl0XvdNWg+CblAXzNvbSOUvgJXwSjmbAKORqyw9V2AlHrm1js2gFw9y3jibBAhpKZi8b5JzJCVh/FyzPsTtgTA==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-cli": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-6.1.3.tgz", + "integrity": "sha512-eieqJU+OR1OFc/lQqMsDmROTJpoMZFvoAQ+82utBQ8/8qGMTfH9bBSPsTdsagYA8uvNzxHw2I2cNSSJkLAGhvw==", + "requires": { + "chalk": "^2.1.0", + "chokidar": "^2.0.0", + "dependency-graph": "^0.8.0", + "fs-extra": "^7.0.0", + "get-stdin": "^6.0.0", + "globby": "^9.0.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "postcss-reporter": "^6.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "yargs": "^12.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==" + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "postcss-load-config": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-reporter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-6.0.1.tgz", + "integrity": "sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw==", + "requires": { + "chalk": "^2.4.1", + "lodash": "^4.17.11", + "log-symbols": "^2.2.0", + "postcss": "^7.0.7" + } + }, + "postcss-value-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz", + "integrity": "sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ==" + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.6.0.tgz", + "integrity": "sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "requires": { + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "read-pkg": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", + "requires": { + "normalize-package-data": "^2.3.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "rxjs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", + "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=" + }, + "spdx-correct": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz", + "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz", + "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==" + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "requires": { + "readable-stream": "^2.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "^4.0.1" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "tree-kill": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", + "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==" + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "requires": { + "glob": "^7.1.2" + } + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + } + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "requires": { + "camelcase": "^3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + } + } + } + } +} diff --git a/public/ia/prototype/package.json b/public/ia/prototype/package.json new file mode 100644 index 0000000..d477e88 --- /dev/null +++ b/public/ia/prototype/package.json @@ -0,0 +1,25 @@ +{ + "name": "ubccs", + "version": "1.0.0", + "description": "UBC CS Custom Theme", + "license": "MIT", + "scripts": { + "sass": "node-sass --recursive --source-map true --output-style expanded --output css sass", + "autoprefixer": "postcss --no-map -u autoprefixer --autoprefixer.browsers -r css/*.css", + "build:css": "npm run sass && npm run autoprefixer", + "build:images": "imagemin img/* -o img", + "watch:css": "onchange 'sass/**/*.scss' -- npm run build:css", + "watch:img": "onchange 'img/**/*' -- npm run build:images", + "watch:all": "concurrently --kill-others 'npm run watch:css' 'npm run watch:img'" + }, + "dependencies": { + "autoprefixer": "^9.7.3", + "concurrently": "^4.1.1", + "node-sass": "^4.13.0", + "onchange": "^6.0.0", + "postcss-cli": "^6.1.3" + }, + "browserslist": [ + "> 1%" + ] +} diff --git a/public/ia/prototype/sass/prototype.scss b/public/ia/prototype/sass/prototype.scss new file mode 100644 index 0000000..76bd87e --- /dev/null +++ b/public/ia/prototype/sass/prototype.scss @@ -0,0 +1,41 @@ +@import '../../../themes/custom/ubccs/sass/variables'; + +.jumbotron { + height: 455px; + + .title { + position: relative; + bottom: 60px; + left: 0; + height: 53px; + width: 100%; + padding: 12px 0 0 10px; + background: rgba(0, 0, 0, 0.6); + + @media (min-width: 768px) { + bottom: 0; + top: 220px; + height: 130px; + width: 625px; + padding: 20px 0 0 30px; + } + + h1 { + font-size: 18px; + color: $white; + + @media (min-width: 768px) { + font-size: 39px; + } + } + } +} // jumbotron + +.jumbotron--full-width { + width: 100vw; + position: relative; + left: 50%; + right: 50%; + margin-left: -50vw; + margin-right: -50vw; +} diff --git a/public/ia/sitemap/css/style.css b/public/ia/sitemap/css/style.css new file mode 100644 index 0000000..c604934 --- /dev/null +++ b/public/ia/sitemap/css/style.css @@ -0,0 +1,185 @@ +body { + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + padding: 40px; + font-size: 14px; + line-height: 1.4; + background: #ccc; + margin: 0; +} + +a { + color: teal; + text-decoration: none; +} + +.legend { + float: right; + width: 30%; +} +.legend__list { + display: flex; + align-items: center; + flex-direction: row; + flex-flow: wrap; +} +.legend li { + margin: .25em; + flex: 30% 0 0; + padding: 0.25em 0.5em; +} + +#orphans-menu { + display: flex; +} + +fieldset { + border: 3px solid #999; + border-radius:8px; + padding: 1em; + margin: 1em 0; + width: 100%; +} + +legend { + color: #999; + font-weight: 700; + padding: 0 .5em; + float: left; + margin-bottom: 1em; +} + +ul { + list-style: none; + padding: 0; + margin: 0.5em 0; +} +ul li { + margin: 0 .25em; +} +ul ul ul { + padding-left: 1em; +} +li a { + display: inline-block; + color: #666; + margin: .2em; + text-decoration: none; + padding: .2em .5em; + max-width: 300px; + border-radius: 3px; + position: relative; +} + +li a[data-count]::after { + content: attr(data-count); + position: absolute; + top: -1.5em; + right: -1.5em; + font-size: 9px; + background: rgba(228, 255, 26, 1); + color: #333; + min-width: 20px; + height: 20px; + line-height: 20px; + padding: 0 .2em; + text-align: center; + border-radius: 10px; + box-shadow: 1px 1px 1px rgba(0,0,0,0.1); +} + +ul#primary-menu, +ul#utility-menu, +ul#footer-menu { + display: flex; + width: 100%; +} + +.flex-3 > ul { + display: flex; +} + +ul ul ul { + display: block; +} + +ul li a { + background: #fff; + font-size: 1.3rem; +} +ul ul li a { + background: rgba(255,255,255,.8); + font-size: .9rem; +} +ul ul ul li a { + background: rgba(255,255,255,.6); + font-size: .8rem; +} +ul ul ul ul li a { + background: rgba(255,255,255,.4); + font-size: .75rem; +} +ul ul ul ul li a { + background: rgba(255,255,255,.2); +} + +.landing { + background: rgba(0, 153, 153, .5); + color: #fff; +} + +.form { + background: rgba(235, 110, 131, .5); + color: #fff; +} + +.ext { + background: rgba(232, 170, 20, .5); + color: #fff; +} + +.list { + background: rgba(255, 87, 20, .5); + color: #fff; +} +.link { + background: rgba(117, 60, 200, 0.47); + color: #fff; +} + +.multiple { + box-shadow: 3px 3px 0 rgba(150,150,150,.7), 5px 5px 0 rgba(100,100,100,.25); + background: rgba(27, 231, 255, .5); + color: #fff; +} + +.new { + background: rgba(87, 200, 60, .5); + color: #fff; +} + +.remove { + background: rgba(235, 20, 31, .5); + color: #fff; + text-decoration: line-through; +} + +.toggle { + position: absolute; + margin-left: -1em; + margin-top: 0.75em; + font-size: 10px; + color: #777; + background-color: rgba(255, 255, 255, 0.1); + display: block; + cursor: pointer; + padding: 0.25em; +} + +@media print { + * { + color: #000!important; + text-shadow: none!important; + background: 0 0!important; + box-shadow: none!important + } +} diff --git a/public/ia/sitemap/index.html b/public/ia/sitemap/index.html new file mode 100644 index 0000000..8eb8d81 --- /dev/null +++ b/public/ia/sitemap/index.html @@ -0,0 +1,694 @@ + + + + + CS Sitemap + + + + + + +
+

Legend

+
    +
  • Listing Page
  • +
  • External
  • +
  • Landing Page
  • +
  • Form
  • +
  • Multiple Pages
  • +
  • New Pages
  • +
  • Delete Pages
  • + +
+
+

UBC CS External Website

+

Preliminary Site Map — Version 2.1

+ +
+ Primary Menu + +
+ +
+ Footer Menu + +
+ +
+ Orphans + +
+ + + + + diff --git a/public/ia/styleguide/index.php b/public/ia/styleguide/index.php new file mode 100644 index 0000000..033fb23 --- /dev/null +++ b/public/ia/styleguide/index.php @@ -0,0 +1,24 @@ + dirname(__DIR__, 3) . '/private/cache', + 'auto_reload' => TRUE, +]; +$loader = new FilesystemLoader(dirname(__DIR__) . '/templates'); +$twig = new Environment($loader, $twig_options); + +print $twig->render('styleguide.twig', ['title' => 'IA Style Guide - UBC CS']); diff --git a/public/ia/templates/base.twig b/public/ia/templates/base.twig new file mode 100644 index 0000000..c86e41c --- /dev/null +++ b/public/ia/templates/base.twig @@ -0,0 +1,102 @@ + + + + + + {{ title }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {##} + + {# @todo Integrate prototype with theme's components. #} + + + + + + {% include 'includes/header.twig' %} + +
+
+
+ {% block body %} + {{ content }} + {% endblock %} +
+
+
+ + {% include 'includes/footer.twig' %} + + diff --git a/public/ia/templates/includes/footer.twig b/public/ia/templates/includes/footer.twig new file mode 100644 index 0000000..6dc2077 --- /dev/null +++ b/public/ia/templates/includes/footer.twig @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{##} diff --git a/public/ia/templates/includes/header.twig b/public/ia/templates/includes/header.twig new file mode 100644 index 0000000..e522698 --- /dev/null +++ b/public/ia/templates/includes/header.twig @@ -0,0 +1,105 @@ + + + + + + + diff --git a/public/ia/templates/patterns.twig b/public/ia/templates/patterns.twig new file mode 100644 index 0000000..815d15e --- /dev/null +++ b/public/ia/templates/patterns.twig @@ -0,0 +1,124 @@ +{% extends "base.twig" %} + +{% block body %} + + +
+
+
+

Patterns

+ + {% for pattern in patterns %} + {% set pattern_id = pattern %} +
+

{{ pattern|replace({'.html': '', '.html.twig': '', '-': ' '})|capitalize }}

+ + + +
+ {% include 'patterns/' ~ pattern %} +
+ + + +
+ +

{{ pattern }}

+
+ +
+ {% endfor %} +
+
+ + +
+{% endblock %} diff --git a/public/ia/templates/patterns/blockquote.html b/public/ia/templates/patterns/blockquote.html new file mode 100644 index 0000000..e23cd3c --- /dev/null +++ b/public/ia/templates/patterns/blockquote.html @@ -0,0 +1,10 @@ +
+

This text is quoted. A block of quoted text like this is particularly useful when presented as a pull-quote within an article of text.

+
+ +
+
+

This text is quoted. A block of quoted text like this is particularly useful when presented as a pull-quote within an article of text.

+
+
Here's a caption with a citation.
+
diff --git a/public/ia/templates/patterns/breadcrumb.html b/public/ia/templates/patterns/breadcrumb.html new file mode 100644 index 0000000..5cdce92 --- /dev/null +++ b/public/ia/templates/patterns/breadcrumb.html @@ -0,0 +1,6 @@ + diff --git a/public/ia/templates/patterns/button.html b/public/ia/templates/patterns/button.html new file mode 100644 index 0000000..7bc4d33 --- /dev/null +++ b/public/ia/templates/patterns/button.html @@ -0,0 +1,54 @@ + +
Default
+ + + + + + +
Primary color
+ + + + + + +
Secondary color
+ + + + + + +
Link
+ + + + + + +
Outline
+ + + + + + +
Danger
+ + + + + + +
Outline inverse
+
+ + + + + +
+ +
Large button
+ diff --git a/public/ia/templates/patterns/cards.html b/public/ia/templates/patterns/cards.html new file mode 100644 index 0000000..6e4877e --- /dev/null +++ b/public/ia/templates/patterns/cards.html @@ -0,0 +1,59 @@ + diff --git a/public/ia/templates/patterns/details.html b/public/ia/templates/patterns/details.html new file mode 100644 index 0000000..99fd988 --- /dev/null +++ b/public/ia/templates/patterns/details.html @@ -0,0 +1,8 @@ +
+ Item Details + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aperiam assumenda blanditiis distinctio esse facilis illo iste iure laudantium magnam maiores obcaecati officia pariatur porro recusandae rerum, sunt temporibus vitae! Magni? +
+
+ Already Open + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto consequatur culpa eos ex facilis, molestias non sequi tempore voluptas. Cumque, excepturi labore odio odit officiis porro quod rerum tempora! +
diff --git a/public/ia/templates/patterns/feedback.html b/public/ia/templates/patterns/feedback.html new file mode 100644 index 0000000..8114160 --- /dev/null +++ b/public/ia/templates/patterns/feedback.html @@ -0,0 +1,27 @@ +
+ × +

Status

+
    +
  • +

    This is a feedback message for the user.

    +
  • +
  • +

    This is another feedback message for the user.

    +
  • +
+
+ +
+ × +

Error

+

This is an error feedback message.

+
+ +
+ × +

This is an warning feedback message.

+
+ +
+

This is an info feedback message.

+
diff --git a/public/ia/templates/patterns/form.html b/public/ia/templates/patterns/form.html new file mode 100644 index 0000000..0863ce1 --- /dev/null +++ b/public/ia/templates/patterns/form.html @@ -0,0 +1,92 @@ +
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ + + +
+
+ + +
+ + + + Delete
+ +
diff --git a/public/ia/templates/patterns/heading.html b/public/ia/templates/patterns/heading.html new file mode 100644 index 0000000..a78931c --- /dev/null +++ b/public/ia/templates/patterns/heading.html @@ -0,0 +1,4 @@ +

Level one heading

+

Level two heading

+

Level three heading

+

Level four heading

diff --git a/public/ia/templates/patterns/inline-block.html b/public/ia/templates/patterns/inline-block.html new file mode 100644 index 0000000..a08ee03 --- /dev/null +++ b/public/ia/templates/patterns/inline-block.html @@ -0,0 +1,17 @@ + +

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus fuga nisi non perferendis quidem soluta voluptate. Accusantium adipisci aut, dolorum explicabo ipsa ipsum molestiae numquam quas recusandae similique voluptate voluptatem?

+
+ Applying?

December 15 deadline for  MSc & PhD programs.

How to Apply

+
+

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Esse expedita explicabo necessitatibus veritatis! Ad aperiam culpa, cum distinctio dolorum explicabo, fuga harum incidunt ipsa molestias neque quae quaerat quisquam reprehenderit.

+
+

Lab Calendar

+ +
+

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Esse expedita explicabo necessitatibus veritatis! Ad aperiam culpa, cum distinctio dolorum explicabo, fuga harum incidunt ipsa molestias neque quae quaerat quisquam reprehenderit.

diff --git a/public/ia/templates/patterns/intro.html b/public/ia/templates/patterns/intro.html new file mode 100644 index 0000000..e828b8a --- /dev/null +++ b/public/ia/templates/patterns/intro.html @@ -0,0 +1,5 @@ +

+ Recognized internationally for excellence in research and teaching with a conscious focus on interdisciplinary programs, + the Department encourages diversity both within its community and areas of study, and plays a leadership role in research, + teaching and outreach activities to champion the understanding and integration of Computer Science within all aspects of society. +

diff --git a/public/ia/templates/patterns/landing-banner.html b/public/ia/templates/patterns/landing-banner.html new file mode 100644 index 0000000..8866939 --- /dev/null +++ b/public/ia/templates/patterns/landing-banner.html @@ -0,0 +1,10 @@ +
+ +
+ Graduate +
+ +
+

Graduate Students

+
+
diff --git a/public/ia/templates/patterns/landing-intro.html b/public/ia/templates/patterns/landing-intro.html new file mode 100644 index 0000000..918a775 --- /dev/null +++ b/public/ia/templates/patterns/landing-intro.html @@ -0,0 +1,7 @@ +
+

+ Recognized internationally for excellence in research and teaching with a conscious focus on interdisciplinary programs, + the Department encourages diversity both within its community and areas of study, and plays a leadership role in research, + teaching and outreach activities to champion the understanding and integration of Computer Science within all aspects of society. +

+
diff --git a/public/ia/templates/patterns/list-ordered.html b/public/ia/templates/patterns/list-ordered.html new file mode 100644 index 0000000..aa33172 --- /dev/null +++ b/public/ia/templates/patterns/list-ordered.html @@ -0,0 +1,11 @@ +
    +
  1. First list item
  2. +
  3. Second item in a list of ordered items
  4. +
  5. Third item in the list +
      +
    1. First list item
    2. +
    3. Second item in a list of ordered items
    4. +
    5. Third item in the list
    6. +
    +
  6. +
diff --git a/public/ia/templates/patterns/list-unordered.html b/public/ia/templates/patterns/list-unordered.html new file mode 100644 index 0000000..9c520ac --- /dev/null +++ b/public/ia/templates/patterns/list-unordered.html @@ -0,0 +1,11 @@ +
    +
  • A list item
  • +
  • Another item in a list
  • +
  • Yet another item in this list of items +
      +
    • A list item
    • +
    • Another item in a list
    • +
    • Yet another item in this list of items
    • +
    +
  • +
diff --git a/public/ia/templates/patterns/pagination.html b/public/ia/templates/patterns/pagination.html new file mode 100644 index 0000000..6c4cb47 --- /dev/null +++ b/public/ia/templates/patterns/pagination.html @@ -0,0 +1,16 @@ + + diff --git a/public/ia/templates/patterns/paragraph.html b/public/ia/templates/patterns/paragraph.html new file mode 100644 index 0000000..d5b50d8 --- /dev/null +++ b/public/ia/templates/patterns/paragraph.html @@ -0,0 +1,7 @@ +

+ This is a paragraph of text. Some of the text may be emphasised and some it might even be + strongly emphasised. Occasionally quoted text may be found within a paragraph …and of + course a link may appear at any point in the text. The average paragraph contains five or six + sentences although some may contain as little or one or two while others carry on for anything up to ten sentences + and beyond. +

diff --git a/public/ia/templates/patterns/profile.html.twig b/public/ia/templates/patterns/profile.html.twig new file mode 100644 index 0000000..cdd784f --- /dev/null +++ b/public/ia/templates/patterns/profile.html.twig @@ -0,0 +1,31 @@ +
+
+ {% for i in 0..4 %} +
+
+
+
+
+

John Smith

+ +
+
+
+ Placeholder image +
+
+ +
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. + Phasellus nec iaculis mauris. @bulmaio. + #css #responsive +
+ +
+
+
+
+ {% endfor %} +
+
diff --git a/public/ia/templates/patterns/site-alert.html b/public/ia/templates/patterns/site-alert.html new file mode 100644 index 0000000..07dbad8 --- /dev/null +++ b/public/ia/templates/patterns/site-alert.html @@ -0,0 +1,17 @@ +
+ +
+ +
!
+ +
+ Coronavirus (COVID-19) and UBC’s response: UBC is + transitioning to online classes as of March 16, 2020 for the remainder + of term. Campuses remain open and all university operations continue as + normal, however UBC is piloting a remote working arrangement. Further + information and FAQs available here Read More + +
+
+ +
diff --git a/public/ia/templates/prototypes/cards.twig b/public/ia/templates/prototypes/cards.twig new file mode 100644 index 0000000..3750499 --- /dev/null +++ b/public/ia/templates/prototypes/cards.twig @@ -0,0 +1,85 @@ + + diff --git a/public/ia/templates/prototypes/key-landing-fluid-hero.twig b/public/ia/templates/prototypes/key-landing-fluid-hero.twig new file mode 100644 index 0000000..bd32d08 --- /dev/null +++ b/public/ia/templates/prototypes/key-landing-fluid-hero.twig @@ -0,0 +1,24 @@ +{% extends "base.twig" %} + +{% block body %} + + +
+
+
+ +
+

Graduate Students

+
+
+ +
+
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi non ex dolor. Mauris fermentum, justo non. Eget luctus ante + justo et ex. Etiam lobortis ante augue, ac tempor dolor gravida rutrum.

+
+
+ + {% include 'prototypes/cards.twig' %} + +{% endblock %} diff --git a/public/ia/templates/prototypes/key-landing.twig b/public/ia/templates/prototypes/key-landing.twig new file mode 100644 index 0000000..532b572 --- /dev/null +++ b/public/ia/templates/prototypes/key-landing.twig @@ -0,0 +1,30 @@ +{% extends "base.twig" %} + +{% block body %} + + + +
+ +
+ Graduate +
+ +
+

Graduate Students

+
+
+ +
+

+ The UBC Department of Computer Science, established in May 1968, is one of the top computer science departments in + North America. Recognized internationally for excellence in research and teaching with a conscious focus on + interdisciplinary programs, the Department encourages diversity both within its community and areas of study, and + plays a leadership role in research, teaching and outreach activities to champion the understanding and + integration of Computer Science within all aspects of society. +

+
+ + {% include 'prototypes/cards.twig' %} + +{% endblock %} diff --git a/public/ia/templates/styleguide.twig b/public/ia/templates/styleguide.twig new file mode 100644 index 0000000..2dc7abb --- /dev/null +++ b/public/ia/templates/styleguide.twig @@ -0,0 +1,372 @@ +{% extends "base.twig" %} +{% block body %} +
+ {# + Original content from https://paulrobertlloyd.com/styleguide + @todo: Replace styles with our own. + #} +
+

Style Guide

+
+

An overview of the typographic and layout styles available for content pages

+
+
+

The content on this page lies within the .node scope + [1] + .

+

Second-level heading +

+

Main page headings are h1 elements, so futher headings within this scope should start with h2, an example of which appears directly above. More than one may be used per page. Consider using an h2 unless you need a header level of less importance, or as a sub-header to an existing h2 element.

+

Third-level heading +

+

The header above is an h3 element, which may be used for any form of page-level header which falls below the h2 header in a document hierarchy.

+

Fourth-level heading +

+

The header above is an h4 element, which may be used for any form of page-level header which falls below the h3 header in a document hierarchy.

+

Grouping content +

+

Paragraphs +

+

All paragraphs are wrapped in p tags.

+

Horizontal rule +

+

The hr element represents a paragraph-level thematic break, e.g. a scene change in a story, or a transition to another topic within a section of a reference book. The following extract from Pandora’s Star by Peter F. Hamilton shows two paragraphs that precede a scene change and the paragraph that follows it:

+

Dudley was ninety-two, in his second life, and fast approaching time for another rejuvenation. Despite his body having the physical age of a standard fifty-year-old, the prospect of a long degrading campaign within academia was one he regarded with dread. For a supposedly advanced civilization, the Intersolar Commonwealth could be appallingly backward at times, not to mention cruel.

+

+ Maybe it won’t be that bad, he told himself. The lie was comforting enough to get him through the rest of the night’s shift.

+
+

The Carlton AllLander drove Dudley home just after dawn. Like the astronomer, the vehicle was old and worn, but perfectly capable of doing its job. It had a cheap diesel engine, common enough on a semi-frontier world like Gralmond, although its drive array was a thoroughly modern photoneural processor. With its high suspension and deep-tread tyres it could plough along the dirt track to the observatory in all weather and seasons, including the metre-deep snow of Gralmond’s winters.

+

Pre-formatted text +

+

The pre element represents a block of pre-formatted text, in which structure is represented by typographic conventions rather than by elements. Such examples are an e-mail (with paragraphs indicated by blank lines, lists indicated by lines prefixed with a bullet), fragments of computer code (with structure indicated according to the conventions of that language) or displaying ASCII art. Here’s an example showing the printable characters of ASCII:

+
  ! " # $ % & ' ( ) * + , - . /
+0 1 2 3 4 5 6 7 8 9 : ; < = > ?
+@ A B C D E F G H I J K L M N O
+P Q R S T U V W X Y Z [ \ ] ^ _
+` a b c d e f g h i j k l m n o
+p q r s t u v w x y z { | } ~
+
+

Blockquotes +

+

The blockquote element represents a section that is being quoted from another source.

+
+

Big Yellow Taxi there by Joni Mitchell, a song in which she complains that they ‘paved paradise to put up a parking lot’ – a measure which actually would have alleviated traffic congestion on the outskirts of paradise. Something which Joni singularly fails to point out, perhaps because it doesn’t quite fit in with her blinkered view of the world.

+

Nevertheless, nice song.

+
+

If you wish to add a citation, enclose it within a <figure> tag:

+
+
+

Many forms of Government have been tried, and will be tried in this world of sin and woe. No one pretends that democracy is perfect or all-wise. Indeed, it has been said that democracy is the worst form of government except all those other forms that have been tried from time to time.

+
+
+

Winston Churchill, in + a speech to the House of Commons + . 11th November 1947

+
+
+

Ordered list +

+

The ol element denotes an ordered list, and various numbering schemes are available through the CSS (including 1,2,3… a,b,c… i,ii,iii… and so on). Each item requires a surrounding <li> and </li> tag, to denote individual items within the list (as you may have guessed, li stands for list item).

+
    +
  1. This is an ordered list.
  2. +
  3. This is the second item, which contains a sub list
      +
    1. This is the sub list, which is also ordered.
    2. +
    3. It has two items.
    4. +
    +
  4. +
  5. This is the final item on this list.
  6. +
+

Unordered list +

+

The ul element denotes an unordered list (ie. a list of loose items that don’t require numbering, or a bulleted list). Again, each item requires a surrounding <li> and </li> tag, to denote individual items. Here is an example list showing the constituent parts of the British Isles:

+
    +
  • United Kingdom of Great Britain and Northern Ireland:
      +
    • England
    • +
    • Scotland
    • +
    • Wales
    • +
    • Northern Ireland
    • +
    +
  • +
  • Republic of Ireland
  • +
  • Isle of Man
  • +
  • Channel Islands:
      +
    • Bailiwick of Guernsey
    • +
    • Bailiwick of Jersey
    • +
    +
  • +
+

Sometimes we may want each list item to contain block elements, typically a paragraph or two:

+
    +
  • +

    The British Isles is an archipelago consisting of the two large islands of Great Britain and Ireland, and many smaller surrounding islands.

    +
  • +
  • +

    Great Britain is the largest island of the archipelago. Ireland is the second largest island of the archipelago and lies directly to the west of Great Britain.

    +
  • +
  • +

    The full list of islands in the British Isles includes over 1,000 islands, of which 51 have an area larger than 20 km2.

    +
  • +
+

Details +

+

The details element allows collapseable details under a summary

+
+ Item 1 Details + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolore, necessitatibus, optio. Amet atque deserunt dicta, eius hic illo magni obcaecati quam similique? Aliquam ducimus esse maxime possimus reprehenderit tempore vero? +
+
+ Item 2 Details + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aperiam assumenda blanditiis distinctio esse facilis illo iste iure laudantium magnam maiores obcaecati officia pariatur porro recusandae rerum, sunt temporibus vitae! Magni? +
+
+ Already Open + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Alias architecto consequatur culpa eos ex facilis, molestias non sequi tempore voluptas. Cumque, excepturi labore odio odit officiis porro quod rerum tempora! +
+

Definition list +

+

he dl element is for another type of list called a definition list. Instead of list items, the content of a dl consists of dt (definition term) and dd (definition description) pairs. Though it may be called a “definition list”, dl can apply to other scenarios where a parent/child relationship is applicable. For example, it may be used for marking up dialogues, with each dt naming a speaker, and each dd containing his or her words.

+
+
This is a term.
+
This is the definition of that term, which both live in a dl.
+
Here is another term.
+
And it gets a definition too, which is this line.
+
+

Images +

+ +

The img element is used to show photos and graphics, for an excerpted piece of content. The following examples show a section of text with an image: + +

+

Left Align

+

+ + For images using the .align-left modifier, the content will stretch across the entire width of the page. +

+

Right Align

+

+ + For images using the .align-right modifier, the content will stretch across the entire width of the page. +

+ +
+

Figures +

+

The figure element is used to annotate illustrations, diagrams, photos, code listings or provide a citation for an excerpted piece of content. The following examples show a section of pre-formatted text, a quotation and an image:

+ + +
+ +
+

No alignment of image, with supporting caption.

+
+
+

For figures using the .align-bleed modifier, the content will stretch across the entire width of the page.

+
+ +
+

Right aligned image in figure with caption.

+
+
+
+ +
+

Left aligned image in figure with caption

+
+
+
+ +
+

Centered aligned image in figure with caption

+
+
+

For figures using the .align-pull utility, the content will be floated to the right side of the page. Note also that the classes align-start and align-end are available for floating content to the start or end of a passage of text.

+

Text-level semantics +

+

There are a number of inline HTML elements you may use anywhere within other elements.

+ +

The a element is used to hyperlink text, be that to another page, a named fragment on the current page or any other location on the web. Example:

+

+ Go to the home page or return to the top of this page.

+

Stressed emphasis +

+

The em element is used to denote text with stressed emphasis, i.e., something you’d pronounce differently. Where italicising is required for stylistic differentiation, the i element may be preferable. Example:

+

You simply must try the negitoro maki!

+

Strong importance +

+

The strong element is used to denote text with strong importance. Where bolding is used for stylistic differentiation, the b element may be preferable. Example:

+

+ Don’t stick nails in the electrical outlet.

+

Small print +

+

The small element is used to represent disclaimers, caveats, legal restrictions, or copyrights (commonly referred to as ‘small print’). It can also be used for attributions or satisfying licensing requirements. Example:

+

+ Copyright © 1922-2011 Acme Corporation. All Rights Reserved. +

+

Strikethrough +

+

The s element is used to represent content that is no longer accurate or relevant. When indicating document edits i.e., marking a span of text as having been removed from a document, use the del element instead. Example:

+

+ Recommended retail price: £3.99 per bottle +
+ Now selling for just £2.99 a bottle! +

+

Citations +

+

The cite element is used to represent the title of a work (e.g. a book, essay, poem, song, film, TV show, sculpture, painting, musical, exhibition, etc). This can be a work that is being quoted or referenced in detail (i.e. a citation), or it can just be a work that is mentioned in passing. Example:

+

+ Universal Declaration of Human Rights, United Nations, December 1948. Adopted by General Assembly resolution 217 A (III).

+

Inline quotes +

+

The q element is used for quoting text inline. Example showing nested quotations:

+

John said, I saw Lucy at lunch, she told me Mary wants you to get some ice cream on your way home. I think I will get some at Ben and Jerry’s, on Gloucester Road. +

+

Definition +

+

The dfn element is used to highlight the first use of a term. The title attribute can be used to describe the term. Example:

+

Bob’s canine mother and equine father sat him down and carefully explained that he was an allopolyploid organism.

+

Abbreviation +

+

The abbr element is used for any abbreviated text, whether it be acronym, initialism, or otherwise. Any text in the title attribute will appear when the user’s mouse hovers the abbreviation. Example abbreviations:

+

+ BBC, HTML, and Staffs. +

+

Time +

+

The time element is used to represent either a time on a 24 hour clock, or a precise date in the proleptic Gregorian calendar, optionally with a time and a time-zone offset. Example:

+

Queen Elizabeth II was proclaimed sovereign of each of the Commonwealth realms on and , after the death of her father, King George VI.

+

Code +

+

The code element is used to represent fragments of computer code. Useful for technology-oriented sites, not so useful otherwise. Example:

+

When you call the activate() method on the robotSnowman object, the eyes glow.

+

The following exampes shows the code element used in conjunction with the pre element (with the applicable syntax highlighting applied automatically):

+
console.log('Hello World!');
+

Variable +

+

The var element is used to denote a variable in a mathematical expression or programming context, but can also be used to indicate a placeholder where the contents should be replaced with your own value. Example:

+

If there are n pipes leading to the ice cream factory then I expect at least n flavours of ice cream to be available for purchase!

+

Sample output +

+

The samp element is used to represent (sample) output from a program or computing system. Useful for technology-oriented sites, not so useful otherwise. Example:

+

The computer said Too much cheese in tray two but I didn’t know what that meant.

+

Keyboard entry +

+

The kbd element is used to denote user input (typically via a keyboard, although it may also be used to represent other input methods, such as voice commands). Example:

+

To take a screenshot on your Mac, press ⌘ Cmd + ⌘ Shift + 3.

+

Superscript and subscript text +

+

The sup element represents a superscript and the sub element represents a sub. These elements must be used only to mark up typographical conventions with specific meanings, not for typographical presentation. As a guide, only use these elements if their absence would change the meaning of the content. Example:

+

The coordinate of the ith point is (x + i + + , y + i + + ). For example, the 10th point has coordinate (x10 + , y10 + ).

+

f(x, n) = log4 + x + + n + +

+

Italicised +

+

The i element is used for text in an alternate voice or mood, or otherwise offset from the normal prose. Examples include taxonomic designations, technical terms, idiomatic phrases from another language, the name of a ship or other spans of text whose typographic presentation is typically italicised. Example:

+

There is a certain je ne sais quoi in the air.

+

Emboldened +

+

The b element is used for text stylistically offset from normal prose without conveying extra importance, such as key words in a document abstract, product names in a review, or other spans of text whose typographic presentation is typically emboldened. Example:

+

You enter a small room. Your sword glows brighter. A rat scurries past the corner wall.

+

Marked or highlighted text +

+

The mark element is used to represent a run of text marked or highlighted for reference purposes. When used in a quotation it indicates a highlight not originally present but added to bring the reader’s attention to that part of the text. When used in the main prose of a document, it indicates a part of the document that has been highlighted due to its relevance to the user’s current activity. Example:

+

I also have some kittens who are visiting me these days. They’re really cute. I think they like my garden! Maybe I should adopt a kitten.

+

Edits +

+

The del element is used to represent deleted or retracted text which still must remain on the page for some reason. Meanwhile its counterpart, the ins element, is used to represent inserted text. Both del and ins have a datetime attribute which allows you to include a timestamp directly in the element. Example inserted text and usage:

+

She bought two five pairs of shoes.

+

Tabular data +

+

Tables should be used when displaying tabular data. The thead, tfoot and tbody elements enable you to group rows within each a table.

+

If you use these elements, you must use every element. They should appear in this order: thead, tfoot and tbody, so that browsers can render the foot before receiving all the data. You must use these tags within the table element.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
The Very Best EggnogServes 12Serves 24
Milk1 quart2 quart
Cinnamon Sticks12
Vanilla Bean, Split12
Cloves510
Mace1020
Egg Yolks1224
Cups Sugar1 1/2 cups3 cups
Dark Rum1 1/2 cups3 cups
Brandy1 1/2 cups3 cups
Vanilla1 tbsp2 tbsp
Light Cream1 quart2 quart
+
+
+
+
    +
  1. +

    This scope may also include footnotes. ↩︎ +

    +
  2. +
+
+
+{% endblock %} diff --git a/public/index.php b/public/index.php new file mode 100644 index 0000000..ad454e2 --- /dev/null +++ b/public/index.php @@ -0,0 +1,388 @@ + getenv('AC_URL') . '/api/v1/', +//]); +//?> + +post('issue-token', [ +// 'json' => [ +// 'username' => getenv('AC_USER'), +// 'password' => getenv('AC_PASS'), +// 'client_name' => 'AC', +// 'client_vendor' => 'UBC CS', +// ], +//]); +// +//if ($response->getStatusCode() != 200) { +// throw new ErrorException('Token not issued'); +//} +//if (!str_contains($response->getHeaderLine('Content-Type'), 'application/json')) { +// throw new ErrorException('Response not json' . $response->getHeaderLine('Content-Type')); +//} +// +//$result = json_decode($response->getBody(), true); +//if (empty($result['is_ok']) || empty($result['token'])) { +// throw new ErrorException('Authentication rejected'); +//} +//$token = $result['token']; +// +//$client = new GuzzleHttp\Client([ +// 'base_uri' => getenv('AC_URL') . '/api/v1/', +// 'headers' => [ +// 'X-Angie-AuthApiToken' => $token, +// ] +//]); +// +////$response = $client->get('projects'); +//// +////$project_labels = json_decode($response->getBody()->getContents(), true); +////var_dump($project_labels); +// +// +//$time_start = microtime(true); +//$client->get('projects'); +//$client->get('projects/categories'); +//$client->get('labels/project-labels'); +//$client->get('labels/task-labels'); +//$client->get('users'); +// +//$execution_time = (microtime(true) - $time_start); +//echo '
Sync Total Execution Time: '.$execution_time.' Seconds'; +// +//$time_start = microtime(true); +// +// +//$promises = [ +// 'projects' => $client->getAsync('projects'), +// 'project-categories' => $client->getAsync('projects/categories'), +// 'project-labels' => $client->getAsync('labels/project-labels'), +// 'task-labels' => $client->getAsync('labels/task-labels'), +// 'users' => $client->getAsync('users'), +//]; +// +//// Wait for the requests to complete; throws a ConnectException +//// if any of the requests fail +////$responses = Utils::unwrap($promises); +//$responses = Utils::settle( +// Utils::unwrap($promises), +//)->wait(); +// +// +//$execution_time = (microtime(true) - $time_start); +//echo '
Async Total Execution Time: '.$execution_time.' Seconds'; +// +// +// +//foreach ($responses as $response) { +//// echo $responses['png']->getHeader('Content-Length')[0]; +//// var_dump(json_decode($response->getBody()->getContents(), true)); +//} +// +// +//// Wait for the requests to complete, even if some of them fail +////$responses = Promise\Utils::settle($promises)->wait(); +// +// +// +////$posts = json_decode($responses[0]['value']->getBody()->getContents(), true); +////$comments = json_decode($responses[1]['value']->getBody()->getContents(), true); +// +// +//die(); +//?> + +issueToken(); + +// Default expiry 10 minutes. +// https://symfony.com/doc/current/components/cache.html +$cache = new FilesystemAdapter('ac', 600, '../cache'); + +if (!($token instanceof TokenInterface)) { + print "Invalid response\n"; + die(); +} + +$client = new Client($token); + +// Collect a key/value map of project labels. +// https://developers.activecollab.com/api-documentation/v1/projects/labels.html +$project_label_map = $cache->get('project_label_map', function (ItemInterface $item) use ($client) { + $item->expiresAfter(60 * 60 * 24); + $project_labels = $client->get('/labels/project-labels')->getJson(); + return array_column($project_labels, 'name', 'id'); +}); + +// Collect a key/value map of project categories. +// https://developers.activecollab.com/api-documentation/v1/projects/categories.html +$project_category_map = $cache->get('project_category_map', function (ItemInterface $item) use ($client) { + $item->expiresAfter(60 * 60 * 24); + $project_categories = $client->get('/projects/categories')->getJson(); + return array_column($project_categories, 'name', 'id'); +}); + +// Collect a key/value map of task labels. +// https://developers.activecollab.com/api-documentation/v1/projects/elements/tasks/labels.html +$task_label_map = $cache->get('task_label_map', function (ItemInterface $item) use ($client) { + $item->expiresAfter(60 * 60 * 24); + $task_labels = $client->get('/labels/task-labels')->getJson(); + return array_column($task_labels, 'name', 'id'); +}); + +// Collect a list of all the projects. +$projects = $cache->get('projects', function (ItemInterface $item) use ($client) { + $item->expiresAfter(60 * 60 * 24); + return $client->get('projects')->getJson(); +}); + +// Collect a list of all the users. +$users = $cache->get('users', function (ItemInterface $item) use ($client) { + $item->expiresAfter(60 * 60 * 24); + return $client->get('users')->getJson(); +}); + +$user_map = array_column($users, 'display_name', 'id'); + +// Collect a key/value map of task list names. +// Collect a list of task lists per project. +$project_task_list_map = []; +$task_lists_per_project = []; +foreach ($projects as $project) { + $project_task_lists = $cache->get('projects_task_lists.' . $project['id'], function (ItemInterface $item) use ($client, $project) { + $item->expiresAfter(3600); + return $client->get('projects/' . $project['id'] . '/task-lists')->getJson(); + }); + + $project_task_list_map += array_column($project_task_lists, 'name', 'id'); + $task_lists_per_project[$project['id']] = $project_task_lists; +} + +// Subtasks +// https://developers.activecollab.com/api-documentation/v1/projects/elements/tasks/subtasks.html + + +// Tasks +// - Filter out is_trashed and is_completed +// - Link Projects +// + +?> + + + + + + AC + + + + + + + + +
+
+ Projects +setData($project_labels) +// ->attr('table', 'class', 'datatable table') +// ->column()->title('#')->value('id')->add() +// ->column()->title('Name')->value('name')->add() +// ->render(); +// +// Table::instance() +// ->setData($task_labels) +// ->attr('table', 'class', 'datatable table') +// ->column()->title('#')->value('id')->add() +// ->column()->title('Name')->value('name')->add() +// ->render(); + +// https://github.com/jupitern/table +Table::instance() + ->setData($projects) + ->attr('table', 'class', 'datatable table') + ->attr('table', 'width', '100%') + ->column()->title('Name')->value(function ($row) { + return '' . $row['name'] . ''; + })->add() + ->column()->title('Label')->value(function ($row) use ($project_label_map) { + return $project_label_map[$row['label_id']] ?? $row['label_id']; + })->add() // ->filter(array_combine($project_label_map, $project_label_map)) + ->column()->title('Category')->value(function ($row) use ($project_category_map) { + return $project_category_map[$row['category_id']] ?? $row['category_id']; + })->add() // ->filter(array_combine($project_category_map, $project_category_map)) + ->column()->title('🚀Up Next')->value(function ($row) use ($task_lists_per_project) { + $task_list_map = array_column($task_lists_per_project[$row['id']], 'name'); + $task_list_ids = array_filter($task_list_map, fn($name) => str_contains($name, 'Up Next')); + $task_list_id = key($task_list_ids); + return $task_lists_per_project[$row['id']][$task_list_id]['open_tasks'] ?? 0; + })->add() + ->column()->title('🪵Backlog')->value(function ($row) use ($task_lists_per_project) { + $task_list_map = array_column($task_lists_per_project[$row['id']], 'name'); + $task_list_ids = array_filter($task_list_map, fn($name) => str_contains($name, 'Backlog')); + $task_list_id = key($task_list_ids); + return $task_lists_per_project[$row['id']][$task_list_id]['open_tasks'] ?? 0; + })->add() + ->column()->title('👀In Review')->value(function ($row) use ($task_lists_per_project) { + $task_list_map = array_column($task_lists_per_project[$row['id']], 'name'); + $task_list_ids = array_filter($task_list_map, fn($name) => str_contains($name, 'In Review')); + $task_list_id = key($task_list_ids); + return $task_lists_per_project[$row['id']][$task_list_id]['open_tasks'] ?? 0; + })->add() + ->column()->title('🧙‍Wish/Idea')->value(function ($row) use ($task_lists_per_project) { + $task_list_map = array_column($task_lists_per_project[$row['id']], 'name'); + $task_list_ids = array_filter($task_list_map, fn($name) => str_contains($name, 'Backlog')); + $task_list_id = key($task_list_ids); + return $task_lists_per_project[$row['id']][$task_list_id]['open_tasks'] ?? 0; + })->add() + ->column()->title('Other Task Lists')->value(function ($row) use ($task_lists_per_project) { + $task_list_links = []; + $split_out_lists = [ + 'Up Next', + 'Backlog', + 'In Review', + 'Wish', + ]; + foreach ($task_lists_per_project[$row['id']] as $task_list) { + $is_split_out_list = array_filter($split_out_lists, function ($list) use ($task_list) { + return str_contains($task_list['name'], $list); + }); + if ($is_split_out_list) { + continue; + } + $task_list_links[] = '' . $task_list['name'] . ' ' . $task_list['open_tasks'] . ''; + } + return implode('', $task_list_links); + })->add() + ->column()->title('Total Tasks')->value('count_tasks')->add() + ->render(); +// echo ''; +// foreach ($data as $project) { +// echo $project['name'] ; +// } +// echo '
'; +// print_r($data); +?> + +
+ Tasks +get('projects_tasks.' . $project['id'], function (ItemInterface $item) use ($client, $project) { + $item->expiresAfter(3600); + return $client->get('projects/' . $project['id'] . '/tasks')->getJson(); + }); + + foreach ($project_tasks['tasks'] as $task) { + $task['project_id'] = $project['id']; + $task['project_name'] = $project['name']; + $tasks[] = $task; + } +} +$today_midnight = strtotime('today'); +Table::instance() + ->setData($tasks) + ->attr('table', 'class', 'datatable table') + ->attr('table', 'width', '100%') + ->column()->title('Project')->value(function ($row) { + return '' . $row['project_name'] . ''; + })->add() + ->column()->title('Task List')->value(function ($row) use ($project_task_list_map) { + return $project_task_list_map[$row['task_list_id']] ?? $row['task_list_id']; + })->add() // ->filter(array_combine($project_category_map, $project_category_map)) + ->column()->title('Name')->value(function ($row) { + return '' . $row['name'] . ''; + })->add() + ->column()->title('Labels')->value(function ($row) { + $labels = array_column($row['labels'], 'name'); + return implode(', ', $labels); + })->add() + ->column()->title('Due On')->value(function ($row) use ($today_midnight) { + if (!empty($row['due_on'])) { + $is_past = $row['due_on'] < $today_midnight; + $formatted_due_date = date('Y-m-d', $row['due_on']); + return $is_past ? '' . $formatted_due_date . '' : $formatted_due_date; + } + return ''; + })->add() + ->column()->title('High Priority')->value(function ($row) { + $is_important = $row['is_important'] ?? FALSE; + return $is_important ? 'High' : ''; + })->add() + ->column()->title('Assigned')->value(function ($row) use ($user_map) { + if (!empty($row['assignee_id'])) { + return $user_map[$row['assignee_id']]; + } + return ''; + })->add() +// ->column()->title('Label')->value(function ($row) { +// return implode(', ', $row['labels']); +// })->add() // ->filter(array_combine($project_label_map, $project_label_map)) + ->column()->title('Open Subtasks')->value('open_subtasks')->add() + ->render(); + +?> +
+ + + + + + + + + + + + + + + + + + + diff --git a/public/themes/custom/ubccs/.gitignore b/public/themes/custom/ubccs/.gitignore new file mode 100644 index 0000000..8d4aaf4 --- /dev/null +++ b/public/themes/custom/ubccs/.gitignore @@ -0,0 +1,2 @@ +node_modules +*.map \ No newline at end of file diff --git a/public/themes/custom/ubccs/css/bootstrap.css b/public/themes/custom/ubccs/css/bootstrap.css new file mode 100644 index 0000000..98d1796 --- /dev/null +++ b/public/themes/custom/ubccs/css/bootstrap.css @@ -0,0 +1,1076 @@ +.container, +.container-fluid, +.container-xl { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 1200px) { + .container-xl, .container-lg, .container-md, .container-sm, .container { + max-width: 1200px; + } +} +.row { + display: flex; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px; +} + +.no-gutters { + margin-right: 0; + margin-left: 0; +} +.no-gutters > .col, +.no-gutters > [class*=col-] { + padding-right: 0; + padding-left: 0; +} + +.col-xxl, +.col-xxl-auto, .col-xxl-12, .col-xxl-11, .col-xxl-10, .col-xxl-9, .col-xxl-8, .col-xxl-7, .col-xxl-6, .col-xxl-5, .col-xxl-4, .col-xxl-3, .col-xxl-2, .col-xxl-1, .col-xl, +.col-xl-auto, .col-xl-12, .col-xl-11, .col-xl-10, .col-xl-9, .col-xl-8, .col-xl-7, .col-xl-6, .col-xl-5, .col-xl-4, .col-xl-3, .col-xl-2, .col-xl-1, .col-lg, +.col-lg-auto, .col-lg-12, .col-lg-11, .col-lg-10, .col-lg-9, .col-lg-8, .col-lg-7, .col-lg-6, .col-lg-5, .col-lg-4, .col-lg-3, .col-lg-2, .col-lg-1, .col-md, +.col-md-auto, .col-md-12, .col-md-11, .col-md-10, .col-md-9, .col-md-8, .col-md-7, .col-md-6, .col-md-5, .col-md-4, .col-md-3, .col-md-2, .col-md-1, .col-sm, +.col-sm-auto, .col-sm-12, .col-sm-11, .col-sm-10, .col-sm-9, .col-sm-8, .col-sm-7, .col-sm-6, .col-sm-5, .col-sm-4, .col-sm-3, .col-sm-2, .col-sm-1, .col, +.col-auto, .col-12, .col-11, .col-10, .col-9, .col-8, .col-7, .col-6, .col-5, .col-4, .col-3, .col-2, .col-1 { + position: relative; + width: 100%; + padding-right: 15px; + padding-left: 15px; +} + +.col { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; +} + +.row-cols-1 > * { + flex: 0 0 100%; + max-width: 100%; +} + +.row-cols-2 > * { + flex: 0 0 50%; + max-width: 50%; +} + +.row-cols-3 > * { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; +} + +.row-cols-4 > * { + flex: 0 0 25%; + max-width: 25%; +} + +.row-cols-5 > * { + flex: 0 0 20%; + max-width: 20%; +} + +.row-cols-6 > * { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; +} + +.col-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; +} + +.col-1 { + flex: 0 0 8.33333333%; + max-width: 8.33333333%; +} + +.col-2 { + flex: 0 0 16.66666667%; + max-width: 16.66666667%; +} + +.col-3 { + flex: 0 0 25%; + max-width: 25%; +} + +.col-4 { + flex: 0 0 33.33333333%; + max-width: 33.33333333%; +} + +.col-5 { + flex: 0 0 41.66666667%; + max-width: 41.66666667%; +} + +.col-6 { + flex: 0 0 50%; + max-width: 50%; +} + +.col-7 { + flex: 0 0 58.33333333%; + max-width: 58.33333333%; +} + +.col-8 { + flex: 0 0 66.66666667%; + max-width: 66.66666667%; +} + +.col-9 { + flex: 0 0 75%; + max-width: 75%; +} + +.col-10 { + flex: 0 0 83.33333333%; + max-width: 83.33333333%; +} + +.col-11 { + flex: 0 0 91.66666667%; + max-width: 91.66666667%; +} + +.col-12 { + flex: 0 0 100%; + max-width: 100%; +} + +.order-first { + order: -1; +} + +.order-last { + order: 13; +} + +.order-0 { + order: 0; +} + +.order-1 { + order: 1; +} + +.order-2 { + order: 2; +} + +.order-3 { + order: 3; +} + +.order-4 { + order: 4; +} + +.order-5 { + order: 5; +} + +.order-6 { + order: 6; +} + +.order-7 { + order: 7; +} + +.order-8 { + order: 8; +} + +.order-9 { + order: 9; +} + +.order-10 { + order: 10; +} + +.order-11 { + order: 11; +} + +.order-12 { + order: 12; +} + +.offset-1 { + margin-left: 8.33333333%; +} + +.offset-2 { + margin-left: 16.66666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.33333333%; +} + +.offset-5 { + margin-left: 41.66666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.33333333%; +} + +.offset-8 { + margin-left: 66.66666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.33333333%; +} + +.offset-11 { + margin-left: 91.66666667%; +} + +@media (min-width: 576px) { + .col-sm { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + .row-cols-sm-1 > * { + flex: 0 0 100%; + max-width: 100%; + } + .row-cols-sm-2 > * { + flex: 0 0 50%; + max-width: 50%; + } + .row-cols-sm-3 > * { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + .row-cols-sm-4 > * { + flex: 0 0 25%; + max-width: 25%; + } + .row-cols-sm-5 > * { + flex: 0 0 20%; + max-width: 20%; + } + .row-cols-sm-6 > * { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + .col-sm-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-sm-1 { + flex: 0 0 8.33333333%; + max-width: 8.33333333%; + } + .col-sm-2 { + flex: 0 0 16.66666667%; + max-width: 16.66666667%; + } + .col-sm-3 { + flex: 0 0 25%; + max-width: 25%; + } + .col-sm-4 { + flex: 0 0 33.33333333%; + max-width: 33.33333333%; + } + .col-sm-5 { + flex: 0 0 41.66666667%; + max-width: 41.66666667%; + } + .col-sm-6 { + flex: 0 0 50%; + max-width: 50%; + } + .col-sm-7 { + flex: 0 0 58.33333333%; + max-width: 58.33333333%; + } + .col-sm-8 { + flex: 0 0 66.66666667%; + max-width: 66.66666667%; + } + .col-sm-9 { + flex: 0 0 75%; + max-width: 75%; + } + .col-sm-10 { + flex: 0 0 83.33333333%; + max-width: 83.33333333%; + } + .col-sm-11 { + flex: 0 0 91.66666667%; + max-width: 91.66666667%; + } + .col-sm-12 { + flex: 0 0 100%; + max-width: 100%; + } + .order-sm-first { + order: -1; + } + .order-sm-last { + order: 13; + } + .order-sm-0 { + order: 0; + } + .order-sm-1 { + order: 1; + } + .order-sm-2 { + order: 2; + } + .order-sm-3 { + order: 3; + } + .order-sm-4 { + order: 4; + } + .order-sm-5 { + order: 5; + } + .order-sm-6 { + order: 6; + } + .order-sm-7 { + order: 7; + } + .order-sm-8 { + order: 8; + } + .order-sm-9 { + order: 9; + } + .order-sm-10 { + order: 10; + } + .order-sm-11 { + order: 11; + } + .order-sm-12 { + order: 12; + } + .offset-sm-0 { + margin-left: 0; + } + .offset-sm-1 { + margin-left: 8.33333333%; + } + .offset-sm-2 { + margin-left: 16.66666667%; + } + .offset-sm-3 { + margin-left: 25%; + } + .offset-sm-4 { + margin-left: 33.33333333%; + } + .offset-sm-5 { + margin-left: 41.66666667%; + } + .offset-sm-6 { + margin-left: 50%; + } + .offset-sm-7 { + margin-left: 58.33333333%; + } + .offset-sm-8 { + margin-left: 66.66666667%; + } + .offset-sm-9 { + margin-left: 75%; + } + .offset-sm-10 { + margin-left: 83.33333333%; + } + .offset-sm-11 { + margin-left: 91.66666667%; + } +} +@media (min-width: 768px) { + .col-md { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + .row-cols-md-1 > * { + flex: 0 0 100%; + max-width: 100%; + } + .row-cols-md-2 > * { + flex: 0 0 50%; + max-width: 50%; + } + .row-cols-md-3 > * { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + .row-cols-md-4 > * { + flex: 0 0 25%; + max-width: 25%; + } + .row-cols-md-5 > * { + flex: 0 0 20%; + max-width: 20%; + } + .row-cols-md-6 > * { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + .col-md-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-md-1 { + flex: 0 0 8.33333333%; + max-width: 8.33333333%; + } + .col-md-2 { + flex: 0 0 16.66666667%; + max-width: 16.66666667%; + } + .col-md-3 { + flex: 0 0 25%; + max-width: 25%; + } + .col-md-4 { + flex: 0 0 33.33333333%; + max-width: 33.33333333%; + } + .col-md-5 { + flex: 0 0 41.66666667%; + max-width: 41.66666667%; + } + .col-md-6 { + flex: 0 0 50%; + max-width: 50%; + } + .col-md-7 { + flex: 0 0 58.33333333%; + max-width: 58.33333333%; + } + .col-md-8 { + flex: 0 0 66.66666667%; + max-width: 66.66666667%; + } + .col-md-9 { + flex: 0 0 75%; + max-width: 75%; + } + .col-md-10 { + flex: 0 0 83.33333333%; + max-width: 83.33333333%; + } + .col-md-11 { + flex: 0 0 91.66666667%; + max-width: 91.66666667%; + } + .col-md-12 { + flex: 0 0 100%; + max-width: 100%; + } + .order-md-first { + order: -1; + } + .order-md-last { + order: 13; + } + .order-md-0 { + order: 0; + } + .order-md-1 { + order: 1; + } + .order-md-2 { + order: 2; + } + .order-md-3 { + order: 3; + } + .order-md-4 { + order: 4; + } + .order-md-5 { + order: 5; + } + .order-md-6 { + order: 6; + } + .order-md-7 { + order: 7; + } + .order-md-8 { + order: 8; + } + .order-md-9 { + order: 9; + } + .order-md-10 { + order: 10; + } + .order-md-11 { + order: 11; + } + .order-md-12 { + order: 12; + } + .offset-md-0 { + margin-left: 0; + } + .offset-md-1 { + margin-left: 8.33333333%; + } + .offset-md-2 { + margin-left: 16.66666667%; + } + .offset-md-3 { + margin-left: 25%; + } + .offset-md-4 { + margin-left: 33.33333333%; + } + .offset-md-5 { + margin-left: 41.66666667%; + } + .offset-md-6 { + margin-left: 50%; + } + .offset-md-7 { + margin-left: 58.33333333%; + } + .offset-md-8 { + margin-left: 66.66666667%; + } + .offset-md-9 { + margin-left: 75%; + } + .offset-md-10 { + margin-left: 83.33333333%; + } + .offset-md-11 { + margin-left: 91.66666667%; + } +} +@media (min-width: 980px) { + .col-lg { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + .row-cols-lg-1 > * { + flex: 0 0 100%; + max-width: 100%; + } + .row-cols-lg-2 > * { + flex: 0 0 50%; + max-width: 50%; + } + .row-cols-lg-3 > * { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + .row-cols-lg-4 > * { + flex: 0 0 25%; + max-width: 25%; + } + .row-cols-lg-5 > * { + flex: 0 0 20%; + max-width: 20%; + } + .row-cols-lg-6 > * { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + .col-lg-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-lg-1 { + flex: 0 0 8.33333333%; + max-width: 8.33333333%; + } + .col-lg-2 { + flex: 0 0 16.66666667%; + max-width: 16.66666667%; + } + .col-lg-3 { + flex: 0 0 25%; + max-width: 25%; + } + .col-lg-4 { + flex: 0 0 33.33333333%; + max-width: 33.33333333%; + } + .col-lg-5 { + flex: 0 0 41.66666667%; + max-width: 41.66666667%; + } + .col-lg-6 { + flex: 0 0 50%; + max-width: 50%; + } + .col-lg-7 { + flex: 0 0 58.33333333%; + max-width: 58.33333333%; + } + .col-lg-8 { + flex: 0 0 66.66666667%; + max-width: 66.66666667%; + } + .col-lg-9 { + flex: 0 0 75%; + max-width: 75%; + } + .col-lg-10 { + flex: 0 0 83.33333333%; + max-width: 83.33333333%; + } + .col-lg-11 { + flex: 0 0 91.66666667%; + max-width: 91.66666667%; + } + .col-lg-12 { + flex: 0 0 100%; + max-width: 100%; + } + .order-lg-first { + order: -1; + } + .order-lg-last { + order: 13; + } + .order-lg-0 { + order: 0; + } + .order-lg-1 { + order: 1; + } + .order-lg-2 { + order: 2; + } + .order-lg-3 { + order: 3; + } + .order-lg-4 { + order: 4; + } + .order-lg-5 { + order: 5; + } + .order-lg-6 { + order: 6; + } + .order-lg-7 { + order: 7; + } + .order-lg-8 { + order: 8; + } + .order-lg-9 { + order: 9; + } + .order-lg-10 { + order: 10; + } + .order-lg-11 { + order: 11; + } + .order-lg-12 { + order: 12; + } + .offset-lg-0 { + margin-left: 0; + } + .offset-lg-1 { + margin-left: 8.33333333%; + } + .offset-lg-2 { + margin-left: 16.66666667%; + } + .offset-lg-3 { + margin-left: 25%; + } + .offset-lg-4 { + margin-left: 33.33333333%; + } + .offset-lg-5 { + margin-left: 41.66666667%; + } + .offset-lg-6 { + margin-left: 50%; + } + .offset-lg-7 { + margin-left: 58.33333333%; + } + .offset-lg-8 { + margin-left: 66.66666667%; + } + .offset-lg-9 { + margin-left: 75%; + } + .offset-lg-10 { + margin-left: 83.33333333%; + } + .offset-lg-11 { + margin-left: 91.66666667%; + } +} +@media (min-width: 1200px) { + .col-xl { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + .row-cols-xl-1 > * { + flex: 0 0 100%; + max-width: 100%; + } + .row-cols-xl-2 > * { + flex: 0 0 50%; + max-width: 50%; + } + .row-cols-xl-3 > * { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + .row-cols-xl-4 > * { + flex: 0 0 25%; + max-width: 25%; + } + .row-cols-xl-5 > * { + flex: 0 0 20%; + max-width: 20%; + } + .row-cols-xl-6 > * { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + .col-xl-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-xl-1 { + flex: 0 0 8.33333333%; + max-width: 8.33333333%; + } + .col-xl-2 { + flex: 0 0 16.66666667%; + max-width: 16.66666667%; + } + .col-xl-3 { + flex: 0 0 25%; + max-width: 25%; + } + .col-xl-4 { + flex: 0 0 33.33333333%; + max-width: 33.33333333%; + } + .col-xl-5 { + flex: 0 0 41.66666667%; + max-width: 41.66666667%; + } + .col-xl-6 { + flex: 0 0 50%; + max-width: 50%; + } + .col-xl-7 { + flex: 0 0 58.33333333%; + max-width: 58.33333333%; + } + .col-xl-8 { + flex: 0 0 66.66666667%; + max-width: 66.66666667%; + } + .col-xl-9 { + flex: 0 0 75%; + max-width: 75%; + } + .col-xl-10 { + flex: 0 0 83.33333333%; + max-width: 83.33333333%; + } + .col-xl-11 { + flex: 0 0 91.66666667%; + max-width: 91.66666667%; + } + .col-xl-12 { + flex: 0 0 100%; + max-width: 100%; + } + .order-xl-first { + order: -1; + } + .order-xl-last { + order: 13; + } + .order-xl-0 { + order: 0; + } + .order-xl-1 { + order: 1; + } + .order-xl-2 { + order: 2; + } + .order-xl-3 { + order: 3; + } + .order-xl-4 { + order: 4; + } + .order-xl-5 { + order: 5; + } + .order-xl-6 { + order: 6; + } + .order-xl-7 { + order: 7; + } + .order-xl-8 { + order: 8; + } + .order-xl-9 { + order: 9; + } + .order-xl-10 { + order: 10; + } + .order-xl-11 { + order: 11; + } + .order-xl-12 { + order: 12; + } + .offset-xl-0 { + margin-left: 0; + } + .offset-xl-1 { + margin-left: 8.33333333%; + } + .offset-xl-2 { + margin-left: 16.66666667%; + } + .offset-xl-3 { + margin-left: 25%; + } + .offset-xl-4 { + margin-left: 33.33333333%; + } + .offset-xl-5 { + margin-left: 41.66666667%; + } + .offset-xl-6 { + margin-left: 50%; + } + .offset-xl-7 { + margin-left: 58.33333333%; + } + .offset-xl-8 { + margin-left: 66.66666667%; + } + .offset-xl-9 { + margin-left: 75%; + } + .offset-xl-10 { + margin-left: 83.33333333%; + } + .offset-xl-11 { + margin-left: 91.66666667%; + } +} +@media (min-width: 1500px) { + .col-xxl { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + .row-cols-xxl-1 > * { + flex: 0 0 100%; + max-width: 100%; + } + .row-cols-xxl-2 > * { + flex: 0 0 50%; + max-width: 50%; + } + .row-cols-xxl-3 > * { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + .row-cols-xxl-4 > * { + flex: 0 0 25%; + max-width: 25%; + } + .row-cols-xxl-5 > * { + flex: 0 0 20%; + max-width: 20%; + } + .row-cols-xxl-6 > * { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + .col-xxl-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-xxl-1 { + flex: 0 0 8.33333333%; + max-width: 8.33333333%; + } + .col-xxl-2 { + flex: 0 0 16.66666667%; + max-width: 16.66666667%; + } + .col-xxl-3 { + flex: 0 0 25%; + max-width: 25%; + } + .col-xxl-4 { + flex: 0 0 33.33333333%; + max-width: 33.33333333%; + } + .col-xxl-5 { + flex: 0 0 41.66666667%; + max-width: 41.66666667%; + } + .col-xxl-6 { + flex: 0 0 50%; + max-width: 50%; + } + .col-xxl-7 { + flex: 0 0 58.33333333%; + max-width: 58.33333333%; + } + .col-xxl-8 { + flex: 0 0 66.66666667%; + max-width: 66.66666667%; + } + .col-xxl-9 { + flex: 0 0 75%; + max-width: 75%; + } + .col-xxl-10 { + flex: 0 0 83.33333333%; + max-width: 83.33333333%; + } + .col-xxl-11 { + flex: 0 0 91.66666667%; + max-width: 91.66666667%; + } + .col-xxl-12 { + flex: 0 0 100%; + max-width: 100%; + } + .order-xxl-first { + order: -1; + } + .order-xxl-last { + order: 13; + } + .order-xxl-0 { + order: 0; + } + .order-xxl-1 { + order: 1; + } + .order-xxl-2 { + order: 2; + } + .order-xxl-3 { + order: 3; + } + .order-xxl-4 { + order: 4; + } + .order-xxl-5 { + order: 5; + } + .order-xxl-6 { + order: 6; + } + .order-xxl-7 { + order: 7; + } + .order-xxl-8 { + order: 8; + } + .order-xxl-9 { + order: 9; + } + .order-xxl-10 { + order: 10; + } + .order-xxl-11 { + order: 11; + } + .order-xxl-12 { + order: 12; + } + .offset-xxl-0 { + margin-left: 0; + } + .offset-xxl-1 { + margin-left: 8.33333333%; + } + .offset-xxl-2 { + margin-left: 16.66666667%; + } + .offset-xxl-3 { + margin-left: 25%; + } + .offset-xxl-4 { + margin-left: 33.33333333%; + } + .offset-xxl-5 { + margin-left: 41.66666667%; + } + .offset-xxl-6 { + margin-left: 50%; + } + .offset-xxl-7 { + margin-left: 58.33333333%; + } + .offset-xxl-8 { + margin-left: 66.66666667%; + } + .offset-xxl-9 { + margin-left: 75%; + } + .offset-xxl-10 { + margin-left: 83.33333333%; + } + .offset-xxl-11 { + margin-left: 91.66666667%; + } +} diff --git a/public/themes/custom/ubccs/css/ckeditor.css b/public/themes/custom/ubccs/css/ckeditor.css new file mode 100644 index 0000000..3e599f9 --- /dev/null +++ b/public/themes/custom/ubccs/css/ckeditor.css @@ -0,0 +1,993 @@ +@charset "UTF-8"; +/** + * $file + * Approximate clf's style in CKEditor instances on the Drupal back-end. + */ +html { + font-size: 10px; +} + +body { + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + color: #444; + font-size: 1.7rem; + line-height: 1.5; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + color: #005554; + text-rendering: auto; + font-weight: 400; + line-height: 1.2; +} + +h1 { + margin-top: 0; + margin-bottom: 0; +} + +h2 { + margin-top: 3.4rem; + margin-bottom: 1.7rem; +} + +h3, +h4, +h5, +h6 { + margin-top: 2.55rem; + margin-bottom: 1.7rem; +} + +h1 { + font-size: 3.995rem; +} + +h2 { + font-size: 2.992rem; +} + +h3 { + font-size: 2.499rem; +} + +h4 { + font-size: 1.989rem; +} + +h3, +h4 { + font-weight: 700; +} + +p { + line-height: 1.5; + margin-top: 1.7rem; + margin-bottom: 1.7rem; +} + +a { + color: #00afa4; + -webkit-text-decoration-skip: ink; + text-decoration-skip-ink: auto; + transition: color 0.5s ease-in; +} + +a:hover, +a:active { + color: #005554; +} + +hr { + display: block; + height: 2px; + border: 0; + margin: 3rem auto; + width: 40%; + padding: 0; + background-color: #9e4225; + clear: both; +} + +blockquote { + border-left: 8px solid #00afa4; + list-style-position: inside; + margin-left: 0; + padding-left: 1em; + padding-right: 2em; +} + +:not(pre) > code { + padding: 0.2em 0.4em; + border-radius: 0.3em; + white-space: normal; +} + +:not(pre) > code, +pre { + background-color: #eee; +} + +pre { + padding: 1em; + margin: 0.5em 0; + overflow: auto; +} + +code, +pre { + color: #555; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + tab-size: 4; + -webkit-hyphens: none; + hyphens: none; +} + +pre, +code, +kbd, +samp { + font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; +} + +figure { + display: table; + margin: 2rem 0; +} +figure img { + display: block; +} + +figcaption { + display: table-caption; + caption-side: bottom; + max-width: none; + padding: 1rem 2rem; + font-size: 1.36rem; + line-height: 1.2; +} + +figcaption p { + margin: 0; +} + +a + figcaption, +img + figcaption { + background: #9e4225; + color: #fff; +} + +blockquote + figcaption { + color: #555; +} + +[tabindex="-1"]:focus { + outline: none; +} + +@media print { + footer { + display: none; + } +} +form { + margin: 0; + padding: 0; +} + +button { + width: auto; + overflow: visible; + -webkit-appearance: none; + -moz-appearance: none; +} + +label { + display: table; + margin: 0 0 0.25em; + padding: 0; + font-weight: bold; +} + +label[for] { + cursor: pointer; +} + +fieldset { + background-color: #f6fffe; + border: 2px solid #00afa4; + border-radius: 3px; + padding: 1em; + margin: 1em 0; + min-width: 100%; +} + +.fieldset-wrapper p { + margin-top: 0; + margin-bottom: 0; +} + +legend { + font-size: 2rem; + font-weight: 700; + padding: 0 0.25em; +} + +/** + * Limits extra long instances of select elements to the max width allowed + * to avoid breaking layouts. + */ +select { + max-width: 100%; +} + +button, +input { + font-size: 1.7rem; + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + vertical-align: baseline; +} + +input { + width: auto; +} + +button { + width: auto; + overflow: visible; +} + +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + line-height: inherit; + margin: 0; +} + +input, +select { + vertical-align: middle; +} + +input, +textarea, +select, +input[type=text] { + -webkit-appearance: none; + appearance: none; + border: 2px solid #444; + border-radius: 0; + color: #444; + margin: 0; + max-width: 100%; + padding: 0.5rem 0.8rem; +} +input:focus, +textarea:focus, +select:focus, +input[type=text]:focus { + outline: 0.2rem solid rgba(82, 168, 236, 0.8); + transition: outline ease-in-out 0.2s; +} + +input[type=image] { + border: 0; +} + +button:hover, +input[type=image]:hover, +input[type=button]:hover, +input[type=submit]:hover { + cursor: pointer; +} + +select { + background: #fff url("../img/arrow-both.svg") no-repeat right 1.3rem center; + background-size: 1rem; + padding-right: 3rem; +} + +select[multiple] { + background-image: none; +} + +input[type=checkbox], +input[type=radio] { + padding: 0; + display: inline-block; +} + +[type=checkbox], +[type=radio] { + height: 2rem; + width: 2rem; + position: relative; + border: 0; + vertical-align: middle; +} +[type=checkbox]:focus, +[type=radio]:focus { + outline: none; +} + +[type=checkbox] + label, +[type=radio] + label { + font-weight: 400; + margin-left: 0.6rem; +} + +[type=checkbox]::before, +[type=radio]::before { + background-color: #fff; + content: " "; + display: inline-block; + text-indent: 0.15em; + vertical-align: middle; + position: absolute; + top: 0; + left: 0; + cursor: pointer; +} + +[type=checkbox]::before { + border-radius: 0.2rem; + box-shadow: 0 0 0 0.2rem #444; + height: 2rem; + line-height: 2rem; + margin-left: 1px; + margin-right: 0.6em; + width: 2rem; +} + +[type=radio]::before { + border-radius: 100%; + box-shadow: 0 0 0 0.2rem #ffffff, 0 0 0 0.4rem #444; + height: 1.4rem; + line-height: 1.4rem; + margin-left: 3px; + margin-right: 0.75em; + width: 1.4rem; +} + +[type=checkbox]:checked::before, +[type=radio]:checked::before { + background-color: #00afa4; + box-shadow: 0 0 0 0.2rem #00afa4; +} + +[type=radio]:checked::before { + box-shadow: 0 0 0 0.2rem #fff, 0 0 0 0.4rem #00afa4; +} + +[type=checkbox]:checked::before, +[type=checkbox]:checked:disabled::before { + background-image: url("../img/correct8.svg"); + background-repeat: no-repeat; + background-position: 50%; +} + +[type=radio]:focus::before { + outline: 0.2rem solid rgba(82, 168, 236, 0.8); + outline-offset: 6px; +} + +[type=checkbox]:disabled + label { + color: #d6d7d9; +} + +[type=checkbox]:focus::before { + outline: 0.2rem solid rgba(82, 168, 236, 0.8); + outline-offset: 3px; +} + +[type=checkbox]:disabled::before, +[type=radio]:disabled::before { + background: #f1f1f1; + box-shadow: 0 0 0 0.2rem #999; + cursor: not-allowed; +} + +img { + max-width: 100%; + height: auto; +} + +ul, +ol { + margin-top: 0; + margin-bottom: 1.7rem; + margin-left: 0; + padding-left: 3.4rem; +} + +li { + line-height: 1.5; +} + +table, +tbody, +td, +tfoot, +th, +thead, +tr { + border: 0; + margin: 0; + padding: 0; +} + +table { + border-collapse: collapse; + margin-bottom: 24px; +} + +caption, +th { + text-align: left; +} + +th, +td { + padding: 1rem; + border: 0 solid #d7e0e7; +} + +th { + vertical-align: bottom; + border-bottom-width: 2px; +} + +td { + vertical-align: top; + border-bottom-width: 1px; +} + +th :first-child, +td :first-child { + margin-top: 0; +} + +th :last-child, +td :last-child { + margin-bottom: 0; +} + +/** + * @file + * Alignment classes for text and block level elements. + */ +.text-align-left { + text-align: left; +} + +.text-align-right { + text-align: right; +} + +.text-align-center { + text-align: center; +} + +.text-align-justify { + text-align: justify; +} + +/** + * Alignment classes for block level elements (images, videos, blockquotes, etc.) + */ +.align-left { + float: left; +} + +.align-right { + float: right; +} + +.align-center { + margin-right: auto; + margin-left: auto; +} + +.image--left, +.image--right, +.image--center { + clear: both; + margin-top: 2rem; + margin-bottom: 2rem; +} + +.align-left, +.image--left { + float: left; + margin-right: 2rem; +} + +.align-right, +.image--right { + float: right; + margin-left: 2rem; +} + +.align-center, +.image--center { + margin-right: auto; + margin-left: auto; +} + +.button, +.image-button { + margin-left: 0; + margin-right: 0; +} + +.read-more__link, .button { + display: inline-block; + padding: 0.7rem 1.7rem; + border: 0; + border-radius: 0.2rem; + background: none; + text-decoration: none; + transition: all 0.5s cubic-bezier(0.165, 0.84, 0.44, 1); + outline-offset: 2px; +} +.button--hover.read-more__link, .button--hover.button, .button--focus.read-more__link, .button--focus.button, .read-more__link:hover, .button:hover, .read-more__link:focus, .button:focus { + text-decoration: none; + outline: none; +} +.button--focus.read-more__link, .button--focus.button, .read-more__link:focus, .button:focus { + z-index: 10; + outline: 1px dotted #00afa4; +} +.button--active.read-more__link, .button--active.button, .read-more__link:active, .button:active { + transition: none; +} + +.field-add-more-submit.button { + font-size: 0.8em; +} + +.button.form-submit, +.button--primary { + border-color: #00afa4; + background-color: #00afa4; + color: #fff; +} +.button.form-submit.button--hover, .button.form-submit:hover, +.button--hover.button--primary, +.button--primary:hover { + background-color: #007c74; + color: #fff; + box-shadow: 0 1px 2px hsla(203deg, 10%, 10%, 0.25); +} +.button.form-submit.button--active, .button.form-submit:active, +.button--active.button--primary, +.button--primary:active { + background-color: #005554; + box-shadow: inset 0 1px 3px hsla(0deg, 0%, 0%, 0.2); +} + +.button--secondary { + border-color: #005554; + background-color: #005554; + color: #fff; +} +.button--focus.button--secondary, .button--hover.button--secondary, .button--secondary:hover, .button--secondary:focus { + background-color: #005554; + border-color: #005554; + color: #fff; +} +.button--hover.button--secondary, .button--secondary:hover { + background-color: #007c74; + box-shadow: 0 1px 2px hsla(203deg, 10%, 10%, 0.25); +} +.button--active.button--secondary, .button--secondary:active { + background-color: #003c3b; + box-shadow: inset 0 1px 3px hsla(0deg, 0%, 0%, 0.2); +} + +/** + * Overrides styling from system.theme. + */ +.button-action::before { + margin-left: -0.2em; + padding-right: 0.2em; + font-size: 0.875rem; + line-height: 16px; +} + +[dir=rtl] .button-action::before { + margin-right: -0.2em; + margin-left: 0; + padding-right: 0; + padding-left: 0.2em; +} + +/* Link actions. */ +/** + * Style a clickable/tappable element as a link. Duplicates the base style for + * the tag, plus a reset for padding, borders and background. + */ +.link { + display: inline; + cursor: pointer; + padding: 0; + border: 0; + background: none; + text-decoration: none; + color: #00afa4; +} +.link:hover, .link:active { + text-decoration: underline; + color: #005554; +} + +/** + * We've temporarily added the danger button here, bit of a harsh reset but we + * need it. + * @todo replace with link--danger. + * See https://www.drupal.org/node/2123731 + */ +.button--danger { + display: inline; + cursor: pointer; + padding: 0; + border: 0; + box-shadow: none; + background: none; + color: #c72100; + text-decoration: underline; +} +.button--danger.button--focus, .button--danger.button--hover, .button--danger.button--active, .button--danger:hover, .button--danger:focus, .button--danger:active { + color: #ff2a00; + text-decoration: underline; + text-shadow: none; + padding: 0; + border: 0; + box-shadow: none; + background: none; +} +.button--danger:disabled, .button--danger.is-disabled { + color: #737373; + cursor: default; + text-decoration: none; + padding: 0; + border: 0; + box-shadow: none; + background: none; +} + +.read-more__link, +.button--outline { + color: #00afa4; + box-shadow: inset 0 0 0 2px #00afa4; +} +.button--hover.read-more__link, .read-more__link:hover, +.button--outline.button--hover, +.button--outline:hover { + box-shadow: inset 0 0 0 2px #007c74; + color: #007c74; +} +.button--active.read-more__link, .read-more__link:active, +.button--outline.button--active, +.button--outline:active { + background-color: rgba(255, 255, 255, 0.3); + color: #005554; + box-shadow: inset 0 0 0 2px #005554; +} + +.button--inverse { + color: #fff; + box-shadow: inset 0 0 0 2px #fff; +} +.button--inverse.button--hover, .button--inverse.button--active, .button--inverse:hover, .button--inverse:active { + background-color: rgba(255, 255, 255, 0.2); + color: #fff; +} +.button--inverse.button--active, .button--inverse:active { + background-color: rgba(255, 255, 255, 0.3); +} + +.button--large { + border-radius: 0.3rem; + font-size: 2rem; + padding: 1rem 2rem; +} + +.read-more__link, +.button--small { + font-size: 1.5rem; + padding: 0.5rem 1.5rem; +} + +.button:disabled, +.button:disabled:active, +.button.is-disabled, +.button.is-disabled:active { + background-color: #ededed; + box-shadow: none; + color: #5c5c5c; + cursor: default; + text-shadow: 0 1px hsla(0deg, 0%, 100%, 0.6); +} + +.read-more { + margin-top: 2rem; +} + +.caption { + display: table; +} + +.caption > * { + display: block; + max-width: 100%; +} + +.caption > figcaption { + display: table-caption; + max-width: none; + caption-side: bottom; +} + +.media + figcaption { + background: #9e4225; + color: #fff; +} + +.caption .media .field { + line-height: 1; +} + +/* Override clf's default blockquote and pre styles when captioned. */ +.caption-pre > pre, +.caption-blockquote > blockquote { + margin: 0; +} + +.caption-blockquote > figcaption::before { + content: "— "; +} + +.caption-blockquote > figcaption { + text-align: left; +} + +[dir=rtl] .caption-blockquote > figcaption { + text-align: right; +} + +details { + padding: 0.5rem 0; + border: 0; + margin-top: 1rem; + margin-bottom: 1rem; +} + +details > .node__content { + padding-left: 1rem; + padding-right: 1rem; +} + +.details--small { + margin-top: 0.5rem; + margin-bottom: 0.5rem; + border: 0; +} +.details--small summary { + font-weight: bold; + font-size: 1.7rem; +} + +details > .details-wrapper { + padding-left: 1rem; + padding-right: 1rem; +} + +.details-wrapper { + margin-top: 1rem; + margin-bottom: 1rem; +} + +.details-wrapper > :last-child { + margin-bottom: 1rem; +} + +details > summary { + list-style: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details summary { + font-size: 2rem; + background-repeat: no-repeat; + background-position: right 1rem top 50%; + background-size: 1.7rem 1.7rem; + color: #00afa4; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Cpath d='M53 29H35V11a3 3 0 00-6 0v18H11a3 3 0 000 6h18v18a3 3 0 006 0V35h18a3 3 0 000-6z' fill='%2300afa4'/%3E%3C/svg%3E"); + border-bottom: 1px solid #005554; + padding-right: 3rem; + padding-left: 1rem; +} + +details[open] summary { + border-bottom-width: 3px; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Cpath d='M53 34H11a3 3 0 010-6h42a3 3 0 010 6z' fill='%2300afa4'/%3E%3C/svg%3E"); +} + +@media (max-width: 767.98px) { + details summary { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } +} +.node__header_image img { + width: 100%; + height: auto; +} + +.inline-block-left, +.inline-block-right { + margin: 0 0 1rem 0; + padding: 2rem; + background-color: #005554; + color: #fff; +} +@media (min-width: 768px) { + .inline-block-left, + .inline-block-right { + max-width: 260px; + width: 100%; + } +} +.inline-block-left h2, +.inline-block-left h3, +.inline-block-left h4, +.inline-block-left a, +.inline-block-right h2, +.inline-block-right h3, +.inline-block-right h4, +.inline-block-right a { + color: #fff; +} +.inline-block-left h2, +.inline-block-left h3, +.inline-block-left h4, +.inline-block-right h2, +.inline-block-right h3, +.inline-block-right h4 { + margin-top: 0; +} + +.inline-block-left { + margin-right: 2rem; +} +@media (min-width: 768px) { + .inline-block-left { + float: left; + clear: left; + } +} + +.inline-block-right { + margin-left: 2rem; +} +@media (min-width: 768px) { + .inline-block-right { + float: right; + clear: right; + } +} + +.media--type-logo { + display: inline-block; + vertical-align: middle; + padding-left: 2rem; +} +.media--type-logo div { + line-height: 0; +} +.media--type-logo img { + object-fit: contain; +} + +.media--type-logo:first-of-type { + padding-left: 0; +} + +.node table { + width: 100%; + max-width: 100%; + border-collapse: collapse; + border-spacing: 0; + border: 1px solid #d7e0e7; + border-right-width: 0; + border-bottom-width: 0; +} +.node td, +.node th { + border: 0 solid #d7e0e7; + border-right-width: 1px; + border-bottom-width: 1px; + padding: 0.5rem 0.8rem; + text-align: left; +} +.node thead th { + vertical-align: bottom; +} + +td.is-active { + background-color: transparent; +} + +.text-primary { + color: #9e4225; +} + +.text-secondary { + color: #005554; +} + +.text-large { + font-size: 3.4rem; +} + +.intro { + color: #cc6e20; + font-size: 2.2rem; +} + +.caption > * { + background: transparent; + padding: 0; + border: 0; +} + +.caption > figcaption { + border: 0; + padding: 1rem 2rem; + text-align: left; + font-size: 1.36rem; +} + +.caption .cke_image_resizer_wrapper + figcaption { + background: #9e4225; + color: #fff; +} + +.cke_show_borders table.cke_show_border, +.cke_show_borders table.cke_show_border > tr > td, +.cke_show_borders table.cke_show_border > tr > th, +.cke_show_borders table.cke_show_border > tbody > tr > td, +.cke_show_borders table.cke_show_border > tbody > tr > th, +.cke_show_borders table.cke_show_border > thead > tr > td, +.cke_show_borders table.cke_show_border > thead > tr > th, +.cke_show_borders table.cke_show_border > tfoot > tr > td, +.cke_show_borders table.cke_show_border > tfoot > tr > th { + border: #000 1px dotted !important; +} + +.cke_widget_element .media { + min-width: 100px; +} + +.cke_widget_drupalmedia { + display: inline-block; +} diff --git a/public/themes/custom/ubccs/css/ckeditor5.css b/public/themes/custom/ubccs/css/ckeditor5.css new file mode 100644 index 0000000..d51267e --- /dev/null +++ b/public/themes/custom/ubccs/css/ckeditor5.css @@ -0,0 +1,834 @@ +@charset "UTF-8"; +/** + * $file + * Approximate clf's style in CKEditor instances on the Drupal back-end. + */ +.ck-content { + /** + * Limits extra long instances of select elements to the max width allowed + * to avoid breaking layouts. + */ + /** + * @file + * Alignment classes for text and block level elements. + */ + /** + * Alignment classes for block level elements (images, videos, blockquotes, etc.) + */ + /** + * Overrides styling from system.theme. + */ + /* Link actions. */ + /** + * Style a clickable/tappable element as a link. Duplicates the base style for + * the tag, plus a reset for padding, borders and background. + */ + /** + * We've temporarily added the danger button here, bit of a harsh reset but we + * need it. + * @todo replace with link--danger. + * See https://www.drupal.org/node/2123731 + */ + /* Override clf's default blockquote and pre styles when captioned. */ +} +.ck-content html { + font-size: 10px; +} +.ck-content body { + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + color: #444; + font-size: 1.1rem; + line-height: 1.5; +} +.ck-content h1, +.ck-content h2, +.ck-content h3, +.ck-content h4, +.ck-content h5, +.ck-content h6 { + color: #005554; + text-rendering: auto; + font-weight: 400; + line-height: 1.2; +} +.ck-content h1 { + margin-top: 0; + margin-bottom: 0; +} +.ck-content h2 { + margin-top: 2.2rem; + margin-bottom: 1.1rem; +} +.ck-content h3, +.ck-content h4, +.ck-content h5, +.ck-content h6 { + margin-top: 1.65rem; + margin-bottom: 1.1rem; +} +.ck-content h1 { + font-size: 2.585rem; +} +.ck-content h2 { + font-size: 1.936rem; +} +.ck-content h3 { + font-size: 1.617rem; +} +.ck-content h4 { + font-size: 1.287rem; +} +.ck-content h3, +.ck-content h4 { + font-weight: 700; +} +.ck-content p { + line-height: 1.5; + margin-top: 1.1rem; + margin-bottom: 1.1rem; +} +.ck-content a { + color: #00afa4; + -webkit-text-decoration-skip: ink; + text-decoration-skip-ink: auto; + transition: color 0.5s ease-in; +} +.ck-content a:hover, +.ck-content a:active { + color: #005554; +} +.ck-content hr { + display: block; + height: 2px; + border: 0; + margin: 3rem auto; + width: 40%; + padding: 0; + background-color: #9e4225; + clear: both; +} +.ck-content blockquote { + border-left: 8px solid #00afa4; + list-style-position: inside; + margin-left: 0; + padding-left: 1em; + padding-right: 2em; +} +.ck-content :not(pre) > code { + padding: 0.2em 0.4em; + border-radius: 0.3em; + white-space: normal; +} +.ck-content :not(pre) > code, +.ck-content pre { + background-color: #eee; +} +.ck-content pre { + padding: 1em; + margin: 0.5em 0; + overflow: auto; +} +.ck-content code, +.ck-content pre { + color: #555; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + tab-size: 4; + -webkit-hyphens: none; + hyphens: none; +} +.ck-content pre, +.ck-content code, +.ck-content kbd, +.ck-content samp { + font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; +} +.ck-content figure { + display: table; + margin: 2rem 0; +} +.ck-content figure img { + display: block; +} +.ck-content figcaption { + display: table-caption; + caption-side: bottom; + max-width: none; + padding: 1rem 2rem; + font-size: 0.88rem; + line-height: 1.2; +} +.ck-content figcaption p { + margin: 0; +} +.ck-content a + figcaption, +.ck-content img + figcaption { + color: #9e4225; +} +.ck-content blockquote + figcaption { + color: #555; +} +.ck-content [tabindex="-1"]:focus { + outline: none; +} +@media print { + .ck-content footer { + display: none; + } +} +.ck-content form { + margin: 0; + padding: 0; +} +.ck-content button { + width: auto; + overflow: visible; + -webkit-appearance: none; + -moz-appearance: none; +} +.ck-content label { + display: table; + margin: 0 0 0.25em; + padding: 0; + font-weight: bold; +} +.ck-content label[for] { + cursor: pointer; +} +.ck-content fieldset { + background-color: #f6fffe; + border: 2px solid #00afa4; + border-radius: 3px; + padding: 1em; + margin: 1em 0; + min-width: 100%; +} +.ck-content .fieldset-wrapper p { + margin-top: 0; + margin-bottom: 0; +} +.ck-content legend { + font-size: 2rem; + font-weight: 700; + padding: 0 0.25em; +} +.ck-content select { + max-width: 100%; +} +.ck-content button, +.ck-content input { + font-size: 1.1rem; + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + vertical-align: baseline; +} +.ck-content input { + width: auto; +} +.ck-content button { + width: auto; + overflow: visible; +} +.ck-content button, +.ck-content input, +.ck-content optgroup, +.ck-content select, +.ck-content textarea { + color: inherit; + font: inherit; + line-height: inherit; + margin: 0; +} +.ck-content input, +.ck-content select { + vertical-align: middle; +} +.ck-content input, +.ck-content textarea, +.ck-content select, +.ck-content input[type=text] { + -webkit-appearance: none; + appearance: none; + border: 2px solid #444; + border-radius: 0; + color: #444; + margin: 0; + max-width: 100%; + padding: 0.5rem 0.8rem; +} +.ck-content input:focus, +.ck-content textarea:focus, +.ck-content select:focus, +.ck-content input[type=text]:focus { + outline: 0.2rem solid rgba(82, 168, 236, 0.8); + transition: outline ease-in-out 0.2s; +} +.ck-content input[type=image] { + border: 0; +} +.ck-content button:hover, +.ck-content input[type=image]:hover, +.ck-content input[type=button]:hover, +.ck-content input[type=submit]:hover { + cursor: pointer; +} +.ck-content select { + background: #fff url("../img/arrow-both.svg") no-repeat right 1.3rem center; + background-size: 1rem; + padding-right: 3rem; +} +.ck-content select[multiple] { + background-image: none; +} +.ck-content input[type=checkbox], +.ck-content input[type=radio] { + padding: 0; + display: inline-block; +} +.ck-content [type=checkbox], +.ck-content [type=radio] { + height: 2rem; + width: 2rem; + position: relative; + border: 0; + vertical-align: middle; +} +.ck-content [type=checkbox]:focus, +.ck-content [type=radio]:focus { + outline: none; +} +.ck-content [type=checkbox] + label, +.ck-content [type=radio] + label { + font-weight: 400; + margin-left: 0.6rem; +} +.ck-content [type=checkbox]::before, +.ck-content [type=radio]::before { + background-color: #fff; + content: " "; + display: inline-block; + text-indent: 0.15em; + vertical-align: middle; + position: absolute; + top: 0; + left: 0; + cursor: pointer; +} +.ck-content [type=checkbox]::before { + border-radius: 0.2rem; + box-shadow: 0 0 0 0.2rem #444; + height: 2rem; + line-height: 2rem; + margin-left: 1px; + margin-right: 0.6em; + width: 2rem; +} +.ck-content [type=radio]::before { + border-radius: 100%; + box-shadow: 0 0 0 0.2rem #ffffff, 0 0 0 0.4rem #444; + height: 1.4rem; + line-height: 1.4rem; + margin-left: 3px; + margin-right: 0.75em; + width: 1.4rem; +} +.ck-content [type=checkbox]:checked::before, +.ck-content [type=radio]:checked::before { + background-color: #00afa4; + box-shadow: 0 0 0 0.2rem #00afa4; +} +.ck-content [type=radio]:checked::before { + box-shadow: 0 0 0 0.2rem #fff, 0 0 0 0.4rem #00afa4; +} +.ck-content [type=checkbox]:checked::before, +.ck-content [type=checkbox]:checked:disabled::before { + background-image: url("../img/correct8.svg"); + background-repeat: no-repeat; + background-position: 50%; +} +.ck-content [type=radio]:focus::before { + outline: 0.2rem solid rgba(82, 168, 236, 0.8); + outline-offset: 6px; +} +.ck-content [type=checkbox]:disabled + label { + color: #d6d7d9; +} +.ck-content [type=checkbox]:focus::before { + outline: 0.2rem solid rgba(82, 168, 236, 0.8); + outline-offset: 3px; +} +.ck-content [type=checkbox]:disabled::before, +.ck-content [type=radio]:disabled::before { + background: #f1f1f1; + box-shadow: 0 0 0 0.2rem #999; + cursor: not-allowed; +} +.ck-content img { + max-width: 100%; + height: auto; +} +.ck-content ul, +.ck-content ol { + margin-top: 0; + margin-bottom: 1.1rem; + margin-left: 0; + padding-left: 2.2rem; +} +.ck-content li { + line-height: 1.5; +} +.ck-content table, +.ck-content tbody, +.ck-content td, +.ck-content tfoot, +.ck-content th, +.ck-content thead, +.ck-content tr { + border: 0; + margin: 0; + padding: 0; +} +.ck-content table { + border-collapse: collapse; + margin-bottom: 24px; +} +.ck-content caption, +.ck-content th { + text-align: left; +} +.ck-content th, +.ck-content td { + padding: 1rem; + border: 0 solid #d7e0e7; +} +.ck-content th { + vertical-align: bottom; + border-bottom-width: 2px; +} +.ck-content td { + vertical-align: top; + border-bottom-width: 1px; +} +.ck-content th :first-child, +.ck-content td :first-child { + margin-top: 0; +} +.ck-content th :last-child, +.ck-content td :last-child { + margin-bottom: 0; +} +.ck-content .text-align-left { + text-align: left; +} +.ck-content .text-align-right { + text-align: right; +} +.ck-content .text-align-center { + text-align: center; +} +.ck-content .text-align-justify { + text-align: justify; +} +.ck-content .align-left { + float: left; +} +.ck-content .align-right { + float: right; +} +.ck-content .align-center { + margin-right: auto; + margin-left: auto; +} +.ck-content .image--left, +.ck-content .image--right, +.ck-content .image--center { + clear: both; + margin-top: 2rem; + margin-bottom: 2rem; +} +.ck-content .align-left, +.ck-content .image--left { + float: left; + margin-right: 2rem; +} +.ck-content .align-right, +.ck-content .image--right { + float: right; + margin-left: 2rem; +} +.ck-content .align-center, +.ck-content .image--center { + margin-right: auto; + margin-left: auto; +} +.ck-content .button, +.ck-content .image-button { + margin-left: 0; + margin-right: 0; +} +.ck-content .read-more__link, .ck-content .button { + display: inline-block; + padding: 0.7rem 1.7rem; + border: 0; + border-radius: 0.2rem; + background: none; + text-decoration: none; + transition: all 0.5s cubic-bezier(0.165, 0.84, 0.44, 1); + outline-offset: 2px; +} +.ck-content .button--hover.read-more__link, .ck-content .button--hover.button, .ck-content .button--focus.read-more__link, .ck-content .button--focus.button, .ck-content .read-more__link:hover, .ck-content .button:hover, .ck-content .read-more__link:focus, .ck-content .button:focus { + text-decoration: none; + outline: none; +} +.ck-content .button--focus.read-more__link, .ck-content .button--focus.button, .ck-content .read-more__link:focus, .ck-content .button:focus { + z-index: 10; + outline: 1px dotted #00afa4; +} +.ck-content .button--active.read-more__link, .ck-content .button--active.button, .ck-content .read-more__link:active, .ck-content .button:active { + transition: none; +} +.ck-content .field-add-more-submit.button { + font-size: 0.8em; +} +.ck-content .button.form-submit, +.ck-content .button--primary { + border-color: #00afa4; + background-color: #00afa4; + color: #fff; +} +.ck-content .button.form-submit.button--hover, .ck-content .button.form-submit:hover, +.ck-content .button--hover.button--primary, +.ck-content .button--primary:hover { + background-color: #007c74; + color: #fff; + box-shadow: 0 1px 2px hsla(203deg, 10%, 10%, 0.25); +} +.ck-content .button.form-submit.button--active, .ck-content .button.form-submit:active, +.ck-content .button--active.button--primary, +.ck-content .button--primary:active { + background-color: #005554; + box-shadow: inset 0 1px 3px hsla(0deg, 0%, 0%, 0.2); +} +.ck-content .button--secondary { + border-color: #005554; + background-color: #005554; + color: #fff; +} +.ck-content .button--focus.button--secondary, .ck-content .button--hover.button--secondary, .ck-content .button--secondary:hover, .ck-content .button--secondary:focus { + background-color: #005554; + border-color: #005554; + color: #fff; +} +.ck-content .button--hover.button--secondary, .ck-content .button--secondary:hover { + background-color: #007c74; + box-shadow: 0 1px 2px hsla(203deg, 10%, 10%, 0.25); +} +.ck-content .button--active.button--secondary, .ck-content .button--secondary:active { + background-color: #003c3b; + box-shadow: inset 0 1px 3px hsla(0deg, 0%, 0%, 0.2); +} +.ck-content .button-action::before { + margin-left: -0.2em; + padding-right: 0.2em; + font-size: 0.875rem; + line-height: 16px; +} +.ck-content [dir=rtl] .button-action::before { + margin-right: -0.2em; + margin-left: 0; + padding-right: 0; + padding-left: 0.2em; +} +.ck-content .link { + display: inline; + cursor: pointer; + padding: 0; + border: 0; + background: none; + text-decoration: none; + color: #00afa4; +} +.ck-content .link:hover, .ck-content .link:active { + text-decoration: underline; + color: #005554; +} +.ck-content .button--danger { + display: inline; + cursor: pointer; + padding: 0; + border: 0; + box-shadow: none; + background: none; + color: #c72100; + text-decoration: underline; +} +.ck-content .button--danger.button--focus, .ck-content .button--danger.button--hover, .ck-content .button--danger.button--active, .ck-content .button--danger:hover, .ck-content .button--danger:focus, .ck-content .button--danger:active { + color: #ff2a00; + text-decoration: underline; + text-shadow: none; + padding: 0; + border: 0; + box-shadow: none; + background: none; +} +.ck-content .button--danger:disabled, .ck-content .button--danger.is-disabled { + color: #737373; + cursor: default; + text-decoration: none; + padding: 0; + border: 0; + box-shadow: none; + background: none; +} +.ck-content .read-more__link, +.ck-content .button--outline { + color: #00afa4; + box-shadow: inset 0 0 0 2px #00afa4; +} +.ck-content .button--hover.read-more__link, .ck-content .read-more__link:hover, +.ck-content .button--outline.button--hover, +.ck-content .button--outline:hover { + box-shadow: inset 0 0 0 2px #007c74; + color: #007c74; +} +.ck-content .button--active.read-more__link, .ck-content .read-more__link:active, +.ck-content .button--outline.button--active, +.ck-content .button--outline:active { + background-color: rgba(255, 255, 255, 0.3); + color: #005554; + box-shadow: inset 0 0 0 2px #005554; +} +.ck-content .button--inverse { + color: #fff; + box-shadow: inset 0 0 0 2px #fff; +} +.ck-content .button--inverse.button--hover, .ck-content .button--inverse.button--active, .ck-content .button--inverse:hover, .ck-content .button--inverse:active { + background-color: rgba(255, 255, 255, 0.2); + color: #fff; +} +.ck-content .button--inverse.button--active, .ck-content .button--inverse:active { + background-color: rgba(255, 255, 255, 0.3); +} +.ck-content .button--large { + border-radius: 0.3rem; + font-size: 2rem; + padding: 1rem 2rem; +} +.ck-content .read-more__link, +.ck-content .button--small { + font-size: 1.5rem; + padding: 0.5rem 1.5rem; +} +.ck-content .button:disabled, +.ck-content .button:disabled:active, +.ck-content .button.is-disabled, +.ck-content .button.is-disabled:active { + background-color: #ededed; + box-shadow: none; + color: #5c5c5c; + cursor: default; + text-shadow: 0 1px hsla(0deg, 0%, 100%, 0.6); +} +.ck-content .read-more { + margin-top: 2rem; +} +.ck-content .caption { + display: table; +} +.ck-content .caption > * { + display: block; + max-width: 100%; +} +.ck-content .caption > figcaption { + display: table-caption; + max-width: none; + caption-side: bottom; +} +.ck-content .media + figcaption { + background: #9e4225; + color: #fff; +} +.ck-content .caption .media .field { + line-height: 1; +} +.ck-content .caption-pre > pre, +.ck-content .caption-blockquote > blockquote { + margin: 0; +} +.ck-content .caption-blockquote > figcaption::before { + content: "— "; +} +.ck-content .caption-blockquote > figcaption { + text-align: left; +} +.ck-content [dir=rtl] .caption-blockquote > figcaption { + text-align: right; +} +.ck-content details { + padding: 0.5rem 0; + border: 0; + margin-top: 1rem; + margin-bottom: 1rem; +} +.ck-content details > .node__content { + padding-left: 1rem; + padding-right: 1rem; +} +.ck-content .details--small { + margin-top: 0.5rem; + margin-bottom: 0.5rem; + border: 0; +} +.ck-content .details--small summary { + font-weight: bold; + font-size: 1.7rem; +} +.ck-content details > .details-wrapper { + padding-left: 1rem; + padding-right: 1rem; +} +.ck-content .details-wrapper { + margin-top: 1rem; + margin-bottom: 1rem; +} +.ck-content .details-wrapper > :last-child { + margin-bottom: 1rem; +} +.ck-content details > summary { + list-style: none; +} +.ck-content details > summary::-webkit-details-marker { + display: none; +} +.ck-content details summary { + font-size: 2rem; + background-repeat: no-repeat; + background-position: right 1rem top 50%; + background-size: 1.7rem 1.7rem; + color: #00afa4; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Cpath d='M53 29H35V11a3 3 0 00-6 0v18H11a3 3 0 000 6h18v18a3 3 0 006 0V35h18a3 3 0 000-6z' fill='%2300afa4'/%3E%3C/svg%3E"); + border-bottom: 1px solid #005554; + padding-right: 3rem; + padding-left: 1rem; +} +.ck-content details[open] summary { + border-bottom-width: 3px; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Cpath d='M53 34H11a3 3 0 010-6h42a3 3 0 010 6z' fill='%2300afa4'/%3E%3C/svg%3E"); +} +@media (max-width: 767.98px) { + .ck-content details summary { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } +} +.ck-content .node__header_image img { + width: 100%; + height: auto; +} +.ck-content .inline-block-left, +.ck-content .inline-block-right { + margin: 0 0 1rem 0; + padding: 2rem; + background-color: #005554; + color: #fff; +} +@media (min-width: 768px) { + .ck-content .inline-block-left, + .ck-content .inline-block-right { + max-width: 260px; + width: 100%; + } +} +.ck-content .inline-block-left h2, +.ck-content .inline-block-left h3, +.ck-content .inline-block-left h4, +.ck-content .inline-block-left a, +.ck-content .inline-block-right h2, +.ck-content .inline-block-right h3, +.ck-content .inline-block-right h4, +.ck-content .inline-block-right a { + color: #fff; +} +.ck-content .inline-block-left h2, +.ck-content .inline-block-left h3, +.ck-content .inline-block-left h4, +.ck-content .inline-block-right h2, +.ck-content .inline-block-right h3, +.ck-content .inline-block-right h4 { + margin-top: 0; +} +.ck-content .inline-block-left { + margin-right: 2rem; +} +@media (min-width: 768px) { + .ck-content .inline-block-left { + float: left; + clear: left; + } +} +.ck-content .inline-block-right { + margin-left: 2rem; +} +@media (min-width: 768px) { + .ck-content .inline-block-right { + float: right; + clear: right; + } +} +.ck-content .media--type-logo { + display: inline-block; + vertical-align: middle; + padding-left: 2rem; +} +.ck-content .media--type-logo div { + line-height: 0; +} +.ck-content .media--type-logo img { + object-fit: contain; +} +.ck-content .media--type-logo:first-of-type { + padding-left: 0; +} +.ck-content .node table { + width: 100%; + max-width: 100%; + border-collapse: collapse; + border-spacing: 0; + border: 1px solid #d7e0e7; + border-right-width: 0; + border-bottom-width: 0; +} +.ck-content .node td, +.ck-content .node th { + border: 0 solid #d7e0e7; + border-right-width: 1px; + border-bottom-width: 1px; + padding: 0.5rem 0.8rem; + text-align: left; +} +.ck-content .node thead th { + vertical-align: bottom; +} +.ck-content td.is-active { + background-color: transparent; +} +.ck-content .text-primary { + color: #9e4225; +} +.ck-content .text-secondary { + color: #005554; +} +.ck-content .text-large { + font-size: 2.2rem; +} +.ck-content .intro { + color: #cc6e20; + font-size: 2.2rem; +} +.ck-content .image:not([class*=image-style-align-]) { + margin: 2rem 0; +} diff --git a/public/themes/custom/ubccs/css/layout.css b/public/themes/custom/ubccs/css/layout.css new file mode 100644 index 0000000..5f373e2 --- /dev/null +++ b/public/themes/custom/ubccs/css/layout.css @@ -0,0 +1,56 @@ +.layout-wrapper { + padding-bottom: 2rem; +} +@media (min-width: 980px) { + .layout-wrapper { + display: flex; + } + .layout-wrapper .layout-sidebar-first, + .layout-wrapper .layout-sidebar-second { + flex-grow: 0; + flex-basis: 260px; + max-width: 260px; + } + .layout-wrapper .layout-sidebar-first { + margin-right: 3%; + } + .layout-wrapper .layout-sidebar-second { + margin-left: 3%; + } + .layout-wrapper .layout-sidebar-first { + order: 1; + } + .layout-wrapper .layout-content.has-sidebar { + order: 2; + } + .layout-wrapper .layout-sidebar-second { + order: 3; + } +} +.layout-wrapper .layout-content { + flex-basis: 0; + flex-grow: 1; +} +.layout-wrapper .layout-content-full-width { + max-width: 100%; +} +.layout-wrapper .layout-content-full-width .field--name-body { + max-width: 760px; + margin: 0 auto; +} + +.layout-content.has-sidebar::after { + display: block; + content: ""; + height: 2px; + border: 0; + margin: 3rem auto; + width: 40%; + padding: 0; + background-color: #9e4225; + clear: both; +} + +.full-width-container { + background-color: #fff; +} diff --git a/public/themes/custom/ubccs/css/local.clf.fixes.css b/public/themes/custom/ubccs/css/local.clf.fixes.css new file mode 100644 index 0000000..34d7b9f --- /dev/null +++ b/public/themes/custom/ubccs/css/local.clf.fixes.css @@ -0,0 +1,114 @@ +/** + * $file + * To fix inconsistencies with the locally-hosted CLF CSS + */ +footer { + background-color: inherit; +} + +#ubc7-unit-social-icons i { + color: #fff; + background-color: #9e4225; + cursor: pointer; + font-size: 24px; + line-height: 32px; + width: 32px; + height: 32px; + text-align: center; +} + +#ubc7-unit-menu { + width: 100%; + margin: 0; +} + +#ubc7-unit-social-icons span.ext { + display: none; +} + +#ubc7-global-footer, +#ubc7-global-menu, +#ubc7-minimal-footer, +#ubc7-unit, +input, +button { + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +#ubc7-search-box input { + font-size: inherit !important; +} + +.btn, +.btn:focus, +.btn:hover, +.btn:active { + box-shadow: none; + border: 0; + color: #00afa4; + background-color: transparent; + line-height: inherit; + font-size: inherit; +} + +input, +textarea, +.uneditable-input { + width: inherit; +} + +input[type=text] { + height: auto; + line-height: inherit; +} + +#ubc7-header { + box-sizing: content-box; +} + +/* Remove the inset shadows and text shadows from the unit area */ +#ubc7-unit { + box-shadow: none; + -webkit-box-shadow: none; +} + +#ubc7-unit-name a, +#ubc7-unit-name a:hover { + text-shadow: none; +} + +ul.primary.tabs, +ul.secondary.tabs { + width: 100%; + max-width: 1200px; + margin-left: auto; + margin-right: auto; +} + +#ubc7-unit-menu .container { + max-width: 1200px; + width: 100%; +} + +@media (min-width: 980px) and (max-width: 1499.98px) { + #ubc7-wordmark { + width: 100% !important; + border-right: #fff solid 100px; + } +} +#ubc7-global-utility button { + position: absolute; + right: 0; +} + +.ubc7-arrow.up-arrow.white { + background-position: -1207px -225px; +} + +#ubc7-global-footer { + font-size: 14px; +} + +.unit-footer-column { + margin-bottom: 2rem; +} diff --git a/public/themes/custom/ubccs/css/main.css b/public/themes/custom/ubccs/css/main.css new file mode 100644 index 0000000..915642a --- /dev/null +++ b/public/themes/custom/ubccs/css/main.css @@ -0,0 +1,3532 @@ +@charset "UTF-8"; +* { + box-sizing: border-box; +} + +body { + overflow-x: hidden; +} + +a:not([href]):not([class]), a:not([href]):not([class]):hover { + color: inherit; + text-decoration: none; +} + +html { + font-size: 10px; +} + +body { + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + color: #444; + font-size: 1.7rem; + line-height: 1.5; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + color: #005554; + text-rendering: auto; + font-weight: 400; + line-height: 1.2; +} + +h1 { + margin-top: 0; + margin-bottom: 0; +} + +h2 { + margin-top: 3.4rem; + margin-bottom: 1.7rem; +} + +h3, +h4, +h5, +h6 { + margin-top: 2.55rem; + margin-bottom: 1.7rem; +} + +h1 { + font-size: 3.995rem; +} + +h2 { + font-size: 2.992rem; +} + +h3 { + font-size: 2.499rem; +} + +h4 { + font-size: 1.989rem; +} + +h3, +h4 { + font-weight: 700; +} + +p { + line-height: 1.5; + margin-top: 1.7rem; + margin-bottom: 1.7rem; +} + +a { + color: #00afa4; + -webkit-text-decoration-skip: ink; + text-decoration-skip-ink: auto; + transition: color 0.5s ease-in; +} + +a:hover, +a:active { + color: #005554; +} + +hr { + display: block; + height: 2px; + border: 0; + margin: 3rem auto; + width: 40%; + padding: 0; + background-color: #9e4225; + clear: both; +} + +blockquote { + border-left: 8px solid #00afa4; + list-style-position: inside; + margin-left: 0; + padding-left: 1em; + padding-right: 2em; +} + +:not(pre) > code { + padding: 0.2em 0.4em; + border-radius: 0.3em; + white-space: normal; +} + +:not(pre) > code, +pre { + background-color: #eee; +} + +pre { + padding: 1em; + margin: 0.5em 0; + overflow: auto; +} + +code, +pre { + color: #555; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + tab-size: 4; + -webkit-hyphens: none; + hyphens: none; +} + +pre, +code, +kbd, +samp { + font-family: Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace; +} + +figure { + display: table; + margin: 2rem 0; +} +figure img { + display: block; +} + +figcaption { + display: table-caption; + caption-side: bottom; + max-width: none; + padding: 1rem 2rem; + font-size: 1.36rem; + line-height: 1.2; +} + +figcaption p { + margin: 0; +} + +a + figcaption, +img + figcaption { + color: #9e4225; +} + +blockquote + figcaption { + color: #555; +} + +[tabindex="-1"]:focus { + outline: none; +} + +@media print { + footer { + display: none; + } +} +form { + margin: 0; + padding: 0; +} + +button { + width: auto; + overflow: visible; + -webkit-appearance: none; + -moz-appearance: none; +} + +label { + display: table; + margin: 0 0 0.25em; + padding: 0; + font-weight: bold; +} + +label[for] { + cursor: pointer; +} + +fieldset { + background-color: #f6fffe; + border: 2px solid #00afa4; + border-radius: 3px; + padding: 1em; + margin: 1em 0; + min-width: 100%; +} + +.fieldset-wrapper p { + margin-top: 0; + margin-bottom: 0; +} + +legend { + font-size: 2rem; + font-weight: 700; + padding: 0 0.25em; +} + +/** + * Limits extra long instances of select elements to the max width allowed + * to avoid breaking layouts. + */ +select { + max-width: 100%; +} + +button, +input { + font-size: 1.7rem; + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + vertical-align: baseline; +} + +input { + width: auto; +} + +button { + width: auto; + overflow: visible; +} + +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + line-height: inherit; + margin: 0; +} + +input, +select { + vertical-align: middle; +} + +input, +textarea, +select, +input[type=text] { + -webkit-appearance: none; + appearance: none; + border: 2px solid #444; + border-radius: 0; + color: #444; + margin: 0; + max-width: 100%; + padding: 0.5rem 0.8rem; +} +input:focus, +textarea:focus, +select:focus, +input[type=text]:focus { + outline: 0.2rem solid rgba(82, 168, 236, 0.8); + transition: outline ease-in-out 0.2s; +} + +input[type=image] { + border: 0; +} + +button:hover, +input[type=image]:hover, +input[type=button]:hover, +input[type=submit]:hover { + cursor: pointer; +} + +select { + background: #fff url("../img/arrow-both.svg") no-repeat right 1.3rem center; + background-size: 1rem; + padding-right: 3rem; +} + +select[multiple] { + background-image: none; +} + +input[type=checkbox], +input[type=radio] { + padding: 0; + display: inline-block; +} + +[type=checkbox], +[type=radio] { + height: 2rem; + width: 2rem; + position: relative; + border: 0; + vertical-align: middle; +} +[type=checkbox]:focus, +[type=radio]:focus { + outline: none; +} + +[type=checkbox] + label, +[type=radio] + label { + font-weight: 400; + margin-left: 0.6rem; +} + +[type=checkbox]::before, +[type=radio]::before { + background-color: #fff; + content: " "; + display: inline-block; + text-indent: 0.15em; + vertical-align: middle; + position: absolute; + top: 0; + left: 0; + cursor: pointer; +} + +[type=checkbox]::before { + border-radius: 0.2rem; + box-shadow: 0 0 0 0.2rem #444; + height: 2rem; + line-height: 2rem; + margin-left: 1px; + margin-right: 0.6em; + width: 2rem; +} + +[type=radio]::before { + border-radius: 100%; + box-shadow: 0 0 0 0.2rem #ffffff, 0 0 0 0.4rem #444; + height: 1.4rem; + line-height: 1.4rem; + margin-left: 3px; + margin-right: 0.75em; + width: 1.4rem; +} + +[type=checkbox]:checked::before, +[type=radio]:checked::before { + background-color: #00afa4; + box-shadow: 0 0 0 0.2rem #00afa4; +} + +[type=radio]:checked::before { + box-shadow: 0 0 0 0.2rem #fff, 0 0 0 0.4rem #00afa4; +} + +[type=checkbox]:checked::before, +[type=checkbox]:checked:disabled::before { + background-image: url("../img/correct8.svg"); + background-repeat: no-repeat; + background-position: 50%; +} + +[type=radio]:focus::before { + outline: 0.2rem solid rgba(82, 168, 236, 0.8); + outline-offset: 6px; +} + +[type=checkbox]:disabled + label { + color: #d6d7d9; +} + +[type=checkbox]:focus::before { + outline: 0.2rem solid rgba(82, 168, 236, 0.8); + outline-offset: 3px; +} + +[type=checkbox]:disabled::before, +[type=radio]:disabled::before { + background: #f1f1f1; + box-shadow: 0 0 0 0.2rem #999; + cursor: not-allowed; +} + +img { + max-width: 100%; + height: auto; +} + +ul, +ol { + margin-top: 0; + margin-bottom: 1.7rem; + margin-left: 0; + padding-left: 3.4rem; +} + +li { + line-height: 1.5; +} + +table, +tbody, +td, +tfoot, +th, +thead, +tr { + border: 0; + margin: 0; + padding: 0; +} + +table { + border-collapse: collapse; + margin-bottom: 24px; +} + +caption, +th { + text-align: left; +} + +th, +td { + padding: 1rem; + border: 0 solid #d7e0e7; +} + +th { + vertical-align: bottom; + border-bottom-width: 2px; +} + +td { + vertical-align: top; + border-bottom-width: 1px; +} + +th :first-child, +td :first-child { + margin-top: 0; +} + +th :last-child, +td :last-child { + margin-bottom: 0; +} + +.node--type-landing .page-title::after { + display: none; +} + +.node--type-landing .views-element-container, +.node--type-landing .block { + max-width: 80ch; + margin: 0 auto; +} + +.node--type-landing .node__content + .block::before { + width: 50%; + max-width: 220px; + height: 3px; + background-color: #9e4225; + margin: 0 auto; + content: ""; + display: inline-block; +} + +.landing-banner { + position: relative; + margin-top: 0; +} +.landing-banner img { + width: 100%; + height: 100%; + display: block; +} + +@media (min-width: 980px) { + .landing-banner__image { + background-color: #4b1f12; + } + .field--name-field-landing-banner-image { + outline: 1rem #fff solid; + margin-top: 1rem; + margin-bottom: 1rem; + } +} +.landing-banner__title { + width: 100%; +} +@media (min-width: 576px) { + .landing-banner__title { + position: absolute; + left: 0; + bottom: 0; + background: rgba(34, 14, 8, 0.6); + padding: 2rem; + } +} +@media (min-width: 768px) { + .landing-banner__title { + width: 75%; + bottom: 3rem; + } +} +@media (min-width: 980px) { + .landing-banner__title { + width: 50%; + } +} +@media (max-width: 575.98px) { + .landing-banner__title h1 { + text-align: center; + } +} +@media (min-width: 576px) { + .landing-banner__title h1 { + font-weight: bold; + color: #fff; + margin: 0; + } +} + +.landing-intro { + max-width: 90rem; + width: 90%; + margin: 2rem auto; + text-align: center; +} +.landing-intro p { + font-style: italic; + font-size: 1.8rem; +} +@media (min-width: 576px) { + .landing-intro p { + font-size: 2.2rem; + } +} + +.landing-cards + .field::before { + width: 50%; + max-width: 220px; + height: 3px; + background-color: #9e4225; + margin: 3rem auto 0; + content: ""; + display: block; +} + +#admin-toolbar-search-input { + padding: 0.5rem 0.8rem; +} + +.alert p { + margin-top: 0; + margin-bottom: 0; +} + +.alert { + max-width: 1200px; + margin-left: auto; + margin-right: auto; +} + +/** + * @file + * Alignment classes for text and block level elements. + */ +.text-align-left { + text-align: left; +} + +.text-align-right { + text-align: right; +} + +.text-align-center { + text-align: center; +} + +.text-align-justify { + text-align: justify; +} + +/** + * Alignment classes for block level elements (images, videos, blockquotes, etc.) + */ +.align-left { + float: left; +} + +.align-right { + float: right; +} + +.align-center { + margin-right: auto; + margin-left: auto; +} + +.image--left, +.image--right, +.image--center { + clear: both; + margin-top: 2rem; + margin-bottom: 2rem; +} + +.align-left, +.image--left { + float: left; + margin-right: 2rem; +} + +.align-right, +.image--right { + float: right; + margin-left: 2rem; +} + +.align-center, +.image--center { + margin-right: auto; + margin-left: auto; +} + +.views-table .views-field-field-award-date { + width: 35px; +} + +.views-table .views-field-field-award-recipient, +.views-table .views-field-field-award-organization { + width: 25%; +} + +.view-awards .views-table { + width: 100%; +} + +.big-quote { + font-family: Merriweather, Georgia, serif; + font-size: 2.5rem; + font-style: italic; + text-align: center; + padding: 3rem 4rem; + position: relative; + z-index: 0; +} +.big-quote:before { + position: absolute; + top: 0; + left: 0; + z-index: -1; + vertical-align: baseline; + content: "“"; + font-size: 20rem; + line-height: 1; + color: #eee; +} + +.breadcrumb { + padding: 0.5rem; + line-height: 1.5rem; + color: #999; + text-transform: uppercase; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.breadcrumb li { + line-height: 1.5rem; +} + +.breadcrumb li::before { + content: "/"; + display: inline-block; + margin: 0 0.5em 0; + color: #999; +} + +.breadcrumb li:first-child:before { + content: none; +} + +.breadcrumb a { + color: #00afa4; +} + +.breadcrumb .active { + color: #999; +} + +.button, +.image-button { + margin-left: 0; + margin-right: 0; +} + +.read-more__link, .button { + display: inline-block; + padding: 0.7rem 1.7rem; + border: 0; + border-radius: 0.2rem; + background: none; + text-decoration: none; + transition: all 0.5s cubic-bezier(0.165, 0.84, 0.44, 1); + outline-offset: 2px; +} +.button--hover.read-more__link, .button--hover.button, .button--focus.read-more__link, .button--focus.button, .read-more__link:hover, .button:hover, .read-more__link:focus, .button:focus { + text-decoration: none; + outline: none; +} +.button--focus.read-more__link, .button--focus.button, .read-more__link:focus, .button:focus { + z-index: 10; + outline: 1px dotted #00afa4; +} +.button--active.read-more__link, .button--active.button, .read-more__link:active, .button:active { + transition: none; +} + +.field-add-more-submit.button { + font-size: 0.8em; +} + +.button.form-submit, +.button--primary { + border-color: #00afa4; + background-color: #00afa4; + color: #fff; +} +.button.form-submit.button--hover, .button.form-submit:hover, +.button--hover.button--primary, +.button--primary:hover { + background-color: #007c74; + color: #fff; + box-shadow: 0 1px 2px hsla(203deg, 10%, 10%, 0.25); +} +.button.form-submit.button--active, .button.form-submit:active, +.button--active.button--primary, +.button--primary:active { + background-color: #005554; + box-shadow: inset 0 1px 3px hsla(0deg, 0%, 0%, 0.2); +} + +.button--secondary { + border-color: #005554; + background-color: #005554; + color: #fff; +} +.button--focus.button--secondary, .button--hover.button--secondary, .button--secondary:hover, .button--secondary:focus { + background-color: #005554; + border-color: #005554; + color: #fff; +} +.button--hover.button--secondary, .button--secondary:hover { + background-color: #007c74; + box-shadow: 0 1px 2px hsla(203deg, 10%, 10%, 0.25); +} +.button--active.button--secondary, .button--secondary:active { + background-color: #003c3b; + box-shadow: inset 0 1px 3px hsla(0deg, 0%, 0%, 0.2); +} + +/** + * Overrides styling from system.theme. + */ +.button-action::before { + margin-left: -0.2em; + padding-right: 0.2em; + font-size: 0.875rem; + line-height: 16px; +} + +[dir=rtl] .button-action::before { + margin-right: -0.2em; + margin-left: 0; + padding-right: 0; + padding-left: 0.2em; +} + +/* Link actions. */ +/** + * Style a clickable/tappable element as a link. Duplicates the base style for + * the tag, plus a reset for padding, borders and background. + */ +.link { + display: inline; + cursor: pointer; + padding: 0; + border: 0; + background: none; + text-decoration: none; + color: #00afa4; +} +.link:hover, .link:active { + text-decoration: underline; + color: #005554; +} + +/** + * We've temporarily added the danger button here, bit of a harsh reset but we + * need it. + * @todo replace with link--danger. + * See https://www.drupal.org/node/2123731 + */ +.button--danger { + display: inline; + cursor: pointer; + padding: 0; + border: 0; + box-shadow: none; + background: none; + color: #c72100; + text-decoration: underline; +} +.button--danger.button--focus, .button--danger.button--hover, .button--danger.button--active, .button--danger:hover, .button--danger:focus, .button--danger:active { + color: #ff2a00; + text-decoration: underline; + text-shadow: none; + padding: 0; + border: 0; + box-shadow: none; + background: none; +} +.button--danger:disabled, .button--danger.is-disabled { + color: #737373; + cursor: default; + text-decoration: none; + padding: 0; + border: 0; + box-shadow: none; + background: none; +} + +.read-more__link, +.button--outline { + color: #00afa4; + box-shadow: inset 0 0 0 2px #00afa4; +} +.button--hover.read-more__link, .read-more__link:hover, +.button--outline.button--hover, +.button--outline:hover { + box-shadow: inset 0 0 0 2px #007c74; + color: #007c74; +} +.button--active.read-more__link, .read-more__link:active, +.button--outline.button--active, +.button--outline:active { + background-color: rgba(255, 255, 255, 0.3); + color: #005554; + box-shadow: inset 0 0 0 2px #005554; +} + +.button--inverse { + color: #fff; + box-shadow: inset 0 0 0 2px #fff; +} +.button--inverse.button--hover, .button--inverse.button--active, .button--inverse:hover, .button--inverse:active { + background-color: rgba(255, 255, 255, 0.2); + color: #fff; +} +.button--inverse.button--active, .button--inverse:active { + background-color: rgba(255, 255, 255, 0.3); +} + +.button--large { + border-radius: 0.3rem; + font-size: 2rem; + padding: 1rem 2rem; +} + +.read-more__link, +.button--small { + font-size: 1.5rem; + padding: 0.5rem 1.5rem; +} + +.button:disabled, +.button:disabled:active, +.button.is-disabled, +.button.is-disabled:active { + background-color: #ededed; + box-shadow: none; + color: #5c5c5c; + cursor: default; + text-shadow: 0 1px hsla(0deg, 0%, 100%, 0.6); +} + +.read-more { + margin-top: 2rem; +} + +.view-event-calendar .view-content { + clear: both; +} + +.view-event-calendar .pager ul.js-pager__items { + padding-left: 0; +} + +.view-event-calendar .pager ul.js-pager__items li.pager__item--previous { + float: left; +} + +.view-event-calendar .pager ul.js-pager__items li.pager__item--next { + float: right; +} + +.view-event-calendar .calendar-granularity a { + padding: 0 10px; +} + +.caption { + display: table; +} + +.caption > * { + display: block; + max-width: 100%; +} + +.caption > figcaption { + display: table-caption; + max-width: none; + caption-side: bottom; +} + +.media + figcaption { + background: #9e4225; + color: #fff; +} + +.caption .media .field { + line-height: 1; +} + +/* Override clf's default blockquote and pre styles when captioned. */ +.caption-pre > pre, +.caption-blockquote > blockquote { + margin: 0; +} + +.caption-blockquote > figcaption::before { + content: "— "; +} + +.caption-blockquote > figcaption { + text-align: left; +} + +[dir=rtl] .caption-blockquote > figcaption { + text-align: right; +} + +.cards { + display: flex; + flex-wrap: wrap; + justify-content: center; + width: 100%; +} + +.card-wrapper { + display: flex; + justify-content: center; + padding: 0; + width: 100%; + margin-bottom: 2rem; +} +@media (min-width: 576px) { + .card-wrapper { + width: 50%; + } +} +@media (min-width: 768px) { + .card-wrapper { + width: 33.33%; + } +} + +.card { + text-decoration: none; + color: inherit; + padding: 2rem; + max-width: 320px; + width: 100%; + border: 1px solid #999; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + display: flex; + flex-direction: column; +} +.card:hover, .card:focus, .card:active { + background-color: #efefef; + text-decoration: none; + color: inherit; + box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22); + transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); +} +.card .button { + border: 2px solid transparent; +} +.card:focus .button, .card:active .button, .card:hover .button { + background-color: #fff; + border: 2px solid #00afa4; + color: #00afa4; +} +.card img { + max-width: 100%; + height: auto; +} +.card span { + display: block; +} +.card .card-title, +.card .card-text { + margin-top: 1rem; + margin-bottom: 1rem; +} +.card .card-title { + color: #00afa4; + font-size: 2rem; + font-weight: 700; + line-height: 1.3; + text-decoration: underline; + -webkit-text-decoration-skip: ink; + text-decoration-skip-ink: auto; + transition: color 0.5s ease-in; +} +.card :hover .card-title, +.card :active .card-title { + color: #005554; +} +.card .card-text { + line-height: 1.3; +} +.card .card-body { + flex: 1 0 auto; +} +.card .card-footer { + flex: 0 1 auto; + background: transparent; + border: 0 none; + margin-top: 1rem; +} + +.card-body * { + margin-bottom: 0; +} + +.cart td { + vertical-align: middle; +} + +.cart-form td .form-item, +.cart-form td .form-actions { + margin: 0; +} + +.course-section-info { + border: 1px solid #cecece; + margin: 20px auto; +} + +.course-section-info-header { + padding: 0 20px; +} + +.course-section-info table { + width: 100%; + margin-bottom: 0; +} + +.course-section-table-header { + background: #005554; + color: #fff; + text-transform: uppercase; +} + +.course-section-table-header > tr > th { + font-weight: inherit; +} + +.course-section-table-body > tr { + cursor: pointer; + white-space: nowrap; +} + +.course-section-table-body > tr.open, .course-section-table-body > tr:hover { + background: #efefef; +} + +.course-section-table-body > tr.child { + cursor: auto; + white-space: inherit; +} + +.course-section-table-body > tr.child:hover { + background: none; +} + +.course-section-info-details { + text-align: center; +} + +.open .course-section-info-toggle { + background-color: #dfe3eb; +} + +.course-ssc-link-wrapper, .course-section-ssc-link { + float: right; +} + +/* Responsive */ +@media (max-width: 979.98px) { + .course-section-info .views-field-field-course-days, + .course-section-info .views-field-field-course-end-time { + display: none; + } +} +@media (max-width: 767.98px) { + .course-section-info .views-field-field-course-term, + .course-section-info .views-field-field-course-room, + .course-section-info .views-field-field-course-instructors { + display: none; + } +} +details { + padding: 0.5rem 0; + border: 0; + margin-top: 1rem; + margin-bottom: 1rem; +} + +details > .node__content { + padding-left: 1rem; + padding-right: 1rem; +} + +.details--small { + margin-top: 0.5rem; + margin-bottom: 0.5rem; + border: 0; +} +.details--small summary { + font-weight: bold; + font-size: 1.7rem; +} + +details > .details-wrapper { + padding-left: 1rem; + padding-right: 1rem; +} + +.details-wrapper { + margin-top: 1rem; + margin-bottom: 1rem; +} + +.details-wrapper > :last-child { + margin-bottom: 1rem; +} + +details > summary { + list-style: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details summary { + font-size: 2rem; + background-repeat: no-repeat; + background-position: right 1rem top 50%; + background-size: 1.7rem 1.7rem; + color: #00afa4; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Cpath d='M53 29H35V11a3 3 0 00-6 0v18H11a3 3 0 000 6h18v18a3 3 0 006 0V35h18a3 3 0 000-6z' fill='%2300afa4'/%3E%3C/svg%3E"); + border-bottom: 1px solid #005554; + padding-right: 3rem; + padding-left: 1rem; +} + +details[open] summary { + border-bottom-width: 3px; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Cpath d='M53 34H11a3 3 0 010-6h42a3 3 0 010 6z' fill='%2300afa4'/%3E%3C/svg%3E"); +} + +@media (max-width: 767.98px) { + details summary { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } +} +.expand-collapse { + text-align: right; +} + +.view-faqs .view-grouping-content h2 { + font-size: 2.5rem; + font-weight: 700; +} + +.field--label-inline .field__label, +.field--label-inline .field__items { + float: none; + display: inline-block; +} + +.field--label-inline { + display: flex; + flex-wrap: wrap; +} + +.field--label-inline .field__item { + vertical-align: top; +} + +.field--label-inline .field__label, +.field--label-inline > .field__item { + padding-right: 0.5rem; +} + +.field + .field { + margin-top: 1rem; +} + +.field--label-inline .field + .field { + margin-top: 0; +} + +.field__label h2 { + margin-top: 1.7rem; +} + +.field--name-field-tags .field__items { + display: flex; +} +.field--name-field-tags .field__items .field__item { + margin: 0 5px; +} + +/** + * Form elements. + */ +.fieldgroup { + min-width: 0; + background-color: transparent; +} + +.form-item, +.form-actions { + margin: 0.75em 0; +} + +.form-type-checkbox { + padding: 0; +} + +label.error { + color: #a51b00; +} + +.form-item label.option { + text-transform: none; +} + +.form-item label.option input { + vertical-align: middle; +} + +.form-disabled label { + color: #737373; +} + +.form-disabled input.form-text, +.form-disabled input.form-tel, +.form-disabled input.form-email, +.form-disabled input.form-url, +.form-disabled input.form-search, +.form-disabled input.form-number, +.form-disabled input.form-color, +.form-disabled input.form-file, +.form-disabled textarea.form-textarea, +.form-disabled select.form-select { + border-color: #d4d4d4; + background-color: hsla(0deg, 0%, 0%, 0.08); + box-shadow: none; +} + +.form-item input.error, +.form-item textarea.error, +.form-item select.error { + border-width: 1px; + border-color: #e62600; + background-color: hsl(15deg, 75%, 97%); + box-shadow: inset 0 5px 5px -5px #b8b8b8; + color: #a51b00; +} + +.form-item textarea.error + .cke { + border-width: 1px; + border-color: #e62600; +} + +.form-item input.error:focus, +.form-item textarea.error:focus, +.form-item select.error:focus { + border-color: #e62600; + outline: 0; + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 0 8px 1px #e62600; + background-color: #fcf4f2; +} + +.form-required:after { + background-size: 7px 7px; + width: 7px; + height: 7px; +} + +.form-item--error-message { + margin-top: 0.15em; + color: #e32700; +} + +.fieldset-wrapper > .form-item--error-message { + margin-top: 0; +} + +.text-format-wrapper .form-item--error-message { + border: solid #ccc; + border-width: 0 1px; + margin: 0; + padding: 0.25em 0.666em 0; +} + +/* Filter */ +ul.tips, +div.description, +.form-item .description { + margin: 0.3rem 0 0 0; + color: #595959; + font-size: 0.95em; +} + +.form-item .description.error { + margin-top: 0; + color: #a51b00; +} + +ul.tips li { + margin: 0.25em 0 0.25em 1.5em; /* LTR */ +} + +[dir=rtl] ul.tips li { + margin: 0.25em 1.5em 0.25em 0; +} + +.form-type-radio .description, +.form-type-checkbox .description { + margin-left: 1.5em; /* LTR */ +} + +[dir=rtl] .form-type-radio .description, +[dir=rtl] .form-type-checkbox .description { + margin-left: 0; + margin-right: 1.5em; +} + +.form-text, +.form-textarea, +input[type=text] { + font-size: 1em; + line-height: normal; +} + +input.form-autocomplete, +input.form-text, +input.form-tel, +input.form-email, +input.form-url, +input.form-search, +input.form-number, +input.form-color, +input.form-file, +input.form-date, +input.form-time, +textarea.form-textarea { + height: auto; + line-height: inherit; + border-radius: 2px; + border-color: #b8b8b8; + border-top-color: #999; + background: #fcfcfa; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.125); + font-size: 1em; + color: #595959; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +select.form-select { + border-color: #b8b8b8; + border-top-color: #999; +} + +.form-text:focus, +.form-tel:focus, +.form-email:focus, +.form-url:focus, +.form-search:focus, +.form-number:focus, +.form-color:focus, +.form-file:focus, +.form-textarea:focus, +.form-date:focus, +.form-time:focus, +input[type=text]:focus { + border-color: #00afa4; + outline: 0; + background-color: #fff; +} + +input[type=text]:focus { + box-shadow: none; +} + +.confirm-parent, +.password-parent { + overflow: visible; + width: auto; +} + +.form-item-options-group-info-identifier, +.form-item-pass .description { + clear: both; +} + +/** + * Improve spacing of cancel link. + */ +#edit-cancel { + margin-left: 10px; /* LTR */ +} + +[dir=rtl] #edit-cancel { + margin-left: 0; + margin-right: 10px; +} + +/** + * Improve form element usability on narrow devices. + */ +@media (max-width: 767.98px) { + input.form-autocomplete, + input.form-text, + input.form-tel, + input.form-email, + input.form-url, + input.form-search, + input.form-number, + input.form-color, + input.form-file, + textarea.form-textarea { + width: 100%; + font-size: 1.2em; + line-height: 1.2em; + } + input.form-number { + width: auto; + } + .form-actions input, + .form-wrapper input[type=submit] { + float: none; + margin-left: 0; + margin-right: 0; + margin-top: 10px; + padding-bottom: 6px; + width: 100%; + } + .form-actions input:first-child, + .form-wrapper input[type=submit]:first-child { + margin-top: 0; + } + .password-strength { + width: 100%; + } + div.form-item div.password-suggestions { + float: none; + } + #edit-cancel { + display: block; + margin: 10px 0 0 0; + } + select { + width: 100%; + } +} +/* Exceptions */ +#diff-inline-form select, +div.filter-options select { + padding: 0; +} + +.node .fc-head-container { + padding: 0; + border: 0; +} + +.node .fc-widget-content { + padding: 0; +} + +.fc-widget-header table { + margin: 0; +} + +.container-home .media { + margin-top: 2rem; + margin-bottom: 2rem; +} + +.view-home-page-banners { + max-width: 100%; +} + +.home__icons { + background-color: #eee; +} + +.home__cards { + margin-top: 0px; + display: flex; + flex-wrap: wrap; + justify-content: center; + width: 100%; +} + +.home__card-wrapper { + display: flex; + justify-content: center; + padding: 0; +} + +.home__card { + text-decoration: none; + color: inherit; + padding: 2rem; + width: 100%; + display: flex; + flex-direction: column; +} + +.home__card-header { + font-size: 4rem; + color: #9e4225; +} + +.home__card-title { + font-size: 2.2rem; + font-weight: 700; + line-height: 1.3; + color: #005554; + margin-top: 1rem; + margin-bottom: 1rem; + display: block; +} + +.home__card-text { + font-size: 1.4rem; +} + +.home__card-text p { + margin: 0; +} + +.home__card-text p + p { + margin-top: 1.7rem; +} + +.home__card-text .button { + margin: 0.2rem; +} + +.home__widgets { + display: flex; + flex-wrap: wrap; +} +.home__widgets .home__widgets-block h2 { + line-height: 1; +} +.home__widgets .home__widgets-block h2::after { + width: 100%; + height: 3px; + background-color: #9e4225; + margin: 0 auto; + content: ""; + display: inline-block; +} +.home__widgets .home__widgets-block .views-element-container { + flex-grow: 1; +} +.home__widgets .home__widgets-block .views-element-container .views-row:last-child .views-field-nothing { + display: none; +} +.home__widgets .views-row { + margin-bottom: 1rem; +} + +.tweets { + max-height: 650px; + overflow-y: scroll; +} + +.tweet-header { + display: flex; + align-items: flex-start; +} + +.tweet-header-info p { + font-weight: normal; + margin-top: 5px; +} + +.twitter-avator { + border-radius: 100px; + width: 48px; + margin-right: 15px; + vertical-align: middle; +} + +.tweet__wrap { + margin: auto 0; + padding: 10px 20px; + border-bottom: 2px solid #e6e6e6; + cursor: pointer; + max-width: 100%; +} +.tweet__wrap:hover, .tweet__wrap:focus, .tweet__wrap:active { + background-color: #efefef; + text-decoration: none; + color: inherit; +} + +.tweet__img-wrap { + padding-left: 60px; +} + +.tweet__footer { + display: flex; +} + +.tweet__footer svg { + color: #657786; + margin-right: 10px; +} + +.tweet__footer svg:hover { + color: #ff1493; +} + +.tweet__retweet { + display: flex; + margin-bottom: 10px; + font-size: 1.4rem; +} + +.tweet__retweet svg { + margin-right: 10px; +} + +.tweet__user { + display: flex; +} + +.tweet__text { + margin: 10px auto; +} + +.tweet__date { + color: #999; +} + +.view-twitter { + margin-top: 10px; +} + +@media screen and (max-width: 430px) { + .tweet-header { + flex-direction: column; + } + .tweet-header img { + margin-bottom: 20px; + } + .tweet-header-info p { + margin-bottom: 30px; + } + .tweet__img-wrap { + padding-left: 0; + } +} +.home-banner { + position: relative; + margin-top: 0; +} +.home-banner img { + width: 100%; + height: 100%; + display: block; +} + +@media (min-width: 980px) { + .field--name-field-home-banner-image { + outline: 1rem #fff solid; + margin-top: 1rem; + margin-bottom: 1rem; + } +} +.home-banner a { + text-decoration: none; +} + +.home-banner__title { + width: 100%; + background: #220e08; + padding: 1.5rem 2rem; +} +@media (min-width: 576px) { + .home-banner__title { + position: absolute; + left: 0; + bottom: 0; + background: rgba(34, 14, 8, 0.9); + } +} +@media (min-width: 768px) { + .home-banner__title { + width: 75%; + bottom: 3rem; + } +} +.home-banner__title .field { + color: #fff; +} +@media (max-width: 575.98px) { + .home-banner__title .field { + text-align: center; + } +} +@media (min-width: 768px) { + .home-banner__title .field { + font-size: 2.5rem; + font-weight: normal; + line-height: 1.2; + } +} +@media (min-width: 980px) { + .home-banner__title .field { + font-size: 3rem; + } +} + +.node__header_image img { + width: 100%; + height: auto; +} + +.block-sponsor-logos { + margin-bottom: 1rem; + margin-top: 1rem; +} +.block-sponsor-logos--gold, .block-sponsor-logos--silver, .block-sponsor-logos--bronze { + padding: 2rem 0; +} +.block-sponsor-logos .field__item { + padding: 1rem; +} +.block-sponsor-logos img { + object-fit: contain; +} +.block-sponsor-logos--gold, .block-sponsor-logos--silver, .block-sponsor-logos--none { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; +} +.block-sponsor-logos--gold img, .block-sponsor-logos--silver img, .block-sponsor-logos--none img { + width: 150px; + max-height: 80px; +} +.block-sponsor-logos--gold { + border: 3px solid gold; +} +.block-sponsor-logos--silver { + border: 3px solid silver; +} +.block-sponsor-logos--silver img { + width: 120px; +} +.block-sponsor-logos--bronze { + border: 3px solid #bea278; + column-gap: 20px; + column-count: auto; + column-width: 150px; +} +.block-sponsor-logos--bronze h3:first-child, +.block-sponsor-logos--bronze h4:first-child { + margin-top: 0; +} +.block-sponsor-logos--bronze p { + display: inline-block; + margin: 1rem 0; +} + +.block-sponsor-logos > div.field--name-field-logos { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + align-items: center; +} + +#block-60853 { + display: flex; + justify-content: center; +} + +.tag { + color: white; + font-size: 0.75em; + background-clip: padding-box; + border: 2px solid #fff; + border-radius: 0.5em; + margin-left: 0.5em; + text-transform: uppercase; + padding: 0 0.25em; +} + +.tag--undergrad { + background-color: crimson; + border-color: rgba(220, 20, 60, 0.5); +} + +.tag--grad { + background-color: lightskyblue; + border-color: rgba(135, 206, 250, 0.5); +} + +.tag--alumni { + background-color: green; + border-color: rgba(0, 128, 0, 0.5); +} + +.tag--research { + background-color: orange; + border-color: rgba(255, 165, 0, 0.5); +} + +.inline-block-left, +.inline-block-right { + margin: 0 0 1rem 0; + padding: 2rem; + background-color: #005554; + color: #fff; +} +@media (min-width: 768px) { + .inline-block-left, + .inline-block-right { + max-width: 260px; + width: 100%; + } +} +.inline-block-left h2, +.inline-block-left h3, +.inline-block-left h4, +.inline-block-left a, +.inline-block-right h2, +.inline-block-right h3, +.inline-block-right h4, +.inline-block-right a { + color: #fff; +} +.inline-block-left h2, +.inline-block-left h3, +.inline-block-left h4, +.inline-block-right h2, +.inline-block-right h3, +.inline-block-right h4 { + margin-top: 0; +} + +.inline-block-left { + margin-right: 2rem; +} +@media (min-width: 768px) { + .inline-block-left { + float: left; + clear: left; + } +} + +.inline-block-right { + margin-left: 2rem; +} +@media (min-width: 768px) { + .inline-block-right { + float: right; + clear: right; + } +} + +.media--type-logo { + display: inline-block; + vertical-align: middle; + padding-left: 2rem; +} +.media--type-logo div { + line-height: 0; +} +.media--type-logo img { + object-fit: contain; +} + +.media--type-logo:first-of-type { + padding-left: 0; +} + +.navbar .nav { + margin: 0; + padding: 0; +} + +.navbar .nav li { + margin: 0; + font-size: 1.7rem; +} + +.navbar .nav > .menu-item--active-trail > .navbar-link { + position: relative; +} + +.navbar .nav > .menu-item--active-trail > .navbar-link::before { + content: ""; + display: block; + width: 100%; + height: 3px; + background-color: #00afa4; + position: absolute; + bottom: 0; + left: 0; + z-index: 2; +} + +#ubc7-unit-menu.navigation-is-sticky { + z-index: 2; +} + +#ubc7-unit-menu .nav > li > a { + color: #005554; + padding: 1rem 1.5rem; + height: 45px !important; +} + +#ubc7-unit-menu .dropdown-menu > li > a { + color: #00afa4; +} + +#ubc7-unit-menu .dropdown:hover .dropdown-menu { + display: block; +} + +.nav > li > a:hover, +.nav > li > a:focus, +#ubc7-unit-menu .nav-collapse .nav > li > a:hover { + background-color: #00afa4 !important; + transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); +} + +#ubc7-unit-menu .nav > li.active > a, +.navbar .nav > .active > a { + background: transparent; + box-shadow: none; +} + +.navbar .nav > .active > a:focus, +.navbar .nav > .active > a:hover { + background-color: #00afa4; + box-shadow: none; + color: #fff; +} + +.dropdown-menu { + border: 0; + border-radius: 3px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); +} + +.dropdown-menu:hover { + box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22); +} + +.dropdown-menu li { + border: 0; +} + +.dropdown-menu > li > a { + padding: 1rem 1.5rem; +} + +.menu--main .dropdown-menu .navbar-link { + font-size: 1.5rem; +} + +#ubc7-unit-menu .nav-collapse .dropdown-menu a:hover, +#ubc7-unit-menu .nav-collapse .nav > li > a:hover { + background-color: #00afa4 !important; +} + +.footer-quick-links ul { + margin: 0; + padding: 10px 0; + list-style-type: none; +} + +.footer-quick-links ul li { + display: inline; + padding: 0 10px; + border-left: 1px solid #005554; +} + +.footer-quick-links ul li:first-child, .footer-quick-links ul li.admin-page { + border-left: none; +} + +.footer-quick-links ul li.admin-page { + float: right; +} + +#ubc7-unit .utility-menu { + float: right; + height: 100%; +} +#ubc7-unit .utility-menu .btn { + background-color: #ef8843; + color: #fff; +} +@media (min-width: 1200px) { + #ubc7-unit .utility-menu .btn { + line-height: 3.6rem; + } +} + +#ubc7-unit-menu .dropdown .btn-group:hover button, +#ubc7-unit-menu .dropdown .btn-group button { + height: 45px !important; +} + +#ubc7-unit .navbar .btn-navbar:active, +#ubc7-unit .navbar .btn-navbar:hover { + box-shadow: none; +} + +#ubc7-unit-navigation .sub-menu--main li a { + color: #00afa4; +} + +#ubc7-unit .navbar .btn-navbar, +#ubc7-unit .btn { + box-shadow: none; + width: auto; + padding: 1.2rem; + margin: 0; + background: transparent; + font-size: 1.7rem; + height: 100%; +} + +@media (min-width: 980px) { + #ubc7-unit-navigation .sub-menu--main { + display: none; + } +} +@media (max-width: 979.98px) { + #ubc7-unit-navigation .menu--main { + display: none; + } +} +.news--teaser__image { + max-width: 115px; +} + +.news--teaser__image img { + border-left: 5px solid #00afa4; + margin: 0 0 2rem; +} + +@media (min-width: 576px) { + .news--teaser { + display: flex; + } + .news--teaser__image { + order: 2; + flex-shrink: 0; + } + .news--teaser__image img { + margin: 0 2rem; + } +} +.news--teaser__image a { + display: block; + line-height: 0; +} + +.news--teaser__text { + flex-grow: 1; +} + +.news--teaser__header { + margin: 0; +} + +.news--teaser__date { + color: #999; +} + +.node > :not(div, header, footer, table) { + max-width: 72rem; +} + +.node__meta { + flex-basis: 100%; +} + +.layout__region--content > .field, +.page-title { + max-width: 72rem; +} + +.node__submitted { + color: #999; + margin: 1rem 0 2rem; + font-size: 1.5rem; +} + +.node--unpublished { + position: relative; +} +.node--unpublished::before { + position: absolute; + top: 0; + right: 0; + display: block; + content: "DRAFT"; + font-size: 5rem; + opacity: 0.2; + color: #999; + transform: rotate(40deg); +} + +.node--view-mode-full { + margin-top: 2rem; +} + +.node__additional-content:before { + content: ""; + background-color: #9e4225; + height: 3px; + width: 50%; + display: block; + margin: 3rem auto; +} + +.node__ical { + font-size: 2.5rem; + text-align: right; +} + +.field--name-body h2, +.field--name-body h3, +.field--name-body h4, +.field--name-body h5 { + max-width: 50ch; +} +.field--name-body li, +.field--name-body p { + max-width: 75ch; +} + +.page-title::after { + content: ""; + display: block; + margin-top: 1rem; + margin-bottom: 1rem; + width: 250px; + height: 3px; + background-color: #9e4225; +} + +.prevnext-element.previous { + float: left; +} + +.prevnext-element.next { + float: right; +} + +.prev-next-container { + line-height: 1.5; + margin-top: 1.7rem; + margin-bottom: 1.7rem; + clear: both; +} + +/* + * DO NOT EDIT THIS FILE. + * See the following change record for more information, + * https://www.drupal.org/node/3084859 + * @preserve + */ +/** + * @file + * Styles for Claro's Pagination. + */ +:root { + /** + * Pager. + */ /* --space-m × 2 */ /* 2px */ +} + +.pager { + margin-top: 1.6rem; + margin-bottom: 1.6rem; +} + +.pager__items { + display: flex; + flex-wrap: wrap; + align-items: flex-end; + justify-content: center; + margin: 1.6rem 0; + padding: 0; + list-style: none; + text-align: center; + font-weight: bold; +} + +.pager__item { + display: inline-block; + margin: 0 0.4rem; +} + +.pager__link, +.pager__item--current { + display: flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + min-width: 3.2rem; + height: 3.2rem; + padding-right: 0.8rem; + padding-left: 0.8rem; + color: #00afa4; + border-radius: 1.6rem; /* Pager size ÷ 2 */ + background: #fff; /* Make sure that the text is visible on dark background. */ + line-height: 1; +} + +.pager__link:hover, +.pager__link:focus, +.pager__link:active { + text-decoration: underline; +} + +.pager__link:hover, +.pager__link.is-active:hover { + color: #005554; + text-decoration: none; +} + +.pager__link--action-link { + border-radius: 0.2rem; +} + +/* Active number link. */ +.pager__link.is-active, +.pager__item--current { + text-decoration: none; + color: #fff; + border: 0.2rem solid transparent; + background: #00afa4; +} + +.pager__item--first .pager__link::before { + background-image: url("data:image/svg+xml,%3csvg width='16' height='16' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M2 2v12M14 2L8 8l6 6' stroke='%2300afa4' stroke-width='2'/%3e%3c/svg%3e"); +} + +.pager__item--previous .pager__link::before { + background-image: url("data:image/svg+xml,%3csvg width='16' height='16' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M11 2L5 8l6 6' stroke='%2300afa4' stroke-width='2'/%3e%3c/svg%3e"); +} + +.pager__item--next .pager__link::after { + background-image: url("data:image/svg+xml,%3csvg width='16' height='16' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M5 14l6-6-6-6' stroke='%2300afa4' stroke-width='2'/%3e%3c/svg%3e"); +} + +.pager__item--last .pager__link::after { + background-image: url("data:image/svg+xml,%3csvg width='16' height='16' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M14 14V2M2 14l6-6-6-6' stroke='%2300afa4' stroke-width='2'/%3e%3c/svg%3e"); +} + +.pager__item--first .pager__link::before, +.pager__item--previous .pager__link::before, +.pager__item--next .pager__link::after, +.pager__item--last .pager__link::after { + position: relative; + display: inline-block; + width: 1.6rem; + height: 1.6rem; + content: ""; + background-repeat: no-repeat; + background-position: center; +} + +.pager__item--mini { + margin-right: 0.8rem; + margin-left: 0.8rem; +} + +.pager__link--mini { + border-radius: 50%; +} + +/** + * On the mini pager, remove margins for the previous and next icons. + * Margins are not needed here as there is no accompanying text. + */ +.pager__link--mini::before { + margin-right: 0; + margin-left: 0; +} + +.pager__item-title--backwards { + margin-left: 0.8rem; +} + +.pager__item-title--forward { + margin-right: 0.8rem; +} + +@media (-ms-high-contrast: active), (forced-colors: active) { + .pager__item a:hover { + text-decoration: underline; + } +} +.profile-display { + display: flex; + flex-wrap: wrap; + margin: 0; + padding: 0; +} +.profile-display .profile-item { + list-style: none; + padding: 1rem; + margin: 0; + display: flex; + flex: 1 1 100%; +} +@media (min-width: 576px) { + .profile-display .profile-item { + flex: 1 1 50%; + } + .profile-display .profile-item:first-of-type { + flex: 1 1 100%; + } +} + +.profile--teaser { + width: 100%; + height: 100%; + position: relative; + display: flex; + justify-content: space-between; + flex-wrap: wrap; + flex-direction: column; + flex-grow: 1; + border: 1px solid #e4e4e4; + border-radius: 1rem; + padding: 3rem; +} +.profile--teaser__head { + display: flex; + align-items: center; + flex-direction: column; + justify-content: center; + margin-bottom: 2rem; + text-align: center; +} +.profile--teaser__image { + margin: auto; +} +.profile--teaser__image .image-default, +.profile--teaser__image img { + width: 150px; + height: 150px; + border-radius: 50%; +} +.profile--teaser__content { + width: 100%; + text-align: center; +} +.profile--teaser__content + div { + display: flex; + flex-direction: row; + flex-wrap: wrap; +} +.profile--teaser__content__name { + font-size: 2.4rem; +} + +.contact { + display: flex; + flex-wrap: wrap; + flex-direction: row; +} +.contact > .field + .field { + margin: 0; +} +.contact div { + flex: 1 1 50%; +} +.contact-content-job-title { + margin: 0; + font-size: 2rem; +} + +.field--label-inline .profile-people { + display: flex; + flex-wrap: wrap; + position: relative; + width: auto; +} +.field--label-inline .profile-people .field--label-inline .field__label, +.field--label-inline .profile-people .field--label-inline > .field__item:nth-child(2) { + padding: 0; +} + +.contact-content-name, +.contact-content-job-title { + font-size: 2rem; + margin: 0 0 1rem; + display: inline-block; +} + +.profile-people { + display: flex; + flex-wrap: wrap; + position: relative; + width: 100%; +} +.profile-people__content { + flex-grow: 4; + flex-shrink: 1; + flex-basis: 50%; +} +.profile-people__image { + margin: 20px; + flex: 0 0 auto; + width: auto; + max-width: none; +} +@media (min-width: 576px) { + .profile-people__image { + order: 2; + } +} +.profile-people__image .image-default, +.profile-people__image img { + width: 200px; + height: 200px; + border-radius: 50%; + padding: 1.2rem; + border: 2px solid #d7e0e7; +} + +@media (min-width: 576px) { + .profile-alumni__header { + display: flex; + flex-wrap: wrap; + position: relative; + width: 100%; + } + .profile-alumni__intro { + width: 100%; + } + .profile-alumni-image { + margin: 20px; + flex: 0 0 auto; + width: auto; + max-width: none; + order: 2; + } + .profile-alumni-image .profile-image { + margin: 0; + } + .profile-alumni-image .profile-image img { + max-width: 200px; + width: 200px; + height: 200px; + border-radius: 50%; + padding: 1.2rem; + border: 2px solid #d7e0e7; + } +} +.image-default { + display: flex; + justify-content: center; + flex-direction: column; + text-align: center; + background-color: #2f5d7c; + color: #fff; + font-size: 5rem; +} + +.profile-image img, +.profile-image .image-default { + max-width: 100px; + width: 100px; + height: 100px; + border-radius: 50%; +} + +.profile-image .image-default { + font-size: 4rem; +} + +.views-field-field-person-lname { + min-width: 20ch; +} + +.profile-alumni { + display: flex; + flex-wrap: wrap; + position: relative; + width: 100%; + margin: 2rem 0; +} + +.profile-alumni__content { + flex-grow: 4; + flex-shrink: 1; + flex-basis: 50%; +} + +.profile-alumni__image { + margin-right: 20px; + flex: 0 0 auto; + width: auto; + max-width: none; +} +.profile-alumni__image .image-default, +.profile-alumni__image img { + max-width: 100px; + width: 100px; + height: 100px; + border-radius: 50%; +} +.profile-alumni__image .image-default { + justify-content: center; + flex-direction: column; + text-align: center; + background-color: #2f5d7c; + color: #fff; + font-size: 5rem; +} + +.profile-alumni__name { + font-size: 3rem; +} + +.research-area__label { + display: flex; +} +@media (max-width: 575.98px) { + .research-area__label { + flex-direction: column; + align-items: center; + } +} + +.research-area__icon { + color: #9e4225; + display: inline-block; + margin-right: 0.5rem; + width: 4rem; + flex-shrink: 0; +} + +.research-area__icon img { + filter: invert(28%) sepia(48%) saturate(1393%) hue-rotate(338deg) brightness(96%) contrast(90%); + width: 3.5rem; +} + +.view-id-research > .view-grouping > .view-grouping-content { + padding: 0 4.5rem; +} + +.sidebar__icons { + font-size: 3rem; +} +.sidebar__icons a { + padding-right: 10px; +} + +.site-alert { + display: flex; + max-width: 1200px; + margin-left: auto; + margin-right: auto; +} +.site-alert h1, +.site-alert h2, +.site-alert h3, +.site-alert h4, +.site-alert h5 { + color: #fff; + margin-top: 1rem; + margin-bottom: 1rem; +} +.site-alert p { + margin-top: 0; + margin-bottom: 0; +} +.site-alert a, +.site-alert h4 { + color: #fff; +} + +.site-alert-box { + color: #fff; + padding: 15px 35px 15px 15px; + margin-top: 1em; + margin-bottom: 1em; + border-width: 2px; + border-radius: 0; + display: flex; + align-items: center; + width: 100%; +} + +.site-alert-box.severity-low { + background-color: #324d6a; + border-color: #00162f; +} + +.site-alert-box.severity-medium { + background-color: #ef8843; + border-color: #d77a3c; +} + +.site-alert-box.severity-high { + background-color: #b33542; + border-color: #900f1d; +} + +.site-alert__icon { + display: block; + width: 40px; + height: 40px; + border: 2px solid #fff; + border-radius: 50%; + font-size: 150%; + text-align: center; + color: #fff; + line-height: 36px; + margin: 0 20px 0 0; + flex-shrink: 0; +} + +.site-alert__message { + flex-grow: 1; +} + +.home__slider { + max-width: 1200px; + width: 100%; + margin: 0 auto; +} + +/* Slider */ +.slick-loading .slick-list { + background: #fff url("/libraries/slick/slick/ajax-loader.gif") no-repeat center center; +} + +/* Arrows */ +.slick-prev, +.slick-next { + position: absolute; + display: block; + height: 20px; + width: 20px; + line-height: 0; + font-size: 0; + cursor: pointer; + background: transparent; + color: transparent; + top: 50%; + transform: translate(0, -50%); + padding: 0; + border: none; + outline: none; +} +.slick-prev:hover, .slick-prev:focus, +.slick-next:hover, +.slick-next:focus { + outline: none; + background: transparent; + color: transparent; +} +.slick-prev:hover:before, .slick-prev:focus:before, +.slick-next:hover:before, +.slick-next:focus:before { + opacity: 1; +} +.slick-prev.slick-disabled:before, +.slick-next.slick-disabled:before { + opacity: 0.25; +} + +.slick-prev { + left: -25px; +} +[dir=rtl] .slick-prev { + left: auto; + right: -25px; +} + +.slick-next { + right: -25px; +} +[dir=rtl] .slick-next { + left: -25px; + right: auto; +} + +/* Dots */ +.slick-dotted.slick-slider { + margin-bottom: 30px; +} + +.slick-dots { + position: absolute; + bottom: -30px; + list-style: none; + display: block; + text-align: center; + padding: 0; + margin: 0; + width: 100%; +} +.slick-dots li { + position: relative; + display: inline-block; + height: 20px; + width: 20px; + margin: 0 5px; + padding: 0; + cursor: pointer; +} +.slick-dots li button { + border: 0; + background: transparent; + display: block; + height: 20px; + width: 20px; + outline: none; + line-height: 0; + font-size: 0; + color: transparent; + padding: 5px; + cursor: pointer; +} +.slick-dots li button:hover, .slick-dots li button:focus { + outline: none; +} +.slick-dots li button:hover:before, .slick-dots li button:focus:before { + opacity: 1; +} +.slick-dots li button:before { + position: absolute; + top: 0; + left: 0; + width: 20px; + height: 20px; + font-size: 6px; + line-height: 20px; + text-align: center; + color: black; + opacity: 0.25; +} +.slick-dots li.slick-active button:before { + color: black; + opacity: 0.75; +} + +.slick-wrapper, +.slick, +.slick * { + box-sizing: border-box; +} + +.slick img { + height: auto; +} + +.slick img, +.slick iframe { + border: 0; + max-width: 100%; +} + +/* Prevents overflowing nested slides. */ +.slick, +.slick-wrapper { + max-width: 100%; + position: relative; +} + +/** + * Misc overrides core slick. + */ +.slick-initialized { + overflow: visible; +} + +.slick__slider::before, +.slick__slider::after { + display: table; + content: ""; +} + +.slick__slider::after { + clear: both; +} + +/** Draggable. */ +.draggable { + cursor: grab; +} + +.draggable:active { + cursor: grabbing; +} + +.draggable:active a, +.draggable:active .slide__caption { + cursor: grabbing; + -webkit-user-select: none; + user-select: none; +} + +/** Visibility fix for stacking slides during initialization. */ +.slick__slide { + max-width: 100%; + position: absolute; + visibility: hidden; +} + +/** Prevents collapsing container during initialization. */ +.slick__slide.slide--0 { + position: relative; +} + +.unslick .slick__slide, +.slick-initialized .slick__slide { + position: relative; + visibility: visible; +} + +/* Fix for Chrome blue outline */ +.slick__slide:focus { + outline: 0; +} + +/* Prevents collapsing slick when unslick like one item. */ +.unslick .slick__slide { + width: 100%; +} + +.slick-current { + z-index: 4; +} + +/** + * Slide layouts, adjust accordingly per actual container slide. + */ +.slide__content, +.grid__content { + position: relative; +} + +.slide__content::after { + content: ""; + display: table; + clear: both; +} + +.slide__title { + margin: 10px 0 5px; + line-height: 1.2; +} + +.slide__link { + margin: 30px auto; +} + +/* Overrides .slick-slider to make caption text selectable. */ +.slide__caption { + cursor: text; + -o-user-select: text; + -webkit-user-select: text; + user-select: text; + width: 100%; +} + +/* Only display when JS is ready. */ +.slick__arrow, +.is-loading .slide__caption { + visibility: hidden; +} + +/** Arrows are outside slick-initialized. */ +.slick--initialized .slick__arrow { + visibility: visible; +} + +.slick--main .slide__caption { + min-height: 32%; + padding: 20px 0; + z-index: 3; +} + +.slick--thumbnail .slide__caption { + padding: 5px 6px; +} + +/** + * Skins. + * Arrows contained/wrapped within slick__arrow for easy moves. + */ +/* Overrides problematic hidden arrows at core slick.css */ +.slick-prev { + left: 0; +} + +.slick-next { + right: 0; +} + +.slick__arrow { + bottom: auto; + height: 2px; + left: 0; + margin-top: -1px; + pointer-events: none; + position: absolute; + top: 50%; + transform: translateY(-50%); + width: 100%; + z-index: 2; +} + +/** Keeps decent fallback for when slick-theme.css is disabled, even if dup. */ +.slick-arrow { + border: 0; + border-radius: 50%; + font-size: 0; + height: 42px; + pointer-events: auto; + position: absolute; + top: 50%; + transform: translateY(-50%); + width: 42px; + margin: 0 1rem; +} + +.slick-arrow:active, +.slick-arrow:focus { + box-shadow: none; + outline: 0; +} + +.slick-arrow::before, +.slick-arrow::after { + pointer-events: none; +} + +/** + * Bullets. + */ +/* Makes the pointer work when bullets placed over the slide. */ +/* Overrides core > 1.3.11, otherwise thumbnails are non-clickable */ +.slick button, +.slick--thumbnail .slick__slide img { + pointer-events: auto; +} + +/* Provides decent dots if core slick-theme.css is disabled. */ +.slick-dots li { + margin-bottom: 5px; + display: inline-block; + vertical-align: top; +} + +/* Overrides too tiny bullets from core slick.css.*/ +.slick-dots li button::before { + font-size: 0.75rem; +} + +/** + * Media. + */ +/* Hide lazyloaded image when JS is off.*/ +img[data-lazy] { + display: none; +} + +.slide__media { + overflow: hidden; + position: relative; +} + +/* Center the image to reduce gap at RHS with smaller image, larger container */ +.media__image { + margin: 0 auto; +} + +/** @todo: Remove temp fix for when total <= slidesToShow at 1.6.1+. */ +/** @see https://github.com/kenwheeler/slick/issues/262 */ +.slick--less .slick-track { + margin-left: auto; + margin-right: auto; + text-align: center; +} + +.slick--less .slick-slide { + float: none; + display: inline-block; + vertical-align: top; +} + +.slick--less .draggable { + cursor: default; +} + +.slick-prev::before, +.slick-next::before { + display: inline-block; + content: ""; + background-repeat: no-repeat; + background-size: 4rem 4rem; + width: 4rem; + height: 4rem; +} + +.slick-prev::before { + background-image: url("../img/slick/prev.svg"); +} + +.slick-next::before { + background-image: url("../img/slick/next.svg"); +} + +.slick-dots li button::before { + background-color: #00afa4; + border-radius: 50%; + border: 2px solid #00afa4; + content: ""; + height: 10px; + width: 10px; + opacity: 1; +} + +.slick-dots li.slick-active button::before { + background-color: #fff; +} + +.sub-menu h3 { + font-weight: normal; +} + +.sub-menu { + margin-top: 2.7rem; +} + +.sub-menu ul { + list-style: none; + padding: 0; + margin: 0; +} + +.sub-menu .menu-item--expanded .menu-item__label { + display: flex; +} +.sub-menu .menu-item--expanded .menu-item__label > .menu-item__link { + flex: 1 1 auto; +} +.sub-menu .menu-item--expanded .menu-item__label > .menu-item__toggle { + flex: 0 0 1rem; +} + +.sub-menu .menu-item__link { + text-decoration: none; + display: block; + padding: 0.5rem 0.85rem; + transition: all 0.25s ease-in; +} +.sub-menu .menu-item__link.is-active { + color: #005554; + font-weight: 400; + position: relative; +} +.sub-menu .menu-item__link.is-active::before { + width: 50px; + height: 2px; + background-color: #005554; + position: absolute; + bottom: 0; + content: ""; +} + +.sub-menu .menu-item__label { + border-bottom: 1px solid #dff4f4; +} + +.sub-menu .menu-item--active-trail > .menu-item__label .menu-item__link { + color: #005554; + font-weight: 400; +} + +.sub-menu ul .menu-item__link { + padding-left: 1rem; +} + +.sub-menu ul ul .menu-item__link { + padding-left: 2rem; +} + +.sub-menu ul ul ul .menu-item__link { + padding-left: 3rem; +} + +.sub-menu ul ul ul ul .menu-item__link { + padding-left: 4rem; +} + +.sub-menu ul ul ul ul ul .menu-item__link { + padding-left: 5rem; +} + +.sub-menu ul ul ul ul ul ul .menu-item__link { + padding-left: 6rem; +} + +.menu-item__item { + margin: 0; +} + +.menu-item__item > ul { + display: none; +} + +.menu-item__item.menu-item--expand > ul { + display: block; +} + +.sub-menu .menu-item__toggle { + text-align: center; + min-width: 3rem; + cursor: pointer; +} + +.menu-item__toggle .chevron::after { + transition: transform 0.5s ease-in-out; +} + +.menu-item__item.menu-item--expand > .menu-item__label .chevron::after { + transform: rotate(135deg); +} + +.menu-item--active-trail > .menu-item__label .chevron::after { + border-color: #005554; +} + +.node table { + width: 100%; + max-width: 100%; + border-collapse: collapse; + border-spacing: 0; + border: 1px solid #d7e0e7; + border-right-width: 0; + border-bottom-width: 0; +} +.node td, +.node th { + border: 0 solid #d7e0e7; + border-right-width: 1px; + border-bottom-width: 1px; + padding: 0.5rem 0.8rem; + text-align: left; +} +.node thead th { + vertical-align: bottom; +} + +td.is-active { + background-color: transparent; +} + +.field-multiple-table { + width: 100%; +} +.field-multiple-table th { + text-align: left; +} + +button.link.tabledrag-toggle-weight { + font-size: 0.7em; + text-transform: uppercase; + color: #999; +} + +form .field-multiple-table .field-multiple-drag .tabledrag-handle { + padding: 7px; +} + +.field-multiple-drag { + vertical-align: middle; +} + +.draggable a.tabledrag-handle { + float: none; + display: inline-block; + margin: 0; + height: 30px; +} + +a.tabledrag-handle .handle { + width: 16px; + height: 16px; + background-position: 0 0; + padding: 0; + margin: 0; +} + +.node .toc-tree { + border: 1px solid #ccc; + padding: 2rem; + margin: 2rem 0; +} + +.toc-tree ol.none { + padding: 0; +} + +.toc-tree h3 { + margin: 0 0; +} + +.toc-tree > ol, +.toc-tree > ul { + margin: 2rem 0; +} + +.text-primary { + color: #9e4225; +} + +.text-secondary { + color: #005554; +} + +.text-large { + font-size: 3.4rem; +} + +.intro { + color: #cc6e20; + font-size: 2.2rem; +} + +#ubc7-unit { + background-color: #9e4225; +} + +body { + padding: 0; +} + +.vertical-tabs__menu-item { + margin: 0; +} + +.views-exposed-form { + display: flex; + flex-wrap: wrap; + align-items: flex-start; + align-content: space-around; + margin-left: -1rem; + margin-right: -1rem; +} + +.views-exposed-form .form-item, +.views-exposed-form .form-actions { + margin: 1rem; +} +@media (min-width: 768px) { + .views-exposed-form .form-item, + .views-exposed-form .form-actions { + max-width: 240px; + } +} + +.views-exposed-form .form-actions { + align-self: flex-end; +} + +.views-field-view-node, +.news-image img { + margin-top: 1rem; +} + +.views-row + .views-row::before { + content: ""; + display: block; + height: 2px; + border: 0; + margin: 2rem auto; + width: 100%; + padding: 0; + background-color: #e6e6e6; +} + +.chevron::after { + border-style: solid; + border-width: 0.2em 0.2em 0 0; + content: ""; + display: inline-block; + height: 0.45em; + left: 0.15em; + position: relative; + transform: rotate(-45deg); + vertical-align: middle; + width: 0.45em; +} + +.chevron.right::after { + left: 0; + transform: rotate(45deg); +} + +.chevron.bottom::after { + transform: rotate(135deg); +} + +.chevron.left::after { + left: 0.25em; + transform: rotate(-135deg); +} + +#back-to-top { + display: none; + position: fixed; + right: 0; + bottom: 40px; + width: 40px; + z-index: 99; + transition: color 0.2s ease, background-color 0.2s ease; +} + +.back-to-top__button { + background-color: #002145; + font-weight: 400; + font-size: 0.9em; + color: #fff; + display: inline-block; + padding: 14px; + margin: 0; + cursor: pointer; + width: auto; + border: none; + text-decoration: none; + opacity: 0.75; +} +.back-to-top__button:hover { + opacity: 0.9; +} +.back-to-top__button i { + color: #fff; +} + +.permalink { + text-decoration: none; + opacity: 0.5; + color: #444; + font-size: 0.8em; +} + +.text-left { + text-align: left !important; +} + +.text-right { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +@media (max-width: 575.98px) { + .extend–background { + margin-left: -15px; + margin-right: -15px; + } +} +@media (min-width: 576px) { + .extend–background { + margin-right: -30000px; + margin-left: -30000px; + padding-right: 30000px; + padding-left: 30000px; + } +} + +.short-line { + width: 225px; + height: 3px; + background-color: #9e4225; + margin: 0 auto; +} + +.intro { + color: #cc6e20; + font-size: 2.2rem; +} + +.bg-base-darkest { + background-color: #005554; +} + +.p-1 { + padding: 1rem; +} + +.p-2 { + padding: 2rem; +} + +.px-1 { + padding-left: 1rem; + padding-right: 1rem; +} + +.px-2 { + padding-left: 2rem; + padding-right: 2rem; +} + +.py-1 { + padding-top: 1rem; + padding-bottom: 1rem; +} + +.py-2 { + padding-top: 2rem; + padding-bottom: 2rem; +} + +.m-1 { + margin: 1rem; +} + +.m-2 { + margin: 2rem; +} + +.mx-1 { + margin-left: 1rem; + margin-right: 1rem; +} + +.mx-2 { + margin-left: 2rem; + margin-right: 2rem; +} + +.my-1 { + margin-top: 1rem; + margin-bottom: 1rem; +} + +.my-2 { + margin-top: 2rem; + margin-bottom: 2rem; +} diff --git a/public/themes/custom/ubccs/css/normalize.css b/public/themes/custom/ubccs/css/normalize.css new file mode 100644 index 0000000..4b5950c --- /dev/null +++ b/public/themes/custom/ubccs/css/normalize.css @@ -0,0 +1,309 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ +/* Document + ========================================================================== */ +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ +html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ +/** + * Remove the margin in all browsers. + */ +body { + margin: 0; +} + +/** + * Render the `main` element consistently in IE. + */ +main { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ +/** + * Remove the gray background on active links in IE 10. + */ +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ +/** + * Remove the border on images inside links in IE 10. + */ +img { + border-style: none; +} + +/* Forms + ========================================================================== */ +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ +button, +input { /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ +button, +select { /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ +button, +[type=button], +[type=reset], +[type=submit] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ +button::-moz-focus-inner, +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ +button:-moz-focusring, +[type=button]:-moz-focusring, +[type=reset]:-moz-focusring, +[type=submit]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ +[type=checkbox], +[type=radio] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ +[type=search] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ +[type=search]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ +/** + * Add the correct display in IE 10+. + */ +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ +[hidden] { + display: none; +} diff --git a/public/themes/custom/ubccs/css/print.css b/public/themes/custom/ubccs/css/print.css new file mode 100644 index 0000000..ac6f8a1 --- /dev/null +++ b/public/themes/custom/ubccs/css/print.css @@ -0,0 +1,36 @@ +body, +input, +textarea, +select { + color: #000; + background: none; +} + +a:link::after { + content: ""; + padding-left: inherit; +} + +.sub-menu, +#back-to-top, +.contextual, +nav.tabs { + display: none; +} + +footer { + display: none; +} + +img { + page-break-inside: avoid; +} + +p, h2, h3 { + orphans: 3; + widows: 3; +} + +h2, h3, h4 { + page-break-after: avoid; +} diff --git a/public/themes/custom/ubccs/css/select2.css b/public/themes/custom/ubccs/css/select2.css new file mode 100644 index 0000000..259d7f4 --- /dev/null +++ b/public/themes/custom/ubccs/css/select2.css @@ -0,0 +1,279 @@ +select { + min-width: 200px; +} + +.select2-container--default .select2-dropdown { + border-radius: 0; +} + +.select2-container--default { + max-width: 100%; +} + +.select2-container--default .select2-selection--single { + background-color: #fff; + border: 2px solid #b8b8b8; + border-top-color: #999; + border-radius: 0; + height: auto; + padding: 0.5rem 0.8rem; +} + +.select2-container--default .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: inherit; +} + +.select2-container--default .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + height: 26px; + margin-right: 20px; + padding-right: 0; +} + +.select2-container--default .select2-selection--single .select2-selection__placeholder { + color: #999; +} + +.select2-container--default .select2-selection--single .select2-selection__arrow { + height: 26px; + position: absolute; + top: 0.5rem; + right: 0.8rem; + width: 20px; +} + +.select2-container--default .select2-selection--single .select2-selection__arrow b { + border-color: #666 transparent transparent transparent; + border-style: solid; + border-width: 7px 6px 0 6px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; +} + +.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #666 transparent; + border-width: 0 6px 7px 6px; +} + +.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear { + float: left; +} + +.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow { + left: 1px; + right: auto; +} + +.select2-container--default.select2-container--disabled .select2-selection--single { + background-color: #eee; + cursor: default; +} + +.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { + display: none; +} + +.select2-container--default .select2-selection--multiple { + background-color: white; + border: 2px solid #b8b8b8; + border-top-color: #999; + border-radius: 0; + cursor: text; + padding-bottom: 0; + padding-right: 0; +} + +.select2-container--default .select2-selection--multiple .select2-selection__rendered { + margin: 0; + display: flex; + flex-wrap: wrap; + gap: 0.4rem; + padding: 0.4rem; +} + +.select2-container--default .select2-selection--multiple .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + height: 20px; + margin-right: 10px; + margin-top: 5px; + padding: 1px; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: #fff; + border: 0; + outline: 1px solid #999; + border-radius: 0; + display: inline-block; + margin: 0; + padding: 0; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice::after { + display: inline-block; + content: ""; + width: 0.5rem; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice__display { + cursor: default; + padding-left: 2px; + padding-right: 5px; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + background-color: transparent; + border: none; + color: #999; + cursor: pointer; + font-weight: bold; + padding: 0 0.5rem; + position: relative; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover, +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:focus { + background-color: #f1f1f1; + color: #333; + outline: none; +} + +.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; +} + +.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__display { + padding-left: 5px; + padding-right: 2px; +} + +.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove { + border-left: 1px solid #b8b8b8; + border-right: none; + border-radius: 0 4px 4px 0; +} + +.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__clear { + float: left; + margin-left: 10px; + margin-right: auto; +} + +.select2-container--default.select2-container--focus .select2-selection--multiple { + border: 2px solid #00afa4; + background-color: #fff; + outline: 0; +} + +.select2-container--default.select2-container--disabled .select2-selection--multiple { + background-color: #eee; + cursor: default; +} + +.select2-container--default.select2-container--disabled .select2-selection__choice__remove { + display: none; +} + +.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, +.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, +.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.select2-container--default .select2-search--dropdown .select2-search__field { + border: 2px solid #b8b8b8; + border-top-color: #999; + margin: 0; +} + +.select2-container--default .select2-search--inline .select2-search__field { + background: transparent; + border: none; + outline: 0; + box-shadow: none; + -webkit-appearance: textfield; + height: 26px; +} + +.select2-container--default .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; +} + +.select2-container--default .select2-results__option { + margin-bottom: 0; +} + +.select2-container--default .select2-results__option .select2-results__option { + padding-left: 1em; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__group { + padding-left: 0; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option { + margin-left: -1em; + padding-left: 2em; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -2em; + padding-left: 3em; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -3em; + padding-left: 4em; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -4em; + padding-left: 5em; +} + +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -5em; + padding-left: 6em; +} + +.select2-container--default .select2-results__option--group { + padding: 0; +} + +.select2-container--default .select2-results__option--disabled { + color: #999; +} + +.select2-container--default .select2-results__option--selected { + background-color: #ddd; +} + +.select2-container--default .select2-results__option--highlighted[aria-selected], +.select2-container--default .select2-results__option--highlighted.select2-results__option--selectable { + background-color: #00afa4; + color: white; +} + +.select2-container--default .select2-results__group { + cursor: default; + display: block; + padding: 6px; +} diff --git a/public/themes/custom/ubccs/css/timeline.css b/public/themes/custom/ubccs/css/timeline.css new file mode 100644 index 0000000..f6e9570 --- /dev/null +++ b/public/themes/custom/ubccs/css/timeline.css @@ -0,0 +1,28 @@ +.tl-timeline { + z-index: 1; +} + +.tl-timegroup:nth-child(1) { + background-color: #e9e9fc !important; +} + +.tl-timegroup:nth-child(2) { + background-color: #eee !important; +} + +.tl-timegroup:nth-child(3) { + background-color: #fef !important; +} + +.tl-timegroup:nth-child(4) { + background-color: #eee; +} + +.tl-slide .tl-slide-content-container .tl-slide-content { + box-sizing: initial; +} + +.tl-text h2.tl-headline-title, +.tl-text h2.tl-headline { + color: #005554; +} diff --git a/public/themes/custom/ubccs/img/arrow-both.svg b/public/themes/custom/ubccs/img/arrow-both.svg new file mode 100644 index 0000000..30afa7d --- /dev/null +++ b/public/themes/custom/ubccs/img/arrow-both.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/themes/custom/ubccs/img/computer-science-logo.png b/public/themes/custom/ubccs/img/computer-science-logo.png new file mode 100644 index 0000000..9452009 Binary files /dev/null and b/public/themes/custom/ubccs/img/computer-science-logo.png differ diff --git a/public/themes/custom/ubccs/img/correct8.svg b/public/themes/custom/ubccs/img/correct8.svg new file mode 100644 index 0000000..bd7b38b --- /dev/null +++ b/public/themes/custom/ubccs/img/correct8.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/themes/custom/ubccs/img/next.svg b/public/themes/custom/ubccs/img/next.svg new file mode 100644 index 0000000..1ad71a7 --- /dev/null +++ b/public/themes/custom/ubccs/img/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/themes/custom/ubccs/img/prev.svg b/public/themes/custom/ubccs/img/prev.svg new file mode 100644 index 0000000..e259c98 --- /dev/null +++ b/public/themes/custom/ubccs/img/prev.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/themes/custom/ubccs/img/slick/next.svg b/public/themes/custom/ubccs/img/slick/next.svg new file mode 100644 index 0000000..788e596 --- /dev/null +++ b/public/themes/custom/ubccs/img/slick/next.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/themes/custom/ubccs/img/slick/prev.svg b/public/themes/custom/ubccs/img/slick/prev.svg new file mode 100644 index 0000000..93c530c --- /dev/null +++ b/public/themes/custom/ubccs/img/slick/prev.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/themes/custom/ubccs/img/ubc_logo.png b/public/themes/custom/ubccs/img/ubc_logo.png new file mode 100644 index 0000000..d7b7e11 Binary files /dev/null and b/public/themes/custom/ubccs/img/ubc_logo.png differ diff --git a/public/themes/custom/ubccs/js/main.js b/public/themes/custom/ubccs/js/main.js new file mode 100644 index 0000000..d03d51e --- /dev/null +++ b/public/themes/custom/ubccs/js/main.js @@ -0,0 +1,68 @@ + +(function ($, Drupal) { + + Drupal.behaviors.BackToTop = { + attach: function () { + var $window = $(window); + var $backToTop = $('#back-to-top'); + $backToTop.hide(); + + $window.scroll(function () { + $window.scrollTop() > 150 ? $backToTop.fadeIn(300) : $backToTop.fadeOut(300); + }); + $backToTop.find('a.ease').on('click', function (e) { + e.preventDefault(); + $('html, body').animate({scrollTop: 0}, 800); + return false; + }); + } + }; + + Drupal.behaviors.SearchFocus = { + attach: function (context) { + var checkIsVisible; + $('#ubc7-global-utility', context).on('click', 'button', function () { + clearInterval(checkIsVisible); + }); + $('#ubc7-global-utility', context).on('click', 'button[data-toggle="collapse"]', function () { + var target = $(this).data('target'); + var $searchInput = $(target).find('input[type="text"]'); + if ($searchInput.length) { + checkIsVisible = setInterval(function () { + if ($searchInput.filter(':visible').length) { + clearInterval(checkIsVisible); + $searchInput.focus(); + console.log($searchInput); + } + }, 100); + } + }); + } + }; + + Drupal.behaviors.SubMenu = { + attach: function (context) { + var $subMenu = $('.sub-menu', context); + var $toggles = $subMenu.find('.menu-item__toggle'); + $toggles.on('click', function () { + $(this).closest('li').toggleClass('menu-item--expand'); + }); + } + }; + + Drupal.behaviors.CourseInfoToggle = { + attach: function (context, settings) { + $('.course-section-table-body > tr:not(.child)', context).click(function (e) { + // Exclude links. + if (e.target.tagName === "A") { + return; + } + e.preventDefault(); + $(this).next('tr').toggle(); + $(this).toggleClass('open'); + $(this).children("td:last").children('.chevron').toggleClass('bottom'); + }); + } + }; + +} (jQuery, Drupal)); diff --git a/public/themes/custom/ubccs/js/vendor/fancybox/jquery.fancybox.css b/public/themes/custom/ubccs/js/vendor/fancybox/jquery.fancybox.css new file mode 100644 index 0000000..16b0125 --- /dev/null +++ b/public/themes/custom/ubccs/js/vendor/fancybox/jquery.fancybox.css @@ -0,0 +1,895 @@ +body.compensate-for-scrollbar { + overflow: hidden; +} + +.fancybox-active { + height: auto; +} + +.fancybox-is-hidden { + left: -9999px; + margin: 0; + position: absolute !important; + top: -9999px; + visibility: hidden; +} + +.fancybox-container { + -webkit-backface-visibility: hidden; + height: 100%; + left: 0; + outline: none; + position: fixed; + -webkit-tap-highlight-color: transparent; + top: 0; + -ms-touch-action: manipulation; + touch-action: manipulation; + transform: translateZ(0); + width: 100%; + z-index: 99992; +} + +.fancybox-container * { + box-sizing: border-box; +} + +.fancybox-outer, +.fancybox-inner, +.fancybox-bg, +.fancybox-stage { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; +} + +.fancybox-outer { + -webkit-overflow-scrolling: touch; + overflow-y: auto; +} + +.fancybox-bg { + background: rgb(30, 30, 30); + opacity: 0; + transition-duration: inherit; + transition-property: opacity; + transition-timing-function: cubic-bezier(.47, 0, .74, .71); +} + +.fancybox-is-open .fancybox-bg { + opacity: .9; + transition-timing-function: cubic-bezier(.22, .61, .36, 1); +} + +.fancybox-infobar, +.fancybox-toolbar, +.fancybox-caption, +.fancybox-navigation .fancybox-button { + direction: ltr; + opacity: 0; + position: absolute; + transition: opacity .25s ease, visibility 0s ease .25s; + visibility: hidden; + z-index: 99997; +} + +.fancybox-show-infobar .fancybox-infobar, +.fancybox-show-toolbar .fancybox-toolbar, +.fancybox-show-caption .fancybox-caption, +.fancybox-show-nav .fancybox-navigation .fancybox-button { + opacity: 1; + transition: opacity .25s ease 0s, visibility 0s ease 0s; + visibility: visible; +} + +.fancybox-infobar { + color: #ccc; + font-size: 13px; + -webkit-font-smoothing: subpixel-antialiased; + height: 44px; + left: 0; + line-height: 44px; + min-width: 44px; + mix-blend-mode: difference; + padding: 0 10px; + pointer-events: none; + top: 0; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.fancybox-toolbar { + right: 0; + top: 0; +} + +.fancybox-stage { + direction: ltr; + overflow: visible; + transform: translateZ(0); + z-index: 99994; +} + +.fancybox-is-open .fancybox-stage { + overflow: hidden; +} + +.fancybox-slide { + -webkit-backface-visibility: hidden; + /* Using without prefix would break IE11 */ + display: none; + height: 100%; + left: 0; + outline: none; + overflow: auto; + -webkit-overflow-scrolling: touch; + padding: 44px; + position: absolute; + text-align: center; + top: 0; + transition-property: transform, opacity; + white-space: normal; + width: 100%; + z-index: 99994; +} + +.fancybox-slide::before { + content: ''; + display: inline-block; + font-size: 0; + height: 100%; + vertical-align: middle; + width: 0; +} + +.fancybox-is-sliding .fancybox-slide, +.fancybox-slide--previous, +.fancybox-slide--current, +.fancybox-slide--next { + display: block; +} + +.fancybox-slide--image { + overflow: hidden; + padding: 44px 0; +} + +.fancybox-slide--image::before { + display: none; +} + +.fancybox-slide--html { + padding: 6px; +} + +.fancybox-content { + background: #fff; + display: inline-block; + margin: 0; + max-width: 100%; + overflow: auto; + -webkit-overflow-scrolling: touch; + padding: 44px; + position: relative; + text-align: left; + vertical-align: middle; +} + +.fancybox-slide--image .fancybox-content { + animation-timing-function: cubic-bezier(.5, 0, .14, 1); + -webkit-backface-visibility: hidden; + background: transparent; + background-repeat: no-repeat; + background-size: 100% 100%; + left: 0; + max-width: none; + overflow: visible; + padding: 0; + position: absolute; + top: 0; + -ms-transform-origin: top left; + transform-origin: top left; + transition-property: transform, opacity; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + z-index: 99995; +} + +.fancybox-can-zoomOut .fancybox-content { + cursor: zoom-out; +} + +.fancybox-can-zoomIn .fancybox-content { + cursor: zoom-in; +} + +.fancybox-can-swipe .fancybox-content, +.fancybox-can-pan .fancybox-content { + cursor: -webkit-grab; + cursor: grab; +} + +.fancybox-is-grabbing .fancybox-content { + cursor: -webkit-grabbing; + cursor: grabbing; +} + +.fancybox-container [data-selectable='true'] { + cursor: text; +} + +.fancybox-image, +.fancybox-spaceball { + background: transparent; + border: 0; + height: 100%; + left: 0; + margin: 0; + max-height: none; + max-width: none; + padding: 0; + position: absolute; + top: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + width: 100%; +} + +.fancybox-spaceball { + z-index: 1; +} + +.fancybox-slide--video .fancybox-content, +.fancybox-slide--map .fancybox-content, +.fancybox-slide--pdf .fancybox-content, +.fancybox-slide--iframe .fancybox-content { + height: 100%; + overflow: visible; + padding: 0; + width: 100%; +} + +.fancybox-slide--video .fancybox-content { + background: #000; +} + +.fancybox-slide--map .fancybox-content { + background: #e5e3df; +} + +.fancybox-slide--iframe .fancybox-content { + background: #fff; +} + +.fancybox-video, +.fancybox-iframe { + background: transparent; + border: 0; + display: block; + height: 100%; + margin: 0; + overflow: hidden; + padding: 0; + width: 100%; +} + +/* Fix iOS */ +.fancybox-iframe { + left: 0; + position: absolute; + top: 0; +} + +.fancybox-error { + background: #fff; + cursor: default; + max-width: 400px; + padding: 40px; + width: 100%; +} + +.fancybox-error p { + color: #444; + font-size: 16px; + line-height: 20px; + margin: 0; + padding: 0; +} + +/* Buttons */ + +.fancybox-button { + background: rgba(30, 30, 30, .6); + border: 0; + border-radius: 0; + box-shadow: none; + cursor: pointer; + display: inline-block; + height: 44px; + margin: 0; + padding: 10px; + position: relative; + transition: color .2s; + vertical-align: top; + visibility: inherit; + width: 44px; +} + +.fancybox-button, +.fancybox-button:visited, +.fancybox-button:link { + color: #ccc; +} + +.fancybox-button:hover { + color: #fff; +} + +.fancybox-button:focus { + outline: none; +} + +.fancybox-button.fancybox-focus { + outline: 1px dotted; +} + +.fancybox-button[disabled], +.fancybox-button[disabled]:hover { + color: #888; + cursor: default; + outline: none; +} + +/* Fix IE11 */ +.fancybox-button div { + height: 100%; +} + +.fancybox-button svg { + display: block; + height: 100%; + overflow: visible; + position: relative; + width: 100%; +} + +.fancybox-button svg path { + fill: currentColor; + stroke-width: 0; +} + +.fancybox-button--play svg:nth-child(2), +.fancybox-button--fsenter svg:nth-child(2) { + display: none; +} + +.fancybox-button--pause svg:nth-child(1), +.fancybox-button--fsexit svg:nth-child(1) { + display: none; +} + +.fancybox-progress { + background: #ff5268; + height: 2px; + left: 0; + position: absolute; + right: 0; + top: 0; + -ms-transform: scaleX(0); + transform: scaleX(0); + -ms-transform-origin: 0; + transform-origin: 0; + transition-property: transform; + transition-timing-function: linear; + z-index: 99998; +} + +/* Close button on the top right corner of html content */ + +.fancybox-close-small { + background: transparent; + border: 0; + border-radius: 0; + color: #ccc; + cursor: pointer; + opacity: .8; + padding: 8px; + position: absolute; + right: -12px; + top: -44px; + z-index: 401; +} + +.fancybox-close-small:hover { + color: #fff; + opacity: 1; +} + +.fancybox-slide--html .fancybox-close-small { + color: currentColor; + padding: 10px; + right: 0; + top: 0; +} + +.fancybox-slide--image.fancybox-is-scaling .fancybox-content { + overflow: hidden; +} + +.fancybox-is-scaling .fancybox-close-small, +.fancybox-is-zoomable.fancybox-can-pan .fancybox-close-small { + display: none; +} + +/* Navigation arrows */ + +.fancybox-navigation .fancybox-button { + background-clip: content-box; + height: 100px; + opacity: 0; + position: absolute; + top: calc(50% - 50px); + width: 70px; +} + +.fancybox-navigation .fancybox-button div { + padding: 7px; +} + +.fancybox-navigation .fancybox-button--arrow_left { + left: 0; + left: env(safe-area-inset-left); + padding: 31px 26px 31px 6px; +} + +.fancybox-navigation .fancybox-button--arrow_right { + padding: 31px 6px 31px 26px; + right: 0; + right: env(safe-area-inset-right); +} + +/* Caption */ + +.fancybox-caption { + background: linear-gradient(to top, + rgba(0, 0, 0, .85) 0%, + rgba(0, 0, 0, .3) 50%, + rgba(0, 0, 0, .15) 65%, + rgba(0, 0, 0, .075) 75.5%, + rgba(0, 0, 0, .037) 82.85%, + rgba(0, 0, 0, .019) 88%, + rgba(0, 0, 0, 0) 100%); + bottom: 0; + color: #eee; + font-size: 14px; + font-weight: 400; + left: 0; + line-height: 1.5; + padding: 75px 44px 25px 44px; + pointer-events: none; + right: 0; + text-align: center; + z-index: 99996; +} + +@supports (padding: max(0px)) { + .fancybox-caption { + padding: 75px max(44px, env(safe-area-inset-right)) max(25px, env(safe-area-inset-bottom)) max(44px, env(safe-area-inset-left)); + } +} + +.fancybox-caption--separate { + margin-top: -50px; +} + +.fancybox-caption__body { + max-height: 50vh; + overflow: auto; + pointer-events: all; +} + +.fancybox-caption a, +.fancybox-caption a:link, +.fancybox-caption a:visited { + color: #ccc; + text-decoration: none; +} + +.fancybox-caption a:hover { + color: #fff; + text-decoration: underline; +} + +/* Loading indicator */ + +.fancybox-loading { + animation: fancybox-rotate 1s linear infinite; + background: transparent; + border: 4px solid #888; + border-bottom-color: #fff; + border-radius: 50%; + height: 50px; + left: 50%; + margin: -25px 0 0 -25px; + opacity: .7; + padding: 0; + position: absolute; + top: 50%; + width: 50px; + z-index: 99999; +} + +@keyframes fancybox-rotate { + 100% { + transform: rotate(360deg); + } +} + +/* Transition effects */ + +.fancybox-animated { + transition-timing-function: cubic-bezier(0, 0, .25, 1); +} + +/* transitionEffect: slide */ + +.fancybox-fx-slide.fancybox-slide--previous { + opacity: 0; + transform: translate3d(-100%, 0, 0); +} + +.fancybox-fx-slide.fancybox-slide--next { + opacity: 0; + transform: translate3d(100%, 0, 0); +} + +.fancybox-fx-slide.fancybox-slide--current { + opacity: 1; + transform: translate3d(0, 0, 0); +} + +/* transitionEffect: fade */ + +.fancybox-fx-fade.fancybox-slide--previous, +.fancybox-fx-fade.fancybox-slide--next { + opacity: 0; + transition-timing-function: cubic-bezier(.19, 1, .22, 1); +} + +.fancybox-fx-fade.fancybox-slide--current { + opacity: 1; +} + +/* transitionEffect: zoom-in-out */ + +.fancybox-fx-zoom-in-out.fancybox-slide--previous { + opacity: 0; + transform: scale3d(1.5, 1.5, 1.5); +} + +.fancybox-fx-zoom-in-out.fancybox-slide--next { + opacity: 0; + transform: scale3d(.5, .5, .5); +} + +.fancybox-fx-zoom-in-out.fancybox-slide--current { + opacity: 1; + transform: scale3d(1, 1, 1); +} + +/* transitionEffect: rotate */ + +.fancybox-fx-rotate.fancybox-slide--previous { + opacity: 0; + -ms-transform: rotate(-360deg); + transform: rotate(-360deg); +} + +.fancybox-fx-rotate.fancybox-slide--next { + opacity: 0; + -ms-transform: rotate(360deg); + transform: rotate(360deg); +} + +.fancybox-fx-rotate.fancybox-slide--current { + opacity: 1; + -ms-transform: rotate(0deg); + transform: rotate(0deg); +} + +/* transitionEffect: circular */ + +.fancybox-fx-circular.fancybox-slide--previous { + opacity: 0; + transform: scale3d(0, 0, 0) translate3d(-100%, 0, 0); +} + +.fancybox-fx-circular.fancybox-slide--next { + opacity: 0; + transform: scale3d(0, 0, 0) translate3d(100%, 0, 0); +} + +.fancybox-fx-circular.fancybox-slide--current { + opacity: 1; + transform: scale3d(1, 1, 1) translate3d(0, 0, 0); +} + +/* transitionEffect: tube */ + +.fancybox-fx-tube.fancybox-slide--previous { + transform: translate3d(-100%, 0, 0) scale(.1) skew(-10deg); +} + +.fancybox-fx-tube.fancybox-slide--next { + transform: translate3d(100%, 0, 0) scale(.1) skew(10deg); +} + +.fancybox-fx-tube.fancybox-slide--current { + transform: translate3d(0, 0, 0) scale(1); +} + +/* Styling for Small-Screen Devices */ +@media all and (max-height: 576px) { + .fancybox-slide { + padding-left: 6px; + padding-right: 6px; + } + + .fancybox-slide--image { + padding: 6px 0; + } + + .fancybox-close-small { + right: -6px; + } + + .fancybox-slide--image .fancybox-close-small { + background: #4e4e4e; + color: #f2f4f6; + height: 36px; + opacity: 1; + padding: 6px; + right: 0; + top: 0; + width: 36px; + } + + .fancybox-caption { + padding-left: 12px; + padding-right: 12px; + } + + @supports (padding: max(0px)) { + .fancybox-caption { + padding-left: max(12px, env(safe-area-inset-left)); + padding-right: max(12px, env(safe-area-inset-right)); + } + } +} +/* Share */ + +.fancybox-share { + background: #f4f4f4; + border-radius: 3px; + max-width: 90%; + padding: 30px; + text-align: center; +} + +.fancybox-share h1 { + color: #222; + font-size: 35px; + font-weight: 700; + margin: 0 0 20px 0; +} + +.fancybox-share p { + margin: 0; + padding: 0; +} + +.fancybox-share__button { + border: 0; + border-radius: 3px; + display: inline-block; + font-size: 14px; + font-weight: 700; + line-height: 40px; + margin: 0 5px 10px 5px; + min-width: 130px; + padding: 0 15px; + text-decoration: none; + transition: all .2s; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + white-space: nowrap; +} + +.fancybox-share__button:visited, +.fancybox-share__button:link { + color: #fff; +} + +.fancybox-share__button:hover { + text-decoration: none; +} + +.fancybox-share__button--fb { + background: #3b5998; +} + +.fancybox-share__button--fb:hover { + background: #344e86; +} + +.fancybox-share__button--pt { + background: #bd081d; +} + +.fancybox-share__button--pt:hover { + background: #aa0719; +} + +.fancybox-share__button--tw { + background: #1da1f2; +} + +.fancybox-share__button--tw:hover { + background: #0d95e8; +} + +.fancybox-share__button svg { + height: 25px; + margin-right: 7px; + position: relative; + top: -1px; + vertical-align: middle; + width: 25px; +} + +.fancybox-share__button svg path { + fill: #fff; +} + +.fancybox-share__input { + background: transparent; + border: 0; + border-bottom: 1px solid #d7d7d7; + border-radius: 0; + color: #5d5b5b; + font-size: 14px; + margin: 10px 0 0 0; + outline: none; + padding: 10px 15px; + width: 100%; +} +/* Thumbs */ + +.fancybox-thumbs { + background: #ddd; + bottom: 0; + display: none; + margin: 0; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + padding: 2px 2px 4px 2px; + position: absolute; + right: 0; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + top: 0; + width: 212px; + z-index: 99995; +} + +.fancybox-thumbs-x { + overflow-x: auto; + overflow-y: hidden; +} + +.fancybox-show-thumbs .fancybox-thumbs { + display: block; +} + +.fancybox-show-thumbs .fancybox-inner { + right: 212px; +} + +.fancybox-thumbs__list { + font-size: 0; + height: 100%; + list-style: none; + margin: 0; + overflow-x: hidden; + overflow-y: auto; + padding: 0; + position: absolute; + position: relative; + white-space: nowrap; + width: 100%; +} + +.fancybox-thumbs-x .fancybox-thumbs__list { + overflow: hidden; +} + +.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar { + width: 7px; +} + +.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-track { + background: #fff; + border-radius: 10px; + box-shadow: inset 0 0 6px rgba(0, 0, 0, .3); +} + +.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-thumb { + background: #2a2a2a; + border-radius: 10px; +} + +.fancybox-thumbs__list a { + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + background-color: rgba(0, 0, 0, .1); + background-position: center center; + background-repeat: no-repeat; + background-size: cover; + cursor: pointer; + float: left; + height: 75px; + margin: 2px; + max-height: calc(100% - 8px); + max-width: calc(50% - 4px); + outline: none; + overflow: hidden; + padding: 0; + position: relative; + -webkit-tap-highlight-color: transparent; + width: 100px; +} + +.fancybox-thumbs__list a::before { + border: 6px solid #ff5268; + bottom: 0; + content: ''; + left: 0; + opacity: 0; + position: absolute; + right: 0; + top: 0; + transition: all .2s cubic-bezier(.25, .46, .45, .94); + z-index: 99991; +} + +.fancybox-thumbs__list a:focus::before { + opacity: .5; +} + +.fancybox-thumbs__list a.fancybox-thumbs-active::before { + opacity: 1; +} + +/* Styling for Small-Screen Devices */ +@media all and (max-width: 576px) { + .fancybox-thumbs { + width: 110px; + } + + .fancybox-show-thumbs .fancybox-inner { + right: 110px; + } + + .fancybox-thumbs__list a { + max-width: calc(100% - 10px); + } +} \ No newline at end of file diff --git a/public/themes/custom/ubccs/js/vendor/fancybox/jquery.fancybox.js b/public/themes/custom/ubccs/js/vendor/fancybox/jquery.fancybox.js new file mode 100644 index 0000000..806b270 --- /dev/null +++ b/public/themes/custom/ubccs/js/vendor/fancybox/jquery.fancybox.js @@ -0,0 +1,5632 @@ +// ================================================== +// fancyBox v3.5.7 +// +// Licensed GPLv3 for open source use +// or fancyBox Commercial License for commercial use +// +// http://fancyapps.com/fancybox/ +// Copyright 2019 fancyApps +// +// ================================================== +(function (window, document, $, undefined) { + "use strict"; + + window.console = window.console || { + info: function (stuff) {} + }; + + // If there's no jQuery, fancyBox can't work + // ========================================= + + if (!$) { + return; + } + + // Check if fancyBox is already initialized + // ======================================== + + if ($.fn.fancybox) { + console.info("fancyBox already initialized"); + + return; + } + + // Private default settings + // ======================== + + var defaults = { + // Close existing modals + // Set this to false if you do not need to stack multiple instances + closeExisting: false, + + // Enable infinite gallery navigation + loop: false, + + // Horizontal space between slides + gutter: 50, + + // Enable keyboard navigation + keyboard: true, + + // Should allow caption to overlap the content + preventCaptionOverlap: true, + + // Should display navigation arrows at the screen edges + arrows: true, + + // Should display counter at the top left corner + infobar: true, + + // Should display close button (using `btnTpl.smallBtn` template) over the content + // Can be true, false, "auto" + // If "auto" - will be automatically enabled for "html", "inline" or "ajax" items + smallBtn: "auto", + + // Should display toolbar (buttons at the top) + // Can be true, false, "auto" + // If "auto" - will be automatically hidden if "smallBtn" is enabled + toolbar: "auto", + + // What buttons should appear in the top right corner. + // Buttons will be created using templates from `btnTpl` option + // and they will be placed into toolbar (class="fancybox-toolbar"` element) + buttons: [ + "zoom", + //"share", + "slideShow", + //"fullScreen", + //"download", + "thumbs", + "close" + ], + + // Detect "idle" time in seconds + idleTime: 3, + + // Disable right-click and use simple image protection for images + protect: false, + + // Shortcut to make content "modal" - disable keyboard navigtion, hide buttons, etc + modal: false, + + image: { + // Wait for images to load before displaying + // true - wait for image to load and then display; + // false - display thumbnail and load the full-sized image over top, + // requires predefined image dimensions (`data-width` and `data-height` attributes) + preload: false + }, + + ajax: { + // Object containing settings for ajax request + settings: { + // This helps to indicate that request comes from the modal + // Feel free to change naming + data: { + fancybox: true + } + } + }, + + iframe: { + // Iframe template + tpl: '', + + // Preload iframe before displaying it + // This allows to calculate iframe content width and height + // (note: Due to "Same Origin Policy", you can't get cross domain data). + preload: true, + + // Custom CSS styling for iframe wrapping element + // You can use this to set custom iframe dimensions + css: {}, + + // Iframe tag attributes + attr: { + scrolling: "auto" + } + }, + + // For HTML5 video only + video: { + tpl: 'download and watch with your favorite video player!' + + "", + format: "", // custom video format + autoStart: true + }, + + // Default content type if cannot be detected automatically + defaultType: "image", + + // Open/close animation type + // Possible values: + // false - disable + // "zoom" - zoom images from/to thumbnail + // "fade" + // "zoom-in-out" + // + animationEffect: "zoom", + + // Duration in ms for open/close animation + animationDuration: 366, + + // Should image change opacity while zooming + // If opacity is "auto", then opacity will be changed if image and thumbnail have different aspect ratios + zoomOpacity: "auto", + + // Transition effect between slides + // + // Possible values: + // false - disable + // "fade' + // "slide' + // "circular' + // "tube' + // "zoom-in-out' + // "rotate' + // + transitionEffect: "fade", + + // Duration in ms for transition animation + transitionDuration: 366, + + // Custom CSS class for slide element + slideClass: "", + + // Custom CSS class for layout + baseClass: "", + + // Base template for layout + baseTpl: '", + + // Loading indicator template + spinnerTpl: '
', + + // Error message template + errorTpl: '

{{ERROR}}

', + + btnTpl: { + download: '' + + '' + + "", + + zoom: '", + + close: '", + + // Arrows + arrowLeft: '", + + arrowRight: '", + + // This small close button will be appended to your html/inline/ajax content by default, + // if "smallBtn" option is not set to false + smallBtn: '" + }, + + // Container is injected into this element + parentEl: "body", + + // Hide browser vertical scrollbars; use at your own risk + hideScrollbar: true, + + // Focus handling + // ============== + + // Try to focus on the first focusable element after opening + autoFocus: true, + + // Put focus back to active element after closing + backFocus: true, + + // Do not let user to focus on element outside modal content + trapFocus: true, + + // Module specific options + // ======================= + + fullScreen: { + autoStart: false + }, + + // Set `touch: false` to disable panning/swiping + touch: { + vertical: true, // Allow to drag content vertically + momentum: true // Continue movement after releasing mouse/touch when panning + }, + + // Hash value when initializing manually, + // set `false` to disable hash change + hash: null, + + // Customize or add new media types + // Example: + /* + media : { + youtube : { + params : { + autoplay : 0 + } + } + } + */ + media: {}, + + slideShow: { + autoStart: false, + speed: 3000 + }, + + thumbs: { + autoStart: false, // Display thumbnails on opening + hideOnClose: true, // Hide thumbnail grid when closing animation starts + parentEl: ".fancybox-container", // Container is injected into this element + axis: "y" // Vertical (y) or horizontal (x) scrolling + }, + + // Use mousewheel to navigate gallery + // If 'auto' - enabled for images only + wheel: "auto", + + // Callbacks + //========== + + // See Documentation/API/Events for more information + // Example: + /* + afterShow: function( instance, current ) { + console.info( 'Clicked element:' ); + console.info( current.opts.$orig ); + } + */ + + onInit: $.noop, // When instance has been initialized + + beforeLoad: $.noop, // Before the content of a slide is being loaded + afterLoad: $.noop, // When the content of a slide is done loading + + beforeShow: $.noop, // Before open animation starts + afterShow: $.noop, // When content is done loading and animating + + beforeClose: $.noop, // Before the instance attempts to close. Return false to cancel the close. + afterClose: $.noop, // After instance has been closed + + onActivate: $.noop, // When instance is brought to front + onDeactivate: $.noop, // When other instance has been activated + + // Interaction + // =========== + + // Use options below to customize taken action when user clicks or double clicks on the fancyBox area, + // each option can be string or method that returns value. + // + // Possible values: + // "close" - close instance + // "next" - move to next gallery item + // "nextOrClose" - move to next gallery item or close if gallery has only one item + // "toggleControls" - show/hide controls + // "zoom" - zoom image (if loaded) + // false - do nothing + + // Clicked on the content + clickContent: function (current, event) { + return current.type === "image" ? "zoom" : false; + }, + + // Clicked on the slide + clickSlide: "close", + + // Clicked on the background (backdrop) element; + // if you have not changed the layout, then most likely you need to use `clickSlide` option + clickOutside: "close", + + // Same as previous two, but for double click + dblclickContent: false, + dblclickSlide: false, + dblclickOutside: false, + + // Custom options when mobile device is detected + // ============================================= + + mobile: { + preventCaptionOverlap: false, + idleTime: false, + clickContent: function (current, event) { + return current.type === "image" ? "toggleControls" : false; + }, + clickSlide: function (current, event) { + return current.type === "image" ? "toggleControls" : "close"; + }, + dblclickContent: function (current, event) { + return current.type === "image" ? "zoom" : false; + }, + dblclickSlide: function (current, event) { + return current.type === "image" ? "zoom" : false; + } + }, + + // Internationalization + // ==================== + + lang: "en", + i18n: { + en: { + CLOSE: "Close", + NEXT: "Next", + PREV: "Previous", + ERROR: "The requested content cannot be loaded.
Please try again later.", + PLAY_START: "Start slideshow", + PLAY_STOP: "Pause slideshow", + FULL_SCREEN: "Full screen", + THUMBS: "Thumbnails", + DOWNLOAD: "Download", + SHARE: "Share", + ZOOM: "Zoom" + }, + de: { + CLOSE: "Schließen", + NEXT: "Weiter", + PREV: "Zurück", + ERROR: "Die angeforderten Daten konnten nicht geladen werden.
Bitte versuchen Sie es später nochmal.", + PLAY_START: "Diaschau starten", + PLAY_STOP: "Diaschau beenden", + FULL_SCREEN: "Vollbild", + THUMBS: "Vorschaubilder", + DOWNLOAD: "Herunterladen", + SHARE: "Teilen", + ZOOM: "Vergrößern" + } + } + }; + + // Few useful variables and methods + // ================================ + + var $W = $(window); + var $D = $(document); + + var called = 0; + + // Check if an object is a jQuery object and not a native JavaScript object + // ======================================================================== + var isQuery = function (obj) { + return obj && obj.hasOwnProperty && obj instanceof $; + }; + + // Handle multiple browsers for "requestAnimationFrame" and "cancelAnimationFrame" + // =============================================================================== + var requestAFrame = (function () { + return ( + window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + // if all else fails, use setTimeout + function (callback) { + return window.setTimeout(callback, 1000 / 60); + } + ); + })(); + + var cancelAFrame = (function () { + return ( + window.cancelAnimationFrame || + window.webkitCancelAnimationFrame || + window.mozCancelAnimationFrame || + window.oCancelAnimationFrame || + function (id) { + window.clearTimeout(id); + } + ); + })(); + + // Detect the supported transition-end event property name + // ======================================================= + var transitionEnd = (function () { + var el = document.createElement("fakeelement"), + t; + + var transitions = { + transition: "transitionend", + OTransition: "oTransitionEnd", + MozTransition: "transitionend", + WebkitTransition: "webkitTransitionEnd" + }; + + for (t in transitions) { + if (el.style[t] !== undefined) { + return transitions[t]; + } + } + + return "transitionend"; + })(); + + // Force redraw on an element. + // This helps in cases where the browser doesn't redraw an updated element properly + // ================================================================================ + var forceRedraw = function ($el) { + return $el && $el.length && $el[0].offsetHeight; + }; + + // Exclude array (`buttons`) options from deep merging + // =================================================== + var mergeOpts = function (opts1, opts2) { + var rez = $.extend(true, {}, opts1, opts2); + + $.each(opts2, function (key, value) { + if ($.isArray(value)) { + rez[key] = value; + } + }); + + return rez; + }; + + // How much of an element is visible in viewport + // ============================================= + + var inViewport = function (elem) { + var elemCenter, rez; + + if (!elem || elem.ownerDocument !== document) { + return false; + } + + $(".fancybox-container").css("pointer-events", "none"); + + elemCenter = { + x: elem.getBoundingClientRect().left + elem.offsetWidth / 2, + y: elem.getBoundingClientRect().top + elem.offsetHeight / 2 + }; + + rez = document.elementFromPoint(elemCenter.x, elemCenter.y) === elem; + + $(".fancybox-container").css("pointer-events", ""); + + return rez; + }; + + // Class definition + // ================ + + var FancyBox = function (content, opts, index) { + var self = this; + + self.opts = mergeOpts({ + index: index + }, $.fancybox.defaults); + + if ($.isPlainObject(opts)) { + self.opts = mergeOpts(self.opts, opts); + } + + if ($.fancybox.isMobile) { + self.opts = mergeOpts(self.opts, self.opts.mobile); + } + + self.id = self.opts.id || ++called; + + self.currIndex = parseInt(self.opts.index, 10) || 0; + self.prevIndex = null; + + self.prevPos = null; + self.currPos = 0; + + self.firstRun = true; + + // All group items + self.group = []; + + // Existing slides (for current, next and previous gallery items) + self.slides = {}; + + // Create group elements + self.addContent(content); + + if (!self.group.length) { + return; + } + + self.init(); + }; + + $.extend(FancyBox.prototype, { + // Create DOM structure + // ==================== + + init: function () { + var self = this, + firstItem = self.group[self.currIndex], + firstItemOpts = firstItem.opts, + $container, + buttonStr; + + if (firstItemOpts.closeExisting) { + $.fancybox.close(true); + } + + // Hide scrollbars + // =============== + + $("body").addClass("fancybox-active"); + + if ( + !$.fancybox.getInstance() && + firstItemOpts.hideScrollbar !== false && + !$.fancybox.isMobile && + document.body.scrollHeight > window.innerHeight + ) { + $("head").append( + '" + ); + + $("body").addClass("compensate-for-scrollbar"); + } + + // Build html markup and set references + // ==================================== + + // Build html code for buttons and insert into main template + buttonStr = ""; + + $.each(firstItemOpts.buttons, function (index, value) { + buttonStr += firstItemOpts.btnTpl[value] || ""; + }); + + // Create markup from base template, it will be initially hidden to + // avoid unnecessary work like painting while initializing is not complete + $container = $( + self.translate( + self, + firstItemOpts.baseTpl + .replace("{{buttons}}", buttonStr) + .replace("{{arrows}}", firstItemOpts.btnTpl.arrowLeft + firstItemOpts.btnTpl.arrowRight) + ) + ) + .attr("id", "fancybox-container-" + self.id) + .addClass(firstItemOpts.baseClass) + .data("FancyBox", self) + .appendTo(firstItemOpts.parentEl); + + // Create object holding references to jQuery wrapped nodes + self.$refs = { + container: $container + }; + + ["bg", "inner", "infobar", "toolbar", "stage", "caption", "navigation"].forEach(function (item) { + self.$refs[item] = $container.find(".fancybox-" + item); + }); + + self.trigger("onInit"); + + // Enable events, deactive previous instances + self.activate(); + + // Build slides, load and reveal content + self.jumpTo(self.currIndex); + }, + + // Simple i18n support - replaces object keys found in template + // with corresponding values + // ============================================================ + + translate: function (obj, str) { + var arr = obj.opts.i18n[obj.opts.lang] || obj.opts.i18n.en; + + return str.replace(/\{\{(\w+)\}\}/g, function (match, n) { + return arr[n] === undefined ? match : arr[n]; + }); + }, + + // Populate current group with fresh content + // Check if each object has valid type and content + // =============================================== + + addContent: function (content) { + var self = this, + items = $.makeArray(content), + thumbs; + + $.each(items, function (i, item) { + var obj = {}, + opts = {}, + $item, + type, + found, + src, + srcParts; + + // Step 1 - Make sure we have an object + // ==================================== + + if ($.isPlainObject(item)) { + // We probably have manual usage here, something like + // $.fancybox.open( [ { src : "image.jpg", type : "image" } ] ) + + obj = item; + opts = item.opts || item; + } else if ($.type(item) === "object" && $(item).length) { + // Here we probably have jQuery collection returned by some selector + $item = $(item); + + // Support attributes like `data-options='{"touch" : false}'` and `data-touch='false'` + opts = $item.data() || {}; + opts = $.extend(true, {}, opts, opts.options); + + // Here we store clicked element + opts.$orig = $item; + + obj.src = self.opts.src || opts.src || $item.attr("href"); + + // Assume that simple syntax is used, for example: + // `$.fancybox.open( $("#test"), {} );` + if (!obj.type && !obj.src) { + obj.type = "inline"; + obj.src = item; + } + } else { + // Assume we have a simple html code, for example: + // $.fancybox.open( '

Hi!

' ); + obj = { + type: "html", + src: item + "" + }; + } + + // Each gallery object has full collection of options + obj.opts = $.extend(true, {}, self.opts, opts); + + // Do not merge buttons array + if ($.isArray(opts.buttons)) { + obj.opts.buttons = opts.buttons; + } + + if ($.fancybox.isMobile && obj.opts.mobile) { + obj.opts = mergeOpts(obj.opts, obj.opts.mobile); + } + + // Step 2 - Make sure we have content type, if not - try to guess + // ============================================================== + + type = obj.type || obj.opts.type; + src = obj.src || ""; + + if (!type && src) { + if ((found = src.match(/\.(mp4|mov|ogv|webm)((\?|#).*)?$/i))) { + type = "video"; + + if (!obj.opts.video.format) { + obj.opts.video.format = "video/" + (found[1] === "ogv" ? "ogg" : found[1]); + } + } else if (src.match(/(^data:image\/[a-z0-9+\/=]*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg|ico)((\?|#).*)?$)/i)) { + type = "image"; + } else if (src.match(/\.(pdf)((\?|#).*)?$/i)) { + type = "iframe"; + obj = $.extend(true, obj, { + contentType: "pdf", + opts: { + iframe: { + preload: false + } + } + }); + } else if (src.charAt(0) === "#") { + type = "inline"; + } + } + + if (type) { + obj.type = type; + } else { + self.trigger("objectNeedsType", obj); + } + + if (!obj.contentType) { + obj.contentType = $.inArray(obj.type, ["html", "inline", "ajax"]) > -1 ? "html" : obj.type; + } + + // Step 3 - Some adjustments + // ========================= + + obj.index = self.group.length; + + if (obj.opts.smallBtn == "auto") { + obj.opts.smallBtn = $.inArray(obj.type, ["html", "inline", "ajax"]) > -1; + } + + if (obj.opts.toolbar === "auto") { + obj.opts.toolbar = !obj.opts.smallBtn; + } + + // Find thumbnail image, check if exists and if is in the viewport + obj.$thumb = obj.opts.$thumb || null; + + if (obj.opts.$trigger && obj.index === self.opts.index) { + obj.$thumb = obj.opts.$trigger.find("img:first"); + + if (obj.$thumb.length) { + obj.opts.$orig = obj.opts.$trigger; + } + } + + if (!(obj.$thumb && obj.$thumb.length) && obj.opts.$orig) { + obj.$thumb = obj.opts.$orig.find("img:first"); + } + + if (obj.$thumb && !obj.$thumb.length) { + obj.$thumb = null; + } + + obj.thumb = obj.opts.thumb || (obj.$thumb ? obj.$thumb[0].src : null); + + // "caption" is a "special" option, it can be used to customize caption per gallery item + if ($.type(obj.opts.caption) === "function") { + obj.opts.caption = obj.opts.caption.apply(item, [self, obj]); + } + + if ($.type(self.opts.caption) === "function") { + obj.opts.caption = self.opts.caption.apply(item, [self, obj]); + } + + // Make sure we have caption as a string or jQuery object + if (!(obj.opts.caption instanceof $)) { + obj.opts.caption = obj.opts.caption === undefined ? "" : obj.opts.caption + ""; + } + + // Check if url contains "filter" used to filter the content + // Example: "ajax.html #something" + if (obj.type === "ajax") { + srcParts = src.split(/\s+/, 2); + + if (srcParts.length > 1) { + obj.src = srcParts.shift(); + + obj.opts.filter = srcParts.shift(); + } + } + + // Hide all buttons and disable interactivity for modal items + if (obj.opts.modal) { + obj.opts = $.extend(true, obj.opts, { + trapFocus: true, + // Remove buttons + infobar: 0, + toolbar: 0, + + smallBtn: 0, + + // Disable keyboard navigation + keyboard: 0, + + // Disable some modules + slideShow: 0, + fullScreen: 0, + thumbs: 0, + touch: 0, + + // Disable click event handlers + clickContent: false, + clickSlide: false, + clickOutside: false, + dblclickContent: false, + dblclickSlide: false, + dblclickOutside: false + }); + } + + // Step 4 - Add processed object to group + // ====================================== + + self.group.push(obj); + }); + + // Update controls if gallery is already opened + if (Object.keys(self.slides).length) { + self.updateControls(); + + // Update thumbnails, if needed + thumbs = self.Thumbs; + + if (thumbs && thumbs.isActive) { + thumbs.create(); + + thumbs.focus(); + } + } + }, + + // Attach an event handler functions for: + // - navigation buttons + // - browser scrolling, resizing; + // - focusing + // - keyboard + // - detecting inactivity + // ====================================== + + addEvents: function () { + var self = this; + + self.removeEvents(); + + // Make navigation elements clickable + // ================================== + + self.$refs.container + .on("click.fb-close", "[data-fancybox-close]", function (e) { + e.stopPropagation(); + e.preventDefault(); + + self.close(e); + }) + .on("touchstart.fb-prev click.fb-prev", "[data-fancybox-prev]", function (e) { + e.stopPropagation(); + e.preventDefault(); + + self.previous(); + }) + .on("touchstart.fb-next click.fb-next", "[data-fancybox-next]", function (e) { + e.stopPropagation(); + e.preventDefault(); + + self.next(); + }) + .on("click.fb", "[data-fancybox-zoom]", function (e) { + // Click handler for zoom button + self[self.isScaledDown() ? "scaleToActual" : "scaleToFit"](); + }); + + // Handle page scrolling and browser resizing + // ========================================== + + $W.on("orientationchange.fb resize.fb", function (e) { + if (e && e.originalEvent && e.originalEvent.type === "resize") { + if (self.requestId) { + cancelAFrame(self.requestId); + } + + self.requestId = requestAFrame(function () { + self.update(e); + }); + } else { + if (self.current && self.current.type === "iframe") { + self.$refs.stage.hide(); + } + + setTimeout( + function () { + self.$refs.stage.show(); + + self.update(e); + }, + $.fancybox.isMobile ? 600 : 250 + ); + } + }); + + $D.on("keydown.fb", function (e) { + var instance = $.fancybox ? $.fancybox.getInstance() : null, + current = instance.current, + keycode = e.keyCode || e.which; + + // Trap keyboard focus inside of the modal + // ======================================= + + if (keycode == 9) { + if (current.opts.trapFocus) { + self.focus(e); + } + + return; + } + + // Enable keyboard navigation + // ========================== + + if (!current.opts.keyboard || e.ctrlKey || e.altKey || e.shiftKey || $(e.target).is("input,textarea,video,audio,select")) { + return; + } + + // Backspace and Esc keys + if (keycode === 8 || keycode === 27) { + e.preventDefault(); + + self.close(e); + + return; + } + + // Left arrow and Up arrow + if (keycode === 37 || keycode === 38) { + e.preventDefault(); + + self.previous(); + + return; + } + + // Righ arrow and Down arrow + if (keycode === 39 || keycode === 40) { + e.preventDefault(); + + self.next(); + + return; + } + + self.trigger("afterKeydown", e, keycode); + }); + + // Hide controls after some inactivity period + if (self.group[self.currIndex].opts.idleTime) { + self.idleSecondsCounter = 0; + + $D.on( + "mousemove.fb-idle mouseleave.fb-idle mousedown.fb-idle touchstart.fb-idle touchmove.fb-idle scroll.fb-idle keydown.fb-idle", + function (e) { + self.idleSecondsCounter = 0; + + if (self.isIdle) { + self.showControls(); + } + + self.isIdle = false; + } + ); + + self.idleInterval = window.setInterval(function () { + self.idleSecondsCounter++; + + if (self.idleSecondsCounter >= self.group[self.currIndex].opts.idleTime && !self.isDragging) { + self.isIdle = true; + self.idleSecondsCounter = 0; + + self.hideControls(); + } + }, 1000); + } + }, + + // Remove events added by the core + // =============================== + + removeEvents: function () { + var self = this; + + $W.off("orientationchange.fb resize.fb"); + $D.off("keydown.fb .fb-idle"); + + this.$refs.container.off(".fb-close .fb-prev .fb-next"); + + if (self.idleInterval) { + window.clearInterval(self.idleInterval); + + self.idleInterval = null; + } + }, + + // Change to previous gallery item + // =============================== + + previous: function (duration) { + return this.jumpTo(this.currPos - 1, duration); + }, + + // Change to next gallery item + // =========================== + + next: function (duration) { + return this.jumpTo(this.currPos + 1, duration); + }, + + // Switch to selected gallery item + // =============================== + + jumpTo: function (pos, duration) { + var self = this, + groupLen = self.group.length, + firstRun, + isMoved, + loop, + current, + previous, + slidePos, + stagePos, + prop, + diff; + + if (self.isDragging || self.isClosing || (self.isAnimating && self.firstRun)) { + return; + } + + // Should loop? + pos = parseInt(pos, 10); + loop = self.current ? self.current.opts.loop : self.opts.loop; + + if (!loop && (pos < 0 || pos >= groupLen)) { + return false; + } + + // Check if opening for the first time; this helps to speed things up + firstRun = self.firstRun = !Object.keys(self.slides).length; + + // Create slides + previous = self.current; + + self.prevIndex = self.currIndex; + self.prevPos = self.currPos; + + current = self.createSlide(pos); + + if (groupLen > 1) { + if (loop || current.index < groupLen - 1) { + self.createSlide(pos + 1); + } + + if (loop || current.index > 0) { + self.createSlide(pos - 1); + } + } + + self.current = current; + self.currIndex = current.index; + self.currPos = current.pos; + + self.trigger("beforeShow", firstRun); + + self.updateControls(); + + // Validate duration length + current.forcedDuration = undefined; + + if ($.isNumeric(duration)) { + current.forcedDuration = duration; + } else { + duration = current.opts[firstRun ? "animationDuration" : "transitionDuration"]; + } + + duration = parseInt(duration, 10); + + // Check if user has swiped the slides or if still animating + isMoved = self.isMoved(current); + + // Make sure current slide is visible + current.$slide.addClass("fancybox-slide--current"); + + // Fresh start - reveal container, current slide and start loading content + if (firstRun) { + if (current.opts.animationEffect && duration) { + self.$refs.container.css("transition-duration", duration + "ms"); + } + + self.$refs.container.addClass("fancybox-is-open").trigger("focus"); + + // Attempt to load content into slide + // This will later call `afterLoad` -> `revealContent` + self.loadSlide(current); + + self.preload("image"); + + return; + } + + // Get actual slide/stage positions (before cleaning up) + slidePos = $.fancybox.getTranslate(previous.$slide); + stagePos = $.fancybox.getTranslate(self.$refs.stage); + + // Clean up all slides + $.each(self.slides, function (index, slide) { + $.fancybox.stop(slide.$slide, true); + }); + + if (previous.pos !== current.pos) { + previous.isComplete = false; + } + + previous.$slide.removeClass("fancybox-slide--complete fancybox-slide--current"); + + // If slides are out of place, then animate them to correct position + if (isMoved) { + // Calculate horizontal swipe distance + diff = slidePos.left - (previous.pos * slidePos.width + previous.pos * previous.opts.gutter); + + $.each(self.slides, function (index, slide) { + slide.$slide.removeClass("fancybox-animated").removeClass(function (index, className) { + return (className.match(/(^|\s)fancybox-fx-\S+/g) || []).join(" "); + }); + + // Make sure that each slide is in equal distance + // This is mostly needed for freshly added slides, because they are not yet positioned + var leftPos = slide.pos * slidePos.width + slide.pos * slide.opts.gutter; + + $.fancybox.setTranslate(slide.$slide, { + top: 0, + left: leftPos - stagePos.left + diff + }); + + if (slide.pos !== current.pos) { + slide.$slide.addClass("fancybox-slide--" + (slide.pos > current.pos ? "next" : "previous")); + } + + // Redraw to make sure that transition will start + forceRedraw(slide.$slide); + + // Animate the slide + $.fancybox.animate( + slide.$slide, { + top: 0, + left: (slide.pos - current.pos) * slidePos.width + (slide.pos - current.pos) * slide.opts.gutter + }, + duration, + function () { + slide.$slide + .css({ + transform: "", + opacity: "" + }) + .removeClass("fancybox-slide--next fancybox-slide--previous"); + + if (slide.pos === self.currPos) { + self.complete(); + } + } + ); + }); + } else if (duration && current.opts.transitionEffect) { + // Set transition effect for previously active slide + prop = "fancybox-animated fancybox-fx-" + current.opts.transitionEffect; + + previous.$slide.addClass("fancybox-slide--" + (previous.pos > current.pos ? "next" : "previous")); + + $.fancybox.animate( + previous.$slide, + prop, + duration, + function () { + previous.$slide.removeClass(prop).removeClass("fancybox-slide--next fancybox-slide--previous"); + }, + false + ); + } + + if (current.isLoaded) { + self.revealContent(current); + } else { + self.loadSlide(current); + } + + self.preload("image"); + }, + + // Create new "slide" element + // These are gallery items that are actually added to DOM + // ======================================================= + + createSlide: function (pos) { + var self = this, + $slide, + index; + + index = pos % self.group.length; + index = index < 0 ? self.group.length + index : index; + + if (!self.slides[pos] && self.group[index]) { + $slide = $('
').appendTo(self.$refs.stage); + + self.slides[pos] = $.extend(true, {}, self.group[index], { + pos: pos, + $slide: $slide, + isLoaded: false + }); + + self.updateSlide(self.slides[pos]); + } + + return self.slides[pos]; + }, + + // Scale image to the actual size of the image; + // x and y values should be relative to the slide + // ============================================== + + scaleToActual: function (x, y, duration) { + var self = this, + current = self.current, + $content = current.$content, + canvasWidth = $.fancybox.getTranslate(current.$slide).width, + canvasHeight = $.fancybox.getTranslate(current.$slide).height, + newImgWidth = current.width, + newImgHeight = current.height, + imgPos, + posX, + posY, + scaleX, + scaleY; + + if (self.isAnimating || self.isMoved() || !$content || !(current.type == "image" && current.isLoaded && !current.hasError)) { + return; + } + + self.isAnimating = true; + + $.fancybox.stop($content); + + x = x === undefined ? canvasWidth * 0.5 : x; + y = y === undefined ? canvasHeight * 0.5 : y; + + imgPos = $.fancybox.getTranslate($content); + + imgPos.top -= $.fancybox.getTranslate(current.$slide).top; + imgPos.left -= $.fancybox.getTranslate(current.$slide).left; + + scaleX = newImgWidth / imgPos.width; + scaleY = newImgHeight / imgPos.height; + + // Get center position for original image + posX = canvasWidth * 0.5 - newImgWidth * 0.5; + posY = canvasHeight * 0.5 - newImgHeight * 0.5; + + // Make sure image does not move away from edges + if (newImgWidth > canvasWidth) { + posX = imgPos.left * scaleX - (x * scaleX - x); + + if (posX > 0) { + posX = 0; + } + + if (posX < canvasWidth - newImgWidth) { + posX = canvasWidth - newImgWidth; + } + } + + if (newImgHeight > canvasHeight) { + posY = imgPos.top * scaleY - (y * scaleY - y); + + if (posY > 0) { + posY = 0; + } + + if (posY < canvasHeight - newImgHeight) { + posY = canvasHeight - newImgHeight; + } + } + + self.updateCursor(newImgWidth, newImgHeight); + + $.fancybox.animate( + $content, { + top: posY, + left: posX, + scaleX: scaleX, + scaleY: scaleY + }, + duration || 366, + function () { + self.isAnimating = false; + } + ); + + // Stop slideshow + if (self.SlideShow && self.SlideShow.isActive) { + self.SlideShow.stop(); + } + }, + + // Scale image to fit inside parent element + // ======================================== + + scaleToFit: function (duration) { + var self = this, + current = self.current, + $content = current.$content, + end; + + if (self.isAnimating || self.isMoved() || !$content || !(current.type == "image" && current.isLoaded && !current.hasError)) { + return; + } + + self.isAnimating = true; + + $.fancybox.stop($content); + + end = self.getFitPos(current); + + self.updateCursor(end.width, end.height); + + $.fancybox.animate( + $content, { + top: end.top, + left: end.left, + scaleX: end.width / $content.width(), + scaleY: end.height / $content.height() + }, + duration || 366, + function () { + self.isAnimating = false; + } + ); + }, + + // Calculate image size to fit inside viewport + // =========================================== + + getFitPos: function (slide) { + var self = this, + $content = slide.$content, + $slide = slide.$slide, + width = slide.width || slide.opts.width, + height = slide.height || slide.opts.height, + maxWidth, + maxHeight, + minRatio, + aspectRatio, + rez = {}; + + if (!slide.isLoaded || !$content || !$content.length) { + return false; + } + + maxWidth = $.fancybox.getTranslate(self.$refs.stage).width; + maxHeight = $.fancybox.getTranslate(self.$refs.stage).height; + + maxWidth -= + parseFloat($slide.css("paddingLeft")) + + parseFloat($slide.css("paddingRight")) + + parseFloat($content.css("marginLeft")) + + parseFloat($content.css("marginRight")); + + maxHeight -= + parseFloat($slide.css("paddingTop")) + + parseFloat($slide.css("paddingBottom")) + + parseFloat($content.css("marginTop")) + + parseFloat($content.css("marginBottom")); + + if (!width || !height) { + width = maxWidth; + height = maxHeight; + } + + minRatio = Math.min(1, maxWidth / width, maxHeight / height); + + width = minRatio * width; + height = minRatio * height; + + // Adjust width/height to precisely fit into container + if (width > maxWidth - 0.5) { + width = maxWidth; + } + + if (height > maxHeight - 0.5) { + height = maxHeight; + } + + if (slide.type === "image") { + rez.top = Math.floor((maxHeight - height) * 0.5) + parseFloat($slide.css("paddingTop")); + rez.left = Math.floor((maxWidth - width) * 0.5) + parseFloat($slide.css("paddingLeft")); + } else if (slide.contentType === "video") { + // Force aspect ratio for the video + // "I say the whole world must learn of our peaceful ways… by force!" + aspectRatio = slide.opts.width && slide.opts.height ? width / height : slide.opts.ratio || 16 / 9; + + if (height > width / aspectRatio) { + height = width / aspectRatio; + } else if (width > height * aspectRatio) { + width = height * aspectRatio; + } + } + + rez.width = width; + rez.height = height; + + return rez; + }, + + // Update content size and position for all slides + // ============================================== + + update: function (e) { + var self = this; + + $.each(self.slides, function (key, slide) { + self.updateSlide(slide, e); + }); + }, + + // Update slide content position and size + // ====================================== + + updateSlide: function (slide, e) { + var self = this, + $content = slide && slide.$content, + width = slide.width || slide.opts.width, + height = slide.height || slide.opts.height, + $slide = slide.$slide; + + // First, prevent caption overlap, if needed + self.adjustCaption(slide); + + // Then resize content to fit inside the slide + if ($content && (width || height || slide.contentType === "video") && !slide.hasError) { + $.fancybox.stop($content); + + $.fancybox.setTranslate($content, self.getFitPos(slide)); + + if (slide.pos === self.currPos) { + self.isAnimating = false; + + self.updateCursor(); + } + } + + // Then some adjustments + self.adjustLayout(slide); + + if ($slide.length) { + $slide.trigger("refresh"); + + if (slide.pos === self.currPos) { + self.$refs.toolbar + .add(self.$refs.navigation.find(".fancybox-button--arrow_right")) + .toggleClass("compensate-for-scrollbar", $slide.get(0).scrollHeight > $slide.get(0).clientHeight); + } + } + + self.trigger("onUpdate", slide, e); + }, + + // Horizontally center slide + // ========================= + + centerSlide: function (duration) { + var self = this, + current = self.current, + $slide = current.$slide; + + if (self.isClosing || !current) { + return; + } + + $slide.siblings().css({ + transform: "", + opacity: "" + }); + + $slide + .parent() + .children() + .removeClass("fancybox-slide--previous fancybox-slide--next"); + + $.fancybox.animate( + $slide, { + top: 0, + left: 0, + opacity: 1 + }, + duration === undefined ? 0 : duration, + function () { + // Clean up + $slide.css({ + transform: "", + opacity: "" + }); + + if (!current.isComplete) { + self.complete(); + } + }, + false + ); + }, + + // Check if current slide is moved (swiped) + // ======================================== + + isMoved: function (slide) { + var current = slide || this.current, + slidePos, + stagePos; + + if (!current) { + return false; + } + + stagePos = $.fancybox.getTranslate(this.$refs.stage); + slidePos = $.fancybox.getTranslate(current.$slide); + + return ( + !current.$slide.hasClass("fancybox-animated") && + (Math.abs(slidePos.top - stagePos.top) > 0.5 || Math.abs(slidePos.left - stagePos.left) > 0.5) + ); + }, + + // Update cursor style depending if content can be zoomed + // ====================================================== + + updateCursor: function (nextWidth, nextHeight) { + var self = this, + current = self.current, + $container = self.$refs.container, + canPan, + isZoomable; + + if (!current || self.isClosing || !self.Guestures) { + return; + } + + $container.removeClass("fancybox-is-zoomable fancybox-can-zoomIn fancybox-can-zoomOut fancybox-can-swipe fancybox-can-pan"); + + canPan = self.canPan(nextWidth, nextHeight); + + isZoomable = canPan ? true : self.isZoomable(); + + $container.toggleClass("fancybox-is-zoomable", isZoomable); + + $("[data-fancybox-zoom]").prop("disabled", !isZoomable); + + if (canPan) { + $container.addClass("fancybox-can-pan"); + } else if ( + isZoomable && + (current.opts.clickContent === "zoom" || ($.isFunction(current.opts.clickContent) && current.opts.clickContent(current) == "zoom")) + ) { + $container.addClass("fancybox-can-zoomIn"); + } else if (current.opts.touch && (current.opts.touch.vertical || self.group.length > 1) && current.contentType !== "video") { + $container.addClass("fancybox-can-swipe"); + } + }, + + // Check if current slide is zoomable + // ================================== + + isZoomable: function () { + var self = this, + current = self.current, + fitPos; + + // Assume that slide is zoomable if: + // - image is still loading + // - actual size of the image is smaller than available area + if (current && !self.isClosing && current.type === "image" && !current.hasError) { + if (!current.isLoaded) { + return true; + } + + fitPos = self.getFitPos(current); + + if (fitPos && (current.width > fitPos.width || current.height > fitPos.height)) { + return true; + } + } + + return false; + }, + + // Check if current image dimensions are smaller than actual + // ========================================================= + + isScaledDown: function (nextWidth, nextHeight) { + var self = this, + rez = false, + current = self.current, + $content = current.$content; + + if (nextWidth !== undefined && nextHeight !== undefined) { + rez = nextWidth < current.width && nextHeight < current.height; + } else if ($content) { + rez = $.fancybox.getTranslate($content); + rez = rez.width < current.width && rez.height < current.height; + } + + return rez; + }, + + // Check if image dimensions exceed parent element + // =============================================== + + canPan: function (nextWidth, nextHeight) { + var self = this, + current = self.current, + pos = null, + rez = false; + + if (current.type === "image" && (current.isComplete || (nextWidth && nextHeight)) && !current.hasError) { + rez = self.getFitPos(current); + + if (nextWidth !== undefined && nextHeight !== undefined) { + pos = { + width: nextWidth, + height: nextHeight + }; + } else if (current.isComplete) { + pos = $.fancybox.getTranslate(current.$content); + } + + if (pos && rez) { + rez = Math.abs(pos.width - rez.width) > 1.5 || Math.abs(pos.height - rez.height) > 1.5; + } + } + + return rez; + }, + + // Load content into the slide + // =========================== + + loadSlide: function (slide) { + var self = this, + type, + $slide, + ajaxLoad; + + if (slide.isLoading || slide.isLoaded) { + return; + } + + slide.isLoading = true; + + if (self.trigger("beforeLoad", slide) === false) { + slide.isLoading = false; + + return false; + } + + type = slide.type; + $slide = slide.$slide; + + $slide + .off("refresh") + .trigger("onReset") + .addClass(slide.opts.slideClass); + + // Create content depending on the type + switch (type) { + case "image": + self.setImage(slide); + + break; + + case "iframe": + self.setIframe(slide); + + break; + + case "html": + self.setContent(slide, slide.src || slide.content); + + break; + + case "video": + self.setContent( + slide, + slide.opts.video.tpl + .replace(/\{\{src\}\}/gi, slide.src) + .replace("{{format}}", slide.opts.videoFormat || slide.opts.video.format || "") + .replace("{{poster}}", slide.thumb || "") + ); + + break; + + case "inline": + if ($(slide.src).length) { + self.setContent(slide, $(slide.src)); + } else { + self.setError(slide); + } + + break; + + case "ajax": + self.showLoading(slide); + + ajaxLoad = $.ajax( + $.extend({}, slide.opts.ajax.settings, { + url: slide.src, + success: function (data, textStatus) { + if (textStatus === "success") { + self.setContent(slide, data); + } + }, + error: function (jqXHR, textStatus) { + if (jqXHR && textStatus !== "abort") { + self.setError(slide); + } + } + }) + ); + + $slide.one("onReset", function () { + ajaxLoad.abort(); + }); + + break; + + default: + self.setError(slide); + + break; + } + + return true; + }, + + // Use thumbnail image, if possible + // ================================ + + setImage: function (slide) { + var self = this, + ghost; + + // Check if need to show loading icon + setTimeout(function () { + var $img = slide.$image; + + if (!self.isClosing && slide.isLoading && (!$img || !$img.length || !$img[0].complete) && !slide.hasError) { + self.showLoading(slide); + } + }, 50); + + //Check if image has srcset + self.checkSrcset(slide); + + // This will be wrapper containing both ghost and actual image + slide.$content = $('
') + .addClass("fancybox-is-hidden") + .appendTo(slide.$slide.addClass("fancybox-slide--image")); + + // If we have a thumbnail, we can display it while actual image is loading + // Users will not stare at black screen and actual image will appear gradually + if (slide.opts.preload !== false && slide.opts.width && slide.opts.height && slide.thumb) { + slide.width = slide.opts.width; + slide.height = slide.opts.height; + + ghost = document.createElement("img"); + + ghost.onerror = function () { + $(this).remove(); + + slide.$ghost = null; + }; + + ghost.onload = function () { + self.afterLoad(slide); + }; + + slide.$ghost = $(ghost) + .addClass("fancybox-image") + .appendTo(slide.$content) + .attr("src", slide.thumb); + } + + // Start loading actual image + self.setBigImage(slide); + }, + + // Check if image has srcset and get the source + // ============================================ + checkSrcset: function (slide) { + var srcset = slide.opts.srcset || slide.opts.image.srcset, + found, + temp, + pxRatio, + windowWidth; + + // If we have "srcset", then we need to find first matching "src" value. + // This is necessary, because when you set an src attribute, the browser will preload the image + // before any javascript or even CSS is applied. + if (srcset) { + pxRatio = window.devicePixelRatio || 1; + windowWidth = window.innerWidth * pxRatio; + + temp = srcset.split(",").map(function (el) { + var ret = {}; + + el.trim() + .split(/\s+/) + .forEach(function (el, i) { + var value = parseInt(el.substring(0, el.length - 1), 10); + + if (i === 0) { + return (ret.url = el); + } + + if (value) { + ret.value = value; + ret.postfix = el[el.length - 1]; + } + }); + + return ret; + }); + + // Sort by value + temp.sort(function (a, b) { + return a.value - b.value; + }); + + // Ok, now we have an array of all srcset values + for (var j = 0; j < temp.length; j++) { + var el = temp[j]; + + if ((el.postfix === "w" && el.value >= windowWidth) || (el.postfix === "x" && el.value >= pxRatio)) { + found = el; + break; + } + } + + // If not found, take the last one + if (!found && temp.length) { + found = temp[temp.length - 1]; + } + + if (found) { + slide.src = found.url; + + // If we have default width/height values, we can calculate height for matching source + if (slide.width && slide.height && found.postfix == "w") { + slide.height = (slide.width / slide.height) * found.value; + slide.width = found.value; + } + + slide.opts.srcset = srcset; + } + } + }, + + // Create full-size image + // ====================== + + setBigImage: function (slide) { + var self = this, + img = document.createElement("img"), + $img = $(img); + + slide.$image = $img + .one("error", function () { + self.setError(slide); + }) + .one("load", function () { + var sizes; + + if (!slide.$ghost) { + self.resolveImageSlideSize(slide, this.naturalWidth, this.naturalHeight); + + self.afterLoad(slide); + } + + if (self.isClosing) { + return; + } + + if (slide.opts.srcset) { + sizes = slide.opts.sizes; + + if (!sizes || sizes === "auto") { + sizes = + (slide.width / slide.height > 1 && $W.width() / $W.height() > 1 ? "100" : Math.round((slide.width / slide.height) * 100)) + + "vw"; + } + + $img.attr("sizes", sizes).attr("srcset", slide.opts.srcset); + } + + // Hide temporary image after some delay + if (slide.$ghost) { + setTimeout(function () { + if (slide.$ghost && !self.isClosing) { + slide.$ghost.hide(); + } + }, Math.min(300, Math.max(1000, slide.height / 1600))); + } + + self.hideLoading(slide); + }) + .addClass("fancybox-image") + .attr("src", slide.src) + .appendTo(slide.$content); + + if ((img.complete || img.readyState == "complete") && $img.naturalWidth && $img.naturalHeight) { + $img.trigger("load"); + } else if (img.error) { + $img.trigger("error"); + } + }, + + // Computes the slide size from image size and maxWidth/maxHeight + // ============================================================== + + resolveImageSlideSize: function (slide, imgWidth, imgHeight) { + var maxWidth = parseInt(slide.opts.width, 10), + maxHeight = parseInt(slide.opts.height, 10); + + // Sets the default values from the image + slide.width = imgWidth; + slide.height = imgHeight; + + if (maxWidth > 0) { + slide.width = maxWidth; + slide.height = Math.floor((maxWidth * imgHeight) / imgWidth); + } + + if (maxHeight > 0) { + slide.width = Math.floor((maxHeight * imgWidth) / imgHeight); + slide.height = maxHeight; + } + }, + + // Create iframe wrapper, iframe and bindings + // ========================================== + + setIframe: function (slide) { + var self = this, + opts = slide.opts.iframe, + $slide = slide.$slide, + $iframe; + + slide.$content = $('
') + .css(opts.css) + .appendTo($slide); + + $slide.addClass("fancybox-slide--" + slide.contentType); + + slide.$iframe = $iframe = $(opts.tpl.replace(/\{rnd\}/g, new Date().getTime())) + .attr(opts.attr) + .appendTo(slide.$content); + + if (opts.preload) { + self.showLoading(slide); + + // Unfortunately, it is not always possible to determine if iframe is successfully loaded + // (due to browser security policy) + + $iframe.on("load.fb error.fb", function (e) { + this.isReady = 1; + + slide.$slide.trigger("refresh"); + + self.afterLoad(slide); + }); + + // Recalculate iframe content size + // =============================== + + $slide.on("refresh.fb", function () { + var $content = slide.$content, + frameWidth = opts.css.width, + frameHeight = opts.css.height, + $contents, + $body; + + if ($iframe[0].isReady !== 1) { + return; + } + + try { + $contents = $iframe.contents(); + $body = $contents.find("body"); + } catch (ignore) {} + + // Calculate content dimensions, if it is accessible + if ($body && $body.length && $body.children().length) { + // Avoid scrolling to top (if multiple instances) + $slide.css("overflow", "visible"); + + $content.css({ + width: "100%", + "max-width": "100%", + height: "9999px" + }); + + if (frameWidth === undefined) { + frameWidth = Math.ceil(Math.max($body[0].clientWidth, $body.outerWidth(true))); + } + + $content.css("width", frameWidth ? frameWidth : "").css("max-width", ""); + + if (frameHeight === undefined) { + frameHeight = Math.ceil(Math.max($body[0].clientHeight, $body.outerHeight(true))); + } + + $content.css("height", frameHeight ? frameHeight : ""); + + $slide.css("overflow", "auto"); + } + + $content.removeClass("fancybox-is-hidden"); + }); + } else { + self.afterLoad(slide); + } + + $iframe.attr("src", slide.src); + + // Remove iframe if closing or changing gallery item + $slide.one("onReset", function () { + // This helps IE not to throw errors when closing + try { + $(this) + .find("iframe") + .hide() + .unbind() + .attr("src", "//about:blank"); + } catch (ignore) {} + + $(this) + .off("refresh.fb") + .empty(); + + slide.isLoaded = false; + slide.isRevealed = false; + }); + }, + + // Wrap and append content to the slide + // ====================================== + + setContent: function (slide, content) { + var self = this; + + if (self.isClosing) { + return; + } + + self.hideLoading(slide); + + if (slide.$content) { + $.fancybox.stop(slide.$content); + } + + slide.$slide.empty(); + + // If content is a jQuery object, then it will be moved to the slide. + // The placeholder is created so we will know where to put it back. + if (isQuery(content) && content.parent().length) { + // Make sure content is not already moved to fancyBox + if (content.hasClass("fancybox-content") || content.parent().hasClass("fancybox-content")) { + content.parents(".fancybox-slide").trigger("onReset"); + } + + // Create temporary element marking original place of the content + slide.$placeholder = $("
") + .hide() + .insertAfter(content); + + // Make sure content is visible + content.css("display", "inline-block"); + } else if (!slide.hasError) { + // If content is just a plain text, try to convert it to html + if ($.type(content) === "string") { + content = $("
") + .append($.trim(content)) + .contents(); + } + + // If "filter" option is provided, then filter content + if (slide.opts.filter) { + content = $("
") + .html(content) + .find(slide.opts.filter); + } + } + + slide.$slide.one("onReset", function () { + // Pause all html5 video/audio + $(this) + .find("video,audio") + .trigger("pause"); + + // Put content back + if (slide.$placeholder) { + slide.$placeholder.after(content.removeClass("fancybox-content").hide()).remove(); + + slide.$placeholder = null; + } + + // Remove custom close button + if (slide.$smallBtn) { + slide.$smallBtn.remove(); + + slide.$smallBtn = null; + } + + // Remove content and mark slide as not loaded + if (!slide.hasError) { + $(this).empty(); + + slide.isLoaded = false; + slide.isRevealed = false; + } + }); + + $(content).appendTo(slide.$slide); + + if ($(content).is("video,audio")) { + $(content).addClass("fancybox-video"); + + $(content).wrap("
"); + + slide.contentType = "video"; + + slide.opts.width = slide.opts.width || $(content).attr("width"); + slide.opts.height = slide.opts.height || $(content).attr("height"); + } + + slide.$content = slide.$slide + .children() + .filter("div,form,main,video,audio,article,.fancybox-content") + .first(); + + slide.$content.siblings().hide(); + + // Re-check if there is a valid content + // (in some cases, ajax response can contain various elements or plain text) + if (!slide.$content.length) { + slide.$content = slide.$slide + .wrapInner("
") + .children() + .first(); + } + + slide.$content.addClass("fancybox-content"); + + slide.$slide.addClass("fancybox-slide--" + slide.contentType); + + self.afterLoad(slide); + }, + + // Display error message + // ===================== + + setError: function (slide) { + slide.hasError = true; + + slide.$slide + .trigger("onReset") + .removeClass("fancybox-slide--" + slide.contentType) + .addClass("fancybox-slide--error"); + + slide.contentType = "html"; + + this.setContent(slide, this.translate(slide, slide.opts.errorTpl)); + + if (slide.pos === this.currPos) { + this.isAnimating = false; + } + }, + + // Show loading icon inside the slide + // ================================== + + showLoading: function (slide) { + var self = this; + + slide = slide || self.current; + + if (slide && !slide.$spinner) { + slide.$spinner = $(self.translate(self, self.opts.spinnerTpl)) + .appendTo(slide.$slide) + .hide() + .fadeIn("fast"); + } + }, + + // Remove loading icon from the slide + // ================================== + + hideLoading: function (slide) { + var self = this; + + slide = slide || self.current; + + if (slide && slide.$spinner) { + slide.$spinner.stop().remove(); + + delete slide.$spinner; + } + }, + + // Adjustments after slide content has been loaded + // =============================================== + + afterLoad: function (slide) { + var self = this; + + if (self.isClosing) { + return; + } + + slide.isLoading = false; + slide.isLoaded = true; + + self.trigger("afterLoad", slide); + + self.hideLoading(slide); + + // Add small close button + if (slide.opts.smallBtn && (!slide.$smallBtn || !slide.$smallBtn.length)) { + slide.$smallBtn = $(self.translate(slide, slide.opts.btnTpl.smallBtn)).appendTo(slide.$content); + } + + // Disable right click + if (slide.opts.protect && slide.$content && !slide.hasError) { + slide.$content.on("contextmenu.fb", function (e) { + if (e.button == 2) { + e.preventDefault(); + } + + return true; + }); + + // Add fake element on top of the image + // This makes a bit harder for user to select image + if (slide.type === "image") { + $('
').appendTo(slide.$content); + } + } + + self.adjustCaption(slide); + + self.adjustLayout(slide); + + if (slide.pos === self.currPos) { + self.updateCursor(); + } + + self.revealContent(slide); + }, + + // Prevent caption overlap, + // fix css inconsistency across browsers + // ===================================== + + adjustCaption: function (slide) { + var self = this, + current = slide || self.current, + caption = current.opts.caption, + preventOverlap = current.opts.preventCaptionOverlap, + $caption = self.$refs.caption, + $clone, + captionH = false; + + $caption.toggleClass("fancybox-caption--separate", preventOverlap); + + if (preventOverlap && caption && caption.length) { + if (current.pos !== self.currPos) { + $clone = $caption.clone().appendTo($caption.parent()); + + $clone + .children() + .eq(0) + .empty() + .html(caption); + + captionH = $clone.outerHeight(true); + + $clone.empty().remove(); + } else if (self.$caption) { + captionH = self.$caption.outerHeight(true); + } + + current.$slide.css("padding-bottom", captionH || ""); + } + }, + + // Simple hack to fix inconsistency across browsers, described here (affects Edge, too): + // https://bugzilla.mozilla.org/show_bug.cgi?id=748518 + // ==================================================================================== + + adjustLayout: function (slide) { + var self = this, + current = slide || self.current, + scrollHeight, + marginBottom, + inlinePadding, + actualPadding; + + if (current.isLoaded && current.opts.disableLayoutFix !== true) { + current.$content.css("margin-bottom", ""); + + // If we would always set margin-bottom for the content, + // then it would potentially break vertical align + if (current.$content.outerHeight() > current.$slide.height() + 0.5) { + inlinePadding = current.$slide[0].style["padding-bottom"]; + actualPadding = current.$slide.css("padding-bottom"); + + if (parseFloat(actualPadding) > 0) { + scrollHeight = current.$slide[0].scrollHeight; + + current.$slide.css("padding-bottom", 0); + + if (Math.abs(scrollHeight - current.$slide[0].scrollHeight) < 1) { + marginBottom = actualPadding; + } + + current.$slide.css("padding-bottom", inlinePadding); + } + } + + current.$content.css("margin-bottom", marginBottom); + } + }, + + // Make content visible + // This method is called right after content has been loaded or + // user navigates gallery and transition should start + // ============================================================ + + revealContent: function (slide) { + var self = this, + $slide = slide.$slide, + end = false, + start = false, + isMoved = self.isMoved(slide), + isRevealed = slide.isRevealed, + effect, + effectClassName, + duration, + opacity; + + slide.isRevealed = true; + + effect = slide.opts[self.firstRun ? "animationEffect" : "transitionEffect"]; + duration = slide.opts[self.firstRun ? "animationDuration" : "transitionDuration"]; + + duration = parseInt(slide.forcedDuration === undefined ? duration : slide.forcedDuration, 10); + + if (isMoved || slide.pos !== self.currPos || !duration) { + effect = false; + } + + // Check if can zoom + if (effect === "zoom") { + if (slide.pos === self.currPos && duration && slide.type === "image" && !slide.hasError && (start = self.getThumbPos(slide))) { + end = self.getFitPos(slide); + } else { + effect = "fade"; + } + } + + // Zoom animation + // ============== + if (effect === "zoom") { + self.isAnimating = true; + + end.scaleX = end.width / start.width; + end.scaleY = end.height / start.height; + + // Check if we need to animate opacity + opacity = slide.opts.zoomOpacity; + + if (opacity == "auto") { + opacity = Math.abs(slide.width / slide.height - start.width / start.height) > 0.1; + } + + if (opacity) { + start.opacity = 0.1; + end.opacity = 1; + } + + // Draw image at start position + $.fancybox.setTranslate(slide.$content.removeClass("fancybox-is-hidden"), start); + + forceRedraw(slide.$content); + + // Start animation + $.fancybox.animate(slide.$content, end, duration, function () { + self.isAnimating = false; + + self.complete(); + }); + + return; + } + + self.updateSlide(slide); + + // Simply show content if no effect + // ================================ + if (!effect) { + slide.$content.removeClass("fancybox-is-hidden"); + + if (!isRevealed && isMoved && slide.type === "image" && !slide.hasError) { + slide.$content.hide().fadeIn("fast"); + } + + if (slide.pos === self.currPos) { + self.complete(); + } + + return; + } + + // Prepare for CSS transiton + // ========================= + $.fancybox.stop($slide); + + //effectClassName = "fancybox-animated fancybox-slide--" + (slide.pos >= self.prevPos ? "next" : "previous") + " fancybox-fx-" + effect; + effectClassName = "fancybox-slide--" + (slide.pos >= self.prevPos ? "next" : "previous") + " fancybox-animated fancybox-fx-" + effect; + + $slide.addClass(effectClassName).removeClass("fancybox-slide--current"); //.addClass(effectClassName); + + slide.$content.removeClass("fancybox-is-hidden"); + + // Force reflow + forceRedraw($slide); + + if (slide.type !== "image") { + slide.$content.hide().show(0); + } + + $.fancybox.animate( + $slide, + "fancybox-slide--current", + duration, + function () { + $slide.removeClass(effectClassName).css({ + transform: "", + opacity: "" + }); + + if (slide.pos === self.currPos) { + self.complete(); + } + }, + true + ); + }, + + // Check if we can and have to zoom from thumbnail + //================================================ + + getThumbPos: function (slide) { + var rez = false, + $thumb = slide.$thumb, + thumbPos, + btw, + brw, + bbw, + blw; + + if (!$thumb || !inViewport($thumb[0])) { + return false; + } + + thumbPos = $.fancybox.getTranslate($thumb); + + btw = parseFloat($thumb.css("border-top-width") || 0); + brw = parseFloat($thumb.css("border-right-width") || 0); + bbw = parseFloat($thumb.css("border-bottom-width") || 0); + blw = parseFloat($thumb.css("border-left-width") || 0); + + rez = { + top: thumbPos.top + btw, + left: thumbPos.left + blw, + width: thumbPos.width - brw - blw, + height: thumbPos.height - btw - bbw, + scaleX: 1, + scaleY: 1 + }; + + return thumbPos.width > 0 && thumbPos.height > 0 ? rez : false; + }, + + // Final adjustments after current gallery item is moved to position + // and it`s content is loaded + // ================================================================== + + complete: function () { + var self = this, + current = self.current, + slides = {}, + $el; + + if (self.isMoved() || !current.isLoaded) { + return; + } + + if (!current.isComplete) { + current.isComplete = true; + + current.$slide.siblings().trigger("onReset"); + + self.preload("inline"); + + // Trigger any CSS transiton inside the slide + forceRedraw(current.$slide); + + current.$slide.addClass("fancybox-slide--complete"); + + // Remove unnecessary slides + $.each(self.slides, function (key, slide) { + if (slide.pos >= self.currPos - 1 && slide.pos <= self.currPos + 1) { + slides[slide.pos] = slide; + } else if (slide) { + $.fancybox.stop(slide.$slide); + + slide.$slide.off().remove(); + } + }); + + self.slides = slides; + } + + self.isAnimating = false; + + self.updateCursor(); + + self.trigger("afterShow"); + + // Autoplay first html5 video/audio + if (!!current.opts.video.autoStart) { + current.$slide + .find("video,audio") + .filter(":visible:first") + .trigger("play") + .one("ended", function () { + if (Document.exitFullscreen) { + Document.exitFullscreen(); + } else if (this.webkitExitFullscreen) { + this.webkitExitFullscreen(); + } + + self.next(); + }); + } + + // Try to focus on the first focusable element + if (current.opts.autoFocus && current.contentType === "html") { + // Look for the first input with autofocus attribute + $el = current.$content.find("input[autofocus]:enabled:visible:first"); + + if ($el.length) { + $el.trigger("focus"); + } else { + self.focus(null, true); + } + } + + // Avoid jumping + current.$slide.scrollTop(0).scrollLeft(0); + }, + + // Preload next and previous slides + // ================================ + + preload: function (type) { + var self = this, + prev, + next; + + if (self.group.length < 2) { + return; + } + + next = self.slides[self.currPos + 1]; + prev = self.slides[self.currPos - 1]; + + if (prev && prev.type === type) { + self.loadSlide(prev); + } + + if (next && next.type === type) { + self.loadSlide(next); + } + }, + + // Try to find and focus on the first focusable element + // ==================================================== + + focus: function (e, firstRun) { + var self = this, + focusableStr = [ + "a[href]", + "area[href]", + 'input:not([disabled]):not([type="hidden"]):not([aria-hidden])', + "select:not([disabled]):not([aria-hidden])", + "textarea:not([disabled]):not([aria-hidden])", + "button:not([disabled]):not([aria-hidden])", + "iframe", + "object", + "embed", + "video", + "audio", + "[contenteditable]", + '[tabindex]:not([tabindex^="-"])' + ].join(","), + focusableItems, + focusedItemIndex; + + if (self.isClosing) { + return; + } + + if (e || !self.current || !self.current.isComplete) { + // Focus on any element inside fancybox + focusableItems = self.$refs.container.find("*:visible"); + } else { + // Focus inside current slide + focusableItems = self.current.$slide.find("*:visible" + (firstRun ? ":not(.fancybox-close-small)" : "")); + } + + focusableItems = focusableItems.filter(focusableStr).filter(function () { + return $(this).css("visibility") !== "hidden" && !$(this).hasClass("disabled"); + }); + + if (focusableItems.length) { + focusedItemIndex = focusableItems.index(document.activeElement); + + if (e && e.shiftKey) { + // Back tab + if (focusedItemIndex < 0 || focusedItemIndex == 0) { + e.preventDefault(); + + focusableItems.eq(focusableItems.length - 1).trigger("focus"); + } + } else { + // Outside or Forward tab + if (focusedItemIndex < 0 || focusedItemIndex == focusableItems.length - 1) { + if (e) { + e.preventDefault(); + } + + focusableItems.eq(0).trigger("focus"); + } + } + } else { + self.$refs.container.trigger("focus"); + } + }, + + // Activates current instance - brings container to the front and enables keyboard, + // notifies other instances about deactivating + // ================================================================================= + + activate: function () { + var self = this; + + // Deactivate all instances + $(".fancybox-container").each(function () { + var instance = $(this).data("FancyBox"); + + // Skip self and closing instances + if (instance && instance.id !== self.id && !instance.isClosing) { + instance.trigger("onDeactivate"); + + instance.removeEvents(); + + instance.isVisible = false; + } + }); + + self.isVisible = true; + + if (self.current || self.isIdle) { + self.update(); + + self.updateControls(); + } + + self.trigger("onActivate"); + + self.addEvents(); + }, + + // Start closing procedure + // This will start "zoom-out" animation if needed and clean everything up afterwards + // ================================================================================= + + close: function (e, d) { + var self = this, + current = self.current, + effect, + duration, + $content, + domRect, + opacity, + start, + end; + + var done = function () { + self.cleanUp(e); + }; + + if (self.isClosing) { + return false; + } + + self.isClosing = true; + + // If beforeClose callback prevents closing, make sure content is centered + if (self.trigger("beforeClose", e) === false) { + self.isClosing = false; + + requestAFrame(function () { + self.update(); + }); + + return false; + } + + // Remove all events + // If there are multiple instances, they will be set again by "activate" method + self.removeEvents(); + + $content = current.$content; + effect = current.opts.animationEffect; + duration = $.isNumeric(d) ? d : effect ? current.opts.animationDuration : 0; + + current.$slide.removeClass("fancybox-slide--complete fancybox-slide--next fancybox-slide--previous fancybox-animated"); + + if (e !== true) { + $.fancybox.stop(current.$slide); + } else { + effect = false; + } + + // Remove other slides + current.$slide + .siblings() + .trigger("onReset") + .remove(); + + // Trigger animations + if (duration) { + self.$refs.container + .removeClass("fancybox-is-open") + .addClass("fancybox-is-closing") + .css("transition-duration", duration + "ms"); + } + + // Clean up + self.hideLoading(current); + + self.hideControls(true); + + self.updateCursor(); + + // Check if possible to zoom-out + if ( + effect === "zoom" && + !($content && duration && current.type === "image" && !self.isMoved() && !current.hasError && (end = self.getThumbPos(current))) + ) { + effect = "fade"; + } + + if (effect === "zoom") { + $.fancybox.stop($content); + + domRect = $.fancybox.getTranslate($content); + + start = { + top: domRect.top, + left: domRect.left, + scaleX: domRect.width / end.width, + scaleY: domRect.height / end.height, + width: end.width, + height: end.height + }; + + // Check if we need to animate opacity + opacity = current.opts.zoomOpacity; + + if (opacity == "auto") { + opacity = Math.abs(current.width / current.height - end.width / end.height) > 0.1; + } + + if (opacity) { + end.opacity = 0; + } + + $.fancybox.setTranslate($content, start); + + forceRedraw($content); + + $.fancybox.animate($content, end, duration, done); + + return true; + } + + if (effect && duration) { + $.fancybox.animate( + current.$slide.addClass("fancybox-slide--previous").removeClass("fancybox-slide--current"), + "fancybox-animated fancybox-fx-" + effect, + duration, + done + ); + } else { + // If skip animation + if (e === true) { + setTimeout(done, duration); + } else { + done(); + } + } + + return true; + }, + + // Final adjustments after removing the instance + // ============================================= + + cleanUp: function (e) { + var self = this, + instance, + $focus = self.current.opts.$orig, + x, + y; + + self.current.$slide.trigger("onReset"); + + self.$refs.container.empty().remove(); + + self.trigger("afterClose", e); + + // Place back focus + if (!!self.current.opts.backFocus) { + if (!$focus || !$focus.length || !$focus.is(":visible")) { + $focus = self.$trigger; + } + + if ($focus && $focus.length) { + x = window.scrollX; + y = window.scrollY; + + $focus.trigger("focus"); + + $("html, body") + .scrollTop(y) + .scrollLeft(x); + } + } + + self.current = null; + + // Check if there are other instances + instance = $.fancybox.getInstance(); + + if (instance) { + instance.activate(); + } else { + $("body").removeClass("fancybox-active compensate-for-scrollbar"); + + $("#fancybox-style-noscroll").remove(); + } + }, + + // Call callback and trigger an event + // ================================== + + trigger: function (name, slide) { + var args = Array.prototype.slice.call(arguments, 1), + self = this, + obj = slide && slide.opts ? slide : self.current, + rez; + + if (obj) { + args.unshift(obj); + } else { + obj = self; + } + + args.unshift(self); + + if ($.isFunction(obj.opts[name])) { + rez = obj.opts[name].apply(obj, args); + } + + if (rez === false) { + return rez; + } + + if (name === "afterClose" || !self.$refs) { + $D.trigger(name + ".fb", args); + } else { + self.$refs.container.trigger(name + ".fb", args); + } + }, + + // Update infobar values, navigation button states and reveal caption + // ================================================================== + + updateControls: function () { + var self = this, + current = self.current, + index = current.index, + $container = self.$refs.container, + $caption = self.$refs.caption, + caption = current.opts.caption; + + // Recalculate content dimensions + current.$slide.trigger("refresh"); + + // Set caption + if (caption && caption.length) { + self.$caption = $caption; + + $caption + .children() + .eq(0) + .html(caption); + } else { + self.$caption = null; + } + + if (!self.hasHiddenControls && !self.isIdle) { + self.showControls(); + } + + // Update info and navigation elements + $container.find("[data-fancybox-count]").html(self.group.length); + $container.find("[data-fancybox-index]").html(index + 1); + + $container.find("[data-fancybox-prev]").prop("disabled", !current.opts.loop && index <= 0); + $container.find("[data-fancybox-next]").prop("disabled", !current.opts.loop && index >= self.group.length - 1); + + if (current.type === "image") { + // Re-enable buttons; update download button source + $container + .find("[data-fancybox-zoom]") + .show() + .end() + .find("[data-fancybox-download]") + .attr("href", current.opts.image.src || current.src) + .show(); + } else if (current.opts.toolbar) { + $container.find("[data-fancybox-download],[data-fancybox-zoom]").hide(); + } + + // Make sure focus is not on disabled button/element + if ($(document.activeElement).is(":hidden,[disabled]")) { + self.$refs.container.trigger("focus"); + } + }, + + // Hide toolbar and caption + // ======================== + + hideControls: function (andCaption) { + var self = this, + arr = ["infobar", "toolbar", "nav"]; + + if (andCaption || !self.current.opts.preventCaptionOverlap) { + arr.push("caption"); + } + + this.$refs.container.removeClass( + arr + .map(function (i) { + return "fancybox-show-" + i; + }) + .join(" ") + ); + + this.hasHiddenControls = true; + }, + + showControls: function () { + var self = this, + opts = self.current ? self.current.opts : self.opts, + $container = self.$refs.container; + + self.hasHiddenControls = false; + self.idleSecondsCounter = 0; + + $container + .toggleClass("fancybox-show-toolbar", !!(opts.toolbar && opts.buttons)) + .toggleClass("fancybox-show-infobar", !!(opts.infobar && self.group.length > 1)) + .toggleClass("fancybox-show-caption", !!self.$caption) + .toggleClass("fancybox-show-nav", !!(opts.arrows && self.group.length > 1)) + .toggleClass("fancybox-is-modal", !!opts.modal); + }, + + // Toggle toolbar and caption + // ========================== + + toggleControls: function () { + if (this.hasHiddenControls) { + this.showControls(); + } else { + this.hideControls(); + } + } + }); + + $.fancybox = { + version: "3.5.7", + defaults: defaults, + + // Get current instance and execute a command. + // + // Examples of usage: + // + // $instance = $.fancybox.getInstance(); + // $.fancybox.getInstance().jumpTo( 1 ); + // $.fancybox.getInstance( 'jumpTo', 1 ); + // $.fancybox.getInstance( function() { + // console.info( this.currIndex ); + // }); + // ====================================================== + + getInstance: function (command) { + var instance = $('.fancybox-container:not(".fancybox-is-closing"):last').data("FancyBox"), + args = Array.prototype.slice.call(arguments, 1); + + if (instance instanceof FancyBox) { + if ($.type(command) === "string") { + instance[command].apply(instance, args); + } else if ($.type(command) === "function") { + command.apply(instance, args); + } + + return instance; + } + + return false; + }, + + // Create new instance + // =================== + + open: function (items, opts, index) { + return new FancyBox(items, opts, index); + }, + + // Close current or all instances + // ============================== + + close: function (all) { + var instance = this.getInstance(); + + if (instance) { + instance.close(); + + // Try to find and close next instance + if (all === true) { + this.close(all); + } + } + }, + + // Close all instances and unbind all events + // ========================================= + + destroy: function () { + this.close(true); + + $D.add("body").off("click.fb-start", "**"); + }, + + // Try to detect mobile devices + // ============================ + + isMobile: /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent), + + // Detect if 'translate3d' support is available + // ============================================ + + use3d: (function () { + var div = document.createElement("div"); + + return ( + window.getComputedStyle && + window.getComputedStyle(div) && + window.getComputedStyle(div).getPropertyValue("transform") && + !(document.documentMode && document.documentMode < 11) + ); + })(), + + // Helper function to get current visual state of an element + // returns array[ top, left, horizontal-scale, vertical-scale, opacity ] + // ===================================================================== + + getTranslate: function ($el) { + var domRect; + + if (!$el || !$el.length) { + return false; + } + + domRect = $el[0].getBoundingClientRect(); + + return { + top: domRect.top || 0, + left: domRect.left || 0, + width: domRect.width, + height: domRect.height, + opacity: parseFloat($el.css("opacity")) + }; + }, + + // Shortcut for setting "translate3d" properties for element + // Can set be used to set opacity, too + // ======================================================== + + setTranslate: function ($el, props) { + var str = "", + css = {}; + + if (!$el || !props) { + return; + } + + if (props.left !== undefined || props.top !== undefined) { + str = + (props.left === undefined ? $el.position().left : props.left) + + "px, " + + (props.top === undefined ? $el.position().top : props.top) + + "px"; + + if (this.use3d) { + str = "translate3d(" + str + ", 0px)"; + } else { + str = "translate(" + str + ")"; + } + } + + if (props.scaleX !== undefined && props.scaleY !== undefined) { + str += " scale(" + props.scaleX + ", " + props.scaleY + ")"; + } else if (props.scaleX !== undefined) { + str += " scaleX(" + props.scaleX + ")"; + } + + if (str.length) { + css.transform = str; + } + + if (props.opacity !== undefined) { + css.opacity = props.opacity; + } + + if (props.width !== undefined) { + css.width = props.width; + } + + if (props.height !== undefined) { + css.height = props.height; + } + + return $el.css(css); + }, + + // Simple CSS transition handler + // ============================= + + animate: function ($el, to, duration, callback, leaveAnimationName) { + var self = this, + from; + + if ($.isFunction(duration)) { + callback = duration; + duration = null; + } + + self.stop($el); + + from = self.getTranslate($el); + + $el.on(transitionEnd, function (e) { + // Skip events from child elements and z-index change + if (e && e.originalEvent && (!$el.is(e.originalEvent.target) || e.originalEvent.propertyName == "z-index")) { + return; + } + + self.stop($el); + + if ($.isNumeric(duration)) { + $el.css("transition-duration", ""); + } + + if ($.isPlainObject(to)) { + if (to.scaleX !== undefined && to.scaleY !== undefined) { + self.setTranslate($el, { + top: to.top, + left: to.left, + width: from.width * to.scaleX, + height: from.height * to.scaleY, + scaleX: 1, + scaleY: 1 + }); + } + } else if (leaveAnimationName !== true) { + $el.removeClass(to); + } + + if ($.isFunction(callback)) { + callback(e); + } + }); + + if ($.isNumeric(duration)) { + $el.css("transition-duration", duration + "ms"); + } + + // Start animation by changing CSS properties or class name + if ($.isPlainObject(to)) { + if (to.scaleX !== undefined && to.scaleY !== undefined) { + delete to.width; + delete to.height; + + if ($el.parent().hasClass("fancybox-slide--image")) { + $el.parent().addClass("fancybox-is-scaling"); + } + } + + $.fancybox.setTranslate($el, to); + } else { + $el.addClass(to); + } + + // Make sure that `transitionend` callback gets fired + $el.data( + "timer", + setTimeout(function () { + $el.trigger(transitionEnd); + }, duration + 33) + ); + }, + + stop: function ($el, callCallback) { + if ($el && $el.length) { + clearTimeout($el.data("timer")); + + if (callCallback) { + $el.trigger(transitionEnd); + } + + $el.off(transitionEnd).css("transition-duration", ""); + + $el.parent().removeClass("fancybox-is-scaling"); + } + } + }; + + // Default click handler for "fancyboxed" links + // ============================================ + + function _run(e, opts) { + var items = [], + index = 0, + $target, + value, + instance; + + // Avoid opening multiple times + if (e && e.isDefaultPrevented()) { + return; + } + + e.preventDefault(); + + opts = opts || {}; + + if (e && e.data) { + opts = mergeOpts(e.data.options, opts); + } + + $target = opts.$target || $(e.currentTarget).trigger("blur"); + instance = $.fancybox.getInstance(); + + if (instance && instance.$trigger && instance.$trigger.is($target)) { + return; + } + + if (opts.selector) { + items = $(opts.selector); + } else { + // Get all related items and find index for clicked one + value = $target.attr("data-fancybox") || ""; + + if (value) { + items = e.data ? e.data.items : []; + items = items.length ? items.filter('[data-fancybox="' + value + '"]') : $('[data-fancybox="' + value + '"]'); + } else { + items = [$target]; + } + } + + index = $(items).index($target); + + // Sometimes current item can not be found + if (index < 0) { + index = 0; + } + + instance = $.fancybox.open(items, opts, index); + + // Save last active element + instance.$trigger = $target; + } + + // Create a jQuery plugin + // ====================== + + $.fn.fancybox = function (options) { + var selector; + + options = options || {}; + selector = options.selector || false; + + if (selector) { + // Use body element instead of document so it executes first + $("body") + .off("click.fb-start", selector) + .on("click.fb-start", selector, { + options: options + }, _run); + } else { + this.off("click.fb-start").on( + "click.fb-start", { + items: this, + options: options + }, + _run + ); + } + + return this; + }; + + // Self initializing plugin for all elements having `data-fancybox` attribute + // ========================================================================== + + $D.on("click.fb-start", "[data-fancybox]", _run); + + // Enable "trigger elements" + // ========================= + + $D.on("click.fb-start", "[data-fancybox-trigger]", function (e) { + $('[data-fancybox="' + $(this).attr("data-fancybox-trigger") + '"]') + .eq($(this).attr("data-fancybox-index") || 0) + .trigger("click.fb-start", { + $trigger: $(this) + }); + }); + + // Track focus event for better accessibility styling + // ================================================== + (function () { + var buttonStr = ".fancybox-button", + focusStr = "fancybox-focus", + $pressed = null; + + $D.on("mousedown mouseup focus blur", buttonStr, function (e) { + switch (e.type) { + case "mousedown": + $pressed = $(this); + break; + case "mouseup": + $pressed = null; + break; + case "focusin": + $(buttonStr).removeClass(focusStr); + + if (!$(this).is($pressed) && !$(this).is("[disabled]")) { + $(this).addClass(focusStr); + } + break; + case "focusout": + $(buttonStr).removeClass(focusStr); + break; + } + }); + })(); +})(window, document, jQuery); +// ========================================================================== +// +// Media +// Adds additional media type support +// +// ========================================================================== +(function ($) { + "use strict"; + + // Object containing properties for each media type + var defaults = { + youtube: { + matcher: /(youtube\.com|youtu\.be|youtube\-nocookie\.com)\/(watch\?(.*&)?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*))(.*)/i, + params: { + autoplay: 1, + autohide: 1, + fs: 1, + rel: 0, + hd: 1, + wmode: "transparent", + enablejsapi: 1, + html5: 1 + }, + paramPlace: 8, + type: "iframe", + url: "https://www.youtube-nocookie.com/embed/$4", + thumb: "https://img.youtube.com/vi/$4/hqdefault.jpg" + }, + + vimeo: { + matcher: /^.+vimeo.com\/(.*\/)?([\d]+)(.*)?/, + params: { + autoplay: 1, + hd: 1, + show_title: 1, + show_byline: 1, + show_portrait: 0, + fullscreen: 1 + }, + paramPlace: 3, + type: "iframe", + url: "//player.vimeo.com/video/$2" + }, + + instagram: { + matcher: /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i, + type: "image", + url: "//$1/p/$2/media/?size=l" + }, + + // Examples: + // http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16 + // https://www.google.com/maps/@37.7852006,-122.4146355,14.65z + // https://www.google.com/maps/@52.2111123,2.9237542,6.61z?hl=en + // https://www.google.com/maps/place/Googleplex/@37.4220041,-122.0833494,17z/data=!4m5!3m4!1s0x0:0x6c296c66619367e0!8m2!3d37.4219998!4d-122.0840572 + gmap_place: { + matcher: /(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(((maps\/(place\/(.*)\/)?\@(.*),(\d+.?\d+?)z))|(\?ll=))(.*)?/i, + type: "iframe", + url: function (rez) { + return ( + "//maps.google." + + rez[2] + + "/?ll=" + + (rez[9] ? rez[9] + "&z=" + Math.floor(rez[10]) + (rez[12] ? rez[12].replace(/^\//, "&") : "") : rez[12] + "").replace(/\?/, "&") + + "&output=" + + (rez[12] && rez[12].indexOf("layer=c") > 0 ? "svembed" : "embed") + ); + } + }, + + // Examples: + // https://www.google.com/maps/search/Empire+State+Building/ + // https://www.google.com/maps/search/?api=1&query=centurylink+field + // https://www.google.com/maps/search/?api=1&query=47.5951518,-122.3316393 + gmap_search: { + matcher: /(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(maps\/search\/)(.*)/i, + type: "iframe", + url: function (rez) { + return "//maps.google." + rez[2] + "/maps?q=" + rez[5].replace("query=", "q=").replace("api=1", "") + "&output=embed"; + } + } + }; + + // Formats matching url to final form + var format = function (url, rez, params) { + if (!url) { + return; + } + + params = params || ""; + + if ($.type(params) === "object") { + params = $.param(params, true); + } + + $.each(rez, function (key, value) { + url = url.replace("$" + key, value || ""); + }); + + if (params.length) { + url += (url.indexOf("?") > 0 ? "&" : "?") + params; + } + + return url; + }; + + $(document).on("objectNeedsType.fb", function (e, instance, item) { + var url = item.src || "", + type = false, + media, + thumb, + rez, + params, + urlParams, + paramObj, + provider; + + media = $.extend(true, {}, defaults, item.opts.media); + + // Look for any matching media type + $.each(media, function (providerName, providerOpts) { + rez = url.match(providerOpts.matcher); + + if (!rez) { + return; + } + + type = providerOpts.type; + provider = providerName; + paramObj = {}; + + if (providerOpts.paramPlace && rez[providerOpts.paramPlace]) { + urlParams = rez[providerOpts.paramPlace]; + + if (urlParams[0] == "?") { + urlParams = urlParams.substring(1); + } + + urlParams = urlParams.split("&"); + + for (var m = 0; m < urlParams.length; ++m) { + var p = urlParams[m].split("=", 2); + + if (p.length == 2) { + paramObj[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " ")); + } + } + } + + params = $.extend(true, {}, providerOpts.params, item.opts[providerName], paramObj); + + url = + $.type(providerOpts.url) === "function" ? providerOpts.url.call(this, rez, params, item) : format(providerOpts.url, rez, params); + + thumb = + $.type(providerOpts.thumb) === "function" ? providerOpts.thumb.call(this, rez, params, item) : format(providerOpts.thumb, rez); + + if (providerName === "youtube") { + url = url.replace(/&t=((\d+)m)?(\d+)s/, function (match, p1, m, s) { + return "&start=" + ((m ? parseInt(m, 10) * 60 : 0) + parseInt(s, 10)); + }); + } else if (providerName === "vimeo") { + url = url.replace("&%23", "#"); + } + + return false; + }); + + // If it is found, then change content type and update the url + + if (type) { + if (!item.opts.thumb && !(item.opts.$thumb && item.opts.$thumb.length)) { + item.opts.thumb = thumb; + } + + if (type === "iframe") { + item.opts = $.extend(true, item.opts, { + iframe: { + preload: false, + attr: { + scrolling: "no" + } + } + }); + } + + $.extend(item, { + type: type, + src: url, + origSrc: item.src, + contentSource: provider, + contentType: type === "image" ? "image" : provider == "gmap_place" || provider == "gmap_search" ? "map" : "video" + }); + } else if (url) { + item.type = item.opts.defaultType; + } + }); + + // Load YouTube/Video API on request to detect when video finished playing + var VideoAPILoader = { + youtube: { + src: "https://www.youtube.com/iframe_api", + class: "YT", + loading: false, + loaded: false + }, + + vimeo: { + src: "https://player.vimeo.com/api/player.js", + class: "Vimeo", + loading: false, + loaded: false + }, + + load: function (vendor) { + var _this = this, + script; + + if (this[vendor].loaded) { + setTimeout(function () { + _this.done(vendor); + }); + return; + } + + if (this[vendor].loading) { + return; + } + + this[vendor].loading = true; + + script = document.createElement("script"); + script.type = "text/javascript"; + script.src = this[vendor].src; + + if (vendor === "youtube") { + window.onYouTubeIframeAPIReady = function () { + _this[vendor].loaded = true; + _this.done(vendor); + }; + } else { + script.onload = function () { + _this[vendor].loaded = true; + _this.done(vendor); + }; + } + + document.body.appendChild(script); + }, + done: function (vendor) { + var instance, $el, player; + + if (vendor === "youtube") { + delete window.onYouTubeIframeAPIReady; + } + + instance = $.fancybox.getInstance(); + + if (instance) { + $el = instance.current.$content.find("iframe"); + + if (vendor === "youtube" && YT !== undefined && YT) { + player = new YT.Player($el.attr("id"), { + events: { + onStateChange: function (e) { + if (e.data == 0) { + instance.next(); + } + } + } + }); + } else if (vendor === "vimeo" && Vimeo !== undefined && Vimeo) { + player = new Vimeo.Player($el); + + player.on("ended", function () { + instance.next(); + }); + } + } + } + }; + + $(document).on({ + "afterShow.fb": function (e, instance, current) { + if (instance.group.length > 1 && (current.contentSource === "youtube" || current.contentSource === "vimeo")) { + VideoAPILoader.load(current.contentSource); + } + } + }); +})(jQuery); +// ========================================================================== +// +// Guestures +// Adds touch guestures, handles click and tap events +// +// ========================================================================== +(function (window, document, $) { + "use strict"; + + var requestAFrame = (function () { + return ( + window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + // if all else fails, use setTimeout + function (callback) { + return window.setTimeout(callback, 1000 / 60); + } + ); + })(); + + var cancelAFrame = (function () { + return ( + window.cancelAnimationFrame || + window.webkitCancelAnimationFrame || + window.mozCancelAnimationFrame || + window.oCancelAnimationFrame || + function (id) { + window.clearTimeout(id); + } + ); + })(); + + var getPointerXY = function (e) { + var result = []; + + e = e.originalEvent || e || window.e; + e = e.touches && e.touches.length ? e.touches : e.changedTouches && e.changedTouches.length ? e.changedTouches : [e]; + + for (var key in e) { + if (e[key].pageX) { + result.push({ + x: e[key].pageX, + y: e[key].pageY + }); + } else if (e[key].clientX) { + result.push({ + x: e[key].clientX, + y: e[key].clientY + }); + } + } + + return result; + }; + + var distance = function (point2, point1, what) { + if (!point1 || !point2) { + return 0; + } + + if (what === "x") { + return point2.x - point1.x; + } else if (what === "y") { + return point2.y - point1.y; + } + + return Math.sqrt(Math.pow(point2.x - point1.x, 2) + Math.pow(point2.y - point1.y, 2)); + }; + + var isClickable = function ($el) { + if ( + $el.is('a,area,button,[role="button"],input,label,select,summary,textarea,video,audio,iframe') || + $.isFunction($el.get(0).onclick) || + $el.data("selectable") + ) { + return true; + } + + // Check for attributes like data-fancybox-next or data-fancybox-close + for (var i = 0, atts = $el[0].attributes, n = atts.length; i < n; i++) { + if (atts[i].nodeName.substr(0, 14) === "data-fancybox-") { + return true; + } + } + + return false; + }; + + var hasScrollbars = function (el) { + var overflowY = window.getComputedStyle(el)["overflow-y"], + overflowX = window.getComputedStyle(el)["overflow-x"], + vertical = (overflowY === "scroll" || overflowY === "auto") && el.scrollHeight > el.clientHeight, + horizontal = (overflowX === "scroll" || overflowX === "auto") && el.scrollWidth > el.clientWidth; + + return vertical || horizontal; + }; + + var isScrollable = function ($el) { + var rez = false; + + while (true) { + rez = hasScrollbars($el.get(0)); + + if (rez) { + break; + } + + $el = $el.parent(); + + if (!$el.length || $el.hasClass("fancybox-stage") || $el.is("body")) { + break; + } + } + + return rez; + }; + + var Guestures = function (instance) { + var self = this; + + self.instance = instance; + + self.$bg = instance.$refs.bg; + self.$stage = instance.$refs.stage; + self.$container = instance.$refs.container; + + self.destroy(); + + self.$container.on("touchstart.fb.touch mousedown.fb.touch", $.proxy(self, "ontouchstart")); + }; + + Guestures.prototype.destroy = function () { + var self = this; + + self.$container.off(".fb.touch"); + + $(document).off(".fb.touch"); + + if (self.requestId) { + cancelAFrame(self.requestId); + self.requestId = null; + } + + if (self.tapped) { + clearTimeout(self.tapped); + self.tapped = null; + } + }; + + Guestures.prototype.ontouchstart = function (e) { + var self = this, + $target = $(e.target), + instance = self.instance, + current = instance.current, + $slide = current.$slide, + $content = current.$content, + isTouchDevice = e.type == "touchstart"; + + // Do not respond to both (touch and mouse) events + if (isTouchDevice) { + self.$container.off("mousedown.fb.touch"); + } + + // Ignore right click + if (e.originalEvent && e.originalEvent.button == 2) { + return; + } + + // Ignore taping on links, buttons, input elements + if (!$slide.length || !$target.length || isClickable($target) || isClickable($target.parent())) { + return; + } + // Ignore clicks on the scrollbar + if (!$target.is("img") && e.originalEvent.clientX > $target[0].clientWidth + $target.offset().left) { + return; + } + + // Ignore clicks while zooming or closing + if (!current || instance.isAnimating || current.$slide.hasClass("fancybox-animated")) { + e.stopPropagation(); + e.preventDefault(); + + return; + } + + self.realPoints = self.startPoints = getPointerXY(e); + + if (!self.startPoints.length) { + return; + } + + // Allow other scripts to catch touch event if "touch" is set to false + if (current.touch) { + e.stopPropagation(); + } + + self.startEvent = e; + + self.canTap = true; + self.$target = $target; + self.$content = $content; + self.opts = current.opts.touch; + + self.isPanning = false; + self.isSwiping = false; + self.isZooming = false; + self.isScrolling = false; + self.canPan = instance.canPan(); + + self.startTime = new Date().getTime(); + self.distanceX = self.distanceY = self.distance = 0; + + self.canvasWidth = Math.round($slide[0].clientWidth); + self.canvasHeight = Math.round($slide[0].clientHeight); + + self.contentLastPos = null; + self.contentStartPos = $.fancybox.getTranslate(self.$content) || { + top: 0, + left: 0 + }; + self.sliderStartPos = $.fancybox.getTranslate($slide); + + // Since position will be absolute, but we need to make it relative to the stage + self.stagePos = $.fancybox.getTranslate(instance.$refs.stage); + + self.sliderStartPos.top -= self.stagePos.top; + self.sliderStartPos.left -= self.stagePos.left; + + self.contentStartPos.top -= self.stagePos.top; + self.contentStartPos.left -= self.stagePos.left; + + $(document) + .off(".fb.touch") + .on(isTouchDevice ? "touchend.fb.touch touchcancel.fb.touch" : "mouseup.fb.touch mouseleave.fb.touch", $.proxy(self, "ontouchend")) + .on(isTouchDevice ? "touchmove.fb.touch" : "mousemove.fb.touch", $.proxy(self, "ontouchmove")); + + if ($.fancybox.isMobile) { + document.addEventListener("scroll", self.onscroll, true); + } + + // Skip if clicked outside the sliding area + if (!(self.opts || self.canPan) || !($target.is(self.$stage) || self.$stage.find($target).length)) { + if ($target.is(".fancybox-image")) { + e.preventDefault(); + } + + if (!($.fancybox.isMobile && $target.parents(".fancybox-caption").length)) { + return; + } + } + + self.isScrollable = isScrollable($target) || isScrollable($target.parent()); + + // Check if element is scrollable and try to prevent default behavior (scrolling) + if (!($.fancybox.isMobile && self.isScrollable)) { + e.preventDefault(); + } + + // One finger or mouse click - swipe or pan an image + if (self.startPoints.length === 1 || current.hasError) { + if (self.canPan) { + $.fancybox.stop(self.$content); + + self.isPanning = true; + } else { + self.isSwiping = true; + } + + self.$container.addClass("fancybox-is-grabbing"); + } + + // Two fingers - zoom image + if (self.startPoints.length === 2 && current.type === "image" && (current.isLoaded || current.$ghost)) { + self.canTap = false; + self.isSwiping = false; + self.isPanning = false; + + self.isZooming = true; + + $.fancybox.stop(self.$content); + + self.centerPointStartX = (self.startPoints[0].x + self.startPoints[1].x) * 0.5 - $(window).scrollLeft(); + self.centerPointStartY = (self.startPoints[0].y + self.startPoints[1].y) * 0.5 - $(window).scrollTop(); + + self.percentageOfImageAtPinchPointX = (self.centerPointStartX - self.contentStartPos.left) / self.contentStartPos.width; + self.percentageOfImageAtPinchPointY = (self.centerPointStartY - self.contentStartPos.top) / self.contentStartPos.height; + + self.startDistanceBetweenFingers = distance(self.startPoints[0], self.startPoints[1]); + } + }; + + Guestures.prototype.onscroll = function (e) { + var self = this; + + self.isScrolling = true; + + document.removeEventListener("scroll", self.onscroll, true); + }; + + Guestures.prototype.ontouchmove = function (e) { + var self = this; + + // Make sure user has not released over iframe or disabled element + if (e.originalEvent.buttons !== undefined && e.originalEvent.buttons === 0) { + self.ontouchend(e); + return; + } + + if (self.isScrolling) { + self.canTap = false; + return; + } + + self.newPoints = getPointerXY(e); + + if (!(self.opts || self.canPan) || !self.newPoints.length || !self.newPoints.length) { + return; + } + + if (!(self.isSwiping && self.isSwiping === true)) { + e.preventDefault(); + } + + self.distanceX = distance(self.newPoints[0], self.startPoints[0], "x"); + self.distanceY = distance(self.newPoints[0], self.startPoints[0], "y"); + + self.distance = distance(self.newPoints[0], self.startPoints[0]); + + // Skip false ontouchmove events (Chrome) + if (self.distance > 0) { + if (self.isSwiping) { + self.onSwipe(e); + } else if (self.isPanning) { + self.onPan(); + } else if (self.isZooming) { + self.onZoom(); + } + } + }; + + Guestures.prototype.onSwipe = function (e) { + var self = this, + instance = self.instance, + swiping = self.isSwiping, + left = self.sliderStartPos.left || 0, + angle; + + // If direction is not yet determined + if (swiping === true) { + // We need at least 10px distance to correctly calculate an angle + if (Math.abs(self.distance) > 10) { + self.canTap = false; + + if (instance.group.length < 2 && self.opts.vertical) { + self.isSwiping = "y"; + } else if (instance.isDragging || self.opts.vertical === false || (self.opts.vertical === "auto" && $(window).width() > 800)) { + self.isSwiping = "x"; + } else { + angle = Math.abs((Math.atan2(self.distanceY, self.distanceX) * 180) / Math.PI); + + self.isSwiping = angle > 45 && angle < 135 ? "y" : "x"; + } + + if (self.isSwiping === "y" && $.fancybox.isMobile && self.isScrollable) { + self.isScrolling = true; + + return; + } + + instance.isDragging = self.isSwiping; + + // Reset points to avoid jumping, because we dropped first swipes to calculate the angle + self.startPoints = self.newPoints; + + $.each(instance.slides, function (index, slide) { + var slidePos, stagePos; + + $.fancybox.stop(slide.$slide); + + slidePos = $.fancybox.getTranslate(slide.$slide); + stagePos = $.fancybox.getTranslate(instance.$refs.stage); + + slide.$slide + .css({ + transform: "", + opacity: "", + "transition-duration": "" + }) + .removeClass("fancybox-animated") + .removeClass(function (index, className) { + return (className.match(/(^|\s)fancybox-fx-\S+/g) || []).join(" "); + }); + + if (slide.pos === instance.current.pos) { + self.sliderStartPos.top = slidePos.top - stagePos.top; + self.sliderStartPos.left = slidePos.left - stagePos.left; + } + + $.fancybox.setTranslate(slide.$slide, { + top: slidePos.top - stagePos.top, + left: slidePos.left - stagePos.left + }); + }); + + // Stop slideshow + if (instance.SlideShow && instance.SlideShow.isActive) { + instance.SlideShow.stop(); + } + } + + return; + } + + // Sticky edges + if (swiping == "x") { + if ( + self.distanceX > 0 && + (self.instance.group.length < 2 || (self.instance.current.index === 0 && !self.instance.current.opts.loop)) + ) { + left = left + Math.pow(self.distanceX, 0.8); + } else if ( + self.distanceX < 0 && + (self.instance.group.length < 2 || + (self.instance.current.index === self.instance.group.length - 1 && !self.instance.current.opts.loop)) + ) { + left = left - Math.pow(-self.distanceX, 0.8); + } else { + left = left + self.distanceX; + } + } + + self.sliderLastPos = { + top: swiping == "x" ? 0 : self.sliderStartPos.top + self.distanceY, + left: left + }; + + if (self.requestId) { + cancelAFrame(self.requestId); + + self.requestId = null; + } + + self.requestId = requestAFrame(function () { + if (self.sliderLastPos) { + $.each(self.instance.slides, function (index, slide) { + var pos = slide.pos - self.instance.currPos; + + $.fancybox.setTranslate(slide.$slide, { + top: self.sliderLastPos.top, + left: self.sliderLastPos.left + pos * self.canvasWidth + pos * slide.opts.gutter + }); + }); + + self.$container.addClass("fancybox-is-sliding"); + } + }); + }; + + Guestures.prototype.onPan = function () { + var self = this; + + // Prevent accidental movement (sometimes, when tapping casually, finger can move a bit) + if (distance(self.newPoints[0], self.realPoints[0]) < ($.fancybox.isMobile ? 10 : 5)) { + self.startPoints = self.newPoints; + return; + } + + self.canTap = false; + + self.contentLastPos = self.limitMovement(); + + if (self.requestId) { + cancelAFrame(self.requestId); + } + + self.requestId = requestAFrame(function () { + $.fancybox.setTranslate(self.$content, self.contentLastPos); + }); + }; + + // Make panning sticky to the edges + Guestures.prototype.limitMovement = function () { + var self = this; + + var canvasWidth = self.canvasWidth; + var canvasHeight = self.canvasHeight; + + var distanceX = self.distanceX; + var distanceY = self.distanceY; + + var contentStartPos = self.contentStartPos; + + var currentOffsetX = contentStartPos.left; + var currentOffsetY = contentStartPos.top; + + var currentWidth = contentStartPos.width; + var currentHeight = contentStartPos.height; + + var minTranslateX, minTranslateY, maxTranslateX, maxTranslateY, newOffsetX, newOffsetY; + + if (currentWidth > canvasWidth) { + newOffsetX = currentOffsetX + distanceX; + } else { + newOffsetX = currentOffsetX; + } + + newOffsetY = currentOffsetY + distanceY; + + // Slow down proportionally to traveled distance + minTranslateX = Math.max(0, canvasWidth * 0.5 - currentWidth * 0.5); + minTranslateY = Math.max(0, canvasHeight * 0.5 - currentHeight * 0.5); + + maxTranslateX = Math.min(canvasWidth - currentWidth, canvasWidth * 0.5 - currentWidth * 0.5); + maxTranslateY = Math.min(canvasHeight - currentHeight, canvasHeight * 0.5 - currentHeight * 0.5); + + // -> + if (distanceX > 0 && newOffsetX > minTranslateX) { + newOffsetX = minTranslateX - 1 + Math.pow(-minTranslateX + currentOffsetX + distanceX, 0.8) || 0; + } + + // <- + if (distanceX < 0 && newOffsetX < maxTranslateX) { + newOffsetX = maxTranslateX + 1 - Math.pow(maxTranslateX - currentOffsetX - distanceX, 0.8) || 0; + } + + // \/ + if (distanceY > 0 && newOffsetY > minTranslateY) { + newOffsetY = minTranslateY - 1 + Math.pow(-minTranslateY + currentOffsetY + distanceY, 0.8) || 0; + } + + // /\ + if (distanceY < 0 && newOffsetY < maxTranslateY) { + newOffsetY = maxTranslateY + 1 - Math.pow(maxTranslateY - currentOffsetY - distanceY, 0.8) || 0; + } + + return { + top: newOffsetY, + left: newOffsetX + }; + }; + + Guestures.prototype.limitPosition = function (newOffsetX, newOffsetY, newWidth, newHeight) { + var self = this; + + var canvasWidth = self.canvasWidth; + var canvasHeight = self.canvasHeight; + + if (newWidth > canvasWidth) { + newOffsetX = newOffsetX > 0 ? 0 : newOffsetX; + newOffsetX = newOffsetX < canvasWidth - newWidth ? canvasWidth - newWidth : newOffsetX; + } else { + // Center horizontally + newOffsetX = Math.max(0, canvasWidth / 2 - newWidth / 2); + } + + if (newHeight > canvasHeight) { + newOffsetY = newOffsetY > 0 ? 0 : newOffsetY; + newOffsetY = newOffsetY < canvasHeight - newHeight ? canvasHeight - newHeight : newOffsetY; + } else { + // Center vertically + newOffsetY = Math.max(0, canvasHeight / 2 - newHeight / 2); + } + + return { + top: newOffsetY, + left: newOffsetX + }; + }; + + Guestures.prototype.onZoom = function () { + var self = this; + + // Calculate current distance between points to get pinch ratio and new width and height + var contentStartPos = self.contentStartPos; + + var currentWidth = contentStartPos.width; + var currentHeight = contentStartPos.height; + + var currentOffsetX = contentStartPos.left; + var currentOffsetY = contentStartPos.top; + + var endDistanceBetweenFingers = distance(self.newPoints[0], self.newPoints[1]); + + var pinchRatio = endDistanceBetweenFingers / self.startDistanceBetweenFingers; + + var newWidth = Math.floor(currentWidth * pinchRatio); + var newHeight = Math.floor(currentHeight * pinchRatio); + + // This is the translation due to pinch-zooming + var translateFromZoomingX = (currentWidth - newWidth) * self.percentageOfImageAtPinchPointX; + var translateFromZoomingY = (currentHeight - newHeight) * self.percentageOfImageAtPinchPointY; + + // Point between the two touches + var centerPointEndX = (self.newPoints[0].x + self.newPoints[1].x) / 2 - $(window).scrollLeft(); + var centerPointEndY = (self.newPoints[0].y + self.newPoints[1].y) / 2 - $(window).scrollTop(); + + // And this is the translation due to translation of the centerpoint + // between the two fingers + var translateFromTranslatingX = centerPointEndX - self.centerPointStartX; + var translateFromTranslatingY = centerPointEndY - self.centerPointStartY; + + // The new offset is the old/current one plus the total translation + var newOffsetX = currentOffsetX + (translateFromZoomingX + translateFromTranslatingX); + var newOffsetY = currentOffsetY + (translateFromZoomingY + translateFromTranslatingY); + + var newPos = { + top: newOffsetY, + left: newOffsetX, + scaleX: pinchRatio, + scaleY: pinchRatio + }; + + self.canTap = false; + + self.newWidth = newWidth; + self.newHeight = newHeight; + + self.contentLastPos = newPos; + + if (self.requestId) { + cancelAFrame(self.requestId); + } + + self.requestId = requestAFrame(function () { + $.fancybox.setTranslate(self.$content, self.contentLastPos); + }); + }; + + Guestures.prototype.ontouchend = function (e) { + var self = this; + + var swiping = self.isSwiping; + var panning = self.isPanning; + var zooming = self.isZooming; + var scrolling = self.isScrolling; + + self.endPoints = getPointerXY(e); + self.dMs = Math.max(new Date().getTime() - self.startTime, 1); + + self.$container.removeClass("fancybox-is-grabbing"); + + $(document).off(".fb.touch"); + + document.removeEventListener("scroll", self.onscroll, true); + + if (self.requestId) { + cancelAFrame(self.requestId); + + self.requestId = null; + } + + self.isSwiping = false; + self.isPanning = false; + self.isZooming = false; + self.isScrolling = false; + + self.instance.isDragging = false; + + if (self.canTap) { + return self.onTap(e); + } + + self.speed = 100; + + // Speed in px/ms + self.velocityX = (self.distanceX / self.dMs) * 0.5; + self.velocityY = (self.distanceY / self.dMs) * 0.5; + + if (panning) { + self.endPanning(); + } else if (zooming) { + self.endZooming(); + } else { + self.endSwiping(swiping, scrolling); + } + + return; + }; + + Guestures.prototype.endSwiping = function (swiping, scrolling) { + var self = this, + ret = false, + len = self.instance.group.length, + distanceX = Math.abs(self.distanceX), + canAdvance = swiping == "x" && len > 1 && ((self.dMs > 130 && distanceX > 10) || distanceX > 50), + speedX = 300; + + self.sliderLastPos = null; + + // Close if swiped vertically / navigate if horizontally + if (swiping == "y" && !scrolling && Math.abs(self.distanceY) > 50) { + // Continue vertical movement + $.fancybox.animate( + self.instance.current.$slide, { + top: self.sliderStartPos.top + self.distanceY + self.velocityY * 150, + opacity: 0 + }, + 200 + ); + ret = self.instance.close(true, 250); + } else if (canAdvance && self.distanceX > 0) { + ret = self.instance.previous(speedX); + } else if (canAdvance && self.distanceX < 0) { + ret = self.instance.next(speedX); + } + + if (ret === false && (swiping == "x" || swiping == "y")) { + self.instance.centerSlide(200); + } + + self.$container.removeClass("fancybox-is-sliding"); + }; + + // Limit panning from edges + // ======================== + Guestures.prototype.endPanning = function () { + var self = this, + newOffsetX, + newOffsetY, + newPos; + + if (!self.contentLastPos) { + return; + } + + if (self.opts.momentum === false || self.dMs > 350) { + newOffsetX = self.contentLastPos.left; + newOffsetY = self.contentLastPos.top; + } else { + // Continue movement + newOffsetX = self.contentLastPos.left + self.velocityX * 500; + newOffsetY = self.contentLastPos.top + self.velocityY * 500; + } + + newPos = self.limitPosition(newOffsetX, newOffsetY, self.contentStartPos.width, self.contentStartPos.height); + + newPos.width = self.contentStartPos.width; + newPos.height = self.contentStartPos.height; + + $.fancybox.animate(self.$content, newPos, 366); + }; + + Guestures.prototype.endZooming = function () { + var self = this; + + var current = self.instance.current; + + var newOffsetX, newOffsetY, newPos, reset; + + var newWidth = self.newWidth; + var newHeight = self.newHeight; + + if (!self.contentLastPos) { + return; + } + + newOffsetX = self.contentLastPos.left; + newOffsetY = self.contentLastPos.top; + + reset = { + top: newOffsetY, + left: newOffsetX, + width: newWidth, + height: newHeight, + scaleX: 1, + scaleY: 1 + }; + + // Reset scalex/scaleY values; this helps for perfomance and does not break animation + $.fancybox.setTranslate(self.$content, reset); + + if (newWidth < self.canvasWidth && newHeight < self.canvasHeight) { + self.instance.scaleToFit(150); + } else if (newWidth > current.width || newHeight > current.height) { + self.instance.scaleToActual(self.centerPointStartX, self.centerPointStartY, 150); + } else { + newPos = self.limitPosition(newOffsetX, newOffsetY, newWidth, newHeight); + + $.fancybox.animate(self.$content, newPos, 150); + } + }; + + Guestures.prototype.onTap = function (e) { + var self = this; + var $target = $(e.target); + + var instance = self.instance; + var current = instance.current; + + var endPoints = (e && getPointerXY(e)) || self.startPoints; + + var tapX = endPoints[0] ? endPoints[0].x - $(window).scrollLeft() - self.stagePos.left : 0; + var tapY = endPoints[0] ? endPoints[0].y - $(window).scrollTop() - self.stagePos.top : 0; + + var where; + + var process = function (prefix) { + var action = current.opts[prefix]; + + if ($.isFunction(action)) { + action = action.apply(instance, [current, e]); + } + + if (!action) { + return; + } + + switch (action) { + case "close": + instance.close(self.startEvent); + + break; + + case "toggleControls": + instance.toggleControls(); + + break; + + case "next": + instance.next(); + + break; + + case "nextOrClose": + if (instance.group.length > 1) { + instance.next(); + } else { + instance.close(self.startEvent); + } + + break; + + case "zoom": + if (current.type == "image" && (current.isLoaded || current.$ghost)) { + if (instance.canPan()) { + instance.scaleToFit(); + } else if (instance.isScaledDown()) { + instance.scaleToActual(tapX, tapY); + } else if (instance.group.length < 2) { + instance.close(self.startEvent); + } + } + + break; + } + }; + + // Ignore right click + if (e.originalEvent && e.originalEvent.button == 2) { + return; + } + + // Skip if clicked on the scrollbar + if (!$target.is("img") && tapX > $target[0].clientWidth + $target.offset().left) { + return; + } + + // Check where is clicked + if ($target.is(".fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-container")) { + where = "Outside"; + } else if ($target.is(".fancybox-slide")) { + where = "Slide"; + } else if ( + instance.current.$content && + instance.current.$content + .find($target) + .addBack() + .filter($target).length + ) { + where = "Content"; + } else { + return; + } + + // Check if this is a double tap + if (self.tapped) { + // Stop previously created single tap + clearTimeout(self.tapped); + self.tapped = null; + + // Skip if distance between taps is too big + if (Math.abs(tapX - self.tapX) > 50 || Math.abs(tapY - self.tapY) > 50) { + return this; + } + + // OK, now we assume that this is a double-tap + process("dblclick" + where); + } else { + // Single tap will be processed if user has not clicked second time within 300ms + // or there is no need to wait for double-tap + self.tapX = tapX; + self.tapY = tapY; + + if (current.opts["dblclick" + where] && current.opts["dblclick" + where] !== current.opts["click" + where]) { + self.tapped = setTimeout(function () { + self.tapped = null; + + if (!instance.isAnimating) { + process("click" + where); + } + }, 500); + } else { + process("click" + where); + } + } + + return this; + }; + + $(document) + .on("onActivate.fb", function (e, instance) { + if (instance && !instance.Guestures) { + instance.Guestures = new Guestures(instance); + } + }) + .on("beforeClose.fb", function (e, instance) { + if (instance && instance.Guestures) { + instance.Guestures.destroy(); + } + }); +})(window, document, jQuery); +// ========================================================================== +// +// SlideShow +// Enables slideshow functionality +// +// Example of usage: +// $.fancybox.getInstance().SlideShow.start() +// +// ========================================================================== +(function (document, $) { + "use strict"; + + $.extend(true, $.fancybox.defaults, { + btnTpl: { + slideShow: '" + }, + slideShow: { + autoStart: false, + speed: 3000, + progress: true + } + }); + + var SlideShow = function (instance) { + this.instance = instance; + this.init(); + }; + + $.extend(SlideShow.prototype, { + timer: null, + isActive: false, + $button: null, + + init: function () { + var self = this, + instance = self.instance, + opts = instance.group[instance.currIndex].opts.slideShow; + + self.$button = instance.$refs.toolbar.find("[data-fancybox-play]").on("click", function () { + self.toggle(); + }); + + if (instance.group.length < 2 || !opts) { + self.$button.hide(); + } else if (opts.progress) { + self.$progress = $('
').appendTo(instance.$refs.inner); + } + }, + + set: function (force) { + var self = this, + instance = self.instance, + current = instance.current; + + // Check if reached last element + if (current && (force === true || current.opts.loop || instance.currIndex < instance.group.length - 1)) { + if (self.isActive && current.contentType !== "video") { + if (self.$progress) { + $.fancybox.animate(self.$progress.show(), { + scaleX: 1 + }, current.opts.slideShow.speed); + } + + self.timer = setTimeout(function () { + if (!instance.current.opts.loop && instance.current.index == instance.group.length - 1) { + instance.jumpTo(0); + } else { + instance.next(); + } + }, current.opts.slideShow.speed); + } + } else { + self.stop(); + instance.idleSecondsCounter = 0; + instance.showControls(); + } + }, + + clear: function () { + var self = this; + + clearTimeout(self.timer); + + self.timer = null; + + if (self.$progress) { + self.$progress.removeAttr("style").hide(); + } + }, + + start: function () { + var self = this, + current = self.instance.current; + + if (current) { + self.$button + .attr("title", (current.opts.i18n[current.opts.lang] || current.opts.i18n.en).PLAY_STOP) + .removeClass("fancybox-button--play") + .addClass("fancybox-button--pause"); + + self.isActive = true; + + if (current.isComplete) { + self.set(true); + } + + self.instance.trigger("onSlideShowChange", true); + } + }, + + stop: function () { + var self = this, + current = self.instance.current; + + self.clear(); + + self.$button + .attr("title", (current.opts.i18n[current.opts.lang] || current.opts.i18n.en).PLAY_START) + .removeClass("fancybox-button--pause") + .addClass("fancybox-button--play"); + + self.isActive = false; + + self.instance.trigger("onSlideShowChange", false); + + if (self.$progress) { + self.$progress.removeAttr("style").hide(); + } + }, + + toggle: function () { + var self = this; + + if (self.isActive) { + self.stop(); + } else { + self.start(); + } + } + }); + + $(document).on({ + "onInit.fb": function (e, instance) { + if (instance && !instance.SlideShow) { + instance.SlideShow = new SlideShow(instance); + } + }, + + "beforeShow.fb": function (e, instance, current, firstRun) { + var SlideShow = instance && instance.SlideShow; + + if (firstRun) { + if (SlideShow && current.opts.slideShow.autoStart) { + SlideShow.start(); + } + } else if (SlideShow && SlideShow.isActive) { + SlideShow.clear(); + } + }, + + "afterShow.fb": function (e, instance, current) { + var SlideShow = instance && instance.SlideShow; + + if (SlideShow && SlideShow.isActive) { + SlideShow.set(); + } + }, + + "afterKeydown.fb": function (e, instance, current, keypress, keycode) { + var SlideShow = instance && instance.SlideShow; + + // "P" or Spacebar + if (SlideShow && current.opts.slideShow && (keycode === 80 || keycode === 32) && !$(document.activeElement).is("button,a,input")) { + keypress.preventDefault(); + + SlideShow.toggle(); + } + }, + + "beforeClose.fb onDeactivate.fb": function (e, instance) { + var SlideShow = instance && instance.SlideShow; + + if (SlideShow) { + SlideShow.stop(); + } + } + }); + + // Page Visibility API to pause slideshow when window is not active + $(document).on("visibilitychange", function () { + var instance = $.fancybox.getInstance(), + SlideShow = instance && instance.SlideShow; + + if (SlideShow && SlideShow.isActive) { + if (document.hidden) { + SlideShow.clear(); + } else { + SlideShow.set(); + } + } + }); +})(document, jQuery); +// ========================================================================== +// +// FullScreen +// Adds fullscreen functionality +// +// ========================================================================== +(function (document, $) { + "use strict"; + + // Collection of methods supported by user browser + var fn = (function () { + var fnMap = [ + ["requestFullscreen", "exitFullscreen", "fullscreenElement", "fullscreenEnabled", "fullscreenchange", "fullscreenerror"], + // new WebKit + [ + "webkitRequestFullscreen", + "webkitExitFullscreen", + "webkitFullscreenElement", + "webkitFullscreenEnabled", + "webkitfullscreenchange", + "webkitfullscreenerror" + ], + // old WebKit (Safari 5.1) + [ + "webkitRequestFullScreen", + "webkitCancelFullScreen", + "webkitCurrentFullScreenElement", + "webkitCancelFullScreen", + "webkitfullscreenchange", + "webkitfullscreenerror" + ], + [ + "mozRequestFullScreen", + "mozCancelFullScreen", + "mozFullScreenElement", + "mozFullScreenEnabled", + "mozfullscreenchange", + "mozfullscreenerror" + ], + ["msRequestFullscreen", "msExitFullscreen", "msFullscreenElement", "msFullscreenEnabled", "MSFullscreenChange", "MSFullscreenError"] + ]; + + var ret = {}; + + for (var i = 0; i < fnMap.length; i++) { + var val = fnMap[i]; + + if (val && val[1] in document) { + for (var j = 0; j < val.length; j++) { + ret[fnMap[0][j]] = val[j]; + } + + return ret; + } + } + + return false; + })(); + + if (fn) { + var FullScreen = { + request: function (elem) { + elem = elem || document.documentElement; + + elem[fn.requestFullscreen](elem.ALLOW_KEYBOARD_INPUT); + }, + exit: function () { + document[fn.exitFullscreen](); + }, + toggle: function (elem) { + elem = elem || document.documentElement; + + if (this.isFullscreen()) { + this.exit(); + } else { + this.request(elem); + } + }, + isFullscreen: function () { + return Boolean(document[fn.fullscreenElement]); + }, + enabled: function () { + return Boolean(document[fn.fullscreenEnabled]); + } + }; + + $.extend(true, $.fancybox.defaults, { + btnTpl: { + fullScreen: '" + }, + fullScreen: { + autoStart: false + } + }); + + $(document).on(fn.fullscreenchange, function () { + var isFullscreen = FullScreen.isFullscreen(), + instance = $.fancybox.getInstance(); + + if (instance) { + // If image is zooming, then force to stop and reposition properly + if (instance.current && instance.current.type === "image" && instance.isAnimating) { + instance.isAnimating = false; + + instance.update(true, true, 0); + + if (!instance.isComplete) { + instance.complete(); + } + } + + instance.trigger("onFullscreenChange", isFullscreen); + + instance.$refs.container.toggleClass("fancybox-is-fullscreen", isFullscreen); + + instance.$refs.toolbar + .find("[data-fancybox-fullscreen]") + .toggleClass("fancybox-button--fsenter", !isFullscreen) + .toggleClass("fancybox-button--fsexit", isFullscreen); + } + }); + } + + $(document).on({ + "onInit.fb": function (e, instance) { + var $container; + + if (!fn) { + instance.$refs.toolbar.find("[data-fancybox-fullscreen]").remove(); + + return; + } + + if (instance && instance.group[instance.currIndex].opts.fullScreen) { + $container = instance.$refs.container; + + $container.on("click.fb-fullscreen", "[data-fancybox-fullscreen]", function (e) { + e.stopPropagation(); + e.preventDefault(); + + FullScreen.toggle(); + }); + + if (instance.opts.fullScreen && instance.opts.fullScreen.autoStart === true) { + FullScreen.request(); + } + + // Expose API + instance.FullScreen = FullScreen; + } else if (instance) { + instance.$refs.toolbar.find("[data-fancybox-fullscreen]").hide(); + } + }, + + "afterKeydown.fb": function (e, instance, current, keypress, keycode) { + // "F" + if (instance && instance.FullScreen && keycode === 70) { + keypress.preventDefault(); + + instance.FullScreen.toggle(); + } + }, + + "beforeClose.fb": function (e, instance) { + if (instance && instance.FullScreen && instance.$refs.container.hasClass("fancybox-is-fullscreen")) { + FullScreen.exit(); + } + } + }); +})(document, jQuery); +// ========================================================================== +// +// Thumbs +// Displays thumbnails in a grid +// +// ========================================================================== +(function (document, $) { + "use strict"; + + var CLASS = "fancybox-thumbs", + CLASS_ACTIVE = CLASS + "-active"; + + // Make sure there are default values + $.fancybox.defaults = $.extend( + true, { + btnTpl: { + thumbs: '" + }, + thumbs: { + autoStart: false, // Display thumbnails on opening + hideOnClose: true, // Hide thumbnail grid when closing animation starts + parentEl: ".fancybox-container", // Container is injected into this element + axis: "y" // Vertical (y) or horizontal (x) scrolling + } + }, + $.fancybox.defaults + ); + + var FancyThumbs = function (instance) { + this.init(instance); + }; + + $.extend(FancyThumbs.prototype, { + $button: null, + $grid: null, + $list: null, + isVisible: false, + isActive: false, + + init: function (instance) { + var self = this, + group = instance.group, + enabled = 0; + + self.instance = instance; + self.opts = group[instance.currIndex].opts.thumbs; + + instance.Thumbs = self; + + self.$button = instance.$refs.toolbar.find("[data-fancybox-thumbs]"); + + // Enable thumbs if at least two group items have thumbnails + for (var i = 0, len = group.length; i < len; i++) { + if (group[i].thumb) { + enabled++; + } + + if (enabled > 1) { + break; + } + } + + if (enabled > 1 && !!self.opts) { + self.$button.removeAttr("style").on("click", function () { + self.toggle(); + }); + + self.isActive = true; + } else { + self.$button.hide(); + } + }, + + create: function () { + var self = this, + instance = self.instance, + parentEl = self.opts.parentEl, + list = [], + src; + + if (!self.$grid) { + // Create main element + self.$grid = $('
').appendTo( + instance.$refs.container + .find(parentEl) + .addBack() + .filter(parentEl) + ); + + // Add "click" event that performs gallery navigation + self.$grid.on("click", "a", function () { + instance.jumpTo($(this).attr("data-index")); + }); + } + + // Build the list + if (!self.$list) { + self.$list = $('
').appendTo(self.$grid); + } + + $.each(instance.group, function (i, item) { + src = item.thumb; + + if (!src && item.type === "image") { + src = item.src; + } + + list.push( + '" + ); + }); + + self.$list[0].innerHTML = list.join(""); + + if (self.opts.axis === "x") { + // Set fixed width for list element to enable horizontal scrolling + self.$list.width( + parseInt(self.$grid.css("padding-right"), 10) + + instance.group.length * + self.$list + .children() + .eq(0) + .outerWidth(true) + ); + } + }, + + focus: function (duration) { + var self = this, + $list = self.$list, + $grid = self.$grid, + thumb, + thumbPos; + + if (!self.instance.current) { + return; + } + + thumb = $list + .children() + .removeClass(CLASS_ACTIVE) + .filter('[data-index="' + self.instance.current.index + '"]') + .addClass(CLASS_ACTIVE); + + thumbPos = thumb.position(); + + // Check if need to scroll to make current thumb visible + if (self.opts.axis === "y" && (thumbPos.top < 0 || thumbPos.top > $list.height() - thumb.outerHeight())) { + $list.stop().animate({ + scrollTop: $list.scrollTop() + thumbPos.top + }, + duration + ); + } else if ( + self.opts.axis === "x" && + (thumbPos.left < $grid.scrollLeft() || thumbPos.left > $grid.scrollLeft() + ($grid.width() - thumb.outerWidth())) + ) { + $list + .parent() + .stop() + .animate({ + scrollLeft: thumbPos.left + }, + duration + ); + } + }, + + update: function () { + var that = this; + that.instance.$refs.container.toggleClass("fancybox-show-thumbs", this.isVisible); + + if (that.isVisible) { + if (!that.$grid) { + that.create(); + } + + that.instance.trigger("onThumbsShow"); + + that.focus(0); + } else if (that.$grid) { + that.instance.trigger("onThumbsHide"); + } + + // Update content position + that.instance.update(); + }, + + hide: function () { + this.isVisible = false; + this.update(); + }, + + show: function () { + this.isVisible = true; + this.update(); + }, + + toggle: function () { + this.isVisible = !this.isVisible; + this.update(); + } + }); + + $(document).on({ + "onInit.fb": function (e, instance) { + var Thumbs; + + if (instance && !instance.Thumbs) { + Thumbs = new FancyThumbs(instance); + + if (Thumbs.isActive && Thumbs.opts.autoStart === true) { + Thumbs.show(); + } + } + }, + + "beforeShow.fb": function (e, instance, item, firstRun) { + var Thumbs = instance && instance.Thumbs; + + if (Thumbs && Thumbs.isVisible) { + Thumbs.focus(firstRun ? 0 : 250); + } + }, + + "afterKeydown.fb": function (e, instance, current, keypress, keycode) { + var Thumbs = instance && instance.Thumbs; + + // "G" + if (Thumbs && Thumbs.isActive && keycode === 71) { + keypress.preventDefault(); + + Thumbs.toggle(); + } + }, + + "beforeClose.fb": function (e, instance) { + var Thumbs = instance && instance.Thumbs; + + if (Thumbs && Thumbs.isVisible && Thumbs.opts.hideOnClose !== false) { + Thumbs.$grid.hide(); + } + } + }); +})(document, jQuery); +//// ========================================================================== +// +// Share +// Displays simple form for sharing current url +// +// ========================================================================== +(function (document, $) { + "use strict"; + + $.extend(true, $.fancybox.defaults, { + btnTpl: { + share: '" + }, + share: { + url: function (instance, item) { + return ( + (!instance.currentHash && !(item.type === "inline" || item.type === "html") ? item.origSrc || item.src : false) || window.location + ); + }, + tpl: '
' + + "

{{SHARE}}

" + + "

" + + '' + + '' + + "Facebook" + + "" + + '' + + '' + + "Twitter" + + "" + + '' + + '' + + "Pinterest" + + "" + + "

" + + '

' + + "
" + } + }); + + function escapeHtml(string) { + var entityMap = { + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'", + "/": "/", + "`": "`", + "=": "=" + }; + + return String(string).replace(/[&<>"'`=\/]/g, function (s) { + return entityMap[s]; + }); + } + + $(document).on("click", "[data-fancybox-share]", function () { + var instance = $.fancybox.getInstance(), + current = instance.current || null, + url, + tpl; + + if (!current) { + return; + } + + if ($.type(current.opts.share.url) === "function") { + url = current.opts.share.url.apply(current, [instance, current]); + } + + tpl = current.opts.share.tpl + .replace(/\{\{media\}\}/g, current.type === "image" ? encodeURIComponent(current.src) : "") + .replace(/\{\{url\}\}/g, encodeURIComponent(url)) + .replace(/\{\{url_raw\}\}/g, escapeHtml(url)) + .replace(/\{\{descr\}\}/g, instance.$caption ? encodeURIComponent(instance.$caption.text()) : ""); + + $.fancybox.open({ + src: instance.translate(instance, tpl), + type: "html", + opts: { + touch: false, + animationEffect: false, + afterLoad: function (shareInstance, shareCurrent) { + // Close self if parent instance is closing + instance.$refs.container.one("beforeClose.fb", function () { + shareInstance.close(null, 0); + }); + + // Opening links in a popup window + shareCurrent.$content.find(".fancybox-share__button").click(function () { + window.open(this.href, "Share", "width=550, height=450"); + return false; + }); + }, + mobile: { + autoFocus: false + } + } + }); + }); +})(document, jQuery); +// ========================================================================== +// +// Hash +// Enables linking to each modal +// +// ========================================================================== +(function (window, document, $) { + "use strict"; + + // Simple $.escapeSelector polyfill (for jQuery prior v3) + if (!$.escapeSelector) { + $.escapeSelector = function (sel) { + var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; + var fcssescape = function (ch, asCodePoint) { + if (asCodePoint) { + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if (ch === "\0") { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }; + + return (sel + "").replace(rcssescape, fcssescape); + }; + } + + // Get info about gallery name and current index from url + function parseUrl() { + var hash = window.location.hash.substr(1), + rez = hash.split("-"), + index = rez.length > 1 && /^\+?\d+$/.test(rez[rez.length - 1]) ? parseInt(rez.pop(-1), 10) || 1 : 1, + gallery = rez.join("-"); + + return { + hash: hash, + /* Index is starting from 1 */ + index: index < 1 ? 1 : index, + gallery: gallery + }; + } + + // Trigger click evnt on links to open new fancyBox instance + function triggerFromUrl(url) { + if (url.gallery !== "") { + // If we can find element matching 'data-fancybox' atribute, + // then triggering click event should start fancyBox + $("[data-fancybox='" + $.escapeSelector(url.gallery) + "']") + .eq(url.index - 1) + .focus() + .trigger("click.fb-start"); + } + } + + // Get gallery name from current instance + function getGalleryID(instance) { + var opts, ret; + + if (!instance) { + return false; + } + + opts = instance.current ? instance.current.opts : instance.opts; + ret = opts.hash || (opts.$orig ? opts.$orig.data("fancybox") || opts.$orig.data("fancybox-trigger") : ""); + + return ret === "" ? false : ret; + } + + // Start when DOM becomes ready + $(function () { + // Check if user has disabled this module + if ($.fancybox.defaults.hash === false) { + return; + } + + // Update hash when opening/closing fancyBox + $(document).on({ + "onInit.fb": function (e, instance) { + var url, gallery; + + if (instance.group[instance.currIndex].opts.hash === false) { + return; + } + + url = parseUrl(); + gallery = getGalleryID(instance); + + // Make sure gallery start index matches index from hash + if (gallery && url.gallery && gallery == url.gallery) { + instance.currIndex = url.index - 1; + } + }, + + "beforeShow.fb": function (e, instance, current, firstRun) { + var gallery; + + if (!current || current.opts.hash === false) { + return; + } + + // Check if need to update window hash + gallery = getGalleryID(instance); + + if (!gallery) { + return; + } + + // Variable containing last hash value set by fancyBox + // It will be used to determine if fancyBox needs to close after hash change is detected + instance.currentHash = gallery + (instance.group.length > 1 ? "-" + (current.index + 1) : ""); + + // If current hash is the same (this instance most likely is opened by hashchange), then do nothing + if (window.location.hash === "#" + instance.currentHash) { + return; + } + + if (firstRun && !instance.origHash) { + instance.origHash = window.location.hash; + } + + if (instance.hashTimer) { + clearTimeout(instance.hashTimer); + } + + // Update hash + instance.hashTimer = setTimeout(function () { + if ("replaceState" in window.history) { + window.history[firstRun ? "pushState" : "replaceState"]({}, + document.title, + window.location.pathname + window.location.search + "#" + instance.currentHash + ); + + if (firstRun) { + instance.hasCreatedHistory = true; + } + } else { + window.location.hash = instance.currentHash; + } + + instance.hashTimer = null; + }, 300); + }, + + "beforeClose.fb": function (e, instance, current) { + if (!current || current.opts.hash === false) { + return; + } + + clearTimeout(instance.hashTimer); + + // Goto previous history entry + if (instance.currentHash && instance.hasCreatedHistory) { + window.history.back(); + } else if (instance.currentHash) { + if ("replaceState" in window.history) { + window.history.replaceState({}, document.title, window.location.pathname + window.location.search + (instance.origHash || "")); + } else { + window.location.hash = instance.origHash; + } + } + + instance.currentHash = null; + } + }); + + // Check if need to start/close after url has changed + $(window).on("hashchange.fb", function () { + var url = parseUrl(), + fb = null; + + // Find last fancyBox instance that has "hash" + $.each( + $(".fancybox-container") + .get() + .reverse(), + function (index, value) { + var tmp = $(value).data("FancyBox"); + + if (tmp && tmp.currentHash) { + fb = tmp; + return false; + } + } + ); + + if (fb) { + // Now, compare hash values + if (fb.currentHash !== url.gallery + "-" + url.index && !(url.index === 1 && fb.currentHash == url.gallery)) { + fb.currentHash = null; + + fb.close(); + } + } else if (url.gallery !== "") { + triggerFromUrl(url); + } + }); + + // Check current hash and trigger click event on matching element to start fancyBox, if needed + setTimeout(function () { + if (!$.fancybox.getInstance()) { + triggerFromUrl(parseUrl()); + } + }, 50); + }); +})(window, document, jQuery); +// ========================================================================== +// +// Wheel +// Basic mouse weheel support for gallery navigation +// +// ========================================================================== +(function (document, $) { + "use strict"; + + var prevTime = new Date().getTime(); + + $(document).on({ + "onInit.fb": function (e, instance, current) { + instance.$refs.stage.on("mousewheel DOMMouseScroll wheel MozMousePixelScroll", function (e) { + var current = instance.current, + currTime = new Date().getTime(); + + if (instance.group.length < 2 || current.opts.wheel === false || (current.opts.wheel === "auto" && current.type !== "image")) { + return; + } + + e.preventDefault(); + e.stopPropagation(); + + if (current.$slide.hasClass("fancybox-animated")) { + return; + } + + e = e.originalEvent || e; + + if (currTime - prevTime < 250) { + return; + } + + prevTime = currTime; + + instance[(-e.deltaY || -e.deltaX || e.wheelDelta || -e.detail) < 0 ? "next" : "previous"](); + }); + } + }); +})(document, jQuery); \ No newline at end of file diff --git a/public/themes/custom/ubccs/js/vendor/fancybox/jquery.fancybox.min.css b/public/themes/custom/ubccs/js/vendor/fancybox/jquery.fancybox.min.css new file mode 100644 index 0000000..7cc60b2 --- /dev/null +++ b/public/themes/custom/ubccs/js/vendor/fancybox/jquery.fancybox.min.css @@ -0,0 +1 @@ +body.compensate-for-scrollbar{overflow:hidden}.fancybox-active{height:auto}.fancybox-is-hidden{left:-9999px;margin:0;position:absolute!important;top:-9999px;visibility:hidden}.fancybox-container{-webkit-backface-visibility:hidden;height:100%;left:0;outline:none;position:fixed;-webkit-tap-highlight-color:transparent;top:0;-ms-touch-action:manipulation;touch-action:manipulation;transform:translateZ(0);width:100%;z-index:99992}.fancybox-container *{box-sizing:border-box}.fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-stage{bottom:0;left:0;position:absolute;right:0;top:0}.fancybox-outer{-webkit-overflow-scrolling:touch;overflow-y:auto}.fancybox-bg{background:#1e1e1e;opacity:0;transition-duration:inherit;transition-property:opacity;transition-timing-function:cubic-bezier(.47,0,.74,.71)}.fancybox-is-open .fancybox-bg{opacity:.9;transition-timing-function:cubic-bezier(.22,.61,.36,1)}.fancybox-caption,.fancybox-infobar,.fancybox-navigation .fancybox-button,.fancybox-toolbar{direction:ltr;opacity:0;position:absolute;transition:opacity .25s ease,visibility 0s ease .25s;visibility:hidden;z-index:99997}.fancybox-show-caption .fancybox-caption,.fancybox-show-infobar .fancybox-infobar,.fancybox-show-nav .fancybox-navigation .fancybox-button,.fancybox-show-toolbar .fancybox-toolbar{opacity:1;transition:opacity .25s ease 0s,visibility 0s ease 0s;visibility:visible}.fancybox-infobar{color:#ccc;font-size:13px;-webkit-font-smoothing:subpixel-antialiased;height:44px;left:0;line-height:44px;min-width:44px;mix-blend-mode:difference;padding:0 10px;pointer-events:none;top:0;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fancybox-toolbar{right:0;top:0}.fancybox-stage{direction:ltr;overflow:visible;transform:translateZ(0);z-index:99994}.fancybox-is-open .fancybox-stage{overflow:hidden}.fancybox-slide{-webkit-backface-visibility:hidden;display:none;height:100%;left:0;outline:none;overflow:auto;-webkit-overflow-scrolling:touch;padding:44px;position:absolute;text-align:center;top:0;transition-property:transform,opacity;white-space:normal;width:100%;z-index:99994}.fancybox-slide:before{content:"";display:inline-block;font-size:0;height:100%;vertical-align:middle;width:0}.fancybox-is-sliding .fancybox-slide,.fancybox-slide--current,.fancybox-slide--next,.fancybox-slide--previous{display:block}.fancybox-slide--image{overflow:hidden;padding:44px 0}.fancybox-slide--image:before{display:none}.fancybox-slide--html{padding:6px}.fancybox-content{background:#fff;display:inline-block;margin:0;max-width:100%;overflow:auto;-webkit-overflow-scrolling:touch;padding:44px;position:relative;text-align:left;vertical-align:middle}.fancybox-slide--image .fancybox-content{animation-timing-function:cubic-bezier(.5,0,.14,1);-webkit-backface-visibility:hidden;background:transparent;background-repeat:no-repeat;background-size:100% 100%;left:0;max-width:none;overflow:visible;padding:0;position:absolute;top:0;transform-origin:top left;transition-property:transform,opacity;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:99995}.fancybox-can-zoomOut .fancybox-content{cursor:zoom-out}.fancybox-can-zoomIn .fancybox-content{cursor:zoom-in}.fancybox-can-pan .fancybox-content,.fancybox-can-swipe .fancybox-content{cursor:grab}.fancybox-is-grabbing .fancybox-content{cursor:grabbing}.fancybox-container [data-selectable=true]{cursor:text}.fancybox-image,.fancybox-spaceball{background:transparent;border:0;height:100%;left:0;margin:0;max-height:none;max-width:none;padding:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.fancybox-spaceball{z-index:1}.fancybox-slide--iframe .fancybox-content,.fancybox-slide--map .fancybox-content,.fancybox-slide--pdf .fancybox-content,.fancybox-slide--video .fancybox-content{height:100%;overflow:visible;padding:0;width:100%}.fancybox-slide--video .fancybox-content{background:#000}.fancybox-slide--map .fancybox-content{background:#e5e3df}.fancybox-slide--iframe .fancybox-content{background:#fff}.fancybox-iframe,.fancybox-video{background:transparent;border:0;display:block;height:100%;margin:0;overflow:hidden;padding:0;width:100%}.fancybox-iframe{left:0;position:absolute;top:0}.fancybox-error{background:#fff;cursor:default;max-width:400px;padding:40px;width:100%}.fancybox-error p{color:#444;font-size:16px;line-height:20px;margin:0;padding:0}.fancybox-button{background:rgba(30,30,30,.6);border:0;border-radius:0;box-shadow:none;cursor:pointer;display:inline-block;height:44px;margin:0;padding:10px;position:relative;transition:color .2s;vertical-align:top;visibility:inherit;width:44px}.fancybox-button,.fancybox-button:link,.fancybox-button:visited{color:#ccc}.fancybox-button:hover{color:#fff}.fancybox-button:focus{outline:none}.fancybox-button.fancybox-focus{outline:1px dotted}.fancybox-button[disabled],.fancybox-button[disabled]:hover{color:#888;cursor:default;outline:none}.fancybox-button div{height:100%}.fancybox-button svg{display:block;height:100%;overflow:visible;position:relative;width:100%}.fancybox-button svg path{fill:currentColor;stroke-width:0}.fancybox-button--fsenter svg:nth-child(2),.fancybox-button--fsexit svg:first-child,.fancybox-button--pause svg:first-child,.fancybox-button--play svg:nth-child(2){display:none}.fancybox-progress{background:#ff5268;height:2px;left:0;position:absolute;right:0;top:0;transform:scaleX(0);transform-origin:0;transition-property:transform;transition-timing-function:linear;z-index:99998}.fancybox-close-small{background:transparent;border:0;border-radius:0;color:#ccc;cursor:pointer;opacity:.8;padding:8px;position:absolute;right:-12px;top:-44px;z-index:401}.fancybox-close-small:hover{color:#fff;opacity:1}.fancybox-slide--html .fancybox-close-small{color:currentColor;padding:10px;right:0;top:0}.fancybox-slide--image.fancybox-is-scaling .fancybox-content{overflow:hidden}.fancybox-is-scaling .fancybox-close-small,.fancybox-is-zoomable.fancybox-can-pan .fancybox-close-small{display:none}.fancybox-navigation .fancybox-button{background-clip:content-box;height:100px;opacity:0;position:absolute;top:calc(50% - 50px);width:70px}.fancybox-navigation .fancybox-button div{padding:7px}.fancybox-navigation .fancybox-button--arrow_left{left:0;left:env(safe-area-inset-left);padding:31px 26px 31px 6px}.fancybox-navigation .fancybox-button--arrow_right{padding:31px 6px 31px 26px;right:0;right:env(safe-area-inset-right)}.fancybox-caption{background:linear-gradient(0deg,rgba(0,0,0,.85) 0,rgba(0,0,0,.3) 50%,rgba(0,0,0,.15) 65%,rgba(0,0,0,.075) 75.5%,rgba(0,0,0,.037) 82.85%,rgba(0,0,0,.019) 88%,transparent);bottom:0;color:#eee;font-size:14px;font-weight:400;left:0;line-height:1.5;padding:75px 44px 25px;pointer-events:none;right:0;text-align:center;z-index:99996}@supports (padding:max(0px)){.fancybox-caption{padding:75px max(44px,env(safe-area-inset-right)) max(25px,env(safe-area-inset-bottom)) max(44px,env(safe-area-inset-left))}}.fancybox-caption--separate{margin-top:-50px}.fancybox-caption__body{max-height:50vh;overflow:auto;pointer-events:all}.fancybox-caption a,.fancybox-caption a:link,.fancybox-caption a:visited{color:#ccc;text-decoration:none}.fancybox-caption a:hover{color:#fff;text-decoration:underline}.fancybox-loading{animation:a 1s linear infinite;background:transparent;border:4px solid #888;border-bottom-color:#fff;border-radius:50%;height:50px;left:50%;margin:-25px 0 0 -25px;opacity:.7;padding:0;position:absolute;top:50%;width:50px;z-index:99999}@keyframes a{to{transform:rotate(1turn)}}.fancybox-animated{transition-timing-function:cubic-bezier(0,0,.25,1)}.fancybox-fx-slide.fancybox-slide--previous{opacity:0;transform:translate3d(-100%,0,0)}.fancybox-fx-slide.fancybox-slide--next{opacity:0;transform:translate3d(100%,0,0)}.fancybox-fx-slide.fancybox-slide--current{opacity:1;transform:translateZ(0)}.fancybox-fx-fade.fancybox-slide--next,.fancybox-fx-fade.fancybox-slide--previous{opacity:0;transition-timing-function:cubic-bezier(.19,1,.22,1)}.fancybox-fx-fade.fancybox-slide--current{opacity:1}.fancybox-fx-zoom-in-out.fancybox-slide--previous{opacity:0;transform:scale3d(1.5,1.5,1.5)}.fancybox-fx-zoom-in-out.fancybox-slide--next{opacity:0;transform:scale3d(.5,.5,.5)}.fancybox-fx-zoom-in-out.fancybox-slide--current{opacity:1;transform:scaleX(1)}.fancybox-fx-rotate.fancybox-slide--previous{opacity:0;transform:rotate(-1turn)}.fancybox-fx-rotate.fancybox-slide--next{opacity:0;transform:rotate(1turn)}.fancybox-fx-rotate.fancybox-slide--current{opacity:1;transform:rotate(0deg)}.fancybox-fx-circular.fancybox-slide--previous{opacity:0;transform:scale3d(0,0,0) translate3d(-100%,0,0)}.fancybox-fx-circular.fancybox-slide--next{opacity:0;transform:scale3d(0,0,0) translate3d(100%,0,0)}.fancybox-fx-circular.fancybox-slide--current{opacity:1;transform:scaleX(1) translateZ(0)}.fancybox-fx-tube.fancybox-slide--previous{transform:translate3d(-100%,0,0) scale(.1) skew(-10deg)}.fancybox-fx-tube.fancybox-slide--next{transform:translate3d(100%,0,0) scale(.1) skew(10deg)}.fancybox-fx-tube.fancybox-slide--current{transform:translateZ(0) scale(1)}@media (max-height:576px){.fancybox-slide{padding-left:6px;padding-right:6px}.fancybox-slide--image{padding:6px 0}.fancybox-close-small{right:-6px}.fancybox-slide--image .fancybox-close-small{background:#4e4e4e;color:#f2f4f6;height:36px;opacity:1;padding:6px;right:0;top:0;width:36px}.fancybox-caption{padding-left:12px;padding-right:12px}@supports (padding:max(0px)){.fancybox-caption{padding-left:max(12px,env(safe-area-inset-left));padding-right:max(12px,env(safe-area-inset-right))}}}.fancybox-share{background:#f4f4f4;border-radius:3px;max-width:90%;padding:30px;text-align:center}.fancybox-share h1{color:#222;font-size:35px;font-weight:700;margin:0 0 20px}.fancybox-share p{margin:0;padding:0}.fancybox-share__button{border:0;border-radius:3px;display:inline-block;font-size:14px;font-weight:700;line-height:40px;margin:0 5px 10px;min-width:130px;padding:0 15px;text-decoration:none;transition:all .2s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}.fancybox-share__button:link,.fancybox-share__button:visited{color:#fff}.fancybox-share__button:hover{text-decoration:none}.fancybox-share__button--fb{background:#3b5998}.fancybox-share__button--fb:hover{background:#344e86}.fancybox-share__button--pt{background:#bd081d}.fancybox-share__button--pt:hover{background:#aa0719}.fancybox-share__button--tw{background:#1da1f2}.fancybox-share__button--tw:hover{background:#0d95e8}.fancybox-share__button svg{height:25px;margin-right:7px;position:relative;top:-1px;vertical-align:middle;width:25px}.fancybox-share__button svg path{fill:#fff}.fancybox-share__input{background:transparent;border:0;border-bottom:1px solid #d7d7d7;border-radius:0;color:#5d5b5b;font-size:14px;margin:10px 0 0;outline:none;padding:10px 15px;width:100%}.fancybox-thumbs{background:#ddd;bottom:0;display:none;margin:0;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;padding:2px 2px 4px;position:absolute;right:0;-webkit-tap-highlight-color:rgba(0,0,0,0);top:0;width:212px;z-index:99995}.fancybox-thumbs-x{overflow-x:auto;overflow-y:hidden}.fancybox-show-thumbs .fancybox-thumbs{display:block}.fancybox-show-thumbs .fancybox-inner{right:212px}.fancybox-thumbs__list{font-size:0;height:100%;list-style:none;margin:0;overflow-x:hidden;overflow-y:auto;padding:0;position:absolute;position:relative;white-space:nowrap;width:100%}.fancybox-thumbs-x .fancybox-thumbs__list{overflow:hidden}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar{width:7px}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-track{background:#fff;border-radius:10px;box-shadow:inset 0 0 6px rgba(0,0,0,.3)}.fancybox-thumbs-y .fancybox-thumbs__list::-webkit-scrollbar-thumb{background:#2a2a2a;border-radius:10px}.fancybox-thumbs__list a{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:rgba(0,0,0,.1);background-position:50%;background-repeat:no-repeat;background-size:cover;cursor:pointer;float:left;height:75px;margin:2px;max-height:calc(100% - 8px);max-width:calc(50% - 4px);outline:none;overflow:hidden;padding:0;position:relative;-webkit-tap-highlight-color:transparent;width:100px}.fancybox-thumbs__list a:before{border:6px solid #ff5268;bottom:0;content:"";left:0;opacity:0;position:absolute;right:0;top:0;transition:all .2s cubic-bezier(.25,.46,.45,.94);z-index:99991}.fancybox-thumbs__list a:focus:before{opacity:.5}.fancybox-thumbs__list a.fancybox-thumbs-active:before{opacity:1}@media (max-width:576px){.fancybox-thumbs{width:110px}.fancybox-show-thumbs .fancybox-inner{right:110px}.fancybox-thumbs__list a{max-width:calc(100% - 10px)}} \ No newline at end of file diff --git a/public/themes/custom/ubccs/js/vendor/fancybox/jquery.fancybox.min.js b/public/themes/custom/ubccs/js/vendor/fancybox/jquery.fancybox.min.js new file mode 100644 index 0000000..d5d10f6 --- /dev/null +++ b/public/themes/custom/ubccs/js/vendor/fancybox/jquery.fancybox.min.js @@ -0,0 +1,13 @@ +// ================================================== +// fancyBox v3.5.7 +// +// Licensed GPLv3 for open source use +// or fancyBox Commercial License for commercial use +// +// http://fancyapps.com/fancybox/ +// Copyright 2019 fancyApps +// +// ================================================== +!function(t,e,n,o){"use strict";function i(t,e){var o,i,a,s=[],r=0;t&&t.isDefaultPrevented()||(t.preventDefault(),e=e||{},t&&t.data&&(e=h(t.data.options,e)),o=e.$target||n(t.currentTarget).trigger("blur"),(a=n.fancybox.getInstance())&&a.$trigger&&a.$trigger.is(o)||(e.selector?s=n(e.selector):(i=o.attr("data-fancybox")||"",i?(s=t.data?t.data.items:[],s=s.length?s.filter('[data-fancybox="'+i+'"]'):n('[data-fancybox="'+i+'"]')):s=[o]),r=n(s).index(o),r<0&&(r=0),a=n.fancybox.open(s,e,r),a.$trigger=o))}if(t.console=t.console||{info:function(t){}},n){if(n.fn.fancybox)return void console.info("fancyBox already initialized");var a={closeExisting:!1,loop:!1,gutter:50,keyboard:!0,preventCaptionOverlap:!0,arrows:!0,infobar:!0,smallBtn:"auto",toolbar:"auto",buttons:["zoom","slideShow","thumbs","close"],idleTime:3,protect:!1,modal:!1,image:{preload:!1},ajax:{settings:{data:{fancybox:!0}}},iframe:{tpl:'',preload:!0,css:{},attr:{scrolling:"auto"}},video:{tpl:'',format:"",autoStart:!0},defaultType:"image",animationEffect:"zoom",animationDuration:366,zoomOpacity:"auto",transitionEffect:"fade",transitionDuration:366,slideClass:"",baseClass:"",baseTpl:'',spinnerTpl:'
',errorTpl:'

{{ERROR}}

',btnTpl:{download:'',zoom:'',close:'',arrowLeft:'',arrowRight:'',smallBtn:''},parentEl:"body",hideScrollbar:!0,autoFocus:!0,backFocus:!0,trapFocus:!0,fullScreen:{autoStart:!1},touch:{vertical:!0,momentum:!0},hash:null,media:{},slideShow:{autoStart:!1,speed:3e3},thumbs:{autoStart:!1,hideOnClose:!0,parentEl:".fancybox-container",axis:"y"},wheel:"auto",onInit:n.noop,beforeLoad:n.noop,afterLoad:n.noop,beforeShow:n.noop,afterShow:n.noop,beforeClose:n.noop,afterClose:n.noop,onActivate:n.noop,onDeactivate:n.noop,clickContent:function(t,e){return"image"===t.type&&"zoom"},clickSlide:"close",clickOutside:"close",dblclickContent:!1,dblclickSlide:!1,dblclickOutside:!1,mobile:{preventCaptionOverlap:!1,idleTime:!1,clickContent:function(t,e){return"image"===t.type&&"toggleControls"},clickSlide:function(t,e){return"image"===t.type?"toggleControls":"close"},dblclickContent:function(t,e){return"image"===t.type&&"zoom"},dblclickSlide:function(t,e){return"image"===t.type&&"zoom"}},lang:"en",i18n:{en:{CLOSE:"Close",NEXT:"Next",PREV:"Previous",ERROR:"The requested content cannot be loaded.
Please try again later.",PLAY_START:"Start slideshow",PLAY_STOP:"Pause slideshow",FULL_SCREEN:"Full screen",THUMBS:"Thumbnails",DOWNLOAD:"Download",SHARE:"Share",ZOOM:"Zoom"},de:{CLOSE:"Schließen",NEXT:"Weiter",PREV:"Zurück",ERROR:"Die angeforderten Daten konnten nicht geladen werden.
Bitte versuchen Sie es später nochmal.",PLAY_START:"Diaschau starten",PLAY_STOP:"Diaschau beenden",FULL_SCREEN:"Vollbild",THUMBS:"Vorschaubilder",DOWNLOAD:"Herunterladen",SHARE:"Teilen",ZOOM:"Vergrößern"}}},s=n(t),r=n(e),c=0,l=function(t){return t&&t.hasOwnProperty&&t instanceof n},d=function(){return t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||function(e){return t.setTimeout(e,1e3/60)}}(),u=function(){return t.cancelAnimationFrame||t.webkitCancelAnimationFrame||t.mozCancelAnimationFrame||t.oCancelAnimationFrame||function(e){t.clearTimeout(e)}}(),f=function(){var t,n=e.createElement("fakeelement"),o={transition:"transitionend",OTransition:"oTransitionEnd",MozTransition:"transitionend",WebkitTransition:"webkitTransitionEnd"};for(t in o)if(void 0!==n.style[t])return o[t];return"transitionend"}(),p=function(t){return t&&t.length&&t[0].offsetHeight},h=function(t,e){var o=n.extend(!0,{},t,e);return n.each(e,function(t,e){n.isArray(e)&&(o[t]=e)}),o},g=function(t){var o,i;return!(!t||t.ownerDocument!==e)&&(n(".fancybox-container").css("pointer-events","none"),o={x:t.getBoundingClientRect().left+t.offsetWidth/2,y:t.getBoundingClientRect().top+t.offsetHeight/2},i=e.elementFromPoint(o.x,o.y)===t,n(".fancybox-container").css("pointer-events",""),i)},b=function(t,e,o){var i=this;i.opts=h({index:o},n.fancybox.defaults),n.isPlainObject(e)&&(i.opts=h(i.opts,e)),n.fancybox.isMobile&&(i.opts=h(i.opts,i.opts.mobile)),i.id=i.opts.id||++c,i.currIndex=parseInt(i.opts.index,10)||0,i.prevIndex=null,i.prevPos=null,i.currPos=0,i.firstRun=!0,i.group=[],i.slides={},i.addContent(t),i.group.length&&i.init()};n.extend(b.prototype,{init:function(){var o,i,a=this,s=a.group[a.currIndex],r=s.opts;r.closeExisting&&n.fancybox.close(!0),n("body").addClass("fancybox-active"),!n.fancybox.getInstance()&&!1!==r.hideScrollbar&&!n.fancybox.isMobile&&e.body.scrollHeight>t.innerHeight&&(n("head").append('"),n("body").addClass("compensate-for-scrollbar")),i="",n.each(r.buttons,function(t,e){i+=r.btnTpl[e]||""}),o=n(a.translate(a,r.baseTpl.replace("{{buttons}}",i).replace("{{arrows}}",r.btnTpl.arrowLeft+r.btnTpl.arrowRight))).attr("id","fancybox-container-"+a.id).addClass(r.baseClass).data("FancyBox",a).appendTo(r.parentEl),a.$refs={container:o},["bg","inner","infobar","toolbar","stage","caption","navigation"].forEach(function(t){a.$refs[t]=o.find(".fancybox-"+t)}),a.trigger("onInit"),a.activate(),a.jumpTo(a.currIndex)},translate:function(t,e){var n=t.opts.i18n[t.opts.lang]||t.opts.i18n.en;return e.replace(/\{\{(\w+)\}\}/g,function(t,e){return void 0===n[e]?t:n[e]})},addContent:function(t){var e,o=this,i=n.makeArray(t);n.each(i,function(t,e){var i,a,s,r,c,l={},d={};n.isPlainObject(e)?(l=e,d=e.opts||e):"object"===n.type(e)&&n(e).length?(i=n(e),d=i.data()||{},d=n.extend(!0,{},d,d.options),d.$orig=i,l.src=o.opts.src||d.src||i.attr("href"),l.type||l.src||(l.type="inline",l.src=e)):l={type:"html",src:e+""},l.opts=n.extend(!0,{},o.opts,d),n.isArray(d.buttons)&&(l.opts.buttons=d.buttons),n.fancybox.isMobile&&l.opts.mobile&&(l.opts=h(l.opts,l.opts.mobile)),a=l.type||l.opts.type,r=l.src||"",!a&&r&&((s=r.match(/\.(mp4|mov|ogv|webm)((\?|#).*)?$/i))?(a="video",l.opts.video.format||(l.opts.video.format="video/"+("ogv"===s[1]?"ogg":s[1]))):r.match(/(^data:image\/[a-z0-9+\/=]*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg|ico)((\?|#).*)?$)/i)?a="image":r.match(/\.(pdf)((\?|#).*)?$/i)?(a="iframe",l=n.extend(!0,l,{contentType:"pdf",opts:{iframe:{preload:!1}}})):"#"===r.charAt(0)&&(a="inline")),a?l.type=a:o.trigger("objectNeedsType",l),l.contentType||(l.contentType=n.inArray(l.type,["html","inline","ajax"])>-1?"html":l.type),l.index=o.group.length,"auto"==l.opts.smallBtn&&(l.opts.smallBtn=n.inArray(l.type,["html","inline","ajax"])>-1),"auto"===l.opts.toolbar&&(l.opts.toolbar=!l.opts.smallBtn),l.$thumb=l.opts.$thumb||null,l.opts.$trigger&&l.index===o.opts.index&&(l.$thumb=l.opts.$trigger.find("img:first"),l.$thumb.length&&(l.opts.$orig=l.opts.$trigger)),l.$thumb&&l.$thumb.length||!l.opts.$orig||(l.$thumb=l.opts.$orig.find("img:first")),l.$thumb&&!l.$thumb.length&&(l.$thumb=null),l.thumb=l.opts.thumb||(l.$thumb?l.$thumb[0].src:null),"function"===n.type(l.opts.caption)&&(l.opts.caption=l.opts.caption.apply(e,[o,l])),"function"===n.type(o.opts.caption)&&(l.opts.caption=o.opts.caption.apply(e,[o,l])),l.opts.caption instanceof n||(l.opts.caption=void 0===l.opts.caption?"":l.opts.caption+""),"ajax"===l.type&&(c=r.split(/\s+/,2),c.length>1&&(l.src=c.shift(),l.opts.filter=c.shift())),l.opts.modal&&(l.opts=n.extend(!0,l.opts,{trapFocus:!0,infobar:0,toolbar:0,smallBtn:0,keyboard:0,slideShow:0,fullScreen:0,thumbs:0,touch:0,clickContent:!1,clickSlide:!1,clickOutside:!1,dblclickContent:!1,dblclickSlide:!1,dblclickOutside:!1})),o.group.push(l)}),Object.keys(o.slides).length&&(o.updateControls(),(e=o.Thumbs)&&e.isActive&&(e.create(),e.focus()))},addEvents:function(){var e=this;e.removeEvents(),e.$refs.container.on("click.fb-close","[data-fancybox-close]",function(t){t.stopPropagation(),t.preventDefault(),e.close(t)}).on("touchstart.fb-prev click.fb-prev","[data-fancybox-prev]",function(t){t.stopPropagation(),t.preventDefault(),e.previous()}).on("touchstart.fb-next click.fb-next","[data-fancybox-next]",function(t){t.stopPropagation(),t.preventDefault(),e.next()}).on("click.fb","[data-fancybox-zoom]",function(t){e[e.isScaledDown()?"scaleToActual":"scaleToFit"]()}),s.on("orientationchange.fb resize.fb",function(t){t&&t.originalEvent&&"resize"===t.originalEvent.type?(e.requestId&&u(e.requestId),e.requestId=d(function(){e.update(t)})):(e.current&&"iframe"===e.current.type&&e.$refs.stage.hide(),setTimeout(function(){e.$refs.stage.show(),e.update(t)},n.fancybox.isMobile?600:250))}),r.on("keydown.fb",function(t){var o=n.fancybox?n.fancybox.getInstance():null,i=o.current,a=t.keyCode||t.which;if(9==a)return void(i.opts.trapFocus&&e.focus(t));if(!(!i.opts.keyboard||t.ctrlKey||t.altKey||t.shiftKey||n(t.target).is("input,textarea,video,audio,select")))return 8===a||27===a?(t.preventDefault(),void e.close(t)):37===a||38===a?(t.preventDefault(),void e.previous()):39===a||40===a?(t.preventDefault(),void e.next()):void e.trigger("afterKeydown",t,a)}),e.group[e.currIndex].opts.idleTime&&(e.idleSecondsCounter=0,r.on("mousemove.fb-idle mouseleave.fb-idle mousedown.fb-idle touchstart.fb-idle touchmove.fb-idle scroll.fb-idle keydown.fb-idle",function(t){e.idleSecondsCounter=0,e.isIdle&&e.showControls(),e.isIdle=!1}),e.idleInterval=t.setInterval(function(){++e.idleSecondsCounter>=e.group[e.currIndex].opts.idleTime&&!e.isDragging&&(e.isIdle=!0,e.idleSecondsCounter=0,e.hideControls())},1e3))},removeEvents:function(){var e=this;s.off("orientationchange.fb resize.fb"),r.off("keydown.fb .fb-idle"),this.$refs.container.off(".fb-close .fb-prev .fb-next"),e.idleInterval&&(t.clearInterval(e.idleInterval),e.idleInterval=null)},previous:function(t){return this.jumpTo(this.currPos-1,t)},next:function(t){return this.jumpTo(this.currPos+1,t)},jumpTo:function(t,e){var o,i,a,s,r,c,l,d,u,f=this,h=f.group.length;if(!(f.isDragging||f.isClosing||f.isAnimating&&f.firstRun)){if(t=parseInt(t,10),!(a=f.current?f.current.opts.loop:f.opts.loop)&&(t<0||t>=h))return!1;if(o=f.firstRun=!Object.keys(f.slides).length,r=f.current,f.prevIndex=f.currIndex,f.prevPos=f.currPos,s=f.createSlide(t),h>1&&((a||s.index0)&&f.createSlide(t-1)),f.current=s,f.currIndex=s.index,f.currPos=s.pos,f.trigger("beforeShow",o),f.updateControls(),s.forcedDuration=void 0,n.isNumeric(e)?s.forcedDuration=e:e=s.opts[o?"animationDuration":"transitionDuration"],e=parseInt(e,10),i=f.isMoved(s),s.$slide.addClass("fancybox-slide--current"),o)return s.opts.animationEffect&&e&&f.$refs.container.css("transition-duration",e+"ms"),f.$refs.container.addClass("fancybox-is-open").trigger("focus"),f.loadSlide(s),void f.preload("image");c=n.fancybox.getTranslate(r.$slide),l=n.fancybox.getTranslate(f.$refs.stage),n.each(f.slides,function(t,e){n.fancybox.stop(e.$slide,!0)}),r.pos!==s.pos&&(r.isComplete=!1),r.$slide.removeClass("fancybox-slide--complete fancybox-slide--current"),i?(u=c.left-(r.pos*c.width+r.pos*r.opts.gutter),n.each(f.slides,function(t,o){o.$slide.removeClass("fancybox-animated").removeClass(function(t,e){return(e.match(/(^|\s)fancybox-fx-\S+/g)||[]).join(" ")});var i=o.pos*c.width+o.pos*o.opts.gutter;n.fancybox.setTranslate(o.$slide,{top:0,left:i-l.left+u}),o.pos!==s.pos&&o.$slide.addClass("fancybox-slide--"+(o.pos>s.pos?"next":"previous")),p(o.$slide),n.fancybox.animate(o.$slide,{top:0,left:(o.pos-s.pos)*c.width+(o.pos-s.pos)*o.opts.gutter},e,function(){o.$slide.css({transform:"",opacity:""}).removeClass("fancybox-slide--next fancybox-slide--previous"),o.pos===f.currPos&&f.complete()})})):e&&s.opts.transitionEffect&&(d="fancybox-animated fancybox-fx-"+s.opts.transitionEffect,r.$slide.addClass("fancybox-slide--"+(r.pos>s.pos?"next":"previous")),n.fancybox.animate(r.$slide,d,e,function(){r.$slide.removeClass(d).removeClass("fancybox-slide--next fancybox-slide--previous")},!1)),s.isLoaded?f.revealContent(s):f.loadSlide(s),f.preload("image")}},createSlide:function(t){var e,o,i=this;return o=t%i.group.length,o=o<0?i.group.length+o:o,!i.slides[t]&&i.group[o]&&(e=n('
').appendTo(i.$refs.stage),i.slides[t]=n.extend(!0,{},i.group[o],{pos:t,$slide:e,isLoaded:!1}),i.updateSlide(i.slides[t])),i.slides[t]},scaleToActual:function(t,e,o){var i,a,s,r,c,l=this,d=l.current,u=d.$content,f=n.fancybox.getTranslate(d.$slide).width,p=n.fancybox.getTranslate(d.$slide).height,h=d.width,g=d.height;l.isAnimating||l.isMoved()||!u||"image"!=d.type||!d.isLoaded||d.hasError||(l.isAnimating=!0,n.fancybox.stop(u),t=void 0===t?.5*f:t,e=void 0===e?.5*p:e,i=n.fancybox.getTranslate(u),i.top-=n.fancybox.getTranslate(d.$slide).top,i.left-=n.fancybox.getTranslate(d.$slide).left,r=h/i.width,c=g/i.height,a=.5*f-.5*h,s=.5*p-.5*g,h>f&&(a=i.left*r-(t*r-t),a>0&&(a=0),ap&&(s=i.top*c-(e*c-e),s>0&&(s=0),se-.5&&(l=e),d>o-.5&&(d=o),"image"===t.type?(u.top=Math.floor(.5*(o-d))+parseFloat(c.css("paddingTop")),u.left=Math.floor(.5*(e-l))+parseFloat(c.css("paddingLeft"))):"video"===t.contentType&&(a=t.opts.width&&t.opts.height?l/d:t.opts.ratio||16/9,d>l/a?d=l/a:l>d*a&&(l=d*a)),u.width=l,u.height=d,u)},update:function(t){var e=this;n.each(e.slides,function(n,o){e.updateSlide(o,t)})},updateSlide:function(t,e){var o=this,i=t&&t.$content,a=t.width||t.opts.width,s=t.height||t.opts.height,r=t.$slide;o.adjustCaption(t),i&&(a||s||"video"===t.contentType)&&!t.hasError&&(n.fancybox.stop(i),n.fancybox.setTranslate(i,o.getFitPos(t)),t.pos===o.currPos&&(o.isAnimating=!1,o.updateCursor())),o.adjustLayout(t),r.length&&(r.trigger("refresh"),t.pos===o.currPos&&o.$refs.toolbar.add(o.$refs.navigation.find(".fancybox-button--arrow_right")).toggleClass("compensate-for-scrollbar",r.get(0).scrollHeight>r.get(0).clientHeight)),o.trigger("onUpdate",t,e)},centerSlide:function(t){var e=this,o=e.current,i=o.$slide;!e.isClosing&&o&&(i.siblings().css({transform:"",opacity:""}),i.parent().children().removeClass("fancybox-slide--previous fancybox-slide--next"),n.fancybox.animate(i,{top:0,left:0,opacity:1},void 0===t?0:t,function(){i.css({transform:"",opacity:""}),o.isComplete||e.complete()},!1))},isMoved:function(t){var e,o,i=t||this.current;return!!i&&(o=n.fancybox.getTranslate(this.$refs.stage),e=n.fancybox.getTranslate(i.$slide),!i.$slide.hasClass("fancybox-animated")&&(Math.abs(e.top-o.top)>.5||Math.abs(e.left-o.left)>.5))},updateCursor:function(t,e){var o,i,a=this,s=a.current,r=a.$refs.container;s&&!a.isClosing&&a.Guestures&&(r.removeClass("fancybox-is-zoomable fancybox-can-zoomIn fancybox-can-zoomOut fancybox-can-swipe fancybox-can-pan"),o=a.canPan(t,e),i=!!o||a.isZoomable(),r.toggleClass("fancybox-is-zoomable",i),n("[data-fancybox-zoom]").prop("disabled",!i),o?r.addClass("fancybox-can-pan"):i&&("zoom"===s.opts.clickContent||n.isFunction(s.opts.clickContent)&&"zoom"==s.opts.clickContent(s))?r.addClass("fancybox-can-zoomIn"):s.opts.touch&&(s.opts.touch.vertical||a.group.length>1)&&"video"!==s.contentType&&r.addClass("fancybox-can-swipe"))},isZoomable:function(){var t,e=this,n=e.current;if(n&&!e.isClosing&&"image"===n.type&&!n.hasError){if(!n.isLoaded)return!0;if((t=e.getFitPos(n))&&(n.width>t.width||n.height>t.height))return!0}return!1},isScaledDown:function(t,e){var o=this,i=!1,a=o.current,s=a.$content;return void 0!==t&&void 0!==e?i=t1.5||Math.abs(a.height-s.height)>1.5)),s},loadSlide:function(t){var e,o,i,a=this;if(!t.isLoading&&!t.isLoaded){if(t.isLoading=!0,!1===a.trigger("beforeLoad",t))return t.isLoading=!1,!1;switch(e=t.type,o=t.$slide,o.off("refresh").trigger("onReset").addClass(t.opts.slideClass),e){case"image":a.setImage(t);break;case"iframe":a.setIframe(t);break;case"html":a.setContent(t,t.src||t.content);break;case"video":a.setContent(t,t.opts.video.tpl.replace(/\{\{src\}\}/gi,t.src).replace("{{format}}",t.opts.videoFormat||t.opts.video.format||"").replace("{{poster}}",t.thumb||""));break;case"inline":n(t.src).length?a.setContent(t,n(t.src)):a.setError(t);break;case"ajax":a.showLoading(t),i=n.ajax(n.extend({},t.opts.ajax.settings,{url:t.src,success:function(e,n){"success"===n&&a.setContent(t,e)},error:function(e,n){e&&"abort"!==n&&a.setError(t)}})),o.one("onReset",function(){i.abort()});break;default:a.setError(t)}return!0}},setImage:function(t){var o,i=this;setTimeout(function(){var e=t.$image;i.isClosing||!t.isLoading||e&&e.length&&e[0].complete||t.hasError||i.showLoading(t)},50),i.checkSrcset(t),t.$content=n('
').addClass("fancybox-is-hidden").appendTo(t.$slide.addClass("fancybox-slide--image")),!1!==t.opts.preload&&t.opts.width&&t.opts.height&&t.thumb&&(t.width=t.opts.width,t.height=t.opts.height,o=e.createElement("img"),o.onerror=function(){n(this).remove(),t.$ghost=null},o.onload=function(){i.afterLoad(t)},t.$ghost=n(o).addClass("fancybox-image").appendTo(t.$content).attr("src",t.thumb)),i.setBigImage(t)},checkSrcset:function(e){var n,o,i,a,s=e.opts.srcset||e.opts.image.srcset;if(s){i=t.devicePixelRatio||1,a=t.innerWidth*i,o=s.split(",").map(function(t){var e={};return t.trim().split(/\s+/).forEach(function(t,n){var o=parseInt(t.substring(0,t.length-1),10);if(0===n)return e.url=t;o&&(e.value=o,e.postfix=t[t.length-1])}),e}),o.sort(function(t,e){return t.value-e.value});for(var r=0;r=a||"x"===c.postfix&&c.value>=i){n=c;break}}!n&&o.length&&(n=o[o.length-1]),n&&(e.src=n.url,e.width&&e.height&&"w"==n.postfix&&(e.height=e.width/e.height*n.value,e.width=n.value),e.opts.srcset=s)}},setBigImage:function(t){var o=this,i=e.createElement("img"),a=n(i);t.$image=a.one("error",function(){o.setError(t)}).one("load",function(){var e;t.$ghost||(o.resolveImageSlideSize(t,this.naturalWidth,this.naturalHeight),o.afterLoad(t)),o.isClosing||(t.opts.srcset&&(e=t.opts.sizes,e&&"auto"!==e||(e=(t.width/t.height>1&&s.width()/s.height()>1?"100":Math.round(t.width/t.height*100))+"vw"),a.attr("sizes",e).attr("srcset",t.opts.srcset)),t.$ghost&&setTimeout(function(){t.$ghost&&!o.isClosing&&t.$ghost.hide()},Math.min(300,Math.max(1e3,t.height/1600))),o.hideLoading(t))}).addClass("fancybox-image").attr("src",t.src).appendTo(t.$content),(i.complete||"complete"==i.readyState)&&a.naturalWidth&&a.naturalHeight?a.trigger("load"):i.error&&a.trigger("error")},resolveImageSlideSize:function(t,e,n){var o=parseInt(t.opts.width,10),i=parseInt(t.opts.height,10);t.width=e,t.height=n,o>0&&(t.width=o,t.height=Math.floor(o*n/e)),i>0&&(t.width=Math.floor(i*e/n),t.height=i)},setIframe:function(t){var e,o=this,i=t.opts.iframe,a=t.$slide;t.$content=n('
').css(i.css).appendTo(a),a.addClass("fancybox-slide--"+t.contentType),t.$iframe=e=n(i.tpl.replace(/\{rnd\}/g,(new Date).getTime())).attr(i.attr).appendTo(t.$content),i.preload?(o.showLoading(t),e.on("load.fb error.fb",function(e){this.isReady=1,t.$slide.trigger("refresh"),o.afterLoad(t)}),a.on("refresh.fb",function(){var n,o,s=t.$content,r=i.css.width,c=i.css.height;if(1===e[0].isReady){try{n=e.contents(),o=n.find("body")}catch(t){}o&&o.length&&o.children().length&&(a.css("overflow","visible"),s.css({width:"100%","max-width":"100%",height:"9999px"}),void 0===r&&(r=Math.ceil(Math.max(o[0].clientWidth,o.outerWidth(!0)))),s.css("width",r||"").css("max-width",""),void 0===c&&(c=Math.ceil(Math.max(o[0].clientHeight,o.outerHeight(!0)))),s.css("height",c||""),a.css("overflow","auto")),s.removeClass("fancybox-is-hidden")}})):o.afterLoad(t),e.attr("src",t.src),a.one("onReset",function(){try{n(this).find("iframe").hide().unbind().attr("src","//about:blank")}catch(t){}n(this).off("refresh.fb").empty(),t.isLoaded=!1,t.isRevealed=!1})},setContent:function(t,e){var o=this;o.isClosing||(o.hideLoading(t),t.$content&&n.fancybox.stop(t.$content),t.$slide.empty(),l(e)&&e.parent().length?((e.hasClass("fancybox-content")||e.parent().hasClass("fancybox-content"))&&e.parents(".fancybox-slide").trigger("onReset"),t.$placeholder=n("
").hide().insertAfter(e),e.css("display","inline-block")):t.hasError||("string"===n.type(e)&&(e=n("
").append(n.trim(e)).contents()),t.opts.filter&&(e=n("
").html(e).find(t.opts.filter))),t.$slide.one("onReset",function(){n(this).find("video,audio").trigger("pause"),t.$placeholder&&(t.$placeholder.after(e.removeClass("fancybox-content").hide()).remove(),t.$placeholder=null),t.$smallBtn&&(t.$smallBtn.remove(),t.$smallBtn=null),t.hasError||(n(this).empty(),t.isLoaded=!1,t.isRevealed=!1)}),n(e).appendTo(t.$slide),n(e).is("video,audio")&&(n(e).addClass("fancybox-video"),n(e).wrap("
"),t.contentType="video",t.opts.width=t.opts.width||n(e).attr("width"),t.opts.height=t.opts.height||n(e).attr("height")),t.$content=t.$slide.children().filter("div,form,main,video,audio,article,.fancybox-content").first(),t.$content.siblings().hide(),t.$content.length||(t.$content=t.$slide.wrapInner("
").children().first()),t.$content.addClass("fancybox-content"),t.$slide.addClass("fancybox-slide--"+t.contentType),o.afterLoad(t))},setError:function(t){t.hasError=!0,t.$slide.trigger("onReset").removeClass("fancybox-slide--"+t.contentType).addClass("fancybox-slide--error"),t.contentType="html",this.setContent(t,this.translate(t,t.opts.errorTpl)),t.pos===this.currPos&&(this.isAnimating=!1)},showLoading:function(t){var e=this;(t=t||e.current)&&!t.$spinner&&(t.$spinner=n(e.translate(e,e.opts.spinnerTpl)).appendTo(t.$slide).hide().fadeIn("fast"))},hideLoading:function(t){var e=this;(t=t||e.current)&&t.$spinner&&(t.$spinner.stop().remove(),delete t.$spinner)},afterLoad:function(t){var e=this;e.isClosing||(t.isLoading=!1,t.isLoaded=!0,e.trigger("afterLoad",t),e.hideLoading(t),!t.opts.smallBtn||t.$smallBtn&&t.$smallBtn.length||(t.$smallBtn=n(e.translate(t,t.opts.btnTpl.smallBtn)).appendTo(t.$content)),t.opts.protect&&t.$content&&!t.hasError&&(t.$content.on("contextmenu.fb",function(t){return 2==t.button&&t.preventDefault(),!0}),"image"===t.type&&n('
').appendTo(t.$content)),e.adjustCaption(t),e.adjustLayout(t),t.pos===e.currPos&&e.updateCursor(),e.revealContent(t))},adjustCaption:function(t){var e,n=this,o=t||n.current,i=o.opts.caption,a=o.opts.preventCaptionOverlap,s=n.$refs.caption,r=!1;s.toggleClass("fancybox-caption--separate",a),a&&i&&i.length&&(o.pos!==n.currPos?(e=s.clone().appendTo(s.parent()),e.children().eq(0).empty().html(i),r=e.outerHeight(!0),e.empty().remove()):n.$caption&&(r=n.$caption.outerHeight(!0)),o.$slide.css("padding-bottom",r||""))},adjustLayout:function(t){var e,n,o,i,a=this,s=t||a.current;s.isLoaded&&!0!==s.opts.disableLayoutFix&&(s.$content.css("margin-bottom",""),s.$content.outerHeight()>s.$slide.height()+.5&&(o=s.$slide[0].style["padding-bottom"],i=s.$slide.css("padding-bottom"),parseFloat(i)>0&&(e=s.$slide[0].scrollHeight,s.$slide.css("padding-bottom",0),Math.abs(e-s.$slide[0].scrollHeight)<1&&(n=i),s.$slide.css("padding-bottom",o))),s.$content.css("margin-bottom",n))},revealContent:function(t){var e,o,i,a,s=this,r=t.$slide,c=!1,l=!1,d=s.isMoved(t),u=t.isRevealed;return t.isRevealed=!0,e=t.opts[s.firstRun?"animationEffect":"transitionEffect"],i=t.opts[s.firstRun?"animationDuration":"transitionDuration"],i=parseInt(void 0===t.forcedDuration?i:t.forcedDuration,10),!d&&t.pos===s.currPos&&i||(e=!1),"zoom"===e&&(t.pos===s.currPos&&i&&"image"===t.type&&!t.hasError&&(l=s.getThumbPos(t))?c=s.getFitPos(t):e="fade"),"zoom"===e?(s.isAnimating=!0,c.scaleX=c.width/l.width,c.scaleY=c.height/l.height,a=t.opts.zoomOpacity,"auto"==a&&(a=Math.abs(t.width/t.height-l.width/l.height)>.1),a&&(l.opacity=.1,c.opacity=1),n.fancybox.setTranslate(t.$content.removeClass("fancybox-is-hidden"),l),p(t.$content),void n.fancybox.animate(t.$content,c,i,function(){s.isAnimating=!1,s.complete()})):(s.updateSlide(t),e?(n.fancybox.stop(r),o="fancybox-slide--"+(t.pos>=s.prevPos?"next":"previous")+" fancybox-animated fancybox-fx-"+e,r.addClass(o).removeClass("fancybox-slide--current"),t.$content.removeClass("fancybox-is-hidden"),p(r),"image"!==t.type&&t.$content.hide().show(0),void n.fancybox.animate(r,"fancybox-slide--current",i,function(){r.removeClass(o).css({transform:"",opacity:""}),t.pos===s.currPos&&s.complete()},!0)):(t.$content.removeClass("fancybox-is-hidden"),u||!d||"image"!==t.type||t.hasError||t.$content.hide().fadeIn("fast"),void(t.pos===s.currPos&&s.complete())))},getThumbPos:function(t){var e,o,i,a,s,r=!1,c=t.$thumb;return!(!c||!g(c[0]))&&(e=n.fancybox.getTranslate(c),o=parseFloat(c.css("border-top-width")||0),i=parseFloat(c.css("border-right-width")||0),a=parseFloat(c.css("border-bottom-width")||0),s=parseFloat(c.css("border-left-width")||0),r={top:e.top+o,left:e.left+s,width:e.width-i-s,height:e.height-o-a,scaleX:1,scaleY:1},e.width>0&&e.height>0&&r)},complete:function(){var t,e=this,o=e.current,i={};!e.isMoved()&&o.isLoaded&&(o.isComplete||(o.isComplete=!0,o.$slide.siblings().trigger("onReset"),e.preload("inline"),p(o.$slide),o.$slide.addClass("fancybox-slide--complete"),n.each(e.slides,function(t,o){o.pos>=e.currPos-1&&o.pos<=e.currPos+1?i[o.pos]=o:o&&(n.fancybox.stop(o.$slide),o.$slide.off().remove())}),e.slides=i),e.isAnimating=!1,e.updateCursor(),e.trigger("afterShow"),o.opts.video.autoStart&&o.$slide.find("video,audio").filter(":visible:first").trigger("play").one("ended",function(){Document.exitFullscreen?Document.exitFullscreen():this.webkitExitFullscreen&&this.webkitExitFullscreen(),e.next()}),o.opts.autoFocus&&"html"===o.contentType&&(t=o.$content.find("input[autofocus]:enabled:visible:first"),t.length?t.trigger("focus"):e.focus(null,!0)),o.$slide.scrollTop(0).scrollLeft(0))},preload:function(t){var e,n,o=this;o.group.length<2||(n=o.slides[o.currPos+1],e=o.slides[o.currPos-1],e&&e.type===t&&o.loadSlide(e),n&&n.type===t&&o.loadSlide(n))},focus:function(t,o){var i,a,s=this,r=["a[href]","area[href]",'input:not([disabled]):not([type="hidden"]):not([aria-hidden])',"select:not([disabled]):not([aria-hidden])","textarea:not([disabled]):not([aria-hidden])","button:not([disabled]):not([aria-hidden])","iframe","object","embed","video","audio","[contenteditable]",'[tabindex]:not([tabindex^="-"])'].join(",");s.isClosing||(i=!t&&s.current&&s.current.isComplete?s.current.$slide.find("*:visible"+(o?":not(.fancybox-close-small)":"")):s.$refs.container.find("*:visible"),i=i.filter(r).filter(function(){return"hidden"!==n(this).css("visibility")&&!n(this).hasClass("disabled")}),i.length?(a=i.index(e.activeElement),t&&t.shiftKey?(a<0||0==a)&&(t.preventDefault(),i.eq(i.length-1).trigger("focus")):(a<0||a==i.length-1)&&(t&&t.preventDefault(),i.eq(0).trigger("focus"))):s.$refs.container.trigger("focus"))},activate:function(){var t=this;n(".fancybox-container").each(function(){var e=n(this).data("FancyBox");e&&e.id!==t.id&&!e.isClosing&&(e.trigger("onDeactivate"),e.removeEvents(),e.isVisible=!1)}),t.isVisible=!0,(t.current||t.isIdle)&&(t.update(),t.updateControls()),t.trigger("onActivate"),t.addEvents()},close:function(t,e){var o,i,a,s,r,c,l,u=this,f=u.current,h=function(){u.cleanUp(t)};return!u.isClosing&&(u.isClosing=!0,!1===u.trigger("beforeClose",t)?(u.isClosing=!1,d(function(){u.update()}),!1):(u.removeEvents(),a=f.$content,o=f.opts.animationEffect,i=n.isNumeric(e)?e:o?f.opts.animationDuration:0,f.$slide.removeClass("fancybox-slide--complete fancybox-slide--next fancybox-slide--previous fancybox-animated"),!0!==t?n.fancybox.stop(f.$slide):o=!1,f.$slide.siblings().trigger("onReset").remove(),i&&u.$refs.container.removeClass("fancybox-is-open").addClass("fancybox-is-closing").css("transition-duration",i+"ms"),u.hideLoading(f),u.hideControls(!0),u.updateCursor(),"zoom"!==o||a&&i&&"image"===f.type&&!u.isMoved()&&!f.hasError&&(l=u.getThumbPos(f))||(o="fade"),"zoom"===o?(n.fancybox.stop(a),s=n.fancybox.getTranslate(a),c={top:s.top,left:s.left,scaleX:s.width/l.width,scaleY:s.height/l.height,width:l.width,height:l.height},r=f.opts.zoomOpacity, +"auto"==r&&(r=Math.abs(f.width/f.height-l.width/l.height)>.1),r&&(l.opacity=0),n.fancybox.setTranslate(a,c),p(a),n.fancybox.animate(a,l,i,h),!0):(o&&i?n.fancybox.animate(f.$slide.addClass("fancybox-slide--previous").removeClass("fancybox-slide--current"),"fancybox-animated fancybox-fx-"+o,i,h):!0===t?setTimeout(h,i):h(),!0)))},cleanUp:function(e){var o,i,a,s=this,r=s.current.opts.$orig;s.current.$slide.trigger("onReset"),s.$refs.container.empty().remove(),s.trigger("afterClose",e),s.current.opts.backFocus&&(r&&r.length&&r.is(":visible")||(r=s.$trigger),r&&r.length&&(i=t.scrollX,a=t.scrollY,r.trigger("focus"),n("html, body").scrollTop(a).scrollLeft(i))),s.current=null,o=n.fancybox.getInstance(),o?o.activate():(n("body").removeClass("fancybox-active compensate-for-scrollbar"),n("#fancybox-style-noscroll").remove())},trigger:function(t,e){var o,i=Array.prototype.slice.call(arguments,1),a=this,s=e&&e.opts?e:a.current;if(s?i.unshift(s):s=a,i.unshift(a),n.isFunction(s.opts[t])&&(o=s.opts[t].apply(s,i)),!1===o)return o;"afterClose"!==t&&a.$refs?a.$refs.container.trigger(t+".fb",i):r.trigger(t+".fb",i)},updateControls:function(){var t=this,o=t.current,i=o.index,a=t.$refs.container,s=t.$refs.caption,r=o.opts.caption;o.$slide.trigger("refresh"),r&&r.length?(t.$caption=s,s.children().eq(0).html(r)):t.$caption=null,t.hasHiddenControls||t.isIdle||t.showControls(),a.find("[data-fancybox-count]").html(t.group.length),a.find("[data-fancybox-index]").html(i+1),a.find("[data-fancybox-prev]").prop("disabled",!o.opts.loop&&i<=0),a.find("[data-fancybox-next]").prop("disabled",!o.opts.loop&&i>=t.group.length-1),"image"===o.type?a.find("[data-fancybox-zoom]").show().end().find("[data-fancybox-download]").attr("href",o.opts.image.src||o.src).show():o.opts.toolbar&&a.find("[data-fancybox-download],[data-fancybox-zoom]").hide(),n(e.activeElement).is(":hidden,[disabled]")&&t.$refs.container.trigger("focus")},hideControls:function(t){var e=this,n=["infobar","toolbar","nav"];!t&&e.current.opts.preventCaptionOverlap||n.push("caption"),this.$refs.container.removeClass(n.map(function(t){return"fancybox-show-"+t}).join(" ")),this.hasHiddenControls=!0},showControls:function(){var t=this,e=t.current?t.current.opts:t.opts,n=t.$refs.container;t.hasHiddenControls=!1,t.idleSecondsCounter=0,n.toggleClass("fancybox-show-toolbar",!(!e.toolbar||!e.buttons)).toggleClass("fancybox-show-infobar",!!(e.infobar&&t.group.length>1)).toggleClass("fancybox-show-caption",!!t.$caption).toggleClass("fancybox-show-nav",!!(e.arrows&&t.group.length>1)).toggleClass("fancybox-is-modal",!!e.modal)},toggleControls:function(){this.hasHiddenControls?this.showControls():this.hideControls()}}),n.fancybox={version:"3.5.7",defaults:a,getInstance:function(t){var e=n('.fancybox-container:not(".fancybox-is-closing"):last').data("FancyBox"),o=Array.prototype.slice.call(arguments,1);return e instanceof b&&("string"===n.type(t)?e[t].apply(e,o):"function"===n.type(t)&&t.apply(e,o),e)},open:function(t,e,n){return new b(t,e,n)},close:function(t){var e=this.getInstance();e&&(e.close(),!0===t&&this.close(t))},destroy:function(){this.close(!0),r.add("body").off("click.fb-start","**")},isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),use3d:function(){var n=e.createElement("div");return t.getComputedStyle&&t.getComputedStyle(n)&&t.getComputedStyle(n).getPropertyValue("transform")&&!(e.documentMode&&e.documentMode<11)}(),getTranslate:function(t){var e;return!(!t||!t.length)&&(e=t[0].getBoundingClientRect(),{top:e.top||0,left:e.left||0,width:e.width,height:e.height,opacity:parseFloat(t.css("opacity"))})},setTranslate:function(t,e){var n="",o={};if(t&&e)return void 0===e.left&&void 0===e.top||(n=(void 0===e.left?t.position().left:e.left)+"px, "+(void 0===e.top?t.position().top:e.top)+"px",n=this.use3d?"translate3d("+n+", 0px)":"translate("+n+")"),void 0!==e.scaleX&&void 0!==e.scaleY?n+=" scale("+e.scaleX+", "+e.scaleY+")":void 0!==e.scaleX&&(n+=" scaleX("+e.scaleX+")"),n.length&&(o.transform=n),void 0!==e.opacity&&(o.opacity=e.opacity),void 0!==e.width&&(o.width=e.width),void 0!==e.height&&(o.height=e.height),t.css(o)},animate:function(t,e,o,i,a){var s,r=this;n.isFunction(o)&&(i=o,o=null),r.stop(t),s=r.getTranslate(t),t.on(f,function(c){(!c||!c.originalEvent||t.is(c.originalEvent.target)&&"z-index"!=c.originalEvent.propertyName)&&(r.stop(t),n.isNumeric(o)&&t.css("transition-duration",""),n.isPlainObject(e)?void 0!==e.scaleX&&void 0!==e.scaleY&&r.setTranslate(t,{top:e.top,left:e.left,width:s.width*e.scaleX,height:s.height*e.scaleY,scaleX:1,scaleY:1}):!0!==a&&t.removeClass(e),n.isFunction(i)&&i(c))}),n.isNumeric(o)&&t.css("transition-duration",o+"ms"),n.isPlainObject(e)?(void 0!==e.scaleX&&void 0!==e.scaleY&&(delete e.width,delete e.height,t.parent().hasClass("fancybox-slide--image")&&t.parent().addClass("fancybox-is-scaling")),n.fancybox.setTranslate(t,e)):t.addClass(e),t.data("timer",setTimeout(function(){t.trigger(f)},o+33))},stop:function(t,e){t&&t.length&&(clearTimeout(t.data("timer")),e&&t.trigger(f),t.off(f).css("transition-duration",""),t.parent().removeClass("fancybox-is-scaling"))}},n.fn.fancybox=function(t){var e;return t=t||{},e=t.selector||!1,e?n("body").off("click.fb-start",e).on("click.fb-start",e,{options:t},i):this.off("click.fb-start").on("click.fb-start",{items:this,options:t},i),this},r.on("click.fb-start","[data-fancybox]",i),r.on("click.fb-start","[data-fancybox-trigger]",function(t){n('[data-fancybox="'+n(this).attr("data-fancybox-trigger")+'"]').eq(n(this).attr("data-fancybox-index")||0).trigger("click.fb-start",{$trigger:n(this)})}),function(){var t=null;r.on("mousedown mouseup focus blur",".fancybox-button",function(e){switch(e.type){case"mousedown":t=n(this);break;case"mouseup":t=null;break;case"focusin":n(".fancybox-button").removeClass("fancybox-focus"),n(this).is(t)||n(this).is("[disabled]")||n(this).addClass("fancybox-focus");break;case"focusout":n(".fancybox-button").removeClass("fancybox-focus")}})}()}}(window,document,jQuery),function(t){"use strict";var e={youtube:{matcher:/(youtube\.com|youtu\.be|youtube\-nocookie\.com)\/(watch\?(.*&)?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*))(.*)/i,params:{autoplay:1,autohide:1,fs:1,rel:0,hd:1,wmode:"transparent",enablejsapi:1,html5:1},paramPlace:8,type:"iframe",url:"https://www.youtube-nocookie.com/embed/$4",thumb:"https://img.youtube.com/vi/$4/hqdefault.jpg"},vimeo:{matcher:/^.+vimeo.com\/(.*\/)?([\d]+)(.*)?/,params:{autoplay:1,hd:1,show_title:1,show_byline:1,show_portrait:0,fullscreen:1},paramPlace:3,type:"iframe",url:"//player.vimeo.com/video/$2"},instagram:{matcher:/(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i,type:"image",url:"//$1/p/$2/media/?size=l"},gmap_place:{matcher:/(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(((maps\/(place\/(.*)\/)?\@(.*),(\d+.?\d+?)z))|(\?ll=))(.*)?/i,type:"iframe",url:function(t){return"//maps.google."+t[2]+"/?ll="+(t[9]?t[9]+"&z="+Math.floor(t[10])+(t[12]?t[12].replace(/^\//,"&"):""):t[12]+"").replace(/\?/,"&")+"&output="+(t[12]&&t[12].indexOf("layer=c")>0?"svembed":"embed")}},gmap_search:{matcher:/(maps\.)?google\.([a-z]{2,3}(\.[a-z]{2})?)\/(maps\/search\/)(.*)/i,type:"iframe",url:function(t){return"//maps.google."+t[2]+"/maps?q="+t[5].replace("query=","q=").replace("api=1","")+"&output=embed"}}},n=function(e,n,o){if(e)return o=o||"","object"===t.type(o)&&(o=t.param(o,!0)),t.each(n,function(t,n){e=e.replace("$"+t,n||"")}),o.length&&(e+=(e.indexOf("?")>0?"&":"?")+o),e};t(document).on("objectNeedsType.fb",function(o,i,a){var s,r,c,l,d,u,f,p=a.src||"",h=!1;s=t.extend(!0,{},e,a.opts.media),t.each(s,function(e,o){if(c=p.match(o.matcher)){if(h=o.type,f=e,u={},o.paramPlace&&c[o.paramPlace]){d=c[o.paramPlace],"?"==d[0]&&(d=d.substring(1)),d=d.split("&");for(var i=0;i1&&("youtube"===n.contentSource||"vimeo"===n.contentSource)&&o.load(n.contentSource)}})}(jQuery),function(t,e,n){"use strict";var o=function(){return t.requestAnimationFrame||t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||t.oRequestAnimationFrame||function(e){return t.setTimeout(e,1e3/60)}}(),i=function(){return t.cancelAnimationFrame||t.webkitCancelAnimationFrame||t.mozCancelAnimationFrame||t.oCancelAnimationFrame||function(e){t.clearTimeout(e)}}(),a=function(e){var n=[];e=e.originalEvent||e||t.e,e=e.touches&&e.touches.length?e.touches:e.changedTouches&&e.changedTouches.length?e.changedTouches:[e];for(var o in e)e[o].pageX?n.push({x:e[o].pageX,y:e[o].pageY}):e[o].clientX&&n.push({x:e[o].clientX,y:e[o].clientY});return n},s=function(t,e,n){return e&&t?"x"===n?t.x-e.x:"y"===n?t.y-e.y:Math.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2)):0},r=function(t){if(t.is('a,area,button,[role="button"],input,label,select,summary,textarea,video,audio,iframe')||n.isFunction(t.get(0).onclick)||t.data("selectable"))return!0;for(var e=0,o=t[0].attributes,i=o.length;ee.clientHeight,a=("scroll"===o||"auto"===o)&&e.scrollWidth>e.clientWidth;return i||a},l=function(t){for(var e=!1;;){if(e=c(t.get(0)))break;if(t=t.parent(),!t.length||t.hasClass("fancybox-stage")||t.is("body"))break}return e},d=function(t){var e=this;e.instance=t,e.$bg=t.$refs.bg,e.$stage=t.$refs.stage,e.$container=t.$refs.container,e.destroy(),e.$container.on("touchstart.fb.touch mousedown.fb.touch",n.proxy(e,"ontouchstart"))};d.prototype.destroy=function(){var t=this;t.$container.off(".fb.touch"),n(e).off(".fb.touch"),t.requestId&&(i(t.requestId),t.requestId=null),t.tapped&&(clearTimeout(t.tapped),t.tapped=null)},d.prototype.ontouchstart=function(o){var i=this,c=n(o.target),d=i.instance,u=d.current,f=u.$slide,p=u.$content,h="touchstart"==o.type;if(h&&i.$container.off("mousedown.fb.touch"),(!o.originalEvent||2!=o.originalEvent.button)&&f.length&&c.length&&!r(c)&&!r(c.parent())&&(c.is("img")||!(o.originalEvent.clientX>c[0].clientWidth+c.offset().left))){if(!u||d.isAnimating||u.$slide.hasClass("fancybox-animated"))return o.stopPropagation(),void o.preventDefault();i.realPoints=i.startPoints=a(o),i.startPoints.length&&(u.touch&&o.stopPropagation(),i.startEvent=o,i.canTap=!0,i.$target=c,i.$content=p,i.opts=u.opts.touch,i.isPanning=!1,i.isSwiping=!1,i.isZooming=!1,i.isScrolling=!1,i.canPan=d.canPan(),i.startTime=(new Date).getTime(),i.distanceX=i.distanceY=i.distance=0,i.canvasWidth=Math.round(f[0].clientWidth),i.canvasHeight=Math.round(f[0].clientHeight),i.contentLastPos=null,i.contentStartPos=n.fancybox.getTranslate(i.$content)||{top:0,left:0},i.sliderStartPos=n.fancybox.getTranslate(f),i.stagePos=n.fancybox.getTranslate(d.$refs.stage),i.sliderStartPos.top-=i.stagePos.top,i.sliderStartPos.left-=i.stagePos.left,i.contentStartPos.top-=i.stagePos.top,i.contentStartPos.left-=i.stagePos.left,n(e).off(".fb.touch").on(h?"touchend.fb.touch touchcancel.fb.touch":"mouseup.fb.touch mouseleave.fb.touch",n.proxy(i,"ontouchend")).on(h?"touchmove.fb.touch":"mousemove.fb.touch",n.proxy(i,"ontouchmove")),n.fancybox.isMobile&&e.addEventListener("scroll",i.onscroll,!0),((i.opts||i.canPan)&&(c.is(i.$stage)||i.$stage.find(c).length)||(c.is(".fancybox-image")&&o.preventDefault(),n.fancybox.isMobile&&c.parents(".fancybox-caption").length))&&(i.isScrollable=l(c)||l(c.parent()),n.fancybox.isMobile&&i.isScrollable||o.preventDefault(),(1===i.startPoints.length||u.hasError)&&(i.canPan?(n.fancybox.stop(i.$content),i.isPanning=!0):i.isSwiping=!0,i.$container.addClass("fancybox-is-grabbing")),2===i.startPoints.length&&"image"===u.type&&(u.isLoaded||u.$ghost)&&(i.canTap=!1,i.isSwiping=!1,i.isPanning=!1,i.isZooming=!0,n.fancybox.stop(i.$content),i.centerPointStartX=.5*(i.startPoints[0].x+i.startPoints[1].x)-n(t).scrollLeft(),i.centerPointStartY=.5*(i.startPoints[0].y+i.startPoints[1].y)-n(t).scrollTop(),i.percentageOfImageAtPinchPointX=(i.centerPointStartX-i.contentStartPos.left)/i.contentStartPos.width,i.percentageOfImageAtPinchPointY=(i.centerPointStartY-i.contentStartPos.top)/i.contentStartPos.height,i.startDistanceBetweenFingers=s(i.startPoints[0],i.startPoints[1]))))}},d.prototype.onscroll=function(t){var n=this;n.isScrolling=!0,e.removeEventListener("scroll",n.onscroll,!0)},d.prototype.ontouchmove=function(t){var e=this;return void 0!==t.originalEvent.buttons&&0===t.originalEvent.buttons?void e.ontouchend(t):e.isScrolling?void(e.canTap=!1):(e.newPoints=a(t),void((e.opts||e.canPan)&&e.newPoints.length&&e.newPoints.length&&(e.isSwiping&&!0===e.isSwiping||t.preventDefault(),e.distanceX=s(e.newPoints[0],e.startPoints[0],"x"),e.distanceY=s(e.newPoints[0],e.startPoints[0],"y"),e.distance=s(e.newPoints[0],e.startPoints[0]),e.distance>0&&(e.isSwiping?e.onSwipe(t):e.isPanning?e.onPan():e.isZooming&&e.onZoom()))))},d.prototype.onSwipe=function(e){var a,s=this,r=s.instance,c=s.isSwiping,l=s.sliderStartPos.left||0;if(!0!==c)"x"==c&&(s.distanceX>0&&(s.instance.group.length<2||0===s.instance.current.index&&!s.instance.current.opts.loop)?l+=Math.pow(s.distanceX,.8):s.distanceX<0&&(s.instance.group.length<2||s.instance.current.index===s.instance.group.length-1&&!s.instance.current.opts.loop)?l-=Math.pow(-s.distanceX,.8):l+=s.distanceX),s.sliderLastPos={top:"x"==c?0:s.sliderStartPos.top+s.distanceY,left:l},s.requestId&&(i(s.requestId),s.requestId=null),s.requestId=o(function(){s.sliderLastPos&&(n.each(s.instance.slides,function(t,e){var o=e.pos-s.instance.currPos;n.fancybox.setTranslate(e.$slide,{top:s.sliderLastPos.top,left:s.sliderLastPos.left+o*s.canvasWidth+o*e.opts.gutter})}),s.$container.addClass("fancybox-is-sliding"))});else if(Math.abs(s.distance)>10){if(s.canTap=!1,r.group.length<2&&s.opts.vertical?s.isSwiping="y":r.isDragging||!1===s.opts.vertical||"auto"===s.opts.vertical&&n(t).width()>800?s.isSwiping="x":(a=Math.abs(180*Math.atan2(s.distanceY,s.distanceX)/Math.PI),s.isSwiping=a>45&&a<135?"y":"x"),"y"===s.isSwiping&&n.fancybox.isMobile&&s.isScrollable)return void(s.isScrolling=!0);r.isDragging=s.isSwiping,s.startPoints=s.newPoints,n.each(r.slides,function(t,e){var o,i;n.fancybox.stop(e.$slide),o=n.fancybox.getTranslate(e.$slide),i=n.fancybox.getTranslate(r.$refs.stage),e.$slide.css({transform:"",opacity:"","transition-duration":""}).removeClass("fancybox-animated").removeClass(function(t,e){return(e.match(/(^|\s)fancybox-fx-\S+/g)||[]).join(" ")}),e.pos===r.current.pos&&(s.sliderStartPos.top=o.top-i.top,s.sliderStartPos.left=o.left-i.left),n.fancybox.setTranslate(e.$slide,{top:o.top-i.top,left:o.left-i.left})}),r.SlideShow&&r.SlideShow.isActive&&r.SlideShow.stop()}},d.prototype.onPan=function(){var t=this;if(s(t.newPoints[0],t.realPoints[0])<(n.fancybox.isMobile?10:5))return void(t.startPoints=t.newPoints);t.canTap=!1,t.contentLastPos=t.limitMovement(),t.requestId&&i(t.requestId),t.requestId=o(function(){n.fancybox.setTranslate(t.$content,t.contentLastPos)})},d.prototype.limitMovement=function(){var t,e,n,o,i,a,s=this,r=s.canvasWidth,c=s.canvasHeight,l=s.distanceX,d=s.distanceY,u=s.contentStartPos,f=u.left,p=u.top,h=u.width,g=u.height;return i=h>r?f+l:f,a=p+d,t=Math.max(0,.5*r-.5*h),e=Math.max(0,.5*c-.5*g),n=Math.min(r-h,.5*r-.5*h),o=Math.min(c-g,.5*c-.5*g),l>0&&i>t&&(i=t-1+Math.pow(-t+f+l,.8)||0),l<0&&i0&&a>e&&(a=e-1+Math.pow(-e+p+d,.8)||0),d<0&&aa?(t=t>0?0:t,t=ts?(e=e>0?0:e,e=e1&&(o.dMs>130&&s>10||s>50);o.sliderLastPos=null,"y"==t&&!e&&Math.abs(o.distanceY)>50?(n.fancybox.animate(o.instance.current.$slide,{top:o.sliderStartPos.top+o.distanceY+150*o.velocityY,opacity:0},200),i=o.instance.close(!0,250)):r&&o.distanceX>0?i=o.instance.previous(300):r&&o.distanceX<0&&(i=o.instance.next(300)),!1!==i||"x"!=t&&"y"!=t||o.instance.centerSlide(200),o.$container.removeClass("fancybox-is-sliding")},d.prototype.endPanning=function(){var t,e,o,i=this;i.contentLastPos&&(!1===i.opts.momentum||i.dMs>350?(t=i.contentLastPos.left,e=i.contentLastPos.top):(t=i.contentLastPos.left+500*i.velocityX,e=i.contentLastPos.top+500*i.velocityY),o=i.limitPosition(t,e,i.contentStartPos.width,i.contentStartPos.height),o.width=i.contentStartPos.width,o.height=i.contentStartPos.height,n.fancybox.animate(i.$content,o,366))},d.prototype.endZooming=function(){var t,e,o,i,a=this,s=a.instance.current,r=a.newWidth,c=a.newHeight;a.contentLastPos&&(t=a.contentLastPos.left,e=a.contentLastPos.top,i={top:e,left:t,width:r,height:c,scaleX:1,scaleY:1},n.fancybox.setTranslate(a.$content,i),rs.width||c>s.height?a.instance.scaleToActual(a.centerPointStartX,a.centerPointStartY,150):(o=a.limitPosition(t,e,r,c),n.fancybox.animate(a.$content,o,150)))},d.prototype.onTap=function(e){var o,i=this,s=n(e.target),r=i.instance,c=r.current,l=e&&a(e)||i.startPoints,d=l[0]?l[0].x-n(t).scrollLeft()-i.stagePos.left:0,u=l[0]?l[0].y-n(t).scrollTop()-i.stagePos.top:0,f=function(t){var o=c.opts[t];if(n.isFunction(o)&&(o=o.apply(r,[c,e])),o)switch(o){case"close":r.close(i.startEvent);break;case"toggleControls":r.toggleControls();break;case"next":r.next();break;case"nextOrClose":r.group.length>1?r.next():r.close(i.startEvent);break;case"zoom":"image"==c.type&&(c.isLoaded||c.$ghost)&&(r.canPan()?r.scaleToFit():r.isScaledDown()?r.scaleToActual(d,u):r.group.length<2&&r.close(i.startEvent))}};if((!e.originalEvent||2!=e.originalEvent.button)&&(s.is("img")||!(d>s[0].clientWidth+s.offset().left))){if(s.is(".fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-container"))o="Outside";else if(s.is(".fancybox-slide"))o="Slide";else{if(!r.current.$content||!r.current.$content.find(s).addBack().filter(s).length)return;o="Content"}if(i.tapped){if(clearTimeout(i.tapped),i.tapped=null,Math.abs(d-i.tapX)>50||Math.abs(u-i.tapY)>50)return this;f("dblclick"+o)}else i.tapX=d,i.tapY=u,c.opts["dblclick"+o]&&c.opts["dblclick"+o]!==c.opts["click"+o]?i.tapped=setTimeout(function(){i.tapped=null,r.isAnimating||f("click"+o)},500):f("click"+o);return this}},n(e).on("onActivate.fb",function(t,e){e&&!e.Guestures&&(e.Guestures=new d(e))}).on("beforeClose.fb",function(t,e){e&&e.Guestures&&e.Guestures.destroy()})}(window,document,jQuery),function(t,e){"use strict";e.extend(!0,e.fancybox.defaults,{btnTpl:{slideShow:''},slideShow:{autoStart:!1,speed:3e3,progress:!0}});var n=function(t){this.instance=t,this.init()};e.extend(n.prototype,{timer:null,isActive:!1,$button:null,init:function(){var t=this,n=t.instance,o=n.group[n.currIndex].opts.slideShow;t.$button=n.$refs.toolbar.find("[data-fancybox-play]").on("click",function(){t.toggle()}),n.group.length<2||!o?t.$button.hide():o.progress&&(t.$progress=e('
').appendTo(n.$refs.inner))},set:function(t){var n=this,o=n.instance,i=o.current;i&&(!0===t||i.opts.loop||o.currIndex'},fullScreen:{autoStart:!1}}),e(t).on(n.fullscreenchange,function(){var t=o.isFullscreen(),n=e.fancybox.getInstance();n&&(n.current&&"image"===n.current.type&&n.isAnimating&&(n.isAnimating=!1,n.update(!0,!0,0),n.isComplete||n.complete()),n.trigger("onFullscreenChange",t),n.$refs.container.toggleClass("fancybox-is-fullscreen",t),n.$refs.toolbar.find("[data-fancybox-fullscreen]").toggleClass("fancybox-button--fsenter",!t).toggleClass("fancybox-button--fsexit",t))})}e(t).on({"onInit.fb":function(t,e){var i;if(!n)return void e.$refs.toolbar.find("[data-fancybox-fullscreen]").remove();e&&e.group[e.currIndex].opts.fullScreen?(i=e.$refs.container,i.on("click.fb-fullscreen","[data-fancybox-fullscreen]",function(t){t.stopPropagation(),t.preventDefault(),o.toggle()}),e.opts.fullScreen&&!0===e.opts.fullScreen.autoStart&&o.request(),e.FullScreen=o):e&&e.$refs.toolbar.find("[data-fancybox-fullscreen]").hide()},"afterKeydown.fb":function(t,e,n,o,i){e&&e.FullScreen&&70===i&&(o.preventDefault(),e.FullScreen.toggle())},"beforeClose.fb":function(t,e){e&&e.FullScreen&&e.$refs.container.hasClass("fancybox-is-fullscreen")&&o.exit()}})}(document,jQuery),function(t,e){"use strict";var n="fancybox-thumbs";e.fancybox.defaults=e.extend(!0,{btnTpl:{thumbs:''},thumbs:{autoStart:!1,hideOnClose:!0,parentEl:".fancybox-container",axis:"y"}},e.fancybox.defaults);var o=function(t){this.init(t)};e.extend(o.prototype,{$button:null,$grid:null,$list:null,isVisible:!1,isActive:!1,init:function(t){var e=this,n=t.group,o=0;e.instance=t,e.opts=n[t.currIndex].opts.thumbs,t.Thumbs=e,e.$button=t.$refs.toolbar.find("[data-fancybox-thumbs]");for(var i=0,a=n.length;i1));i++);o>1&&e.opts?(e.$button.removeAttr("style").on("click",function(){e.toggle()}),e.isActive=!0):e.$button.hide()},create:function(){var t,o=this,i=o.instance,a=o.opts.parentEl,s=[];o.$grid||(o.$grid=e('
').appendTo(i.$refs.container.find(a).addBack().filter(a)),o.$grid.on("click","a",function(){i.jumpTo(e(this).attr("data-index"))})),o.$list||(o.$list=e('
').appendTo(o.$grid)),e.each(i.group,function(e,n){t=n.thumb,t||"image"!==n.type||(t=n.src),s.push('")}),o.$list[0].innerHTML=s.join(""),"x"===o.opts.axis&&o.$list.width(parseInt(o.$grid.css("padding-right"),10)+i.group.length*o.$list.children().eq(0).outerWidth(!0))},focus:function(t){var e,n,o=this,i=o.$list,a=o.$grid;o.instance.current&&(e=i.children().removeClass("fancybox-thumbs-active").filter('[data-index="'+o.instance.current.index+'"]').addClass("fancybox-thumbs-active"),n=e.position(),"y"===o.opts.axis&&(n.top<0||n.top>i.height()-e.outerHeight())?i.stop().animate({scrollTop:i.scrollTop()+n.top},t):"x"===o.opts.axis&&(n.lefta.scrollLeft()+(a.width()-e.outerWidth()))&&i.parent().stop().animate({scrollLeft:n.left},t))},update:function(){var t=this;t.instance.$refs.container.toggleClass("fancybox-show-thumbs",this.isVisible),t.isVisible?(t.$grid||t.create(),t.instance.trigger("onThumbsShow"),t.focus(0)):t.$grid&&t.instance.trigger("onThumbsHide"),t.instance.update()},hide:function(){this.isVisible=!1,this.update()},show:function(){this.isVisible=!0,this.update()},toggle:function(){this.isVisible=!this.isVisible,this.update()}}),e(t).on({"onInit.fb":function(t,e){var n;e&&!e.Thumbs&&(n=new o(e),n.isActive&&!0===n.opts.autoStart&&n.show())},"beforeShow.fb":function(t,e,n,o){var i=e&&e.Thumbs;i&&i.isVisible&&i.focus(o?0:250)},"afterKeydown.fb":function(t,e,n,o,i){var a=e&&e.Thumbs;a&&a.isActive&&71===i&&(o.preventDefault(),a.toggle())},"beforeClose.fb":function(t,e){var n=e&&e.Thumbs;n&&n.isVisible&&!1!==n.opts.hideOnClose&&n.$grid.hide()}})}(document,jQuery),function(t,e){"use strict";function n(t){var e={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/","`":"`","=":"="};return String(t).replace(/[&<>"'`=\/]/g,function(t){return e[t]})}e.extend(!0,e.fancybox.defaults,{btnTpl:{share:''},share:{url:function(t,e){return!t.currentHash&&"inline"!==e.type&&"html"!==e.type&&(e.origSrc||e.src)||window.location}, +tpl:''}}),e(t).on("click","[data-fancybox-share]",function(){var t,o,i=e.fancybox.getInstance(),a=i.current||null;a&&("function"===e.type(a.opts.share.url)&&(t=a.opts.share.url.apply(a,[i,a])),o=a.opts.share.tpl.replace(/\{\{media\}\}/g,"image"===a.type?encodeURIComponent(a.src):"").replace(/\{\{url\}\}/g,encodeURIComponent(t)).replace(/\{\{url_raw\}\}/g,n(t)).replace(/\{\{descr\}\}/g,i.$caption?encodeURIComponent(i.$caption.text()):""),e.fancybox.open({src:i.translate(i,o),type:"html",opts:{touch:!1,animationEffect:!1,afterLoad:function(t,e){i.$refs.container.one("beforeClose.fb",function(){t.close(null,0)}),e.$content.find(".fancybox-share__button").click(function(){return window.open(this.href,"Share","width=550, height=450"),!1})},mobile:{autoFocus:!1}}}))})}(document,jQuery),function(t,e,n){"use strict";function o(){var e=t.location.hash.substr(1),n=e.split("-"),o=n.length>1&&/^\+?\d+$/.test(n[n.length-1])?parseInt(n.pop(-1),10)||1:1,i=n.join("-");return{hash:e,index:o<1?1:o,gallery:i}}function i(t){""!==t.gallery&&n("[data-fancybox='"+n.escapeSelector(t.gallery)+"']").eq(t.index-1).focus().trigger("click.fb-start")}function a(t){var e,n;return!!t&&(e=t.current?t.current.opts:t.opts,""!==(n=e.hash||(e.$orig?e.$orig.data("fancybox")||e.$orig.data("fancybox-trigger"):""))&&n)}n.escapeSelector||(n.escapeSelector=function(t){return(t+"").replace(/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t})}),n(function(){!1!==n.fancybox.defaults.hash&&(n(e).on({"onInit.fb":function(t,e){var n,i;!1!==e.group[e.currIndex].opts.hash&&(n=o(),(i=a(e))&&n.gallery&&i==n.gallery&&(e.currIndex=n.index-1))},"beforeShow.fb":function(n,o,i,s){var r;i&&!1!==i.opts.hash&&(r=a(o))&&(o.currentHash=r+(o.group.length>1?"-"+(i.index+1):""),t.location.hash!=="#"+o.currentHash&&(s&&!o.origHash&&(o.origHash=t.location.hash),o.hashTimer&&clearTimeout(o.hashTimer),o.hashTimer=setTimeout(function(){"replaceState"in t.history?(t.history[s?"pushState":"replaceState"]({},e.title,t.location.pathname+t.location.search+"#"+o.currentHash),s&&(o.hasCreatedHistory=!0)):t.location.hash=o.currentHash,o.hashTimer=null},300)))},"beforeClose.fb":function(n,o,i){i&&!1!==i.opts.hash&&(clearTimeout(o.hashTimer),o.currentHash&&o.hasCreatedHistory?t.history.back():o.currentHash&&("replaceState"in t.history?t.history.replaceState({},e.title,t.location.pathname+t.location.search+(o.origHash||"")):t.location.hash=o.origHash),o.currentHash=null)}}),n(t).on("hashchange.fb",function(){var t=o(),e=null;n.each(n(".fancybox-container").get().reverse(),function(t,o){var i=n(o).data("FancyBox");if(i&&i.currentHash)return e=i,!1}),e?e.currentHash===t.gallery+"-"+t.index||1===t.index&&e.currentHash==t.gallery||(e.currentHash=null,e.close()):""!==t.gallery&&i(t)}),setTimeout(function(){n.fancybox.getInstance()||i(o())},50))})}(window,document,jQuery),function(t,e){"use strict";var n=(new Date).getTime();e(t).on({"onInit.fb":function(t,e,o){e.$refs.stage.on("mousewheel DOMMouseScroll wheel MozMousePixelScroll",function(t){var o=e.current,i=(new Date).getTime();e.group.length<2||!1===o.opts.wheel||"auto"===o.opts.wheel&&"image"!==o.type||(t.preventDefault(),t.stopPropagation(),o.$slide.hasClass("fancybox-animated")||(t=t.originalEvent||t,i-n<250||(n=i,e[(-t.deltaY||-t.deltaX||t.wheelDelta||-t.detail)<0?"next":"previous"]())))})}})}(document,jQuery); \ No newline at end of file diff --git a/public/themes/custom/ubccs/package-lock.json b/public/themes/custom/ubccs/package-lock.json new file mode 100644 index 0000000..d93d7dc --- /dev/null +++ b/public/themes/custom/ubccs/package-lock.json @@ -0,0 +1,1160 @@ +{ + "name": "ubccs", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@fancyapps/fancybox": "github:fancyapps/fancybox", + "bootstrap": "^4.0.0", + "normalize.css": "^8.0.0" + }, + "devDependencies": { + "autoprefixer": "^10.0.0", + "onchange": "^7.0.0", + "postcss-cli": "^10.0.0", + "sass": "^1.0.0" + } + }, + "node_modules/@blakeembrey/deque": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@blakeembrey/deque/-/deque-1.0.5.tgz", + "integrity": "sha512-6xnwtvp9DY1EINIKdTfvfeAtCYw4OqBZJhtiqkT3ivjnEfa25VQ3TsKvaFfKm8MyGIEfE95qLe+bNEt3nB0Ylg==", + "dev": true + }, + "node_modules/@blakeembrey/template": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@blakeembrey/template/-/template-1.1.0.tgz", + "integrity": "sha512-iZf+UWfL+DogJVpd/xMQyP6X6McYd6ArdYoPMiv/zlOTzeXXfQbYxBNJJBF6tThvsjLMbA8tLjkCdm9RWMFCCw==", + "dev": true + }, + "node_modules/@fancyapps/fancybox": { + "version": "3.5.7", + "resolved": "git+ssh://git@github.com/fancyapps/fancybox.git#c4fd90370f8c93336d6e36a5c6120bcabcf8675c", + "license": "GPL-3.0", + "peerDependencies": { + "jquery": ">=1.9.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/autoprefixer": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bootstrap": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz", + "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "jquery": "1.9.1 - 3", + "popper.js": "^1.16.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001450", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz", + "integrity": "sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.288", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.288.tgz", + "integrity": "sha512-8s9aJf3YiokIrR+HOQzNOGmEHFXVUQzXM/JaViVvKdCkNUjS+lEa/uT7xw3nDVG/IgfxiIwUGkwJ6AR1pTpYsQ==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fs-extra": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", + "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", + "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jquery": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.3.tgz", + "integrity": "sha512-bZ5Sy3YzKo9Fyc8wH2iIQK4JImJ6R0GWI9kL1/k7Z91ZBNgkRXE6U0JfHIizZbort8ZunhSI3jw9I6253ahKfg==", + "peer": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lilconfig": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true, + "peer": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize.css": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", + "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==" + }, + "node_modules/onchange": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/onchange/-/onchange-7.1.0.tgz", + "integrity": "sha512-ZJcqsPiWUAUpvmnJri5TPBooqJOPmC0ttN65juhN15Q8xA+Nbg3BaxBHXQ45EistKKlKElb0edmbPWnKSBkvMg==", + "dev": true, + "dependencies": { + "@blakeembrey/deque": "^1.0.5", + "@blakeembrey/template": "^1.0.0", + "arg": "^4.1.3", + "chokidar": "^3.3.1", + "cross-spawn": "^7.0.1", + "ignore": "^5.1.4", + "tree-kill": "^1.2.2" + }, + "bin": { + "onchange": "dist/bin.js" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "peer": true, + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-cli": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-10.1.0.tgz", + "integrity": "sha512-Zu7PLORkE9YwNdvOeOVKPmWghprOtjFQU3srMUGbdz3pHJiFh7yZ4geiZFMkjMfB0mtTFR3h8RemR62rPkbOPA==", + "dev": true, + "dependencies": { + "chokidar": "^3.3.0", + "dependency-graph": "^0.11.0", + "fs-extra": "^11.0.0", + "get-stdin": "^9.0.0", + "globby": "^13.0.0", + "picocolors": "^1.0.0", + "postcss-load-config": "^4.0.0", + "postcss-reporter": "^7.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "slash": "^5.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "postcss": "index.js" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-reporter": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.5.tgz", + "integrity": "sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "thenby": "^1.3.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sass": { + "version": "1.58.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.0.tgz", + "integrity": "sha512-PiMJcP33DdKtZ/1jSjjqVIKihoDc6yWmYr9K/4r3fVVIEDAluD0q7XZiRKrNJcPK3qkLRF/79DND1H5q1LBjgg==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.0.0.tgz", + "integrity": "sha512-n6KkmvKS0623igEVj3FF0OZs1gYYJ0o0Hj939yc1fyxl2xt+xYpLnzJB6xBSqOfV9ZFLEWodBBN/heZJahuIJQ==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/thenby": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", + "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", + "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + } + } +} diff --git a/public/themes/custom/ubccs/package.json b/public/themes/custom/ubccs/package.json new file mode 100644 index 0000000..d2c41e1 --- /dev/null +++ b/public/themes/custom/ubccs/package.json @@ -0,0 +1,32 @@ +{ + "private": true, + "scripts": { + "build:sass": "sass sass:css", + "autoprefixer": "postcss --no-map -u autoprefixer --autoprefixer.browsers -r css/*.css", + "build:css": "npm run build:sass && npm run autoprefixer", + "watch:css": "onchange 'sass/**/*.scss' -- npm run build:css" + }, + "dependencies": { + "@fancyapps/fancybox": "github:fancyapps/fancybox", + "bootstrap": "^4.0.0", + "normalize.css": "^8.0.0" + }, + "devDependencies": { + "autoprefixer": "^10.0.0", + "onchange": "^7.0.0", + "postcss-cli": "^10.0.0", + "sass": "^1.0.0" + }, + "copyFiles": [ + { + "from": "node_modules/@fancyapps/fancybox/dist/*", + "to": "js/vendor/fancybox" + } + ], + "copyFilesSettings": { + "whenFileExists": "overwrite" + }, + "browserslist": [ + "> 1%" + ] +} diff --git a/public/themes/custom/ubccs/sass/_bootstrap-no-output.scss b/public/themes/custom/ubccs/sass/_bootstrap-no-output.scss new file mode 100644 index 0000000..81ceaa0 --- /dev/null +++ b/public/themes/custom/ubccs/sass/_bootstrap-no-output.scss @@ -0,0 +1,6 @@ +@import 'variables'; + +// These imports have no output and are safe to import. +@import '../node_modules/bootstrap/scss/functions'; +@import '../node_modules/bootstrap/scss/variables'; +@import '../node_modules/bootstrap/scss/mixins'; diff --git a/public/themes/custom/ubccs/sass/_utility.scss b/public/themes/custom/ubccs/sass/_utility.scss new file mode 100644 index 0000000..f16855e --- /dev/null +++ b/public/themes/custom/ubccs/sass/_utility.scss @@ -0,0 +1,103 @@ +@import 'variables'; +@import 'bootstrap-no-output'; + +.text-left { + text-align: left !important; +} + +.text-right { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +// Extend backgrounds. +.extend–background { + @include media-breakpoint-only(xs) { + // Counter the container to bleed to the edge. + margin-left: -15px; + margin-right: -15px; + } + @include media-breakpoint-up(sm) { + margin-right: -30000px; + margin-left: -30000px; + padding-right: 30000px; + padding-left: 30000px; + } +} + +// @todo Make into a hr variant. +.short-line { + width: 225px; + height: 3px; + background-color: $burnt-sienna; + margin: 0 auto; +} + +.intro { + color: #cc6e20; + font-size: 2.2rem; +} + +.bg-base-darkest { + background-color: $dark-teal; +} + +// Spacing. +.p-1 { + padding: 1rem; +} + +.p-2 { + padding: 2rem; +} + +.px-1 { + padding-left: 1rem; + padding-right: 1rem; +} + +.px-2 { + padding-left: 2rem; + padding-right: 2rem; +} + +.py-1 { + padding-top: 1rem; + padding-bottom: 1rem; +} + +.py-2 { + padding-top: 2rem; + padding-bottom: 2rem; +} + +.m-1 { + margin: 1rem; +} + +.m-2 { + margin: 2rem; +} + +.mx-1 { + margin-left: 1rem; + margin-right: 1rem; +} + +.mx-2 { + margin-left: 2rem; + margin-right: 2rem; +} + +.my-1 { + margin-top: 1rem; + margin-bottom: 1rem; +} + +.my-2 { + margin-top: 2rem; + margin-bottom: 2rem; +} diff --git a/public/themes/custom/ubccs/sass/_variables.scss b/public/themes/custom/ubccs/sass/_variables.scss new file mode 100644 index 0000000..226c048 --- /dev/null +++ b/public/themes/custom/ubccs/sass/_variables.scss @@ -0,0 +1,69 @@ +// MEDIA QUERIES AND GRIDS +// ------------------------- + +$screen-md: 980px; + +// Grid. +// ------------------------- +$grid-columns: 12; +$grid-gutter-width: 30px; + +$grid-breakpoints: ( + // Extra small screen / phone + xs: 0, + // Small screen / phone + sm: 576px, + // Medium screen / tablet + md: 768px, + // Large screen / desktop + lg: 980px, + // Extra large screen / wide desktop + xl: 1200px, + // Extra Extra large screen / wide desktop + xxl: 1500px +); + +// Only max width to contain the site, otherwise full 1200px. +$container-max-widths: ( + xl: 1200px +); + +// Fonts. +// ------------------------- +$font-family-serif: Merriweather, Georgia, serif; +$font-family-sans-serif: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; +$font-family-mono: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + +$font-family: $font-family-sans-serif; + +$font-size-base: 1.7rem !default; + +// UBC Colours. +// ------------------------- +$ubc-blue: #002145; +$ubc-grey: #2f5d7c; +$ubc-light-grey: #5e869f; +$ubc-lighter-grey: #98b2c3; +$ubc-silver-grey: #c3d0d8; +$ubc-silver: #d7e0e7; +$silver: #cfcfd0; + +// Greys. +// ------------------------- +$black: #000; +$gray-darker: #222; +$gray-dark: #444; +$gray: #555; +$gray-light: #999; +$gray-lighter: #eee; +$white: #fff; + +// CS Colours. +// ------------------------- +$burnt-sienna: #9e4225; +$orange: #ef8843; +$dark-teal: #005554; +$teal: #00afa4; + +$unit-color: $burnt-sienna; // Burnt Sienna. + diff --git a/public/themes/custom/ubccs/sass/base/_blockquote.scss b/public/themes/custom/ubccs/sass/base/_blockquote.scss new file mode 100644 index 0000000..7c6b5c5 --- /dev/null +++ b/public/themes/custom/ubccs/sass/base/_blockquote.scss @@ -0,0 +1,9 @@ +@import '../variables'; + +blockquote { + border-left: 8px solid $teal; + list-style-position: inside; + margin-left: 0; + padding-left: 1em; + padding-right: 2em; +} diff --git a/public/themes/custom/ubccs/sass/base/_code.scss b/public/themes/custom/ubccs/sass/base/_code.scss new file mode 100644 index 0000000..11fd8ff --- /dev/null +++ b/public/themes/custom/ubccs/sass/base/_code.scss @@ -0,0 +1,42 @@ +@import '../variables'; + +:not(pre) > code { + padding: .2em .4em; + border-radius: .3em; + white-space: normal; +} +:not(pre) > code, +pre { + background-color: $gray-lighter; +} + +pre { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +code, +pre { + color: $gray; + + //text-shadow: 0 1px rgba(0, 0, 0, 0.3); + text-align: left; + white-space: pre; + + word-spacing: normal; + word-break: normal; + word-wrap: normal; + + line-height: 1.5; + tab-size: 4; + hyphens: none; +} + +pre, +code, +kbd, +samp { + font-family: $font-family-mono; +} + diff --git a/public/themes/custom/ubccs/sass/base/_figure.scss b/public/themes/custom/ubccs/sass/base/_figure.scss new file mode 100644 index 0000000..0a34957 --- /dev/null +++ b/public/themes/custom/ubccs/sass/base/_figure.scss @@ -0,0 +1,42 @@ +@import '../variables'; + + +figure { + display: table; + + margin: 2rem 0; + + img { + // Prevent line-height spacing under image and between caption. + display: block; + } +} + +figcaption { + display: table-caption; + caption-side: bottom; + max-width: none; + + padding: 1rem 2rem; + + font-size: $font-size-base * 0.8; + line-height: 1.2; +} + +figcaption p { + margin: 0; +} + +// Image captions. +a + figcaption, +img + figcaption { + color: $burnt-sienna; + // Temporary fix for AC 6542-106. + //background: $burnt-sienna; + //color: #fff; +} + +// Blockquote captions. +blockquote + figcaption { + color: $gray; +} diff --git a/public/themes/custom/ubccs/sass/base/_fixes.scss b/public/themes/custom/ubccs/sass/base/_fixes.scss new file mode 100644 index 0000000..ae170d7 --- /dev/null +++ b/public/themes/custom/ubccs/sass/base/_fixes.scss @@ -0,0 +1,11 @@ +// Negative index isn't meant to be focused by the user. +// https://stackoverflow.com/questions/32911355/whats-the-tabindex-1-in-bootstrap-for +[tabindex="-1"]:focus { + outline: none; +} + +@media print { + footer { + display: none; + } +} diff --git a/public/themes/custom/ubccs/sass/base/_form.scss b/public/themes/custom/ubccs/sass/base/_form.scss new file mode 100644 index 0000000..e1d9ef1 --- /dev/null +++ b/public/themes/custom/ubccs/sass/base/_form.scss @@ -0,0 +1,242 @@ +@import '../variables'; + +form { + margin: 0; + padding: 0; +} + +button { + width: auto; + overflow: visible; + -webkit-appearance: none; + -moz-appearance: none; +} + +label { + display: table; + margin: 0 0 0.25em; + padding: 0; + font-weight: bold; +} + +label[for] { + cursor: pointer; +} + +// Fieldsets. +fieldset { + background-color: lighten($teal, 64%); + border: 2px solid $teal; + border-radius: 3px; + + padding: 1em; + margin: 1em 0; + + // Fix for items pushing the width past it's parent. + min-width: 100%; +} + +.fieldset-wrapper p { + margin-top: 0; + margin-bottom: 0; +} + +legend { + font-size: 2rem; + font-weight: 700; + padding: 0 0.25em; +} + +/** + * Limits extra long instances of select elements to the max width allowed + * to avoid breaking layouts. + */ +select { + max-width: 100%; +} + +// CLF override. +button, +input { + font-size: $font-size-base; + font-family: $font-family; + vertical-align: baseline; +} + +// CLF override. +input { + width: auto; +} + +button { + width: auto; + overflow: visible; +} + +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + line-height: inherit; + margin: 0; +} + +input, +select { + vertical-align: middle; +} + +input, +textarea, +select, +// CWL override [type="text"]. +input[type="text"] { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border: 2px solid $gray-dark; + border-radius: 0; + color: $gray-dark; + + // Avoid this because of inline blocks, let the label break the line. + // display: block; + + // CLF override. + margin: 0; + + // Ensure doesn't exceed container. + max-width: 100%; + + padding: 0.5rem 0.8rem; + + &:focus { + outline: 0.2rem solid rgba(82, 168, 236, 0.8); + transition: outline ease-in-out 0.2s; + } +} + +// Buttons +input[type="image"] { + border: 0; +} + +button, +input[type="image"], +input[type="button"], +input[type="submit"] { + &:hover { + cursor: pointer; + } +} + +select { + // Cap the width of the select fields. + // max-width: 210px; + background: #fff url("../img/arrow-both.svg") no-repeat right 1.3rem center; + background-size: 1rem; + padding-right: 3rem; +} + +select[multiple] { + background-image: none; +} + +input[type="checkbox"], +input[type="radio"] { + padding: 0; + display: inline-block; +} +[type="checkbox"], +[type="radio"] { + height: 2rem; + width: 2rem; + position: relative; + border: 0; + vertical-align: middle; + + &:focus { + outline: none; + } +} + +[type="checkbox"] + label, +[type="radio"] + label { + font-weight: 400; + margin-left: 0.6rem; +} + +[type="checkbox"]::before, +[type="radio"]::before { + background-color: #fff; + content: "\a0"; + display: inline-block; + text-indent: 0.15em; + vertical-align: middle; + + position: absolute; + top: 0; + left: 0; + + cursor: pointer; +} + +[type="checkbox"]::before { + border-radius: 0.2rem; + box-shadow: 0 0 0 0.2rem $gray-dark; + height: 2rem; + line-height: 2rem; + margin-left: 1px; + margin-right: 0.6em; + width: 2rem; +} + +[type="radio"]::before { + border-radius: 100%; + box-shadow: 0 0 0 0.2rem #ffffff, 0 0 0 0.4rem $gray-dark; + height: 1.4rem; + line-height: 1.4rem; + margin-left: 3px; + margin-right: 0.75em; + width: 1.4rem; +} + +[type="checkbox"]:checked::before, +[type="radio"]:checked::before { + background-color: $teal; + box-shadow: 0 0 0 0.2rem $teal; +} + +[type="radio"]:checked::before { + box-shadow: 0 0 0 0.2rem #fff, 0 0 0 0.4rem $teal; +} + +[type="checkbox"]:checked::before, +[type="checkbox"]:checked:disabled::before { + background-image: url("../img/correct8.svg"); + background-repeat: no-repeat; + background-position: 50%; +} + +[type="radio"]:focus::before { + outline: 0.2rem solid rgba(82, 168, 236, 0.8); + outline-offset: 6px; +} + +[type="checkbox"]:disabled + label { + color: #d6d7d9; +} + +[type="checkbox"]:focus::before { + outline: 0.2rem solid rgba(82, 168, 236, 0.8); + outline-offset: 3px; +} + +[type="checkbox"]:disabled::before, +[type="radio"]:disabled::before { + background: #f1f1f1; + box-shadow: 0 0 0 0.2rem $gray-light; + cursor: not-allowed; +} diff --git a/public/themes/custom/ubccs/sass/base/_image.scss b/public/themes/custom/ubccs/sass/base/_image.scss new file mode 100644 index 0000000..c00a788 --- /dev/null +++ b/public/themes/custom/ubccs/sass/base/_image.scss @@ -0,0 +1,4 @@ +img { + max-width: 100%; + height: auto; +} diff --git a/public/themes/custom/ubccs/sass/base/_list.scss b/public/themes/custom/ubccs/sass/base/_list.scss new file mode 100644 index 0000000..b2c0c37 --- /dev/null +++ b/public/themes/custom/ubccs/sass/base/_list.scss @@ -0,0 +1,17 @@ +@import '../variables'; + +ul, +ol { + margin-top: 0; + margin-bottom: $font-size-base; + + // Override CLF. + margin-left: 0; + + padding-left: $font-size-base * 2; +} + +li { + // Override CLF to match default line-height. + line-height: 1.5; +} diff --git a/public/themes/custom/ubccs/sass/base/_reset.scss b/public/themes/custom/ubccs/sass/base/_reset.scss new file mode 100644 index 0000000..aade885 --- /dev/null +++ b/public/themes/custom/ubccs/sass/base/_reset.scss @@ -0,0 +1,21 @@ +* { + box-sizing: border-box; +} + +body { + overflow-x: hidden; +} + +// Copy from bootstrap _reboot.scss. +// And undo these styles for placeholder links/named anchors (without href). +// It would be more straightforward to just use a[href] in previous block, but that +// causes specificity issues in many other styles that are too complex to fix. +// See https://github.com/twbs/bootstrap/issues/19402 + +a:not([href]):not([class]) { + &, + &:hover { + color: inherit; + text-decoration: none; + } +} diff --git a/public/themes/custom/ubccs/sass/base/_table.scss b/public/themes/custom/ubccs/sass/base/_table.scss new file mode 100644 index 0000000..9d4c2d8 --- /dev/null +++ b/public/themes/custom/ubccs/sass/base/_table.scss @@ -0,0 +1,49 @@ +@import '../variables'; + +table, +tbody, +td, +tfoot, +th, +thead, +tr { + border: 0; + margin: 0; + padding: 0; +} + +table { + border-collapse: collapse; + margin-bottom: 24px; +} + +caption, +th { + text-align: left; +} + +th, +td { + padding: 1rem; + border: 0 solid $ubc-silver; +} + +th { + vertical-align: bottom; + border-bottom-width: 2px; +} + +td { + vertical-align: top; + border-bottom-width: 1px; +} + +// Remove spacing around headers, lists, paragraphs in tables. +th :first-child, +td :first-child { + margin-top: 0; +} +th :last-child, +td :last-child { + margin-bottom: 0; +} diff --git a/public/themes/custom/ubccs/sass/base/_typography.scss b/public/themes/custom/ubccs/sass/base/_typography.scss new file mode 100644 index 0000000..0d85503 --- /dev/null +++ b/public/themes/custom/ubccs/sass/base/_typography.scss @@ -0,0 +1,101 @@ +@import '../variables'; + +html { + font-size: 10px; +} + +body { + font-family: $font-family; + color: $gray-dark; + + // Override CLF. + font-size: $font-size-base; + + // Fix absolute line-height from CLF. + line-height: 1.5; +} + +// Heading general. +h1, +h2, +h3, +h4, +h5, +h6 { + color: $dark-teal; + + text-rendering: auto; + font-weight: 400; + line-height: 1.2; +} + +// Heading spacing. +h1 { + margin-top: 0; + margin-bottom: 0; +} + +h2 { + margin-top: $font-size-base * 2; + margin-bottom: $font-size-base; +} + +h3, +h4, +h5, +h6 { + margin-top: $font-size-base * 1.5; + margin-bottom: $font-size-base; +} + +// Heading sizes. +h1 { + font-size: $font-size-base * 2.35; +} +h2 { + font-size: $font-size-base * 1.76; +} +h3 { + font-size: $font-size-base * 1.47; +} +h4 { + font-size: $font-size-base * 1.17; +} + +// Heading weights. +h3, +h4 { + font-weight: 700; +} + +// Paragraphs. +p { + line-height: 1.5; + margin-top: $font-size-base; + margin-bottom: $font-size-base; +} + +// Links. +a { + color: $teal; + text-decoration-skip-ink: auto; + transition: color 0.5s ease-in; +} + +a:hover, +a:active { + color: $dark-teal; +} + +hr { + display: block; + height: 2px; + border: 0; + margin: 3rem auto; + width: 40%; + padding: 0; + background-color: $burnt-sienna; + + // Prevent floating on left and right. + clear: both; +} diff --git a/public/themes/custom/ubccs/sass/bootstrap.scss b/public/themes/custom/ubccs/sass/bootstrap.scss new file mode 100644 index 0000000..340d43a --- /dev/null +++ b/public/themes/custom/ubccs/sass/bootstrap.scss @@ -0,0 +1,24 @@ + + +@import 'bootstrap-no-output'; + +// Don't import all of bootstrap, only things you need when you need it. +// @import '../node_modules/bootstrap/scss/bootstrap'; + +// Don't use these, it's got too many opinions that are not shared and other CSS provides. +//@import '../node_modules/bootstrap/scss/reboot'; +//@import '../node_modules/bootstrap/scss/type'; +//@import '../node_modules/bootstrap/scss/code'; +//@import '../node_modules/bootstrap/scss/utilities'; +//@import '../node_modules/bootstrap/scss/images'; +//@import '../node_modules/bootstrap/scss/root'; + + +// Bootstrap grid. +@import '../node_modules/bootstrap/scss/grid'; + +// Bootstrap cards. +//@import '../node_modules/bootstrap/scss/card'; + +// Bootstrap jumbotron. +//@import '../node_modules/bootstrap/scss/jumbotron'; diff --git a/public/themes/custom/ubccs/sass/ckeditor5.scss b/public/themes/custom/ubccs/sass/ckeditor5.scss new file mode 100644 index 0000000..5862b71 --- /dev/null +++ b/public/themes/custom/ubccs/sass/ckeditor5.scss @@ -0,0 +1,36 @@ +/** + * $file + * Approximate clf's style in CKEditor instances on the Drupal back-end. + */ + +@import 'variables'; + +.ck-content { + // Override to fix rem issue in CKEditor 5 in Claro. + $font-size-base: 1.1rem; + + @import 'base/typography'; + @import 'base/blockquote'; + @import 'base/code'; + @import 'base/figure'; + @import 'base/fixes'; + @import 'base/form'; + @import 'base/image'; + @import 'base/list'; + @import 'base/table'; + + @import 'components/align'; + @import 'components/button'; + @import 'components/caption'; + @import 'components/details'; + @import 'components/image'; + @import 'components/inline-block'; + @import 'components/media'; + @import 'components/table'; + @import 'components/typography'; + + // Fix ckeditor5 display, margin: auto. + .image:not([class*="image-style-align-"]) { + margin: 2rem 0; + } +} diff --git a/public/themes/custom/ubccs/sass/components/_admin.scss b/public/themes/custom/ubccs/sass/components/_admin.scss new file mode 100644 index 0000000..b3d1cef --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_admin.scss @@ -0,0 +1,4 @@ +#admin-toolbar-search-input { + // Fix toolbar. + padding: 0.5rem 0.8rem; +} diff --git a/public/themes/custom/ubccs/sass/components/_alert.scss b/public/themes/custom/ubccs/sass/components/_alert.scss new file mode 100644 index 0000000..c1120ae --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_alert.scss @@ -0,0 +1,13 @@ +@import '../variables'; +@import '../bootstrap-no-output'; + +.alert p { + margin-top: 0; + margin-bottom: 0; +} + +.alert { + max-width: map_get($container-max-widths, xl); + margin-left: auto; + margin-right: auto; +} diff --git a/public/themes/custom/ubccs/sass/components/_align.scss b/public/themes/custom/ubccs/sass/components/_align.scss new file mode 100644 index 0000000..be534a4 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_align.scss @@ -0,0 +1,62 @@ + +/** + * @file + * Alignment classes for text and block level elements. + */ + +.text-align-left { + text-align: left; +} +.text-align-right { + text-align: right; +} +.text-align-center { + text-align: center; +} +.text-align-justify { + text-align: justify; +} + +/** + * Alignment classes for block level elements (images, videos, blockquotes, etc.) + */ +.align-left { + float: left; +} +.align-right { + float: right; +} +.align-center { + //display: block; + margin-right: auto; + margin-left: auto; +} + +.image--left, +.image--right, +.image--center { + // Prevent them from stacking beside each other. + clear: both; + + // Give space away from content above and below. + margin-top: 2rem; + margin-bottom: 2rem; +} + +.align-left, +.image--left { + float: left; + margin-right: 2rem; +} + +.align-right, +.image--right { + float: right; + margin-left: 2rem; +} + +.align-center, +.image--center { + margin-right: auto; + margin-left: auto; +} diff --git a/public/themes/custom/ubccs/sass/components/_awards.scss b/public/themes/custom/ubccs/sass/components/_awards.scss new file mode 100644 index 0000000..f5d7159 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_awards.scss @@ -0,0 +1,14 @@ + +// Maintain a reasonable column width. +.views-table .views-field-field-award-date { + width: 35px; +} + +.views-table .views-field-field-award-recipient, +.views-table .views-field-field-award-organization { + width: 25%; +} + +.view-awards .views-table { + width: 100%; +} diff --git a/public/themes/custom/ubccs/sass/components/_back-to-top.scss b/public/themes/custom/ubccs/sass/components/_back-to-top.scss new file mode 100644 index 0000000..7f2543d --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_back-to-top.scss @@ -0,0 +1,34 @@ +@import '../variables'; + +#back-to-top { + display: none; + position: fixed; + right: 0; + bottom: 40px; + width: 40px; + z-index: 99; + transition: color .2s ease, background-color .2s ease; +} + +.back-to-top__button { + background-color: $ubc-blue; + font-weight: 400; + font-size: .9em; + color: #fff; + display: inline-block; + padding: 14px; + margin: 0; + cursor: pointer; + width: auto; + border: none; + text-decoration: none; + opacity: 0.75; + + &:hover { + opacity: 0.9; + } + i { + color: #fff; + } +} + diff --git a/public/themes/custom/ubccs/sass/components/_big-quote.scss b/public/themes/custom/ubccs/sass/components/_big-quote.scss new file mode 100644 index 0000000..5dd5a13 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_big-quote.scss @@ -0,0 +1,28 @@ +@import '../variables'; + +.big-quote { + font-family: $font-family-serif; + font-size: 2.5rem; + font-style: italic; + + text-align: center; + + padding: 3rem 4rem; + + position: relative; + z-index: 0; + + &:before { + position: absolute; + top: 0; + left: 0; + z-index: -1; + vertical-align: baseline; + + content: '“'; + + font-size: 20rem; + line-height: 1; + color: $gray-lighter; + } +} diff --git a/public/themes/custom/ubccs/sass/components/_breadcrumbs.scss b/public/themes/custom/ubccs/sass/components/_breadcrumbs.scss new file mode 100644 index 0000000..f281aa1 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_breadcrumbs.scss @@ -0,0 +1,38 @@ +@import '../variables'; + +.breadcrumb { + padding: .5rem; + + line-height: 1.5rem; + + color: $gray-light; + text-transform: uppercase; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} + +.breadcrumb li { + line-height: 1.5rem; +} + +.breadcrumb li::before { + content: '/'; + display: inline-block; + margin: 0 .5em 0; + color: $gray-light; +} + +.breadcrumb li:first-child:before { + content: none; +} + +// Override CLF. +.breadcrumb a { + color: $teal; +} + +// Override CLF. +.breadcrumb .active { + color: $gray-light; +} diff --git a/public/themes/custom/ubccs/sass/components/_button.scss b/public/themes/custom/ubccs/sass/components/_button.scss new file mode 100644 index 0000000..d32a2ff --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_button.scss @@ -0,0 +1,267 @@ +@import "../variables"; + +// Buttons. +// Not touching bootstrap .btn class buttons. + +// Classy override. +.button, +.image-button { + margin-left: 0; + margin-right: 0; +} + +%button { + display: inline-block; + padding: .7rem 1.7rem; + + border: 0; + border-radius: .2rem; + + // Override CLF. + background: none; + text-decoration: none; + + transition: all .5s cubic-bezier(0.165, 0.84, 0.44, 1); + + // Default offset. + outline-offset: 2px; + + &.button--hover, + &.button--focus, + &:hover, + &:focus { + text-decoration: none; + outline: none; + } + + &.button--focus, + &:focus { + // Prevent focus ring being covered by next siblings. + z-index: 10; + outline: 1px dotted $teal; + } + + &.button--active, + &:active { + transition: none; + } +} + +.button { + @extend %button; +} + +.field-add-more-submit.button { + font-size: .8em; +} + +.button.form-submit, +%button--primary { + border-color: $teal; + background-color: $teal; + color: #fff; + + &.button--hover, + &:hover { + background-color: darken($teal, 10%); + color: #fff; + box-shadow: 0 1px 2px hsla(203, 10%, 10%, 0.25); + } + + &.button--active, + &:active { + background-color: $dark-teal; + box-shadow: inset 0 1px 3px hsla(0, 0%, 0%, 0.2); + } +} +.button--primary { + @extend %button--primary; +} + +%button--secondary { + border-color: $dark-teal; + background-color: $dark-teal; + color: #fff; + //text-shadow: 0 1px hsla(0, 0%, 0%, 0.5); + + &.button--focus, + &.button--hover, + &:hover, + &:focus { + background-color: $dark-teal; + border-color: $dark-teal; + color: #fff; + } + + &.button--hover, + &:hover { + background-color: darken($teal, 10%); + box-shadow: 0 1px 2px hsla(203, 10%, 10%, 0.25); + } + + &.button--active, + &:active { + background-color: darken($dark-teal, 5%); + box-shadow: inset 0 1px 3px hsla(0, 0%, 0%, 0.2); + } +} + +.button--secondary { + @extend %button--secondary; +} + +/** + * Overrides styling from system.theme. + */ +.button-action::before { + margin-left: -0.2em; + padding-right: 0.2em; + font-size: 0.875rem; + line-height: 16px; +} +[dir="rtl"] .button-action::before { + margin-right: -0.2em; + margin-left: 0; + padding-right: 0; + padding-left: 0.2em; +} + +/* Link actions. */ + +/** + * Style a clickable/tappable element as a link. Duplicates the base style for + * the tag, plus a reset for padding, borders and background. + */ +.link { + display: inline; + cursor: pointer; + padding: 0; + border: 0; + background: none; + text-decoration: none; + + color: $teal; + + &:hover, + &:active { + text-decoration: underline; + color: $dark-teal; + } +} + +/** + * We've temporarily added the danger button here, bit of a harsh reset but we + * need it. + * @todo replace with link--danger. + * See https://www.drupal.org/node/2123731 + */ +.button--danger { + display: inline; + cursor: pointer; + padding: 0; + border: 0; + box-shadow: none; + background: none; + color: #c72100; + text-decoration: underline; + + &.button--focus, + &.button--hover, + &.button--active, + &:hover, + &:focus, + &:active { + color: #ff2a00; + text-decoration: underline; + text-shadow: none; + padding: 0; + border: 0; + box-shadow: none; + background: none; + } + + &:disabled, + &.is-disabled { + color: #737373; + cursor: default; + text-decoration: none; + padding: 0; + border: 0; + box-shadow: none; + background: none; + } +} + +%button--outline, +.button--outline { + color: $teal; + box-shadow: inset 0 0 0 2px $teal; + + &.button--hover, + &:hover { + box-shadow: inset 0 0 0 2px darken($teal, 10%); + color: darken($teal, 10%); + } + + &.button--active, + &:active { + background-color: rgba(255, 255, 255, .3); + color: $dark-teal; + box-shadow: inset 0 0 0 2px $dark-teal; + } + +} + +.button--inverse { + color: #fff; + box-shadow: inset 0 0 0 2px #fff; + + &.button--hover, + &.button--active, + &:hover, + &:active { + background-color: rgba(255, 255, 255, .2); + color: #fff; + } + + &.button--active, + &:active { + background-color: rgba(255, 255, 255, .3); + } +} + +%button--large, +.button--large { + border-radius: .3rem; + font-size: 2rem; + padding: 1rem 2rem; +} + +%button--small, +.button--small { + font-size: 1.5rem; + padding: .5rem 1.5rem; +} + +// Last to override. +.button:disabled, +.button:disabled:active, +.button.is-disabled, +.button.is-disabled:active { + background-color: #ededed; + box-shadow: none; + color: #5c5c5c; + cursor: default; + text-shadow: 0 1px hsla(0, 0%, 100%, 0.6); +} + +// Read more buttons. +.read-more { + margin-top: 2rem; +} + +.read-more__link { + @extend %button; + @extend %button--outline; + @extend %button--small; +} diff --git a/public/themes/custom/ubccs/sass/components/_calendar.scss b/public/themes/custom/ubccs/sass/components/_calendar.scss new file mode 100644 index 0000000..1fb905e --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_calendar.scss @@ -0,0 +1,15 @@ +.view-event-calendar .view-content { + clear:both; +} +.view-event-calendar .pager ul.js-pager__items { + padding-left: 0; +} +.view-event-calendar .pager ul.js-pager__items li.pager__item--previous { + float: left; +} +.view-event-calendar .pager ul.js-pager__items li.pager__item--next { + float: right; +} +.view-event-calendar .calendar-granularity a{ + padding: 0 10px; +} diff --git a/public/themes/custom/ubccs/sass/components/_caption.scss b/public/themes/custom/ubccs/sass/components/_caption.scss new file mode 100644 index 0000000..4013199 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_caption.scss @@ -0,0 +1,41 @@ + +// Caption filter: default styling for displaying image captions. +// Essentials, based on https://stackoverflow.com/a/13363408. +.caption { + display: table; +} +.caption > * { + display: block; + max-width: 100%; +} +.caption > figcaption { + display: table-caption; + max-width: none; + caption-side: bottom; +} + +// Media captions. +.media + figcaption { + background: $burnt-sienna; + color: #fff; +} + +.caption .media .field { + // Remove gap under inline elements like iframe or img. + line-height: 1; +} + +/* Override clf's default blockquote and pre styles when captioned. */ +.caption-pre > pre, +.caption-blockquote > blockquote { + margin: 0; +} +.caption-blockquote > figcaption::before { + content: "— "; +} +.caption-blockquote > figcaption { + text-align: left; +} +[dir="rtl"] .caption-blockquote > figcaption { + text-align: right; +} diff --git a/public/themes/custom/ubccs/sass/components/_card.scss b/public/themes/custom/ubccs/sass/components/_card.scss new file mode 100644 index 0000000..db008e3 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_card.scss @@ -0,0 +1,120 @@ +@import '../variables'; +@import '../bootstrap-no-output'; + +.cards { + display: flex; + flex-wrap: wrap; + justify-content: center; + + width: 100%; +} + +.card-wrapper { + display: flex; + justify-content: center; + + padding: 0; + width: 100%; + margin-bottom: 2rem; + + @include media-breakpoint-up(sm) { + width: 50%; + } + + @include media-breakpoint-up(md) { + width: 33.33%; + } +} + +.card { + text-decoration: none; + color: inherit; + + padding: 2rem; + + max-width: 320px; + width: 100%; + + border: 1px solid $gray-light; + + box-shadow: 0 1px 3px rgba(0,0,0,.12),0 1px 2px rgba(0,0,0,.24); + + // Layout. + display: flex; + flex-direction: column; + + &:hover, + &:focus, + &:active { + background-color: #efefef; + text-decoration: none; + color: inherit; + + box-shadow: 0 14px 28px rgba(0,0,0,.25),0 10px 10px rgba(0,0,0,.22); + transition: all .3s cubic-bezier(.25,.8,.25,1); + } + + .button { + border: 2px solid transparent; + } + + &:focus .button, + &:active .button, + &:hover .button { + background-color: $white; + border: 2px solid $teal; + color: $teal; + } + + img { + max-width: 100%; + height: auto; + } + + span { + display: block; + } + + .card-title, + .card-text { + margin-top: 1rem; + margin-bottom: 1rem; + } + + .card-title { + color: $teal; + font-size: 2rem; + font-weight: 700; + line-height: 1.3; + + text-decoration: underline; + text-decoration-skip-ink: auto; + transition: color 0.5s ease-in; + } + + :hover .card-title, + :active .card-title { + color: $dark-teal; + } + + .card-text { + line-height: 1.3; + } + + .card-body { + // Removed extra padding for Task-4631-106. + //padding: 0 1.25rem; + flex: 1 0 auto; + } + + .card-footer { + flex: 0 1 auto; + background: transparent; + border: 0 none; + margin-top: 1rem; + } +} + +.card-body * { + margin-bottom: 0; +} diff --git a/public/themes/custom/ubccs/sass/components/_cart.scss b/public/themes/custom/ubccs/sass/components/_cart.scss new file mode 100644 index 0000000..d25d54b --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_cart.scss @@ -0,0 +1,13 @@ +.cart td { + vertical-align: middle; +} + +.cart-form td { + + // Too much space taken up in side a table when usually only one form element + // is visible. + .form-item, + .form-actions { + margin: 0; + } +} diff --git a/public/themes/custom/ubccs/sass/components/_chevron.scss b/public/themes/custom/ubccs/sass/components/_chevron.scss new file mode 100644 index 0000000..67c80ee --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_chevron.scss @@ -0,0 +1,26 @@ +.chevron::after { + border-style: solid; + border-width: 0.2em 0.2em 0 0; + content: ''; + display: inline-block; + height: 0.45em; + left: 0.15em; + position: relative; + transform: rotate(-45deg); + vertical-align: middle; + width: 0.45em; +} + +.chevron.right::after { + left: 0; + transform: rotate(45deg); +} + +.chevron.bottom::after { + transform: rotate(135deg); +} + +.chevron.left::after { + left: 0.25em; + transform: rotate(-135deg); +} diff --git a/public/themes/custom/ubccs/sass/components/_courses.scss b/public/themes/custom/ubccs/sass/components/_courses.scss new file mode 100644 index 0000000..2d2ad94 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_courses.scss @@ -0,0 +1,61 @@ +@import '../variables'; +@import '../bootstrap-no-output'; + +.course-section-info { + border: 1px solid #cecece; + margin: 20px auto; +} +.course-section-info-header { + padding: 0 20px; +} +.course-section-info table { + width: 100%; + margin-bottom: 0; +} +.course-section-table-header { + background: #005554; + color: #fff; + text-transform: uppercase; +} +.course-section-table-header > tr > th { + font-weight: inherit; +} +.course-section-table-body > tr { + cursor: pointer; + white-space: nowrap; +} +.course-section-table-body > tr.open, .course-section-table-body > tr:hover { + background: #efefef; +} +.course-section-table-body > tr.child { + cursor: auto; + white-space: inherit; +} +.course-section-table-body > tr.child:hover { + background: none; +} +.course-section-info-details { + text-align: center; +} +.open .course-section-info-toggle { + background-color: #dfe3eb; + +} +.course-ssc-link-wrapper, .course-section-ssc-link { + float: right; +} + +/* Responsive */ +@include media-breakpoint-down(md) { +.course-section-info .views-field-field-course-days, +.course-section-info .views-field-field-course-end-time { + display: none; + } +} +@include media-breakpoint-down(sm) { +.course-section-info .views-field-field-course-term, +.course-section-info .views-field-field-course-room, +.course-section-info .views-field-field-course-instructors { + display: none; + } +} diff --git a/public/themes/custom/ubccs/sass/components/_details.scss b/public/themes/custom/ubccs/sass/components/_details.scss new file mode 100644 index 0000000..0f10f2e --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_details.scss @@ -0,0 +1,72 @@ +@import '../variables'; +@import '../bootstrap-no-output'; + +details { + padding: 0.5rem 0; + border: 0; + margin-top: 1rem; + margin-bottom: 1rem; +} + +details > .node__content { + padding-left: 1rem; + padding-right: 1rem; +} + +.details--small { + margin-top: 0.5rem; + margin-bottom: 0.5rem; + border: 0; + + summary { + font-weight: bold; + font-size: 1.7rem; + } +} + +details > .details-wrapper { + padding-left: 1rem; + padding-right: 1rem; +} + +.details-wrapper { + margin-top: 1rem; + margin-bottom: 1rem; +} + +.details-wrapper > :last-child { + margin-bottom: 1rem; +} + +details > summary { + list-style: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details summary { + font-size: 2rem; + background-repeat: no-repeat; + background-position: right 1rem top 50%; + background-size: 1.7rem 1.7rem; + color: $teal; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Cpath d='M53 29H35V11a3 3 0 00-6 0v18H11a3 3 0 000 6h18v18a3 3 0 006 0V35h18a3 3 0 000-6z' fill='%2300afa4'/%3E%3C/svg%3E"); + border-bottom: 1px solid $dark-teal; + padding-right: 3rem; + padding-left: 1rem; +} + +details[open] summary { + border-bottom-width: 3px; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E%3Cpath d='M53 34H11a3 3 0 010-6h42a3 3 0 010 6z' fill='%2300afa4'/%3E%3C/svg%3E"); +} + +@include media-breakpoint-down(sm) { + details summary { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } +} diff --git a/public/themes/custom/ubccs/sass/components/_expand-collapse.scss b/public/themes/custom/ubccs/sass/components/_expand-collapse.scss new file mode 100644 index 0000000..41c040f --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_expand-collapse.scss @@ -0,0 +1,3 @@ +.expand-collapse { + text-align: right; +} diff --git a/public/themes/custom/ubccs/sass/components/_faq.scss b/public/themes/custom/ubccs/sass/components/_faq.scss new file mode 100644 index 0000000..76913b4 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_faq.scss @@ -0,0 +1,7 @@ +// @todo preferably this would be an h3 in the template with the grouping +// level context. +.view-faqs .view-grouping-content h2 { + // Treat like an h3. + font-size: 2.5rem; + font-weight: 700; +} diff --git a/public/themes/custom/ubccs/sass/components/_field.scss b/public/themes/custom/ubccs/sass/components/_field.scss new file mode 100644 index 0000000..99aa740 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_field.scss @@ -0,0 +1,41 @@ +.field--label-inline .field__label, +.field--label-inline .field__items { + // Override core. + float: none; + display: inline-block; +} + +.field--label-inline { + display: flex; + flex-wrap: wrap; +} + +.field--label-inline .field__item { + vertical-align: top; +} + +.field--label-inline .field__label, +.field--label-inline > .field__item { + padding-right: 0.5rem; +} + +.field + .field { + margin-top: 1rem; +} + +.field--label-inline .field + .field { + margin-top: 0; +} + +// Generally fields are following a clearfix class so remove the excess +// whitespace. +.field__label h2 { + margin-top: 1.7rem; +} + +.field--name-field-tags .field__items { + display: flex; + .field__item { + margin: 0 5px; + } +} diff --git a/public/themes/custom/ubccs/sass/components/_form.scss b/public/themes/custom/ubccs/sass/components/_form.scss new file mode 100644 index 0000000..a508c3a --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_form.scss @@ -0,0 +1,259 @@ +@import '../variables'; +@import '../bootstrap-no-output'; + +/** + * Form elements. + */ + +.fieldgroup { + min-width: 0; + + // Remove background color from fieldset. + background-color: transparent; +} + +.form-item, +.form-actions { + margin: 0.75em 0; +} + +.form-type-checkbox { + padding: 0; +} + +label.error { + color: #a51b00; +} +.form-item label.option { + text-transform: none; +} +.form-item label.option input { + vertical-align: middle; +} +.form-disabled label { + color: #737373; +} +.form-disabled input.form-text, +.form-disabled input.form-tel, +.form-disabled input.form-email, +.form-disabled input.form-url, +.form-disabled input.form-search, +.form-disabled input.form-number, +.form-disabled input.form-color, +.form-disabled input.form-file, +.form-disabled textarea.form-textarea, +.form-disabled select.form-select { + border-color: #d4d4d4; + background-color: hsla(0, 0%, 0%, .08); + box-shadow: none; +} +.form-item input.error, +.form-item textarea.error, +.form-item select.error { + border-width: 1px; + border-color: #e62600; + background-color: hsla(15, 75%, 97%, 1); + box-shadow: inset 0 5px 5px -5px #b8b8b8; + color: #a51b00; +} +.form-item textarea.error + .cke { + border-width: 1px; + border-color: #e62600; +} +.form-item input.error:focus, +.form-item textarea.error:focus, +.form-item select.error:focus { + border-color: #e62600; + outline: 0; + box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 0 8px 1px #e62600; + background-color: #fcf4f2; +} +.form-required:after { + background-size: 7px 7px; + width: 7px; + height: 7px; +} +.form-item--error-message { + margin-top: 0.15em; + color: #e32700; +} +.fieldset-wrapper > .form-item--error-message { + margin-top: 0; +} +.text-format-wrapper .form-item--error-message { + border: solid #ccc; + border-width: 0 1px; + margin: 0; + padding: 0.25em 0.666em 0; +} + +/* Filter */ +ul.tips, +div.description, +.form-item .description { + margin: 0.3rem 0 0 0; + color: #595959; + font-size: 0.95em; +} +.form-item .description.error { + margin-top: 0; + color: #a51b00; +} + +ul.tips li { + margin: 0.25em 0 0.25em 1.5em; /* LTR */ +} +[dir="rtl"] ul.tips li { + margin: 0.25em 1.5em 0.25em 0; +} +.form-type-radio .description, +.form-type-checkbox .description { + margin-left: 1.5em; /* LTR */ +} +[dir="rtl"] .form-type-radio .description, +[dir="rtl"] .form-type-checkbox .description { + margin-left: 0; + margin-right: 1.5em; +} + +.form-text, +.form-textarea, + // CLF Fix. +input[type="text"] { + font-size: 1em; + line-height: normal; +} + +input.form-autocomplete, +input.form-text, +input.form-tel, +input.form-email, +input.form-url, +input.form-search, +input.form-number, +input.form-color, +input.form-file, +input.form-date, +input.form-time, +textarea.form-textarea { + // CLF Fix. + height: auto; + line-height: inherit; + + border-radius: 2px; + border-color: #b8b8b8; + border-top-color: #999; + + background: #fcfcfa; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .125); + font-size: 1em; + color: #595959; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +select.form-select { + border-color: #b8b8b8; + border-top-color: #999; +} + +.form-text:focus, +.form-tel:focus, +.form-email:focus, +.form-url:focus, +.form-search:focus, +.form-number:focus, +.form-color:focus, +.form-file:focus, +.form-textarea:focus, +.form-date:focus, +.form-time:focus, +// CLF override. +input[type="text"]:focus { + border-color: $teal; + outline: 0; + background-color: #fff; +} + +// CLF override. +input[type="text"]:focus { + box-shadow: none; +} + +.confirm-parent, +.password-parent { + overflow: visible; + width: auto; +} + +.form-item-options-group-info-identifier, +.form-item-pass .description { + clear: both; +} + +/** + * Improve spacing of cancel link. + */ +#edit-cancel { + margin-left: 10px; /* LTR */ +} +[dir="rtl"] #edit-cancel { + margin-left: 0; + margin-right: 10px; +} + +/** + * Improve form element usability on narrow devices. + */ +@include media-breakpoint-down(sm) { + input.form-autocomplete, + input.form-text, + input.form-tel, + input.form-email, + input.form-url, + input.form-search, + input.form-number, + input.form-color, + input.form-file, + textarea.form-textarea { + width: 100%; + font-size: 1.2em; + line-height: 1.2em; + } + input.form-number { + width: auto; + } + .form-actions input, + .form-wrapper input[type="submit"] { + float: none; + margin-left: 0; + margin-right: 0; + margin-top: 10px; + padding-bottom: 6px; + width: 100%; + } + .form-actions input:first-child, + .form-wrapper input[type="submit"]:first-child { + margin-top: 0; + } + + .password-strength { + width: 100%; + } + div.form-item div.password-suggestions { + float: none; + } + + #edit-cancel { + display: block; + margin: 10px 0 0 0; + } + select { + width: 100%; + } +} + +/* Exceptions */ +#diff-inline-form select, +div.filter-options select { + padding: 0; +} diff --git a/public/themes/custom/ubccs/sass/components/_full-calendar.scss b/public/themes/custom/ubccs/sass/components/_full-calendar.scss new file mode 100644 index 0000000..bf22493 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_full-calendar.scss @@ -0,0 +1,13 @@ + +.node .fc-head-container { + padding: 0; + border: 0; +} + +.node .fc-widget-content { + padding: 0; +} + +.fc-widget-header table { + margin: 0; +} diff --git a/public/themes/custom/ubccs/sass/components/_home-banner.scss b/public/themes/custom/ubccs/sass/components/_home-banner.scss new file mode 100644 index 0000000..9cc624d --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_home-banner.scss @@ -0,0 +1,65 @@ +@import '../variables'; +@import '../bootstrap-no-output'; + +.home-banner { + position: relative; + margin-top: 0; + + img { + width: 100%; + height: 100%; + + // Keep line-height from affecting the background. + display: block; + } +} + +@include media-breakpoint-up(lg) { + .field--name-field-home-banner-image { + outline: 1rem #fff solid; + margin-top: 1rem; + margin-bottom: 1rem; + } +} + +.home-banner a { + // Remove the underline on mobile. + text-decoration: none; +} + +.home-banner__title { + width: 100%; + + background: darken($burnt-sienna, 30%); + padding: 1.5rem 2rem; + + @include media-breakpoint-up(sm) { + position: absolute; + left: 0; + bottom: 0; + background: rgba(darken($burnt-sienna, 30%), 0.9); + } + + @include media-breakpoint-up(md) { + width: 75%; + bottom: 3rem; + } + + .field { + color: $white; + + @include media-breakpoint-only(xs) { + text-align: center; + } + + @include media-breakpoint-up(md) { + font-size: 2.5rem; + font-weight: normal; + line-height: 1.2; + } + + @include media-breakpoint-up(lg) { + font-size: 3rem; + } + } +} diff --git a/public/themes/custom/ubccs/sass/components/_home.scss b/public/themes/custom/ubccs/sass/components/_home.scss new file mode 100644 index 0000000..e4d7929 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_home.scss @@ -0,0 +1,186 @@ +@import '../variables'; + +// Embeded videos need spacing on home. +.container-home .media { + margin-top: 2rem; + margin-bottom: 2rem; +} + +.view-home-page-banners { + max-width: 100%; +} + +.home__icons { + background-color: $gray-lighter; +} +.home__cards { + margin-top: 0px; + display: flex; + flex-wrap: wrap; + justify-content: center; + width: 100%; +} + +.home__card-wrapper { + display: flex; + justify-content: center; + padding: 0; +} + +.home__card { + text-decoration: none; + color: inherit; + padding: 2rem; + //max-width: 320px; + width: 100%; + display: flex; + flex-direction: column; +} + +.home__card-header { + font-size: 4rem; + color: $unit-color; +} + +.home__card-title { + font-size: 2.2rem; + font-weight: 700; + line-height: 1.3; + color: $dark-teal; + margin-top: 1rem; + margin-bottom: 1rem; + display: block; +} + +.home__card-text { + font-size: 1.4rem; +} + +// Remove margin on top and bottom and only leave in between. +.home__card-text p { + margin: 0; +} +.home__card-text p + p { + margin-top: 1.7rem; +} + +// Space around the card buttons. +.home__card-text .button { + margin: .2rem; +} + + +.home__widgets { + display: flex; + flex-wrap: wrap; + + .home__widgets-block { + h2 { + line-height: 1; + + &::after { + width: 100%; + height: 3px; + background-color: $unit-color; + margin: 0 auto; + content: ''; + display: inline-block; + } + } + + .views-element-container { + flex-grow: 1; + + .views-row:last-child .views-field-nothing { + display: none; + } + } + } + + .views-row { + margin-bottom: 1rem; + } +} +.tweets { + max-height: 650px; + overflow-y: scroll; +} +.tweet-header { + display: flex; + align-items: flex-start; +} +.tweet-header-info p { + font-weight:normal; + margin-top: 5px; +} + +.twitter-avator { + border-radius: 100px; + width: 48px; + margin-right: 15px; + vertical-align: middle; +} +.tweet__wrap { + margin: auto 0; + padding: 10px 20px; + border-bottom: 2px solid #e6e6e6; + cursor: pointer; + max-width: 100%; + &:hover, + &:focus, + &:active { + background-color: #efefef; + text-decoration: none; + color: inherit; + } +} +.tweet__img-wrap { + padding-left: 60px; +} + +.tweet__footer { + display: flex; +} +.tweet__footer svg { + color: #657786; + margin-right: 10px; +} +.tweet__footer svg:hover { + color: #ff1493; +} +.tweet__retweet { + display: flex; + margin-bottom: 10px; + font-size: 1.4rem; +} +.tweet__retweet svg { + margin-right: 10px; +} +.tweet__user { + display: flex; +} +.tweet__text { + margin: 10px auto; +} +.tweet__date { + color: $gray-light; +} +.view-twitter { + margin-top: 10px; +} + +@media screen and (max-width:430px){ + + .tweet-header { + flex-direction:column; + } + .tweet-header img { + margin-bottom: 20px; + } + .tweet-header-info p { + margin-bottom: 30px; + } + .tweet__img-wrap { + padding-left: 0; + } +} diff --git a/public/themes/custom/ubccs/sass/components/_image.scss b/public/themes/custom/ubccs/sass/components/_image.scss new file mode 100644 index 0000000..9126a9a --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_image.scss @@ -0,0 +1,5 @@ + +.node__header_image img { + width: 100%; + height: auto; +} diff --git a/public/themes/custom/ubccs/sass/components/_industry.scss b/public/themes/custom/ubccs/sass/components/_industry.scss new file mode 100644 index 0000000..b9468a7 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_industry.scss @@ -0,0 +1,113 @@ + +.block-sponsor-logos { + margin-bottom: 1rem; + margin-top: 1rem; + + &--gold, + &--silver, + &--bronze { + padding: 2rem 0; + } + + .field__item { + padding: 1rem; + } + + img { + object-fit: contain; + } + + &--gold, + &--silver, + &--none { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + } + + &--gold img, + &--silver img, + &--none img { + width: 150px; + max-height: 80px; + } + + &--gold { + border: 3px solid gold; + } + + &--silver { + border: 3px solid silver; + + img { + width: 120px; + } + } + + &--bronze { + border: 3px solid lighten(#ad8a56, 10%); + + column-gap: 20px; + column-count: auto; + column-width: 150px; + + h3:first-child, + h4:first-child { + margin-top: 0; + } + + p { + display: inline-block; + margin: 1rem 0; + } + } +} + +.block-sponsor-logos > div.field--name-field-logos { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + align-items: center; +} + +#block-60853 { + display: flex; + justify-content: center; +} + +.tag { + color: white; + font-size: 0.75em; + + background-clip: padding-box; + + border: 2px solid #fff; + border-radius: 0.5em; + + margin-left: 0.5em; + text-transform: uppercase; + + padding: 0 0.25em; +} + +.tag--undergrad { + background-color: crimson; + border-color: rgba(crimson, 0.5); +} + +.tag--grad { + background-color: lightskyblue; + border-color: rgba(lightskyblue, 0.5); +} + +.tag--alumni { + background-color: green; + border-color: rgba(green, 0.5); +} + +.tag--research { + background-color: orange; + border-color: rgba(orange, 0.5); +} diff --git a/public/themes/custom/ubccs/sass/components/_inline-block.scss b/public/themes/custom/ubccs/sass/components/_inline-block.scss new file mode 100644 index 0000000..efab2cf --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_inline-block.scss @@ -0,0 +1,47 @@ +@import '../variables'; +@import '../bootstrap-no-output'; + +.inline-block-left, +.inline-block-right { + @include media-breakpoint-up(md) { + max-width: 260px; + width: 100%; + } + + margin: 0 0 1rem 0; + padding: 2rem; + + background-color: $dark-teal; + color: #fff; + + h2, + h3, + h4, + a { + color: #fff; + } + + h2, + h3, + h4 { + margin-top: 0; + } +} + +.inline-block-left { + @include media-breakpoint-up(md) { + float: left; + clear: left; + } + + margin-right: 2rem; +} + +.inline-block-right { + @include media-breakpoint-up(md) { + float: right; + clear: right; + } + + margin-left: 2rem; +} diff --git a/public/themes/custom/ubccs/sass/components/_landing-banner.scss b/public/themes/custom/ubccs/sass/components/_landing-banner.scss new file mode 100644 index 0000000..2f9665c --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_landing-banner.scss @@ -0,0 +1,61 @@ +@import '../variables'; +@import '../bootstrap-no-output'; + +.landing-banner { + position: relative; + margin-top: 0; + + img { + width: 100%; + height: 100%; + + // Keep line-height from affecting the background. + display: block; + } +} + +@include media-breakpoint-up(lg) { + .landing-banner__image { + background-color: darken($burnt-sienna, 20%); + } + + .field--name-field-landing-banner-image { + outline: 1rem #fff solid; + margin-top: 1rem; + margin-bottom: 1rem; + } +} + +.landing-banner__title { + width: 100%; + + @include media-breakpoint-up(sm) { + position: absolute; + left: 0; + bottom: 0; + + background: rgba(darken($burnt-sienna, 30%), 0.6); + padding: 2rem; + } + + @include media-breakpoint-up(md) { + width: 75%; + bottom: 3rem; + } + + @include media-breakpoint-up(lg) { + width: 50%; + } + + h1 { + @include media-breakpoint-only(xs) { + text-align: center; + } + + @include media-breakpoint-up(sm) { + font-weight: bold; + color: $white; + margin: 0; + } + } +} diff --git a/public/themes/custom/ubccs/sass/components/_landing-cards.scss b/public/themes/custom/ubccs/sass/components/_landing-cards.scss new file mode 100644 index 0000000..f945247 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_landing-cards.scss @@ -0,0 +1,11 @@ +@import '../variables'; +// Divider between landing cards and anything after (typically body field). +.landing-cards + .field::before { + width: 50%; + max-width: 220px; + height: 3px; + background-color: $burnt-sienna; + margin: 3rem auto 0; + content: ''; + display: block; +} diff --git a/public/themes/custom/ubccs/sass/components/_landing-intro.scss b/public/themes/custom/ubccs/sass/components/_landing-intro.scss new file mode 100644 index 0000000..e4697c1 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_landing-intro.scss @@ -0,0 +1,29 @@ +@import '../variables'; +@import '../bootstrap-no-output'; + +.landing-intro { + max-width: 90rem; + width: 90%; + margin: 2rem auto; + text-align: center; + + p { + font-style: italic; + font-size: 1.8rem; + + @include media-breakpoint-up(sm) { + font-size: 2.2rem; + } + } + + // Disable divider.card-wrapper + //&::after { + // width: 50%; + // max-width: 220px; + // height: 3px; + // background-color: $burnt-sienna; + // margin: 0 auto; + // content: ''; + // display: inline-block; + //} +} diff --git a/public/themes/custom/ubccs/sass/components/_landing.scss b/public/themes/custom/ubccs/sass/components/_landing.scss new file mode 100644 index 0000000..efc5012 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_landing.scss @@ -0,0 +1,23 @@ + +// Remove partial underline on all landing pages. +.node--type-landing .page-title::after { + display: none; +} + +.node--type-landing .views-element-container, +.node--type-landing .block { + // 80 characters per line. + max-width: 80ch; + margin: 0 auto; +} + +// Separate the node content from blocks under it. +.node--type-landing .node__content + .block::before { + width: 50%; + max-width: 220px; + height: 3px; + background-color: $burnt-sienna; + margin: 0 auto; + content: ''; + display: inline-block; +} diff --git a/public/themes/custom/ubccs/sass/components/_list.scss b/public/themes/custom/ubccs/sass/components/_list.scss new file mode 100644 index 0000000..6890a4e --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_list.scss @@ -0,0 +1,15 @@ +// Commented due to sliders and other things getting overridden +// due to selectivity. + +//.node ol, +//.node ul { +// margin-bottom: 24px; +//} +// +//.node ul li ul { +// margin: .5em 0 0; +//} +// +//.node li { +// margin-bottom: 0.5em; +//} diff --git a/public/themes/custom/ubccs/sass/components/_media.scss b/public/themes/custom/ubccs/sass/components/_media.scss new file mode 100644 index 0000000..16d8bea --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_media.scss @@ -0,0 +1,19 @@ +.media--type-logo { + display: inline-block; + vertical-align: middle; + + // Remove inline space below image. + div { + line-height: 0; + } + + padding-left: 2rem; + + img { + object-fit: contain; + } +} + +.media--type-logo:first-of-type { + padding-left: 0; +} diff --git a/public/themes/custom/ubccs/sass/components/_menu.scss b/public/themes/custom/ubccs/sass/components/_menu.scss new file mode 100644 index 0000000..fa990e6 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_menu.scss @@ -0,0 +1,133 @@ +@import '../variables'; + +.navbar .nav { + margin: 0; + padding: 0; +} + +.navbar .nav li { + margin: 0; + font-size: $font-size-base; +} + +.navbar .nav > .menu-item--active-trail > .navbar-link { + position: relative; +} + +.navbar .nav > .menu-item--active-trail > .navbar-link::before { + content: ''; + display: block; + + width: 100%; + height: 3px; + background-color: $teal; + + position: absolute; + bottom: 0; + left: 0; + z-index: 2; +} + +// Help stay above things. +#ubc7-unit-menu.navigation-is-sticky { + z-index: 2; +} + +#ubc7-unit-menu .nav > li > a { + color: $dark-teal; + padding: 1rem 1.5rem; + // No dropdown. + height: 45px !important; +} + +#ubc7-unit-menu .dropdown-menu > li > a { + color: $teal; +} + +// Hover affect where available. +#ubc7-unit-menu .dropdown:hover .dropdown-menu { + display: block; +} + +// Menu hover CLF override. +.nav > li > a:hover, +.nav > li > a:focus, +#ubc7-unit-menu .nav-collapse .nav > li > a:hover { + background-color: $teal !important; + transition: all 0.3s cubic-bezier(.25,.8,.25,1); +} + +#ubc7-unit-menu .nav > li.active > a, +.navbar .nav > .active > a { + background: transparent; + box-shadow: none; +} + +.navbar .nav > .active > a:focus, +.navbar .nav > .active > a:hover { + background-color: $teal; + box-shadow: none; + color: #fff; +} + +// Remove border from CLF dropdowns. +.dropdown-menu { + border: 0; + border-radius: 3px; + + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + transition: all 0.3s cubic-bezier(.25,.8,.25,1); +} +.dropdown-menu:hover { + box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22); +} + +.dropdown-menu li { + border: 0; +} +.dropdown-menu > li > a { + padding: 1rem 1.5rem; +} + +// Drop menu link size. +.menu--main .dropdown-menu .navbar-link { + font-size: 1.5rem; +} + +#ubc7-unit-menu .nav-collapse .dropdown-menu a:hover, +#ubc7-unit-menu .nav-collapse .nav > li > a:hover { + background-color: $teal !important; +} + +// Footer Quick Links. +.footer-quick-links ul { + margin: 0; + padding: 10px 0; + list-style-type: none; +} +.footer-quick-links ul li { + display: inline; + padding: 0 10px; + border-left: 1px solid $dark-teal; +} +.footer-quick-links ul li:first-child, .footer-quick-links ul li.admin-page { + border-left: none; +} +.footer-quick-links ul li.admin-page { + float: right; +} + +// Utility Menu. +#ubc7-unit .utility-menu { + float: right; + height: 100%; + + .btn { + background-color: $orange; + color: #fff; + + @include media-breakpoint-up(xl) { + line-height: 3.6rem; + } + } +} diff --git a/public/themes/custom/ubccs/sass/components/_message.scss b/public/themes/custom/ubccs/sass/components/_message.scss new file mode 100644 index 0000000..5a12be5 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_message.scss @@ -0,0 +1,10 @@ +.alert .close { + text-decoration: none; +} + +.alert-danger, +.alert-error { + a { + color: #fff; + } +} diff --git a/public/themes/custom/ubccs/sass/components/_mobile-menu.scss b/public/themes/custom/ubccs/sass/components/_mobile-menu.scss new file mode 100644 index 0000000..17fc963 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_mobile-menu.scss @@ -0,0 +1,44 @@ +@import '../variables'; +@import '../bootstrap-no-output'; + +// CLF overrides. +#ubc7-unit-menu .dropdown .btn-group:hover button, +#ubc7-unit-menu .dropdown .btn-group button { + height: 45px !important; +} + +#ubc7-unit .navbar .btn-navbar:active, +#ubc7-unit .navbar .btn-navbar:hover { + box-shadow: none; +} + +#ubc7-unit-navigation .sub-menu--main li a { + color: $teal; +} + + +#ubc7-unit .navbar .btn-navbar, +#ubc7-unit .btn { + box-shadow: none; + width: auto; + padding: 1.2rem; + margin: 0; + background: transparent; + + font-size: 1.7rem; + + height: 100%; +} + +@include media-breakpoint-up(lg) { + // Hide mobile main menu. + #ubc7-unit-navigation .sub-menu--main { + display: none; + } +} +@include media-breakpoint-down(md) { + // Hide desktop main menu. + #ubc7-unit-navigation .menu--main { + display: none; + } +} diff --git a/public/themes/custom/ubccs/sass/components/_news.scss b/public/themes/custom/ubccs/sass/components/_news.scss new file mode 100644 index 0000000..e14c30e --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_news.scss @@ -0,0 +1,45 @@ +@import '../variables'; + +// Set width to max half of the image style. +.news--teaser__image { + max-width: 115px; +} + +.news--teaser__image img { + border-left: 5px solid $teal; + margin: 0 0 2rem; +} + +@include media-breakpoint-up(sm) { + .news--teaser { + display: flex; + } + + .news--teaser__image { + order: 2; + flex-shrink: 0; + } + + .news--teaser__image img { + margin: 0 2rem; + } +} + +.news--teaser__image a { + display: block; + line-height: 0; +} + + +.news--teaser__text { + flex-grow: 1; +} + +// Remove margin from teaser header. +.news--teaser__header { + margin: 0; +} + +.news--teaser__date { + color: $gray-light; +} diff --git a/public/themes/custom/ubccs/sass/components/_node.scss b/public/themes/custom/ubccs/sass/components/_node.scss new file mode 100644 index 0000000..f2ca67f --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_node.scss @@ -0,0 +1,75 @@ +@import '../variables'; + +.node > :not(div, header, footer, table) { + // Line measure. + max-width: 72rem; +} + +.node__meta { + // Wrap if flex. + flex-basis: 100%; +} + +.layout__region--content > .field, +.page-title { + // Line measure. + max-width: 72rem; +} + +.node__submitted { + color: $gray-light; + margin: 1rem 0 2rem; + font-size: 1.5rem; +} + +.node--unpublished { + position: relative; + + &::before { + position: absolute; + top: 0; + right: 0; + + display: block; + + content: 'DRAFT'; + font-size: 5rem; + opacity: .2; + color: $gray-light; + transform: rotate(40deg); + } +} + +.node--view-mode-full { + // Push page content off the title. + margin-top: 2rem; +} + +.node__additional-content:before { + content: ''; + background-color: $burnt-sienna; + height: 3px; + width: 50%; + display: block; + margin: 3rem auto; +} + +.node__ical { + font-size: 2.5rem; + text-align: right; +} + +// Line length enforcement. +.field--name-body { + h2, + h3, + h4, + h5 { + max-width: 50ch; + } + + li, + p { + max-width: 75ch; + } +} diff --git a/public/themes/custom/ubccs/sass/components/_page.scss b/public/themes/custom/ubccs/sass/components/_page.scss new file mode 100644 index 0000000..58d4239 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_page.scss @@ -0,0 +1,13 @@ +@import '../variables'; + +// Add partial underline on all page titles. +.page-title::after { + content: ''; + display: block; + margin-top: 1rem; + margin-bottom: 1rem; + width: 250px; + height: 3px; + background-color: $burnt-sienna; +} + diff --git a/public/themes/custom/ubccs/sass/components/_pager.scss b/public/themes/custom/ubccs/sass/components/_pager.scss new file mode 100644 index 0000000..15461e8 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_pager.scss @@ -0,0 +1,162 @@ +@import "../variables"; + +// This is for the next_prev module. +.prevnext-element.previous { + float: left; +} +.prevnext-element.next { + float: right; +} + +.prev-next-container { + line-height: 1.5; + margin-top: 1.7rem; + margin-bottom: 1.7rem; + clear: both; +} + +// Pager styles. +/* + * DO NOT EDIT THIS FILE. + * See the following change record for more information, + * https://www.drupal.org/node/3084859 + * @preserve + */ + +/** + * @file + * Styles for Claro's Pagination. + */ + +:root { + /** + * Pager. + */ /* --space-m × 2 */ /* 2px */ +} + +.pager { + margin-top: 1.6rem; + margin-bottom: 1.6rem; +} + +.pager__items { + display: flex; + flex-wrap: wrap; + align-items: flex-end; + justify-content: center; + margin: 1.6rem 0; + padding: 0; + list-style: none; + text-align: center; + font-weight: bold; +} + +.pager__item { + display: inline-block; + margin: 0 0.4rem; +} + +.pager__link, +.pager__item--current { + display: flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + min-width: 3.2rem; + height: 3.2rem; + padding-right: 0.8rem; + padding-left: 0.8rem; + color: $teal; + border-radius: 1.6rem; /* Pager size ÷ 2 */ + background: #fff; /* Make sure that the text is visible on dark background. */ + line-height: 1; +} + +.pager__link:hover, +.pager__link:focus, +.pager__link:active { + text-decoration: underline; +} + +.pager__link:hover, +.pager__link.is-active:hover { + color: $dark-teal; + text-decoration: none; +} + +.pager__link--action-link { + border-radius: 0.2rem; +} + +/* Active number link. */ + +.pager__link.is-active, +.pager__item--current { + text-decoration: none; + color: #fff; + border: 0.2rem solid transparent; + background: $teal; +} + +.pager__item--first .pager__link::before { + background-image: url("data:image/svg+xml,%3csvg width='16' height='16' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M2 2v12M14 2L8 8l6 6' stroke='%2300afa4' stroke-width='2'/%3e%3c/svg%3e"); +} + +.pager__item--previous .pager__link::before { + background-image: url("data:image/svg+xml,%3csvg width='16' height='16' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M11 2L5 8l6 6' stroke='%2300afa4' stroke-width='2'/%3e%3c/svg%3e"); +} + +.pager__item--next .pager__link::after { + background-image: url("data:image/svg+xml,%3csvg width='16' height='16' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M5 14l6-6-6-6' stroke='%2300afa4' stroke-width='2'/%3e%3c/svg%3e"); +} + +.pager__item--last .pager__link::after { + background-image: url("data:image/svg+xml,%3csvg width='16' height='16' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M14 14V2M2 14l6-6-6-6' stroke='%2300afa4' stroke-width='2'/%3e%3c/svg%3e"); +} + +.pager__item--first .pager__link::before, +.pager__item--previous .pager__link::before, +.pager__item--next .pager__link::after, +.pager__item--last .pager__link::after { + position: relative; + display: inline-block; + width: 1.6rem; + height: 1.6rem; + content: ""; + background-repeat: no-repeat; + background-position: center; +} + +.pager__item--mini { + margin-right: 0.8rem; + margin-left: 0.8rem; +} + +.pager__link--mini { + border-radius: 50%; +} + +/** + * On the mini pager, remove margins for the previous and next icons. + * Margins are not needed here as there is no accompanying text. + */ + +.pager__link--mini::before { + margin-right: 0; + margin-left: 0; +} + +.pager__item-title--backwards { + margin-left: 0.8rem; +} + +.pager__item-title--forward { + margin-right: 0.8rem; +} + + +@media (-ms-high-contrast: active), (forced-colors: active) { + .pager__item a:hover { + text-decoration: underline; + } +} diff --git a/public/themes/custom/ubccs/sass/components/_permalink.scss b/public/themes/custom/ubccs/sass/components/_permalink.scss new file mode 100644 index 0000000..cb25eab --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_permalink.scss @@ -0,0 +1,8 @@ +@import '../variables'; + +.permalink { + text-decoration: none; + opacity: .5; + color: $gray-dark; + font-size: 0.8em; +} diff --git a/public/themes/custom/ubccs/sass/components/_profile-alumni.scss b/public/themes/custom/ubccs/sass/components/_profile-alumni.scss new file mode 100644 index 0000000..3a7826d --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_profile-alumni.scss @@ -0,0 +1,46 @@ +@import '../variables'; + +.profile-alumni { + display: flex; + flex-wrap: wrap; + + position: relative; + + width: 100%; + margin: 2rem 0; +} + +.profile-alumni__content { + flex-grow: 4; + flex-shrink: 1; + flex-basis: 50%; +} + +.profile-alumni__image { + margin-right: 20px; + flex: 0 0 auto; + width: auto; + max-width: none; + + .image-default, + img { + max-width: 100px; + width: 100px; + height: 100px; + border-radius: 50%; + } + + .image-default { + justify-content: center; + flex-direction: column; + text-align: center; + + background-color: $ubc-grey; + color: $white; + font-size: 5rem; + } +} + +.profile-alumni__name { + font-size: 3rem; +} diff --git a/public/themes/custom/ubccs/sass/components/_profile.scss b/public/themes/custom/ubccs/sass/components/_profile.scss new file mode 100644 index 0000000..f9efc85 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_profile.scss @@ -0,0 +1,221 @@ +@import '../variables'; +@import "../bootstrap-no-output"; + +.profile-display { + display: flex; + flex-wrap: wrap; + margin: 0; + padding: 0; + + .profile-item { + list-style: none; + padding: 1rem; + margin: 0; + display: flex; + flex: 1 1 100%; + } + + @include media-breakpoint-up(sm) { + .profile-item { + flex: 1 1 50%; + + &:first-of-type { + flex: 1 1 100%; + } + } + } +} + +.profile--teaser { + width: 100%; + height: 100%; + position: relative; + + display: flex; + + justify-content: space-between; + flex-wrap: wrap; + flex-direction: column; + flex-grow: 1; + + border: 1px solid #e4e4e4; + border-radius: 1rem; + padding: 3rem; + + &__head { + display: flex; + align-items: center; + flex-direction: column; + justify-content: center; + + margin-bottom: 2rem; + text-align: center; + } + + &__image { + margin: auto; + + .image-default, + img { + width: 150px; + height: 150px; + border-radius: 50%; + } + } + + &__content { + width: 100%; + text-align: center; + + & + div { + display: flex; + flex-direction: row; + flex-wrap: wrap; + } + } + + &__content__name { + font-size: 2.4rem; + } +} + +.contact { + display: flex; + flex-wrap: wrap; + flex-direction: row; + + & > .field + .field { + margin: 0; + } + + div { + flex: 1 1 50%; + } + + &-content { + &-job-title { + margin: 0; + font-size: 2rem; + } + } +} + +.field--label-inline { + .profile-people { + display: flex; + flex-wrap: wrap; + position: relative; + width: auto; + + .field--label-inline .field__label, + .field--label-inline > .field__item:nth-child(2) { + padding: 0; + } + } +} + +.contact-content-name, +.contact-content-job-title { + font-size: 2rem; + margin: 0 0 1rem; + display: inline-block; +} + +// Profile Page. +.profile-people { + display: flex; + flex-wrap: wrap; + position: relative; + + width: 100%; + + &__content { + flex-grow: 4; + flex-shrink: 1; + flex-basis: 50%; + } + + &__image { + margin: 20px; + flex: 0 0 auto; + width: auto; + max-width: none; + + @include media-breakpoint-up(sm) { + order: 2; + } + + .image-default, + img { + width: 200px; + height: 200px; + border-radius: 50%; + + padding: 1.2rem; + border: 2px solid $ubc-silver; + } + } +} + +@include media-breakpoint-up(sm) { + .profile-alumni__header { + display: flex; + flex-wrap: wrap; + position: relative; + width: 100%; + } + + .profile-alumni__intro { + width: 100%; + } + .profile-alumni-image { + margin: 20px; + flex: 0 0 auto; + width: auto; + max-width: none; + + order: 2; + .profile-image{ + margin: 0; + } + .profile-image img { + max-width: 200px; + width: 200px; + height: 200px; + border-radius: 50%; + + padding: 1.2rem; + border: 2px solid $ubc-silver; + } + } +} + +.image-default { + display: flex; + justify-content: center; + flex-direction: column; + text-align: center; + + background-color: $ubc-grey; + color: $white; + font-size: 5rem; +} + +// People Listing profile images. +.profile-image img, +.profile-image .image-default { + // Combat default responsive image max-width. + max-width: 100px; + width: 100px; + height: 100px; + border-radius: 50%; +} + +.profile-image .image-default { + font-size: 4rem; +} + +// People Page column min-width +.views-field-field-person-lname { + min-width: 20ch; +} diff --git a/public/themes/custom/ubccs/sass/components/_research.scss b/public/themes/custom/ubccs/sass/components/_research.scss new file mode 100644 index 0000000..a6f1c43 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_research.scss @@ -0,0 +1,30 @@ +@import '../variables'; + +.research-area__label { + display: flex; + + @include media-breakpoint-down(xs) { + flex-direction: column; + align-items: center; + } +} + +.research-area__icon { + color: $burnt-sienna; + display: inline-block; + margin-right: .5rem; + width: 4rem; + flex-shrink: 0; +} + +// Generated for $burnt-sienna https://codepen.io/sosuke/pen/Pjoqqp for SVGs. +.research-area__icon img { + filter: invert(28%) sepia(48%) saturate(1393%) hue-rotate(338deg) brightness(96%) contrast(90%); + width: 3.5rem; +} + +@include media-breakpoint-up(xs) { + .view-id-research > .view-grouping > .view-grouping-content { + padding: 0 4.5rem; + } +} diff --git a/public/themes/custom/ubccs/sass/components/_sidebar.scss b/public/themes/custom/ubccs/sass/components/_sidebar.scss new file mode 100644 index 0000000..fe9a8d0 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_sidebar.scss @@ -0,0 +1,6 @@ +.sidebar__icons { + font-size: 3rem; + a { + padding-right: 10px; + } +} diff --git a/public/themes/custom/ubccs/sass/components/_site-alert.scss b/public/themes/custom/ubccs/sass/components/_site-alert.scss new file mode 100644 index 0000000..5e165c9 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_site-alert.scss @@ -0,0 +1,84 @@ +@import '../variables'; +@import '../bootstrap-no-output'; + +$unit-warning: #ef8843; +$unit-danger: #b33542; +$unit-info: #324d6a; +$unit-success: #95be4f; + +.site-alert { + // Tricks the margin in side not to push things at the top. + display: flex; + + max-width: map_get($container-max-widths, xl); + margin-left: auto; + margin-right: auto; + + h1, + h2, + h3, + h4, + h5 { + color: #fff; + margin-top: 1rem; + margin-bottom: 1rem; + } + p { + margin-top: 0; + margin-bottom: 0; + } + + a, + h4 { + color: #fff; + } +} + +.site-alert-box { + color: #fff; + padding: 15px 35px 15px 15px; + margin-top: 1em; + margin-bottom: 1em; + border-width: 2px; + border-radius: 0; + display: flex; + align-items: center; + width: 100%; +} + +.site-alert-box.severity-low { + background-color: $unit-info; + border-color: #00162f; +} + +.site-alert-box.severity-medium { + background-color: $unit-warning; + border-color: #d77a3c; +} + +.site-alert-box.severity-high { + background-color: $unit-danger; + border-color: #900f1d; +} + +.site-alert__icon { + display: block; + width: 40px; + height: 40px; + + border: 2px solid #fff; + border-radius: 50%; + + font-size: 150%; + text-align: center; + color: #fff; + line-height: calc(40px - 4px); + + margin: 0 20px 0 0; + + flex-shrink: 0; +} + +.site-alert__message { + flex-grow: 1; +} diff --git a/public/themes/custom/ubccs/sass/components/_slick-slider.scss b/public/themes/custom/ubccs/sass/components/_slick-slider.scss new file mode 100644 index 0000000..e9196c6 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_slick-slider.scss @@ -0,0 +1,455 @@ +@charset "UTF-8"; + +@import '../variables'; +@import '../bootstrap-no-output'; + +.home__slider { + max-width: map_get($container-max-widths, xl); + width: 100%; + margin: 0 auto; +} + +// Copied and modified from /libraries/slick/slick/slick-slider.scss + +// Default Variables + +// Slick icon entity codes outputs the following +// "\2190" outputs ascii character "←" +// "\2192" outputs ascii character "→" +// "\2022" outputs ascii character "•" + +$slick-font-path: "/libraries/slick/slick/fonts/" !default; +$slick-font-family: "slick" !default; +$slick-loader-path: "/libraries/slick/slick/" !default; +$slick-arrow-color: white !default; +$slick-dot-color: black !default; +$slick-dot-color-active: $slick-dot-color !default; +$slick-prev-character: "\2190" !default; +$slick-next-character: "\2192" !default; +$slick-dot-character: "\2022" !default; +$slick-dot-size: 6px !default; +$slick-opacity-default: 0.75 !default; +$slick-opacity-on-hover: 1 !default; +$slick-opacity-not-active: 0.25 !default; + +@function slick-image-url($url) { + @return url($slick-loader-path + $url); +} + +@function slick-font-url($url) { + @return url($slick-font-path + $url); +} + +/* Slider */ +.slick-loading .slick-list { + background: #fff slick-image-url("ajax-loader.gif") no-repeat center center; +} + +///* Icons */ +//@if $slick-font-family == "slick" { +// @font-face { +// font-family: "slick"; +// src: slick-font-url("slick.eot"); +// src: slick-font-url("slick.eot?#iefix") format("embedded-opentype"), slick-font-url("slick.woff") format("woff"), slick-font-url("slick.ttf") format("truetype"), slick-font-url("slick.svg#slick") format("svg"); +// font-weight: normal; +// font-style: normal; +// } +//} + +/* Arrows */ + +.slick-prev, +.slick-next { + position: absolute; + display: block; + height: 20px; + width: 20px; + line-height: 0; + font-size: 0; + cursor: pointer; + background: transparent; + color: transparent; + top: 50%; + transform: translate(0, -50%); + padding: 0; + border: none; + outline: none; + &:hover, &:focus { + outline: none; + background: transparent; + color: transparent; + &:before { + opacity: $slick-opacity-on-hover; + } + } + &.slick-disabled:before { + opacity: $slick-opacity-not-active; + } +} + +.slick-prev { + left: -25px; + [dir="rtl"] & { + left: auto; + right: -25px; + } +} + +.slick-next { + right: -25px; + [dir="rtl"] & { + left: -25px; + right: auto; + } +} + +/* Dots */ + +.slick-dotted.slick-slider { + margin-bottom: 30px; +} + +.slick-dots { + position: absolute; + bottom: -30px; + list-style: none; + display: block; + text-align: center; + padding: 0; + margin: 0; + width: 100%; + li { + position: relative; + display: inline-block; + height: 20px; + width: 20px; + margin: 0 5px; + padding: 0; + cursor: pointer; + button { + border: 0; + background: transparent; + display: block; + height: 20px; + width: 20px; + outline: none; + line-height: 0; + font-size: 0; + color: transparent; + padding: 5px; + cursor: pointer; + &:hover, + &:focus { + outline: none; + &:before { + opacity: $slick-opacity-on-hover; + } + } + &:before { + position: absolute; + top: 0; + left: 0; + width: 20px; + height: 20px; + font-size: $slick-dot-size; + line-height: 20px; + text-align: center; + color: $slick-dot-color; + opacity: $slick-opacity-not-active; + } + } + &.slick-active button:before { + color: $slick-dot-color-active; + opacity: $slick-opacity-default; + } + } +} + +.slick-wrapper, +.slick, +.slick * { + box-sizing: border-box; +} + +.slick img { + height: auto; +} + +.slick img, +.slick iframe { + border: 0; + max-width: 100%; +} + +/* Prevents overflowing nested slides. */ +.slick, +.slick-wrapper { + max-width: 100%; + position: relative; +} + +/** + * Misc overrides core slick. + */ +.slick-initialized { + overflow: visible; +} + +.slick__slider::before, +.slick__slider::after { + display: table; + content: ''; +} + +.slick__slider::after { + clear: both; +} + +/** Draggable. */ +.draggable { + cursor: grab; +} + +.draggable:active { + cursor: grabbing; +} + +.draggable:active a, +.draggable:active .slide__caption { + cursor: grabbing; + user-select: none; +} + +/** Visibility fix for stacking slides during initialization. */ +.slick__slide { + max-width: 100%; + position: absolute; + visibility: hidden; +} + +/** Prevents collapsing container during initialization. */ +.slick__slide.slide--0 { + position: relative; +} + +.unslick .slick__slide, +.slick-initialized .slick__slide { + position: relative; + visibility: visible; +} + +/* Fix for Chrome blue outline */ +.slick__slide:focus { + outline: 0; +} + +/* Prevents collapsing slick when unslick like one item. */ +.unslick .slick__slide { + width: 100%; +} + +.slick-current { + z-index: 4; +} + +/** + * Slide layouts, adjust accordingly per actual container slide. + */ +.slide__content, +.grid__content { + position: relative; +} + +.slide__content::after { + content: ""; + display: table; + clear: both; +} + +.slide__title { + margin: 10px 0 5px; + line-height: 1.2; +} + +.slide__link { + margin: 30px auto; +} + +/* Overrides .slick-slider to make caption text selectable. */ +.slide__caption { + cursor: text; + -moz-user-select: text; + -ms-user-select: text; + -o-user-select: text; + -webkit-user-select: text; + user-select: text; + width: 100%; +} + +/* Only display when JS is ready. */ +.slick__arrow, +.is-loading .slide__caption { + visibility: hidden; +} + +/** Arrows are outside slick-initialized. */ +.slick--initialized .slick__arrow { + visibility: visible; +} + +.slick--main .slide__caption { + min-height: 32%; + padding: 20px 0; + z-index: 3; +} + +.slick--thumbnail .slide__caption { + padding: 5px 6px; +} + +/** + * Skins. + * Arrows contained/wrapped within slick__arrow for easy moves. + */ +/* Overrides problematic hidden arrows at core slick.css */ +.slick-prev { + left: 0; +} + +.slick-next { + right: 0; +} + +.slick__arrow { + bottom: auto; + height: 2px; + left: 0; + margin-top: -1px; + pointer-events: none; + position: absolute; + top: 50%; + transform: translateY(-50%); + width: 100%; + z-index: 2; +} + +/** Keeps decent fallback for when slick-theme.css is disabled, even if dup. */ +.slick-arrow { + border: 0; + border-radius: 50%; + font-size: 0; + height: 42px; + pointer-events: auto; + position: absolute; + top: 50%; + transform: translateY(-50%); + width: 42px; + margin: 0 1rem; +} + +.slick-arrow:active, +.slick-arrow:focus { + box-shadow: none; + outline: 0; +} + +.slick-arrow::before, +.slick-arrow::after { + pointer-events: none; +} + +/** + * Bullets. + */ +/* Makes the pointer work when bullets placed over the slide. */ +/* Overrides core > 1.3.11, otherwise thumbnails are non-clickable */ +.slick button, +.slick--thumbnail .slick__slide img { + pointer-events: auto; +} + +/* Provides decent dots if core slick-theme.css is disabled. */ +.slick-dots li { + margin-bottom: 5px; + display: inline-block; + vertical-align: top; +} + +/* Overrides too tiny bullets from core slick.css.*/ +.slick-dots li button::before { + font-size: 0.75rem; +} + +/** + * Media. + */ +/* Hide lazyloaded image when JS is off.*/ +img[data-lazy] { + display: none; +} + +.slide__media { + overflow: hidden; + position: relative; +} + +/* Center the image to reduce gap at RHS with smaller image, larger container */ +.media__image { + margin: 0 auto; +} + +/** @todo: Remove temp fix for when total <= slidesToShow at 1.6.1+. */ +/** @see https://github.com/kenwheeler/slick/issues/262 */ +.slick--less .slick-track { + margin-left: auto; + margin-right: auto; + text-align: center; +} + +.slick--less .slick-slide { + float: none; + display: inline-block; + vertical-align: top; +} + +.slick--less .draggable { + cursor: default; +} + +// +// Overrides. +// + +.slick-prev, +.slick-next { + &::before { + display: inline-block; + content: ""; + background-repeat: no-repeat; + background-size: 4rem 4rem; + width: 4rem; + height: 4rem; + } +} + +.slick-prev::before { + background-image: url('../img/slick/prev.svg'); +} + +.slick-next::before { + background-image: url('../img/slick/next.svg'); +} + +.slick-dots li button::before { + background-color: $teal; + border-radius: 50%; + border: 2px solid $teal; + content: ''; + height: 10px; + width: 10px; + opacity: 1; +} + +.slick-dots li.slick-active button::before { + background-color: #fff; +} diff --git a/public/themes/custom/ubccs/sass/components/_sub-menu.scss b/public/themes/custom/ubccs/sass/components/_sub-menu.scss new file mode 100644 index 0000000..90aa5bc --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_sub-menu.scss @@ -0,0 +1,119 @@ + +.sub-menu h3 { + font-weight: normal; +} + +.sub-menu { + // Push off the top same as the h1. + margin-top: 2.7rem; +} + +.sub-menu ul { + list-style: none; + padding: 0; + margin: 0; +} + +.sub-menu .menu-item--expanded .menu-item__label { + display: flex; + + & > .menu-item__link { + flex: 1 1 auto; + } + & > .menu-item__toggle { + flex: 0 0 1rem; + } +} + +.sub-menu .menu-item__link { + text-decoration: none; + display: block; + + padding: .5rem .85rem; + + transition: all .25s ease-in; + + &.is-active { + color: $dark-teal; + + // Not bold to reduce the text-width jump, may need to be normal. + font-weight: 400; + + position: relative; + + &::before { + width: 50px; + height: 2px; + + background-color: $dark-teal; + position: absolute; + bottom: 0; + content: ''; + } + } +} + +.sub-menu .menu-item__label { + border-bottom: 1px solid lighten(desaturate($dark-teal, 50%), 75%); +} + +.sub-menu .menu-item--active-trail > .menu-item__label .menu-item__link { + color: $dark-teal; + + // Not bold to reduce the text-width jump, may need to be normal. + font-weight: 400; +} + +// Indentation of sub links. +.sub-menu ul .menu-item__link { + padding-left: 1rem; +} + +.sub-menu ul ul .menu-item__link { + padding-left: 2rem; +} + +.sub-menu ul ul ul .menu-item__link { + padding-left: 3rem; +} + +.sub-menu ul ul ul ul .menu-item__link { + padding-left: 4rem; +} + +.sub-menu ul ul ul ul ul .menu-item__link { + padding-left: 5rem; +} + +.sub-menu ul ul ul ul ul ul .menu-item__link { + padding-left: 6rem; +} + +.menu-item__item { + margin: 0; +} + +// Toggle. +.menu-item__item > ul { + display: none; +} +.menu-item__item.menu-item--expand > ul { + display: block; +} + +.sub-menu .menu-item__toggle { + text-align: center; + min-width: 3rem; + cursor: pointer; +} + +.menu-item__toggle .chevron::after { + transition: transform .5s ease-in-out; +} +.menu-item__item.menu-item--expand > .menu-item__label .chevron::after { + transform: rotate(135deg); +} + +.menu-item--active-trail > .menu-item__label .chevron::after { + border-color: $dark-teal; +} diff --git a/public/themes/custom/ubccs/sass/components/_table.scss b/public/themes/custom/ubccs/sass/components/_table.scss new file mode 100644 index 0000000..e084f2b --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_table.scss @@ -0,0 +1,29 @@ + +.node { + table { + width: 100%; + max-width: 100%; + border-collapse: collapse; + border-spacing: 0; + border: 1px solid $ubc-silver; + border-right-width: 0; + border-bottom-width: 0; + } + + td, + th { + border: 0 solid $ubc-silver; + border-right-width: 1px; + border-bottom-width: 1px; + padding: .5rem .8rem; + text-align: left; + } + thead th { + vertical-align: bottom; + } +} + +// Override tablesort. +td.is-active { + background-color: transparent; +} diff --git a/public/themes/custom/ubccs/sass/components/_tabledrag.scss b/public/themes/custom/ubccs/sass/components/_tabledrag.scss new file mode 100644 index 0000000..a2b9a83 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_tabledrag.scss @@ -0,0 +1,32 @@ +.field-multiple-table { + width: 100%; + th { + text-align: left; + } +} + +button.link.tabledrag-toggle-weight { + font-size: .7em; + text-transform: uppercase; + color: #999; +} + +form .field-multiple-table .field-multiple-drag .tabledrag-handle { + padding: 7px; +} +.field-multiple-drag { + vertical-align: middle; +} +.draggable a.tabledrag-handle { + float: none; + display: inline-block; + margin: 0; + height: 30px; +} +a.tabledrag-handle .handle { + width: 16px; + height: 16px; + background-position: 0 0; + padding: 0; + margin: 0; +} diff --git a/public/themes/custom/ubccs/sass/components/_toc.scss b/public/themes/custom/ubccs/sass/components/_toc.scss new file mode 100644 index 0000000..4c35e4e --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_toc.scss @@ -0,0 +1,18 @@ +// Table of Contents Filter. + +.node .toc-tree { + border: 1px solid #ccc; + padding: 2rem; + margin: 2rem 0; +} + +.toc-tree ol.none { + padding: 0 +} +.toc-tree h3 { + margin: 0 0; +} +.toc-tree > ol, +.toc-tree > ul { + margin: 2rem 0; +} diff --git a/public/themes/custom/ubccs/sass/components/_typography.scss b/public/themes/custom/ubccs/sass/components/_typography.scss new file mode 100644 index 0000000..da6c331 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_typography.scss @@ -0,0 +1,18 @@ +@import '../variables'; + +.text-primary { + color: $unit-color; +} + +.text-secondary { + color: $dark-teal; +} + +.text-large { + font-size: $font-size-base * 2; +} + +.intro { + color: #cc6e20; + font-size: 2.2rem; +} diff --git a/public/themes/custom/ubccs/sass/components/_unit.scss b/public/themes/custom/ubccs/sass/components/_unit.scss new file mode 100644 index 0000000..3b408a4 --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_unit.scss @@ -0,0 +1,10 @@ +@import '../variables'; + +// UNIT COLOURS +#ubc7-unit { + background-color: $unit-color; +} +// override clf +body { + padding: 0; +} diff --git a/public/themes/custom/ubccs/sass/components/_vertical-tabs.scss b/public/themes/custom/ubccs/sass/components/_vertical-tabs.scss new file mode 100644 index 0000000..24d732a --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_vertical-tabs.scss @@ -0,0 +1,3 @@ +.vertical-tabs__menu-item { + margin: 0; +} diff --git a/public/themes/custom/ubccs/sass/components/_views.scss b/public/themes/custom/ubccs/sass/components/_views.scss new file mode 100644 index 0000000..bb2153f --- /dev/null +++ b/public/themes/custom/ubccs/sass/components/_views.scss @@ -0,0 +1,41 @@ +@import '../variables'; +@import '../bootstrap-no-output'; + + +.views-exposed-form { + display: flex; + flex-wrap: wrap; + align-items: flex-start; + align-content: space-around; + margin-left: -1rem; + margin-right: -1rem; +} + +.views-exposed-form .form-item, +.views-exposed-form .form-actions { + margin: 1rem; + // Prevent long fields from breaking multiple lines. + @include media-breakpoint-up(md) { + max-width: 240px; + } +} + +.views-exposed-form .form-actions { + align-self: flex-end; +} + +.views-field-view-node, +.news-image img { + margin-top: 1rem; +} + +.views-row + .views-row::before { + content: ""; + display: block; + height: 2px; + border: 0; + margin: 2rem auto; + width: 100%; + padding: 0; + background-color: #e6e6e6; +} diff --git a/public/themes/custom/ubccs/sass/layout.scss b/public/themes/custom/ubccs/sass/layout.scss new file mode 100644 index 0000000..5606e70 --- /dev/null +++ b/public/themes/custom/ubccs/sass/layout.scss @@ -0,0 +1,76 @@ +@import 'variables'; +@import 'bootstrap-no-output'; + +.layout-wrapper { + // Bottom spacing (could get us into trouble if you want things flush. + padding-bottom: 2rem; + + @include media-breakpoint-up(lg) { + display: flex; + + .layout-sidebar-first, + .layout-sidebar-second { + flex-grow: 0; + flex-basis: 260px; + max-width: 260px; + } + + .layout-sidebar-first { + margin-right: 3%; + } + + .layout-sidebar-second { + margin-left: 3%; + } + + // Positioning. + .layout-sidebar-first { + order: 1; + } + + .layout-content.has-sidebar { + order: 2; + } + + .layout-sidebar-second { + order: 3; + } + } + + .layout-content { + flex-basis: 0; + flex-grow: 1; + + // This can prove problematic on landing pages, let's see. + // Remove + //max-width: 760px; + //margin: 0 auto; + } + + .layout-content-full-width { + max-width: 100%; + + .field--name-body { + max-width: 760px; + margin: 0 auto; + } + } +} + +// Divider at bottom of all pages to avoid editor from manually adding it in +// content. +.layout-content.has-sidebar::after { + display: block; + content: ''; + height: 2px; + border: 0; + margin: 3rem auto; + width: 40%; + padding: 0; + background-color: $burnt-sienna; + clear: both; +} + +.full-width-container { + background-color: #fff; +} diff --git a/public/themes/custom/ubccs/sass/local.clf.fixes.scss b/public/themes/custom/ubccs/sass/local.clf.fixes.scss new file mode 100644 index 0000000..33e30c5 --- /dev/null +++ b/public/themes/custom/ubccs/sass/local.clf.fixes.scss @@ -0,0 +1,131 @@ +@import 'variables'; +@import 'bootstrap-no-output'; + +/** + * $file + * To fix inconsistencies with the locally-hosted CLF CSS + */ + +footer { + background-color: inherit; +} + +#ubc7-unit-social-icons i { + color: #fff; + background-color: $unit-color; + cursor: pointer; + font-size: 24px; + line-height: 32px; + width: 32px; + height: 32px; + text-align: center; +} + +// Overrides to make nav consistent after sticky trigger +#ubc7-unit-menu { + width: 100%; + margin: 0; //set margin to zero so width is not offset. +} + +// Hide external link. +#ubc7-unit-social-icons span.ext { + display: none; +} + +// Use the same font everywhere. +#ubc7-global-footer, +#ubc7-global-menu, +#ubc7-minimal-footer, +#ubc7-unit, +input, +button { + font-family: $font-family; +} + +#ubc7-search-box input { + font-size: inherit !important; +} + +.btn, +.btn:focus, +.btn:hover, +.btn:active { + box-shadow: none; + border: 0; + color: $teal; + background-color: transparent; + + line-height: inherit; + font-size: inherit; +} + +// Undo the forced width of 206px in the CLF. +input, +textarea, +.uneditable-input { + width: inherit; +} + +input[type="text"] { + height: auto; + line-height: inherit; +} + +#ubc7-header { + box-sizing: content-box; +} +/* Remove the inset shadows and text shadows from the unit area */ +#ubc7-unit { + box-shadow: none; + -webkit-box-shadow: none; +} + +#ubc7-unit-name a, +#ubc7-unit-name a:hover { + text-shadow: none; +} + +// +ul.primary.tabs, +ul.secondary.tabs { + width: 100%; + max-width: map_get($container-max-widths, xl); + margin-left: auto; + margin-right: auto; +} + +#ubc7-unit-menu .container { + max-width: map_get($container-max-widths, xl); + width: 100%; +} + +.non-clf .container { + max-width: map_get($container-max-widths, xxl); +} + +// Cover sprites. +@include media-breakpoint-between(lg, xl) { + #ubc7-wordmark { + width: 100% !important; + border-right: #fff solid 100px; + } +} + +#ubc7-global-utility button { + position: absolute; + right: 0; +} + +// Get the white up arrow. +.ubc7-arrow.up-arrow.white { + background-position: -1207px -225px; +} + +#ubc7-global-footer { + // Match CLF sizes by setting container. + font-size: 14px; +} + +.unit-footer-column { + margin-bottom: 2rem; +} diff --git a/public/themes/custom/ubccs/sass/main.scss b/public/themes/custom/ubccs/sass/main.scss new file mode 100644 index 0000000..87626e8 --- /dev/null +++ b/public/themes/custom/ubccs/sass/main.scss @@ -0,0 +1,70 @@ +@import 'variables'; + +@import 'base/reset'; + +@import 'base/typography'; +@import 'base/blockquote'; +@import 'base/code'; +@import 'base/figure'; +@import 'base/fixes'; +@import 'base/form'; +@import 'base/image'; +@import 'base/list'; +@import 'base/table'; + +@import 'components/landing'; +@import 'components/landing-banner'; +@import 'components/landing-intro'; +@import 'components/landing-cards'; + +@import 'components/admin'; +@import 'components/alert'; +@import 'components/align'; +@import 'components/awards'; +@import 'components/big-quote'; +@import 'components/breadcrumbs'; +@import 'components/button'; +@import 'components/calendar'; +@import 'components/caption'; +@import 'components/card'; +@import 'components/cart'; +@import 'components/courses'; +@import 'components/details'; +@import 'components/expand-collapse'; +@import 'components/faq'; +@import 'components/field'; +@import 'components/form'; +@import 'components/full-calendar'; +@import 'components/home'; +@import 'components/home-banner'; +@import 'components/image'; +@import 'components/industry'; +@import 'components/inline-block'; +@import 'components/list'; +@import 'components/media'; +@import 'components/menu'; +@import 'components/mobile-menu'; +@import 'components/news'; +@import 'components/node'; +@import 'components/page'; +@import 'components/pager'; +@import 'components/profile'; +@import 'components/profile-alumni'; +@import 'components/research'; +@import 'components/sidebar'; +@import 'components/site-alert'; +@import 'components/slick-slider'; +@import 'components/sub-menu'; +@import 'components/table'; +@import 'components/tabledrag'; +@import 'components/toc'; +@import 'components/typography'; +@import 'components/unit'; +@import 'components/vertical-tabs'; +@import 'components/views'; + +@import 'components/chevron'; +@import 'components/back-to-top'; +@import 'components/permalink'; + +@import 'utility'; diff --git a/public/themes/custom/ubccs/sass/normalize.scss b/public/themes/custom/ubccs/sass/normalize.scss new file mode 100644 index 0000000..e900d75 --- /dev/null +++ b/public/themes/custom/ubccs/sass/normalize.scss @@ -0,0 +1 @@ +@use '../node_modules/normalize.css/normalize.css'; diff --git a/public/themes/custom/ubccs/sass/print.scss b/public/themes/custom/ubccs/sass/print.scss new file mode 100644 index 0000000..306be65 --- /dev/null +++ b/public/themes/custom/ubccs/sass/print.scss @@ -0,0 +1,87 @@ + +///* ---------- General Layout ---------- */ + +body, +input, +textarea, +select { + color: #000; + background: none; +} + +// CLF override. +a:link::after { + content: ""; + padding-left: inherit; +} + +//body.two-sidebars, +//body.sidebar-first, +//body.sidebar-second, +//body { +// width: 640px; +//} +//#sidebar-first, +//#sidebar-second, +//.navigation, +//#toolbar, +//#footer-wrapper, + +// Hide navigation components. +.sub-menu, +#back-to-top, +.contextual, +nav.tabs { + display: none; +} + +// Hide footers. +footer { + display: none; +} + +//.one-sidebar #content, +//.two-sidebars #content { +// width: 100%; +//} + +//* { +// background: transparent !important; +// color: #444 !important; +// text-shadow: none; +//} +//a, +//a:visited { +// color: #444 !important; +// text-decoration: underline; +//} +//a:after { +// content: " (" attr(href) ")"; +//} +//abbr:after { +// content: " (" attr(title) ")"; +//} +// +//pre, blockquote { +// border: 1px solid #999; +// page-break-inside: avoid; +//} +//.content table th, +//.content table td { +// border-color: #333; +//} + +img { + page-break-inside: avoid; +} + + +// Typography. +p, h2, h3 { + orphans: 3; + widows: 3; +} + +h2, h3, h4 { + page-break-after: avoid; +} diff --git a/public/themes/custom/ubccs/sass/select2.scss b/public/themes/custom/ubccs/sass/select2.scss new file mode 100644 index 0000000..9ae346e --- /dev/null +++ b/public/themes/custom/ubccs/sass/select2.scss @@ -0,0 +1,286 @@ +@import "variables"; + +select { + min-width: 200px; +} + +.select2-container--default .select2-dropdown { + border-radius: 0; +} + +.select2-container--default { + //margin: 0.4rem 0; + + // Ensure doesn't exceed container. + max-width: 100%; +} + +.select2-container--default .select2-selection--single { + background-color: #fff; + border: 2px solid #b8b8b8; + border-top-color: #999; + border-radius: 0; + height: auto; + padding: 0.5rem 0.8rem; + +} +.select2-container--default .select2-selection--single .select2-selection__rendered { + color: #444; + line-height: inherit; +} + +.select2-container--default .select2-selection--single .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + height: 26px; + margin-right: 20px; + padding-right: 0; +} +.select2-container--default .select2-selection--single .select2-selection__placeholder { + color: #999; +} +.select2-container--default .select2-selection--single .select2-selection__arrow { + height: 26px; + position: absolute; + top: 0.5rem; + right: 0.8rem; + + width: 20px; +} +.select2-container--default .select2-selection--single .select2-selection__arrow b { + border-color: #666 transparent transparent transparent; + border-style: solid; + border-width: 7px 6px 0 6px; + height: 0; + left: 50%; + margin-left: -4px; + margin-top: -2px; + position: absolute; + top: 50%; + width: 0; +} +.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { + border-color: transparent transparent #666 transparent; + border-width: 0 6px 7px 6px; +} + +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { + float: left; +} + +.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { + left: 1px; + right: auto; +} + +.select2-container--default.select2-container--disabled .select2-selection--single { + background-color: #eee; + cursor: default; +} +.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { + display: none; +} + + +.select2-container--default .select2-selection--multiple { + background-color: white; + border: 2px solid #b8b8b8; + border-top-color: #999; + + border-radius: 0; + cursor: text; + + padding-bottom: 0; + padding-right: 0; +} + +.select2-container--default .select2-selection--multiple .select2-selection__rendered { + margin: 0; + + // Flex. + display: flex; + flex-wrap: wrap; + gap: 0.4rem; + padding: 0.4rem; +} + +.select2-container--default .select2-selection--multiple .select2-selection__rendered li { + // Override li styles from base/list. + //margin: 0; +} + +.select2-container--default .select2-selection--multiple .select2-selection__clear { + cursor: pointer; + float: right; + font-weight: bold; + height: 20px; + margin-right: 10px; + margin-top: 5px; + padding: 1px; +} +.select2-container--default .select2-selection--multiple .select2-selection__choice { + background-color: #fff; + border: 0; + outline: 1px solid $gray-light; + border-radius: 0; + display: inline-block; + margin: 0; + padding: 0; +} +.select2-container--default .select2-selection--multiple .select2-selection__choice::after { + display: inline-block; + content: ""; + width: 0.5rem; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice__display { + cursor: default; + padding-left: 2px; + padding-right: 5px; +} + +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove { + background-color: transparent; + border: none; + //border-right: 1px solid $gray-dark; + //border-top-left-radius: 4px; + //border-bottom-left-radius: 4px; + color: #999; + cursor: pointer; + //font-size: 1.5rem; + font-weight: bold; + padding: 0 0.5rem; + position: relative; +} +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover, +.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:focus { + background-color: #f1f1f1; + color: #333; + outline: none; +} + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { + margin-left: 5px; + margin-right: auto; +} + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__display { + padding-left: 5px; + padding-right: 2px; +} + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { + border-left: 1px solid #b8b8b8; + + border-right: none; + border-radius: 0 4px 4px 0; +} + +.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__clear { + float: left; + margin-left: 10px; + margin-right: auto; +} + +.select2-container--default.select2-container--focus .select2-selection--multiple { + border: 2px solid $teal; + background-color: #fff; + + outline: 0; +} + +.select2-container--default.select2-container--disabled .select2-selection--multiple { + background-color: #eee; + cursor: default; +} + +.select2-container--default.select2-container--disabled .select2-selection__choice__remove { + display: none; +} + +.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, +.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, +.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.select2-container--default .select2-search--dropdown .select2-search__field { + border: 2px solid #b8b8b8; + border-top-color: #999; + margin: 0; +} +.select2-container--default .select2-search--inline .select2-search__field { + background: transparent; + border: none; + outline: 0; + box-shadow: none; + -webkit-appearance: textfield; + //margin: 0.5rem 0.8rem; + // Override default. + height: 26px; +} + +.select2-container--default .select2-results > .select2-results__options { + max-height: 200px; + overflow-y: auto; +} +.select2-container--default .select2-results__option { + margin-bottom: 0; +} +.select2-container--default .select2-results__option .select2-results__option { + padding-left: 1em; +} +.select2-container--default .select2-results__option .select2-results__option .select2-results__group { + padding-left: 0; +} +.select2-container--default .select2-results__option .select2-results__option .select2-results__option { + margin-left: -1em; + padding-left: 2em; +} +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -2em; + padding-left: 3em; +} +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -3em; + padding-left: 4em; +} +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -4em; + padding-left: 5em; +} +.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { + margin-left: -5em; + padding-left: 6em; +} + +.select2-container--default .select2-results__option--group { + padding: 0; +} + +.select2-container--default .select2-results__option--disabled { + color: #999; +} + +.select2-container--default .select2-results__option--selected { + background-color: #ddd; +} + +.select2-container--default .select2-results__option--highlighted[aria-selected], +.select2-container--default .select2-results__option--highlighted.select2-results__option--selectable { + background-color: $teal; + color: white; +} + +.select2-container--default .select2-results__group { + cursor: default; + display: block; + padding: 6px; +} diff --git a/public/themes/custom/ubccs/sass/timeline.scss b/public/themes/custom/ubccs/sass/timeline.scss new file mode 100644 index 0000000..ced0dce --- /dev/null +++ b/public/themes/custom/ubccs/sass/timeline.scss @@ -0,0 +1,27 @@ +@import "variables"; + +.tl-timeline { + z-index: 1; +} + +.tl-timegroup:nth-child(1) { + background-color: #e9e9fc !important; +} +.tl-timegroup:nth-child(2) { + background-color: #eee !important; +} +.tl-timegroup:nth-child(3) { + background-color: #fef !important; +} +.tl-timegroup:nth-child(4) { + background-color: #eee; +} + +.tl-slide .tl-slide-content-container .tl-slide-content { + box-sizing: initial; +} + +.tl-text h2.tl-headline-title, +.tl-text h2.tl-headline { + color: $dark-teal; +} diff --git a/public/themes/custom/ubccs/screenshot.png b/public/themes/custom/ubccs/screenshot.png new file mode 100644 index 0000000..eb53a63 Binary files /dev/null and b/public/themes/custom/ubccs/screenshot.png differ diff --git a/public/themes/custom/ubccs/templates/block/block--bundle--sponsor_logos.html.twig b/public/themes/custom/ubccs/templates/block/block--bundle--sponsor_logos.html.twig new file mode 100755 index 0000000..4d99065 --- /dev/null +++ b/public/themes/custom/ubccs/templates/block/block--bundle--sponsor_logos.html.twig @@ -0,0 +1,49 @@ +{# +/** + * @file + * Theme override to display a block. + * + * Available variables: + * - plugin_id: The ID of the block implementation. + * - label: The configured label of the block if visible. + * - configuration: A list of the block's configuration values. + * - label: The configured label for the block. + * - label_display: The display settings for the label. + * - module: The module that provided this block plugin. + * - cache: The cache settings. + * - Block plugin specific settings will also be stored here. + * - block - The full block entity. + * - label_hidden: The hidden block title value if the block was + * configured to hide the title ('label' is empty in this case). + * - module: The module that generated the block. + * - delta: An ID for the block, unique within each module. + * - region: The block region embedding the current block. + * - content: The content of this block. + * - attributes: array of HTML attributes populated by modules, intended to + * be added to the main container tag of this template. + * - id: A valid HTML ID and guaranteed unique. + * - title_attributes: Same as attributes, except applied to the main title + * tag that appears in the template. + * - title_prefix: Additional output populated by modules, intended to be + * displayed in front of the main title tag that appears in the template. + * - title_suffix: Additional output populated by modules, intended to be + * displayed after the main title tag that appears in the template. + * + * @see template_preprocess_block() + */ +#} +{% + set classes = [ + 'block', + 'block-' ~ configuration.provider|clean_class, + 'block-sponsor-logos', + 'block-sponsor-logos--' ~ (content['#block_content'].field_tier.value ? content['#block_content'].field_tier.value|clean_class : 'none') + ] +%} + + {{ title_prefix }} + {{ title_suffix }} + {% block content %} + {{ content|without('field_tier') }} + {% endblock %} +
diff --git a/public/themes/custom/ubccs/templates/block/block--menu-block--main-submenu.html.twig b/public/themes/custom/ubccs/templates/block/block--menu-block--main-submenu.html.twig new file mode 100644 index 0000000..8435679 --- /dev/null +++ b/public/themes/custom/ubccs/templates/block/block--menu-block--main-submenu.html.twig @@ -0,0 +1,27 @@ +{# +/** + * @file + * Theme override for a menu block. + */ +#} +{% +set classes = [ + 'sub-menu', + 'sub-menu--' ~ derivative_plugin_id|clean_class, +] +%} +{# Label. If not displayed, we still provide it for screen readers. #} +{% if not configuration.label_display %} + {% set title_attributes = title_attributes.addClass('visually-hidden') %} +{% endif %} + +{% set heading_id = attributes.id ~ '-menu'|clean_id %} + diff --git a/public/themes/custom/ubccs/templates/block/block--system-menu-block.html.twig b/public/themes/custom/ubccs/templates/block/block--system-menu-block.html.twig new file mode 100644 index 0000000..a974eb0 --- /dev/null +++ b/public/themes/custom/ubccs/templates/block/block--system-menu-block.html.twig @@ -0,0 +1,26 @@ +{# +/** + * @file + * Theme override for a menu block. + */ +#} +{% +set classes = [ + 'menu--' ~ derivative_plugin_id|clean_class, +] +%} +{# Label. If not displayed, we still provide it for screen readers. #} +{% if not configuration.label_display %} + {% set title_attributes = title_attributes.addClass('visually-hidden') %} +{% endif %} + +{% set heading_id = attributes.id ~ '-menu'|clean_id %} + diff --git a/public/themes/custom/ubccs/templates/component/landing-banner.html.twig b/public/themes/custom/ubccs/templates/component/landing-banner.html.twig new file mode 100644 index 0000000..bac1bb4 --- /dev/null +++ b/public/themes/custom/ubccs/templates/component/landing-banner.html.twig @@ -0,0 +1,14 @@ +{% if content %} + + {% if content.image %} + + {{ content.image }} +
+ {% endif %} + {% if content.title %} + + {{ content.title }} +
+ {% endif %} +
+{% endif %} diff --git a/public/themes/custom/ubccs/templates/component/site-alert.html.twig b/public/themes/custom/ubccs/templates/component/site-alert.html.twig new file mode 100644 index 0000000..13cc7f1 --- /dev/null +++ b/public/themes/custom/ubccs/templates/component/site-alert.html.twig @@ -0,0 +1,8 @@ +
+ +
!
+ +
+ {{ alert.message }} +
+
diff --git a/public/themes/custom/ubccs/templates/component/twitter-api--tweet-list.html.twig b/public/themes/custom/ubccs/templates/component/twitter-api--tweet-list.html.twig new file mode 100644 index 0000000..647e2f7 --- /dev/null +++ b/public/themes/custom/ubccs/templates/component/twitter-api--tweet-list.html.twig @@ -0,0 +1,20 @@ +{#

+ Tweets by @{{ twitter_user.screen_name }} +

#} +
+ {{ tweets }} +
+ + + diff --git a/public/themes/custom/ubccs/templates/component/twitter-api--tweet.html.twig b/public/themes/custom/ubccs/templates/component/twitter-api--tweet.html.twig new file mode 100644 index 0000000..fc3b478 --- /dev/null +++ b/public/themes/custom/ubccs/templates/component/twitter-api--tweet.html.twig @@ -0,0 +1,32 @@ +
+
+ {% if tweet.retweet.text != '' %} + + + {{ tweet.retweet.text }} + + {% endif %} + {% if tweet.screen_name != 'UBC_CS' %} + + {% endif %} +
+
{{ text }}
+
{{ image }}
+
+ +
+ +
+
+
+ diff --git a/public/themes/custom/ubccs/templates/content/node--alumni--teaser.html.twig b/public/themes/custom/ubccs/templates/content/node--alumni--teaser.html.twig new file mode 100644 index 0000000..a58ec2c --- /dev/null +++ b/public/themes/custom/ubccs/templates/content/node--alumni--teaser.html.twig @@ -0,0 +1,31 @@ +{# +/** + * @file + * Theme override to display a node teaser. + */ +#} + + {{ title_suffix.contextual_links }} +
+
+ {% if content.field_node_image_vertical %} + {{ content.field_node_image_vertical }} + {% else %} +
+ {% set alumni_name_split = node.getTitle()|split(' ') %} + {{ alumni_name_split[0][:1]|upper }}{{ alumni_name_split[1][:1]|upper }} +
+ {% endif %} +
+ +
+ + {{ label }} +
+ {{ content|without('field_node_image_vertical') }} + +
+
+
diff --git a/public/themes/custom/ubccs/templates/content/node--alumni.html.twig b/public/themes/custom/ubccs/templates/content/node--alumni.html.twig new file mode 100644 index 0000000..8f7a5f7 --- /dev/null +++ b/public/themes/custom/ubccs/templates/content/node--alumni.html.twig @@ -0,0 +1,59 @@ +{% extends "node.html.twig" %} + {% block header %} +
+ {% if content.field_header_image %} + {{ content.field_header_image }} + {% endif %} + + {{ title_prefix }} + {% if page %} + + {{ label }} + + {% else %} + + {{ label }} + + {% endif %} + {{ title_suffix }} + + {% if content.field_subtitle|render %} +
+

{{ content.field_subtitle }}

+
+ {% endif %} + + {% if display_submitted and page %} +
+ + Posted on: {{ node.getCreatedTime()|format_date('custom', 'F j, Y') }} + {{ metadata }} +
+ + {% endif %} + + + + {% endblock %} + +{% block node_content %} + + + {{ content|without('links', 'field_subtitle', 'field_node_image_vertical') }} +
+ + + {% if content.field_node_image_vertical %} +
+
+ {{ content.field_node_image_vertical }} +
+
+ {% endif %} + + +{% endblock %} + +{% block node_meta %} +{# Moved to header block. #} +{% endblock %} diff --git a/public/themes/custom/ubccs/templates/content/node--award--teaser.html.twig b/public/themes/custom/ubccs/templates/content/node--award--teaser.html.twig new file mode 100644 index 0000000..75753e1 --- /dev/null +++ b/public/themes/custom/ubccs/templates/content/node--award--teaser.html.twig @@ -0,0 +1,23 @@ +{# +/** + * @file + * Theme override to display a node teaser. + */ +#} +{% extends "node.html.twig" %} +{% block header %} + {{ title_prefix }} +
+
+ +
+
+
+ +
+ {{ title_suffix }} +{% endblock %} +{% block node_content %}{% endblock %} +{% block node_links %}{% endblock %} diff --git a/public/themes/custom/ubccs/templates/content/node--course-section.html.twig b/public/themes/custom/ubccs/templates/content/node--course-section.html.twig new file mode 100644 index 0000000..585c56e --- /dev/null +++ b/public/themes/custom/ubccs/templates/content/node--course-section.html.twig @@ -0,0 +1,71 @@ +{# +/** + * @file + * Theme override to display a node. + */ +#} +{% + set classes = [ + 'node', + 'node--type-' ~ node.bundle|clean_class, + view_mode != 'full' and node.isPromoted() ? 'node--promoted', + view_mode != 'full' and node.isSticky() ? 'node--sticky', + not node.isPublished() ? 'node--unpublished', + view_mode ? 'node--view-mode-' ~ view_mode|clean_class, + ] +%} + + {% block header %} +
+ {{ title_prefix }} + {% if page %} + + {{ label|render|striptags|replace({'_': ' '}) }} + + {% endif %} + {{ title_suffix }} +
+ {% endblock %} + + {% block node_meta %} + {% if display_submitted and page %} +
+ {# {{ author_picture }} #} + + {{ node.getCreatedTime()|format_date('custom', 'F j, Y') }} + {% trans %}by {{ author_name }}{% endtrans %} + {{ metadata }} + +
+ {% endif %} + {% endblock %} + + {% block pre_content_custom_views %}{% endblock %} + + {% block node_content %} + + {% if show_course_schedule %} + {# Add autogenerated course section link #} + {% set dept_course = node.field_course_pid.value|split('_') %} + {% set dept = dept_course.0 %} + {% set course = dept_course.1 %} + {% set section = node.field_course_section.value %} + {% set session = node.field_course_year.value[-1:1] %} + {% set year = node.field_course_year.value[:-1] %} + + {% endif %} + {{ content|without('links', 'field_header_image') }} + + {% endblock %} + + {% block post_content_custom_views %}{% endblock %} + + {% block node_links %} + {% if content.links %} + + {% endif %} + {% endblock %} + + diff --git a/public/themes/custom/ubccs/templates/content/node--course.html.twig b/public/themes/custom/ubccs/templates/content/node--course.html.twig new file mode 100644 index 0000000..7eea21f --- /dev/null +++ b/public/themes/custom/ubccs/templates/content/node--course.html.twig @@ -0,0 +1,82 @@ +{# +/** + * @file + * Theme override to display a node. + */ +#} +{% + set classes = [ + 'node', + 'node--type-' ~ node.bundle|clean_class, + view_mode != 'full' and node.isPromoted() ? 'node--promoted', + view_mode != 'full' and node.isSticky() ? 'node--sticky', + not node.isPublished() ? 'node--unpublished', + view_mode ? 'node--view-mode-' ~ view_mode|clean_class, + ] +%} + + {% block header %} + {% if not is_front %} +
+ {% if content.field_header_image %} + {{ content.field_header_image }} + {% endif %} + + {{ title_prefix }} + {% if page %} + + {{ label }} + + {% else %} + + {{ label }} + + {% endif %} + {{ title_suffix }} +
+ {% endif %} + {% endblock %} + + {% block node_meta %} + {% if display_submitted and page %} +
+ {# {{ author_picture }} #} + + {{ node.getCreatedTime()|format_date('custom', 'F j, Y') }} + {% trans %}by {{ author_name }}{% endtrans %} + {{ metadata }} + +
+ {% endif %} + {% endblock %} + + {% block pre_content_custom_views %}{% endblock %} + + {% block node_content %} + + {{ content|without('links', 'field_header_image') }} + {% if show_course_schedule %} + {# Add autogenerated course section link #} + {% set dept_course = node.field_course_number.value|split(' ') %} + {% set dept = dept_course.0 %} + {% set course = dept_course.1 %} + {% set section = node.field_course_section.value %} + {% set session = node.field_course_year.value[-1:1] %} + {% set year = node.field_course_year.value[:-1] %} + UBC Course Schedule + {% endif %} + + + {% endblock %} + + {% block post_content_custom_views %}{% endblock %} + + {% block node_links %} + {% if content.links %} + + {% endif %} + {% endblock %} + + diff --git a/public/themes/custom/ubccs/templates/content/node--department-job.html.twig b/public/themes/custom/ubccs/templates/content/node--department-job.html.twig new file mode 100644 index 0000000..96a98e3 --- /dev/null +++ b/public/themes/custom/ubccs/templates/content/node--department-job.html.twig @@ -0,0 +1,26 @@ +{# +/** + * @file + * Theme override to display a node. + */ +#} +{% extends "node.html.twig" %} + +{% block node_meta %} +{% if display_submitted and page %} +
+ {# {{ author_picture }} #} + + {{ node.getCreatedTime()|format_date('custom', 'F j, Y') }} + {{ metadata }} + +
+{% endif %} + +{% endblock %} diff --git a/public/themes/custom/ubccs/templates/content/node--event.html.twig b/public/themes/custom/ubccs/templates/content/node--event.html.twig new file mode 100644 index 0000000..a02a165 --- /dev/null +++ b/public/themes/custom/ubccs/templates/content/node--event.html.twig @@ -0,0 +1,82 @@ +{# +/** + * @file + * Theme override to display a node. + */ +#} +{% + set classes = [ + 'node', + 'node--type-' ~ node.bundle|clean_class, + view_mode != 'full' and node.isPromoted() ? 'node--promoted', + view_mode != 'full' and node.isSticky() ? 'node--sticky', + not node.isPublished() ? 'node--unpublished', + view_mode ? 'node--view-mode-' ~ view_mode|clean_class, + ] +%} + + {% block header %} + {% if not is_front %} +
+ {% if content.field_header_image %} + {{ content.field_header_image }} + {% endif %} + + {{ title_prefix }} + {% if page %} + + {{ label }} + + {% else %} + + {{ label }} + + {% endif %} + {{ title_suffix }} +
+ {% endif %} + {% endblock %} + + {% block node_meta %} + {% if display_submitted and page %} +
+ {# {{ author_picture }} #} + + {{ node.getCreatedTime()|format_date('custom', 'F j, Y') }} + {% trans %}by {{ author_name }}{% endtrans %} + {{ metadata }} + +
+ {% endif %} + + {% endblock %} + + {% block pre_content_custom_views %}{% endblock %} + + {% block node_content %} + + {{ content|without('links', 'field_header_image', 'schedule') }} + {{ content.schedule }} +
+   +
+ + {% endblock %} + + {% block post_content_custom_views %}{% endblock %} + + {% block node_links %} + {% if content.links %} + + {% endif %} + {% endblock %} + + diff --git a/public/themes/custom/ubccs/templates/content/node--faq--teaser.html.twig b/public/themes/custom/ubccs/templates/content/node--faq--teaser.html.twig new file mode 100644 index 0000000..f44c587 --- /dev/null +++ b/public/themes/custom/ubccs/templates/content/node--faq--teaser.html.twig @@ -0,0 +1,35 @@ +{# +/** + * @file + * Theme override to display a node. + */ +#} +{% + set classes = [ + 'node', + 'node--type-' ~ node.bundle|clean_class, + view_mode != 'full' and node.isPromoted() ? 'node--promoted', + view_mode != 'full' and node.isSticky() ? 'node--sticky', + not node.isPublished() ? 'node--unpublished', + view_mode ? 'node--view-mode-' ~ view_mode|clean_class, +] +%} + + + + {{ title_prefix }} + {{ label }} + {{ title_suffix }} + + + + {{ content|without('links') }} + + + {% if content.links %} + + {% endif %} + + diff --git a/public/themes/custom/ubccs/templates/content/node--homepage-banner.html.twig b/public/themes/custom/ubccs/templates/content/node--homepage-banner.html.twig new file mode 100644 index 0000000..d7752c6 --- /dev/null +++ b/public/themes/custom/ubccs/templates/content/node--homepage-banner.html.twig @@ -0,0 +1,35 @@ +{# +/** + * @file + * Theme override to display a node. + */ +#} +
+{% if node.field_home_banner_learn_more.uri %} + + {% if content.field_home_banner_img %} +
+ {{ content.field_home_banner_img }} +
+ {% endif %} + {% if content.field_home_banner_head %} +
+ {{ content.field_home_banner_head }} + {{ content.body }} +
+ {% endif %} +
+{% else %} + {% if content.field_home_banner_img %} +
+ {{ content.field_home_banner_img }} +
+ {% endif %} + {% if content.field_home_banner_head %} +
+ {{ content.field_home_banner_head }} + {{ content.body }} +
+ {% endif %} +{% endif %} +
diff --git a/public/themes/custom/ubccs/templates/content/node--job.html.twig b/public/themes/custom/ubccs/templates/content/node--job.html.twig new file mode 100644 index 0000000..e01a599 --- /dev/null +++ b/public/themes/custom/ubccs/templates/content/node--job.html.twig @@ -0,0 +1,27 @@ +{# +/** + * @file + * Theme override to display a node. + */ +#} +{% extends "node.html.twig" %} + +{% block node_meta %} + {% if display_submitted and page %} +
+ {# {{ author_picture }} #} + + {{ node.getCreatedTime()|format_date('custom', 'F j, Y') }} + {% trans %}by {{ author_name }}{% endtrans %} + {{ metadata }} + +
+ {% endif %} + +{% endblock %} diff --git a/public/themes/custom/ubccs/templates/content/node--landing--full.html.twig b/public/themes/custom/ubccs/templates/content/node--landing--full.html.twig new file mode 100644 index 0000000..bc0062d --- /dev/null +++ b/public/themes/custom/ubccs/templates/content/node--landing--full.html.twig @@ -0,0 +1,13 @@ +{# + Generic Layout for all landing page content-type, which includes + the conditions and injects ext.twig files +#} +{% extends "node.html.twig" %} + +{% block pre_content_custom_views %} + {{ pre_content_custom_blocks }} +{% endblock %} + +{% block post_content_custom_views %} + {{ post_content_custom_blocks }} +{% endblock %} diff --git a/public/themes/custom/ubccs/templates/content/node--news--teaser.html.twig b/public/themes/custom/ubccs/templates/content/node--news--teaser.html.twig new file mode 100644 index 0000000..7b7babd --- /dev/null +++ b/public/themes/custom/ubccs/templates/content/node--news--teaser.html.twig @@ -0,0 +1,27 @@ +{# +/** + * @file + * Theme override to display a node teaser. + */ +#} +{% extends "node.html.twig" %} +{% block header %} + {{ title_prefix }} + {{ title_suffix }} +{% endblock %} +{% block node_content %} +
+
+ {% if content.field_thumbnail|render %} + {{ content.field_thumbnail }} + {% else %} + {{ content.field_header_image }} + {% endif %} +
+
+

{{ label }}

+
+
{{ content.body }}
+
+
+{% endblock %} diff --git a/public/themes/custom/ubccs/templates/content/node--news.html.twig b/public/themes/custom/ubccs/templates/content/node--news.html.twig new file mode 100644 index 0000000..e2223dc --- /dev/null +++ b/public/themes/custom/ubccs/templates/content/node--news.html.twig @@ -0,0 +1,23 @@ +{% extends "node.html.twig" %} +{% block node_meta %} + {% if display_submitted and page %} + {% set text = content.body|render|striptags %} + {% set read_time = (text|split(' ')|length / 250)|round(0,'ceil') %} +
+ {# {{ author_picture }} #} + + {{ node.getCreatedTime()|format_date('month_day_year') }} + {% trans %}by {{ author_name }}{% endtrans %} + | {{ read_time }} min{% if read_time > 1 %}s{% endif %} read + {{ metadata }} + +
+ +{% endif %} +{% endblock %} diff --git a/public/themes/custom/ubccs/templates/content/node--page--full.html.twig b/public/themes/custom/ubccs/templates/content/node--page--full.html.twig new file mode 100644 index 0000000..6cf699c --- /dev/null +++ b/public/themes/custom/ubccs/templates/content/node--page--full.html.twig @@ -0,0 +1,13 @@ +{# + Generic Layout for all page content-type, which includes + the conditions and injects ext.twig files +#} +{% extends "node.html.twig" %} + +{% block pre_content_custom_views %} + {{ pre_content_custom_blocks }} +{% endblock %} + +{% block post_content_custom_views %} + {{ post_content_custom_blocks }} +{% endblock %} diff --git a/public/themes/custom/ubccs/templates/content/node--schedule--teaser.html.twig b/public/themes/custom/ubccs/templates/content/node--schedule--teaser.html.twig new file mode 100644 index 0000000..09a2a10 --- /dev/null +++ b/public/themes/custom/ubccs/templates/content/node--schedule--teaser.html.twig @@ -0,0 +1,33 @@ +{# +/** + * @file + * Theme override to display a node. + */ +#} +{% + set classes = [ + 'node', + 'node--type-' ~ node.bundle|clean_class, + view_mode != 'full' and node.isPromoted() ? 'node--promoted', + view_mode != 'full' and node.isSticky() ? 'node--sticky', + not node.isPublished() ? 'node--unpublished', + view_mode ? 'node--view-mode-' ~ view_mode|clean_class, + ] +%} + + {% block header %} +
+ {{ title_prefix }} + + {{ label }} + + {{ title_suffix }} +
+ {% endblock %} + + {% block node_content %} + + {{ content|without('body', 'field_event', 'field_speaker_affiliation') }} + + {% endblock %} + diff --git a/public/themes/custom/ubccs/templates/content/node--special-event--full.html.twig b/public/themes/custom/ubccs/templates/content/node--special-event--full.html.twig new file mode 100644 index 0000000..88cda0e --- /dev/null +++ b/public/themes/custom/ubccs/templates/content/node--special-event--full.html.twig @@ -0,0 +1,9 @@ +{% extends "node.html.twig" %} + +{% block pre_content_custom_views %} + {{ pre_content_custom_blocks }} +{% endblock %} + +{% block post_content_custom_views %} + {{ post_content_custom_blocks }} +{% endblock %} diff --git a/public/themes/custom/ubccs/templates/content/node--teaser.html.twig b/public/themes/custom/ubccs/templates/content/node--teaser.html.twig new file mode 100644 index 0000000..3a68b1b --- /dev/null +++ b/public/themes/custom/ubccs/templates/content/node--teaser.html.twig @@ -0,0 +1,16 @@ +{# +/** + * @file + * Theme override to display a node teaser. + */ +#} +{% extends "node.html.twig" %} +{% block header %} +
+ {{ title_prefix }} + + {{ label }} + + {{ title_suffix }} +
+{% endblock %} diff --git a/public/themes/custom/ubccs/templates/content/node.html.twig b/public/themes/custom/ubccs/templates/content/node.html.twig new file mode 100644 index 0000000..d581443 --- /dev/null +++ b/public/themes/custom/ubccs/templates/content/node.html.twig @@ -0,0 +1,75 @@ +{# +/** + * @file + * Theme override to display a node. + */ +#} +{% + set classes = [ + 'node', + 'node--type-' ~ node.bundle|clean_class, + view_mode != 'full' and node.isPromoted() ? 'node--promoted', + view_mode != 'full' and node.isSticky() ? 'node--sticky', + not node.isPublished() ? 'node--unpublished', + view_mode ? 'node--view-mode-' ~ view_mode|clean_class, + ] +%} + + {% block header %} + {% if not is_front %} +
+ {% if content.field_header_image %} + {{ content.field_header_image }} + {% endif %} + + {{ title_prefix }} + {% if page %} + + {{ label }} + + {% else %} + + {{ label }} + + {% endif %} + {{ title_suffix }} +
+ {% endif %} + {% endblock %} + + {% block node_meta %} + {% if display_submitted and page %} +
+ {# {{ author_picture }} #} + + {{ node.getCreatedTime()|format_date('custom', 'F j, Y') }} + {% trans %}by {{ author_name }}{% endtrans %} + {{ metadata }} + +
+ {% endif %} + {% endblock %} + + {% block pre_content_custom_views %}{% endblock %} + + {% block node_content %} + + {{ content|without('links', 'prevnext_previous', 'prevnext_next', 'field_header_image') }} + +
+ {{ content.prevnext_previous }} + {{ content.prevnext_next }} +
+ {% endblock %} + + {% block post_content_custom_views %}{% endblock %} + + {% block node_links %} + {% if content.links %} + + {% endif %} + {% endblock %} + + diff --git a/public/themes/custom/ubccs/templates/content/taxonomy-term--research-group.html.twig b/public/themes/custom/ubccs/templates/content/taxonomy-term--research-group.html.twig new file mode 100644 index 0000000..ebcc05e --- /dev/null +++ b/public/themes/custom/ubccs/templates/content/taxonomy-term--research-group.html.twig @@ -0,0 +1,45 @@ +{# +/** + * @file + * Theme override to display a taxonomy term. + * + * Available variables: + * - url: URL of the current term. + * - name: Name of the current term. + * - content: Items for the content of the term (fields and description). + * Use 'content' to print them all, or print a subset such as + * 'content.description'. Use the following code to exclude the + * printing of a given child element: + * @code + * {{ content|without('description') }} + * @endcode + * - attributes: HTML attributes for the wrapper. + * - page: Flag for the full page state. + * - term: The taxonomy term entity, including: + * - id: The ID of the taxonomy term. + * - bundle: Machine name of the current vocabulary. + * - view_mode: View mode, e.g. 'full', 'teaser', etc. + * + * @see template_preprocess_taxonomy_term() + */ +#} +{% + set classes = [ + 'taxonomy-term', + 'vocabulary-' ~ term.bundle|clean_class, + ] +%} + + {{ title_prefix }} + {% if not page %} +

+ + {{ term.label }} + +

+ {% endif %} + {{ title_suffix }} +
+ {{ content }} +
+ diff --git a/public/themes/custom/ubccs/templates/field/date-recur-basic-formatter.html.twig b/public/themes/custom/ubccs/templates/field/date-recur-basic-formatter.html.twig new file mode 100644 index 0000000..e6a9f5b --- /dev/null +++ b/public/themes/custom/ubccs/templates/field/date-recur-basic-formatter.html.twig @@ -0,0 +1,37 @@ +{# +/** + * @file + * Default theme implementation to display a recurring dates field. + * + * Available variables: + * - date: shows first start, and end date if available, whether or not the + * field is a rule. + * - interpretation: The human readable repeat rule. + * - occurrences: The occurrences, if value is recurring. Individual occurrences + * can be printed as a whole, or properties of each occurrences can be + * accessed: + * - occurrence: print all properties + * - start_date: the start date. + * - end_date: the end date. + * - separator: the date separator. + * - is_recurring: Whether the field value is recurring. + * + * @ingroup themeable + */ +#} +{% if date and not is_recurring %} +
{{ date }}
+{% endif %} + +{% if interpretation -%} +
Repeats {{ interpretation }}
+{% endif %} + +{% if is_recurring and occurrences|length > 0 %} +

Upcoming Dates

+
    + {% for item in occurrences %} +
  • {{ item }}
  • + {% endfor %} +
+{% endif %} diff --git a/public/themes/custom/ubccs/templates/field/field--block-content--body--card.html.twig b/public/themes/custom/ubccs/templates/field/field--block-content--body--card.html.twig new file mode 100644 index 0000000..445e38d --- /dev/null +++ b/public/themes/custom/ubccs/templates/field/field--block-content--body--card.html.twig @@ -0,0 +1,3 @@ +{% for item in items %} +
{{ item.content }}
+{% endfor %} diff --git a/public/themes/custom/ubccs/templates/field/field--field-card-link.html.twig b/public/themes/custom/ubccs/templates/field/field--field-card-link.html.twig new file mode 100644 index 0000000..79e0d69 --- /dev/null +++ b/public/themes/custom/ubccs/templates/field/field--field-card-link.html.twig @@ -0,0 +1,3 @@ +{% for item in items %} + {{- item.content -}} +{% endfor %} diff --git a/public/themes/custom/ubccs/templates/field/field--field-card-title.html.twig b/public/themes/custom/ubccs/templates/field/field--field-card-title.html.twig new file mode 100644 index 0000000..c25f543 --- /dev/null +++ b/public/themes/custom/ubccs/templates/field/field--field-card-title.html.twig @@ -0,0 +1,3 @@ +{% for item in items %} +
{{ item.content }}
+{% endfor %} diff --git a/public/themes/custom/ubccs/templates/field/field--field-landing-cards.html.twig b/public/themes/custom/ubccs/templates/field/field--field-landing-cards.html.twig new file mode 100644 index 0000000..fe31562 --- /dev/null +++ b/public/themes/custom/ubccs/templates/field/field--field-landing-cards.html.twig @@ -0,0 +1,29 @@ +{% set classes = 'cards' %} +{% + set title_classes = [ + 'field__label', + label_display == 'visually_hidden' ? 'visually-hidden', +] +%} +{% if items %} +
+
+ {% if not label_hidden %} + {{ label }}
+ {% endif %} + + + {% for item in items %} + {% set url = item.content.field_card_link['#object'].field_card_link.0.getUrl() %} + {% if item.content and url %} + + + {{ item.content|without('field_card_link') }} + +
+ {% endif %} + {% endfor %} + + + +{% endif %} diff --git a/public/themes/custom/ubccs/templates/field/field--field-landing-intro.html.twig b/public/themes/custom/ubccs/templates/field/field--field-landing-intro.html.twig new file mode 100644 index 0000000..7e1ab45 --- /dev/null +++ b/public/themes/custom/ubccs/templates/field/field--field-landing-intro.html.twig @@ -0,0 +1,52 @@ +{# +/** + * @file + * Theme override for a field. + * + * To override output, copy the "field.html.twig" from the templates directory + * to your theme's directory and customize it, just like customizing other + * Drupal templates such as page.html.twig or node.html.twig. + * + * Instead of overriding the theming for all fields, you can also just override + * theming for a subset of fields using + * @link themeable Theme hook suggestions. @endlink For example, + * here are some theme hook suggestions that can be used for a field_foo field + * on an article node type: + * - field--node--field-foo--article.html.twig + * - field--node--field-foo.html.twig + * - field--node--article.html.twig + * - field--field-foo.html.twig + * - field--text-with-summary.html.twig + * - field.html.twig + * + * Available variables: + * - attributes: HTML attributes for the containing element. + * - label_hidden: Whether to show the field label or not. + * - title_attributes: HTML attributes for the title. + * - label: The label for the field. + * - multiple: TRUE if a field can contain multiple items. + * - items: List of all the field items. Each item contains: + * - attributes: List of HTML attributes for each item. + * - content: The field item's content. + * - entity_type: The entity type to which the field belongs. + * - field_name: The name of the field. + * - field_type: The type of the field. + * - label_display: The display settings for the label. + * + * + * @see template_preprocess_field() + */ +#} +{% set classes = 'landing-intro' %} + +{% if multiple %} + + {% for item in items %} +

{{ item.content }}

+ {% endfor %} + +{% else %} + {% for item in items %} +

{{ item.content }}

+ {% endfor %} +{% endif %} diff --git a/public/themes/custom/ubccs/templates/field/field--node--title--technical-report.html.twig b/public/themes/custom/ubccs/templates/field/field--node--title--technical-report.html.twig new file mode 100644 index 0000000..248a628 --- /dev/null +++ b/public/themes/custom/ubccs/templates/field/field--node--title--technical-report.html.twig @@ -0,0 +1,30 @@ +{# +/** + * @file + * Default theme implementation for the node title field. + * + * This is an override of field.html.twig for the node title field. See that + * template for documentation about its details and overrides. + * + * Available variables: + * - attributes: HTML attributes for the containing span element. + * - items: List of all the field items. Each item contains: + * - attributes: List of HTML attributes for each item. + * - content: The field item content. + * - entity_type: The entity type to which the field belongs. + * - field_name: The name of the field. + * - field_type: The type of the field. + * - label_display: The display settings for the label. + * + * @see field.html.twig + * + * @ingroup themeable + */ +#} +
+ + {%- for item in items -%} + {{ item.content }} + {%- endfor -%} + +
diff --git a/public/themes/custom/ubccs/templates/field/field--text.html.twig b/public/themes/custom/ubccs/templates/field/field--text.html.twig new file mode 100644 index 0000000..7cfea86 --- /dev/null +++ b/public/themes/custom/ubccs/templates/field/field--text.html.twig @@ -0,0 +1,28 @@ +{% extends "field.html.twig" %} +{# +/** + * @file + * Default theme implementation for a text field. + * + * A 'clearfix' class is added, because 'text' fields have a 'format' property + * that allows a Text Format to be associated with the entered text, which then + * applies filtering on output. A common use case is to align images to the left + * or right, and without this 'clearfix' class, such aligned images may be + * rendered outside of the 'text' field formatter's boundaries, and hence + * overlap with other fields. By setting the 'clearfix' class on all 'text' + * fields, we prevent that. + * + * @see https://www.drupal.org/node/2358529 + * + * A 'text-formatted' class is added to assist with default styling of base + * elements such as paragraphs and lists that may not have classes assigned to + * them. This allows user entered content to have default styling without + * interfering with the styles of other UI components such as system generated + * lists or other dynamic content. + * + * @see https://www.drupal.org/node/2539860 + * + * @ingroup themeable + */ +#} +{% set attributes = attributes.addClass('text-formatted') %} diff --git a/public/themes/custom/ubccs/templates/field/field.html.twig b/public/themes/custom/ubccs/templates/field/field.html.twig new file mode 100644 index 0000000..05bf89c --- /dev/null +++ b/public/themes/custom/ubccs/templates/field/field.html.twig @@ -0,0 +1,81 @@ +{# +/** + * @file + * Theme override for a field. + * + * To override output, copy the "field.html.twig" from the templates directory + * to your theme's directory and customize it, just like customizing other + * Drupal templates such as page.html.twig or node.html.twig. + * + * Instead of overriding the theming for all fields, you can also just override + * theming for a subset of fields using + * @link themeable Theme hook suggestions. @endlink For example, + * here are some theme hook suggestions that can be used for a field_foo field + * on an article node type: + * - field--node--field-foo--article.html.twig + * - field--node--field-foo.html.twig + * - field--node--article.html.twig + * - field--field-foo.html.twig + * - field--text-with-summary.html.twig + * - field.html.twig + * + * Available variables: + * - attributes: HTML attributes for the containing element. + * - label_hidden: Whether to show the field label or not. + * - title_attributes: HTML attributes for the title. + * - label: The label for the field. + * - multiple: TRUE if a field can contain multiple items. + * - items: List of all the field items. Each item contains: + * - attributes: List of HTML attributes for each item. + * - content: The field item's content. + * - entity_type: The entity type to which the field belongs. + * - field_name: The name of the field. + * - field_type: The type of the field. + * - label_display: The display settings for the label. + * + * + * @see template_preprocess_field() + */ +#} +{% + set classes = [ + 'field', + 'field--name-' ~ field_name|clean_class, + 'field--type-' ~ field_type|clean_class, + 'field--label-' ~ label_display, +] +%} +{% + set title_classes = [ + 'field__label', + label_display == 'visually_hidden' ? 'visually-hidden', +] +%} +{% spaceless %} +{% if label_hidden %} + {% if multiple %} + + {% for item in items %} + {{ item.content }} + {% endfor %} + + {% else %} + {% for item in items %} + {{ item.content }} + {% endfor %} + {% endif %} +{% else %} + + {{ label }} + {% if multiple %} +
+ {% endif %} + {% for item in items %} + {{ item.content }}
+ {% endfor %} + {% if multiple %} + + {% endif %} + +{% endif %} +{% endspaceless %} diff --git a/public/themes/custom/ubccs/templates/field/image.html.twig b/public/themes/custom/ubccs/templates/field/image.html.twig new file mode 100644 index 0000000..b342eee --- /dev/null +++ b/public/themes/custom/ubccs/templates/field/image.html.twig @@ -0,0 +1,13 @@ +{# +/** + * @file + * Theme override of an image. + * + * Available variables: + * - attributes: HTML attributes for the img tag. + * - style_name: (optional) The name of the image style applied. + * + * @see template_preprocess_image() + */ +#} + diff --git a/public/themes/custom/ubccs/templates/layout/html.html.twig b/public/themes/custom/ubccs/templates/layout/html.html.twig new file mode 100644 index 0000000..ecd7c6a --- /dev/null +++ b/public/themes/custom/ubccs/templates/layout/html.html.twig @@ -0,0 +1,24 @@ +{# +/** + * @file + * Theme override for the basic structure of a single Drupal page. + */ +#} + + + + + {{ head_title|safe_join(' | ') }} + + + + + + + + {{ page_top }} + {{ page }} + {{ page_bottom }} + + + diff --git a/public/themes/custom/ubccs/templates/layout/page--front.html.twig b/public/themes/custom/ubccs/templates/layout/page--front.html.twig new file mode 100644 index 0000000..f2fc8c2 --- /dev/null +++ b/public/themes/custom/ubccs/templates/layout/page--front.html.twig @@ -0,0 +1,60 @@ +{# +/** + * @file + * Homepage template. + */ +#} +{% extends "page.html.twig" %} + +{% block layout_content %} +
+
+ {{ drupal_view('home_page_banners', 'block_1') }} +
+ + {{ page.content.ubccs_content }} + +
+
+
+ {{ cs_homepage_card('60775') }} +
+
+ {{ cs_homepage_card('60776') }} +
+
+ {{ cs_homepage_card('60777') }} +
+
+
+ +
+
+{# +
+

Events

+ {{ drupal_view('event_listings', 'block_3') }} + More Events  +
+#} + +
+

News

+ {{ drupal_view('news', 'block_2') }} + +
+ +
+ +
+
+
+
+{% endblock %} diff --git a/public/themes/custom/ubccs/templates/layout/page--node-type--landing.html.twig b/public/themes/custom/ubccs/templates/layout/page--node-type--landing.html.twig new file mode 100644 index 0000000..e5c14b5 --- /dev/null +++ b/public/themes/custom/ubccs/templates/layout/page--node-type--landing.html.twig @@ -0,0 +1,14 @@ +{# +/** + * @file + * Timeline template. + */ +#} +{% extends "page.html.twig" %} + +{% block layout_content %} +
+ {# Let the node template deal with the title. #} + {{ node ? page.content|without('ubccs_page_title') : page.content }} +
+{% endblock %} diff --git a/public/themes/custom/ubccs/templates/layout/page--timeline.html.twig b/public/themes/custom/ubccs/templates/layout/page--timeline.html.twig new file mode 100644 index 0000000..e5c14b5 --- /dev/null +++ b/public/themes/custom/ubccs/templates/layout/page--timeline.html.twig @@ -0,0 +1,14 @@ +{# +/** + * @file + * Timeline template. + */ +#} +{% extends "page.html.twig" %} + +{% block layout_content %} +
+ {# Let the node template deal with the title. #} + {{ node ? page.content|without('ubccs_page_title') : page.content }} +
+{% endblock %} diff --git a/public/themes/custom/ubccs/templates/layout/page.html.twig b/public/themes/custom/ubccs/templates/layout/page.html.twig new file mode 100644 index 0000000..236e234 --- /dev/null +++ b/public/themes/custom/ubccs/templates/layout/page.html.twig @@ -0,0 +1,250 @@ +{# +/** + * @file + * Theme override to display a single page. + */ +#} +{% set maincontent_attributes = create_attribute() %} +{% set sidebarfirst_attributes = create_attribute() %} +{% set sidebarsecond_attributes = create_attribute() %} + +
+ +
+
+ +
+
+
+ + + + + + + + + + +
+ {{ page.breadcrumb }} + + {% if page.featured %} + + {% endif %} + +
+ {% if page.highlighted %} +
{{ page.highlighted }}
+ {% endif %} + +
+ {{ page.header }} +
+ +
+ + {% block layout_content %} +
+ {# Let the node template deal with the title. #} + {{ node ? page.content|without('ubccs_page_title') : page.content }} +
+ + {% if page.sidebar_first %} + + {% endif %} + + {% if page.sidebar_second %} + + {% endif %} + + {% endblock %} +
+ + {% if page.footer %} +
+ {{ page.footer }} +
+ {% endif %} + +
+
+ + + +{% if page.prefooter %} + +{% endif %} + +
+
+
+ + + + + +
+
+ + + + + +
+ + diff --git a/public/themes/custom/ubccs/templates/navigation/breadcrumb.html.twig b/public/themes/custom/ubccs/templates/navigation/breadcrumb.html.twig new file mode 100644 index 0000000..68a870b --- /dev/null +++ b/public/themes/custom/ubccs/templates/navigation/breadcrumb.html.twig @@ -0,0 +1,21 @@ +{# +/** + * @file + * Theme override for a breadcrumb trail. + */ +#} +{% if breadcrumb %} + +{% endif %} diff --git a/public/themes/custom/ubccs/templates/navigation/menu--main-submenu.html.twig b/public/themes/custom/ubccs/templates/navigation/menu--main-submenu.html.twig new file mode 100644 index 0000000..5a6482d --- /dev/null +++ b/public/themes/custom/ubccs/templates/navigation/menu--main-submenu.html.twig @@ -0,0 +1,50 @@ +{# +/** + * @file + * Default theme implementation to display a menu. + */ +#} +{% import _self as menus %} + +{# + We call a macro which calls itself to render the full tree. + @see http://twig.sensiolabs.org/doc/tags/macro.html + + 1. We use menu_name (see above) to create a CSS class name from it. + See https://www.drupal.org/node/2649076 +#} +{{ menus.menu_links(items, attributes, 0, menu_name) }} {# 1. #} +{% set menu_name_class = menu_name|clean_class %} + +{% macro menu_links(items, attributes, menu_level, menu_name_class) %} {# 1. #} + {% import _self as menus %} + + {% if items %} + + {% for item in items %} + {% + set item_classes = [ + item.is_expanded ? 'menu-item--expanded', + item.is_collapsed ? 'menu-item--collapsed', + item.in_active_trail ? 'menu-item--active-trail', + item.is_expanded and item.in_active_trail ? 'menu-item--expand', + ] + %} + + + {% if item.below %} + {{ menus.menu_links(item.below, attributes, menu_level + 1, menu_name_class) }} + {% endif %} + + {% endfor %} + + {% endif %} +{% endmacro %} diff --git a/public/themes/custom/ubccs/templates/navigation/menu--main.html.twig b/public/themes/custom/ubccs/templates/navigation/menu--main.html.twig new file mode 100644 index 0000000..c16b6c0 --- /dev/null +++ b/public/themes/custom/ubccs/templates/navigation/menu--main.html.twig @@ -0,0 +1,53 @@ +{# +/** + * @file + * Default theme implementation to display a menu. + * + * Available variables: + * - menu_name: The machine name of the menu. + * - items: A nested list of menu items. Each menu item contains: + * - attributes: HTML attributes for the menu item. + * - below: The menu item child items. + * - title: The menu link title. + * - url: The menu link url, instance of \Drupal\Core\Url + * - localized_options: Menu link localized options. + * + * @ingroup themeable + */ +#} +{% import _self as menus %} +{# + We call a macro which calls itself to render the full tree. + @see http://twig.sensiolabs.org/doc/tags/macro.html +#} +{{ menus.menu_links(items, attributes, 0) }} + +{% macro menu_links(items, attributes, menu_level) %} + {% import _self as menus %} + {% if items %} + + {% for item in items %} + {% + set classes = [ + item.is_expanded ? 'menu-item--expanded', + item.is_expanded ? 'dropdown', + item.is_collapsed ? 'menu-item--collapsed', + item.in_active_trail ? 'menu-item--active-trail', + item.in_active_trail ? 'active', + ] + %} + {% if menu_level == 0 and item.is_expanded %} + + {{ link(item.title, item.url, item.attributes.addClass('navbar-link')) }} + {% else %} + + {{ link(item.title, item.url, {'class': ['navbar-link']}) }} + {% endif %} + {% if item.below %} + {{ menus.menu_links(item.below, attributes.removeClass('nav', 'navbar-nav'), menu_level + 1) }} + {% endif %} + + {% endfor %} + + {% endif %} +{% endmacro %} diff --git a/public/themes/custom/ubccs/templates/navigation/pager.html.twig b/public/themes/custom/ubccs/templates/navigation/pager.html.twig new file mode 100644 index 0000000..e91a3ff --- /dev/null +++ b/public/themes/custom/ubccs/templates/navigation/pager.html.twig @@ -0,0 +1,127 @@ +{# +/** + * @file + * Theme override to display a pager. + * + * Available variables: + * - heading_id: Pagination heading ID. + * - items: List of pager items. + * The list is keyed by the following elements: + * - first: Item for the first page; not present on the first page of results. + * - previous: Item for the previous page; not present on the first page + * of results. + * - next: Item for the next page; not present on the last page of results. + * - last: Item for the last page; not present on the last page of results. + * - pages: List of pages, keyed by page number. + * Sub-sub elements: + * items.first, items.previous, items.next, items.last, and each item inside + * items.pages contain the following elements: + * - href: URL with appropriate query parameters for the item. + * - attributes: A keyed list of HTML attributes for the item. + * - text: The visible text used for the item link, such as "‹ Previous" + * or "Next ›". + * - current: The page number of the current page. + * - ellipses: If there are more pages than the quantity allows, then an + * ellipsis before or after the listed pages may be present. + * - previous: Present if the currently visible list of pages does not start + * at the first page. + * - next: Present if the visible list of pages ends before the last page. + * + * @see template_preprocess_pager() + * + * @todo review all uses of the replace() filter below in + * https://www.drupal.org/node/3053707 as the behavior it addresses will + * likely change when that issue is completed. + */ +#} +{% if items %} + +{% endif %} diff --git a/public/themes/custom/ubccs/templates/navigation/prevnext.html.twig b/public/themes/custom/ubccs/templates/navigation/prevnext.html.twig new file mode 100644 index 0000000..af0e354 --- /dev/null +++ b/public/themes/custom/ubccs/templates/navigation/prevnext.html.twig @@ -0,0 +1,29 @@ +{# +/** + * @file prevnext.html.twig + * Default theme implementation to the prevnext indicator. + * + * Available variables: + * - direction: "previous" or "next" + * - text: The translated text for "Previous" or "Next" + * - nid: The node NID of the destination link + * - url: A formatted absolute URL for the path /node/$nid + * - void: A flag indicating wether this element should be completelly skipped. TRUE means there is no available $nid. + * + */ +#} + +{% if not void %} + + +{% endif %} diff --git a/public/themes/custom/ubccs/templates/profile/profile--main--full.html.twig b/public/themes/custom/ubccs/templates/profile/profile--main--full.html.twig new file mode 100644 index 0000000..8824810 --- /dev/null +++ b/public/themes/custom/ubccs/templates/profile/profile--main--full.html.twig @@ -0,0 +1,36 @@ +{# +/** + * @file + * + * Default theme implementation for profiles. + * + * Available variables: + * - content: Items for the content of the profile. + * Use 'content' to print them all, or print a subset such as + * 'content.title'. Use the following code to exclude the + * printing of a given child element: + * @code + * {{ content|without('title') }} + * @endcode + * - attributes: HTML attributes for the wrapper. + * - profile: The profile object. + * - url: The profile URL, if available. + * - title_suffix: Additional output populated by modules, intended to be + * displayed after the main title tag that appears in the template. + * + * @ingroup themeable + */ +#} + + {{ title_suffix.contextual_links }} +
+
+ {{ content.field_person_img }} +
+
+ {{ content|without('field_person_img') }} +
+
+ {{ cv_profile }} + {{ post_content_custom_blocks }} + diff --git a/public/themes/custom/ubccs/templates/profile/profile--main--linked-name.html.twig b/public/themes/custom/ubccs/templates/profile/profile--main--linked-name.html.twig new file mode 100644 index 0000000..e26a69f --- /dev/null +++ b/public/themes/custom/ubccs/templates/profile/profile--main--linked-name.html.twig @@ -0,0 +1,24 @@ +{# +/** + * @file + * + * Default theme implementation for profiles. + * + * Available variables: + * - content: Items for the content of the profile. + * Use 'content' to print them all, or print a subset such as + * 'content.title'. Use the following code to exclude the + * printing of a given child element: + * @code + * {{ content|without('title') }} + * @endcode + * - attributes: HTML attributes for the wrapper. + * - profile: The profile object. + * - url: The profile URL, if available. + * - title_suffix: Additional output populated by modules, intended to be + * displayed after the main title tag that appears in the template. + * + * @ingroup themeable + */ +#} +{{ content }} diff --git a/public/themes/custom/ubccs/templates/profile/profile--main--teaser.html.twig b/public/themes/custom/ubccs/templates/profile/profile--main--teaser.html.twig new file mode 100644 index 0000000..0c03120 --- /dev/null +++ b/public/themes/custom/ubccs/templates/profile/profile--main--teaser.html.twig @@ -0,0 +1,57 @@ +{# +/** + * @file + * + * Default theme implementation for profiles. + * + * Available variables: + * - content: Items for the content of the profile. + * Use 'content' to print them all, or print a subset such as + * 'content.title'. Use the following code to exclude the + * printing of a given child element: + * @code + * {{ content|without('title') }} + * @endcode + * - attributes: HTML attributes for the wrapper. + * - profile: The profile object. + * - url: The profile URL, if available. + * - title_suffix: Additional output populated by modules, intended to be + * displayed after the main title tag that appears in the template. + * + * @ingroup themeable + */ +#} + + {{ title_suffix.contextual_links }} +
+
+ {% if profile.field_person_img.value %} + {{ content.field_person_img }} + {% else %} +
+ {{ profile.field_person_fname.value[:1]|upper }}{{ profile.field_person_lname.value[:1]|upper }} +
+ {% endif %} +
+
+
+ +
+ {{ profile.field_person_job_title.value }} +
+ + + +
+ diff --git a/public/themes/custom/ubccs/templates/views/views-exposed-form.html.twig b/public/themes/custom/ubccs/templates/views/views-exposed-form.html.twig new file mode 100644 index 0000000..edccd0d --- /dev/null +++ b/public/themes/custom/ubccs/templates/views/views-exposed-form.html.twig @@ -0,0 +1,19 @@ +{# +/** + * @file + * Theme override for a views exposed form. + * + * Available variables: + * - form: A render element representing the form. + * + * @see template_preprocess_views_exposed_form() + */ +#} +{% if q is not empty %} + {# + This ensures that, if clean URLs are off, the 'q' is added first, + as a hidden form element, so that it shows up first in the POST URL. + #} +{{ q }} +{% endif %} +{{ form }} diff --git a/public/themes/custom/ubccs/templates/views/views-mini-pager.html.twig b/public/themes/custom/ubccs/templates/views/views-mini-pager.html.twig new file mode 100644 index 0000000..c84eb71 --- /dev/null +++ b/public/themes/custom/ubccs/templates/views/views-mini-pager.html.twig @@ -0,0 +1,54 @@ +{# +/** + * @file + * Theme override for a views mini-pager. + * + * Available variables: + * - heading_id: Pagination heading ID. + * - items: List of pager items. + * + * @see template_preprocess_views_mini_pager() + */ +#} +{% + set pager_action_classes = [ + 'pager__link', + 'pager__link--mini', + 'pager__link--action-link' + ] +%} +{% if items.previous or items.next %} + + {{ 'Pagination'|t }} + + {% if items.previous %} + {% apply spaceless %} +
  • + + {{ 'Previous page'|t }} + +
  • + {% endapply %} + {% endif %} + + {% if items.current %} +
  • + + {{ 'Current page'|t }} + + {{ items.current }} +
  • + {% endif %} + + {% if items.next %} + {% apply spaceless %} +
  • + + {{ 'Next page'|t }} + +
  • + {% endapply %} + {% endif %} + + +{% endif %} diff --git a/public/themes/custom/ubccs/templates/views/views-view--research--block-1.html.twig b/public/themes/custom/ubccs/templates/views/views-view--research--block-1.html.twig new file mode 100644 index 0000000..aded520 --- /dev/null +++ b/public/themes/custom/ubccs/templates/views/views-view--research--block-1.html.twig @@ -0,0 +1,91 @@ +{# +/** + * @file + * Default theme implementation for main view template. + * + * Available variables: + * - attributes: Remaining HTML attributes for the element. + * - css_name: A CSS-safe version of the view name. + * - css_class: The user-specified classes names, if any. + * - header: The optional header. + * - footer: The optional footer. + * - rows: The results of the view query, if any. + * - empty: The content to display if there are no rows. + * - pager: The optional pager next/prev links to display. + * - exposed: Exposed widget form/info to display. + * - feed_icons: Optional feed icons to display. + * - more: An optional link to the next page of results. + * - title: Title of the view, only used when displaying in the admin preview. + * - title_prefix: Additional output populated by modules, intended to be + * displayed in front of the view title. + * - title_suffix: Additional output populated by modules, intended to be + * displayed after the view title. + * - attachment_before: An optional attachment view to be displayed before the + * view content. + * - attachment_after: An optional attachment view to be displayed after the + * view content. + * - dom_id: Unique id for every view being printed to give unique class for + * Javascript. + * + * @see template_preprocess_views_view() + * + * @ingroup themeable + */ +#} +{% + set classes = [ + 'view', + 'view-' ~ id|clean_class, + 'view-id-' ~ id, + 'view-display-id-' ~ display_id, + dom_id ? 'js-view-dom-id-' ~ dom_id, +] +%} + +
    + + +
    + + {{ title_prefix }} + {{ title }} + {{ title_suffix }} + + {% if header %} +
    + {{ header }} +
    + {% endif %} + + {{ exposed }} + {{ attachment_before }} + + {% if rows -%} + {{ rows }} + {% elseif empty -%} + {{ empty }} + {% endif %} + {{ pager }} + + {{ attachment_after }} + {{ more }} + + {% if footer %} +
    + {{ footer }} +
    + {% endif %} + + {{ feed_icons }} + + + diff --git a/public/themes/custom/ubccs/templates/views/views-view-list--research--block-1.html.twig b/public/themes/custom/ubccs/templates/views/views-view-list--research--block-1.html.twig new file mode 100644 index 0000000..918a0ae --- /dev/null +++ b/public/themes/custom/ubccs/templates/views/views-view-list--research--block-1.html.twig @@ -0,0 +1,47 @@ +{# +/** + * @file + * Default theme implementation for a view template to display a list of rows. + * + * Available variables: + * - attributes: HTML attributes for the container. + * - rows: A list of rows for this list. + * - attributes: The row's HTML attributes. + * - content: The row's contents. + * - title: The title of this group of rows. May be empty. + * - list: @todo. + * - type: Starting tag will be either a ul or ol. + * - attributes: HTML attributes for the list element. + * + * @see template_preprocess_views_view_list() + * + * @ingroup themeable + */ +#} + + {% if title %} +

    {{ title }}

    + {% endif %} + +
    + +
    + <{{ list.type }}{{ list.attributes }}> + + {% for row in rows %} + + {{- row.content -}} + + {% endfor %} + + +
    +
    + diff --git a/public/themes/custom/ubccs/templates/views/views-view-table--course-list.html.twig b/public/themes/custom/ubccs/templates/views/views-view-table--course-list.html.twig new file mode 100644 index 0000000..d1d4dfb --- /dev/null +++ b/public/themes/custom/ubccs/templates/views/views-view-table--course-list.html.twig @@ -0,0 +1,135 @@ +{# +/** + * @file + * Theme override for displaying a view as a table. + * + * Available variables: + * - attributes: Remaining HTML attributes for the element. + * - class: HTML classes that can be used to style contextually through CSS. + * - title : The title of this group of rows. + * - header: The table header columns. + * - attributes: Remaining HTML attributes for the element. + * - content: HTML classes to apply to each header cell, indexed by + * the header's key. + * - default_classes: A flag indicating whether default classes should be + * used. + * - caption_needed: Is the caption tag needed. + * - caption: The caption for this table. + * - accessibility_description: Extended description for the table details. + * - accessibility_summary: Summary for the table details. + * - rows: Table row items. Rows are keyed by row number. + * - attributes: HTML classes to apply to each row. + * - columns: Row column items. Columns are keyed by column number. + * - attributes: HTML classes to apply to each column. + * - content: The column content. + * - default_classes: A flag indicating whether default classes should be + * used. + * - responsive: A flag indicating whether table is responsive. + * - sticky: A flag indicating whether table header is sticky. + * - summary_element: A render array with table summary information (if any). + * + * @see template_preprocess_views_view_table() + */ +#} +{% + set classes = [ + 'views-table', + 'views-view-table', + 'cols-' ~ header|length, + responsive ? 'responsive-enabled', + sticky ? 'sticky-enabled', + ] +%} +
    + {% endif %} + + + {% if header %} + + + {% for key, column in header %} + {% if column.default_classes %} + {% + set column_classes = [ + 'views-field', + 'views-field-' ~ fields[key], + ] + %} + {% endif %} + + {%- if column.wrapper_element -%} + <{{ column.wrapper_element }}> + {%- if column.url -%} + {{ column.content }}{{ column.sort_indicator }} + {%- else -%} + {{ column.content }}{{ column.sort_indicator }} + {%- endif -%} + + {%- else -%} + {%- if column.url -%} + {{ column.content }}{{ column.sort_indicator }} + {%- else -%} + {{- column.content }}{{ column.sort_indicator }} + {%- endif -%} + {%- endif -%} + + {% endfor %} + + Details + + + + {% endif %} + + {% for i, row in rows %} + + {% for key, column in row.columns %} + {% if column.default_classes %} + {% + set column_classes = [ + 'views-field' + ] + %} + {% for field in column.fields %} + {% set column_classes = column_classes|merge(['views-field-' ~ field]) %} + {% endfor %} + {% endif %} + + {%- if column.wrapper_element -%} + <{{ column.wrapper_element }}> + {% for content in column.content %} + {{ content.separator }}{{ content.field_output }} + {% endfor %} + + {%- else -%} + {% for content in column.content %} + {{- content.separator }}{{ content.field_output -}} + {% endfor %} + {%- endif %} + + {% endfor %} + + + + + + {% endfor %} + +
    + {% if caption %} + {{ caption }} + {% else %} + {{ title }} + {% endif %} + {% if (summary_element is not empty) %} + {{ summary_element }} + {% endif %} +
    +
    diff --git a/public/themes/custom/ubccs/templates/views/views-view-table.html.twig b/public/themes/custom/ubccs/templates/views/views-view-table.html.twig new file mode 100644 index 0000000..aeeae92 --- /dev/null +++ b/public/themes/custom/ubccs/templates/views/views-view-table.html.twig @@ -0,0 +1,120 @@ +{# +/** + * @file + * Theme override for displaying a view as a table. + * + * Available variables: + * - attributes: Remaining HTML attributes for the element. + * - class: HTML classes that can be used to style contextually through CSS. + * - title : The title of this group of rows. + * - header: The table header columns. + * - attributes: Remaining HTML attributes for the element. + * - content: HTML classes to apply to each header cell, indexed by + * the header's key. + * - default_classes: A flag indicating whether default classes should be + * used. + * - caption_needed: Is the caption tag needed. + * - caption: The caption for this table. + * - accessibility_description: Extended description for the table details. + * - accessibility_summary: Summary for the table details. + * - rows: Table row items. Rows are keyed by row number. + * - attributes: HTML classes to apply to each row. + * - columns: Row column items. Columns are keyed by column number. + * - attributes: HTML classes to apply to each column. + * - content: The column content. + * - default_classes: A flag indicating whether default classes should be + * used. + * - responsive: A flag indicating whether table is responsive. + * - sticky: A flag indicating whether table header is sticky. + * - summary_element: A render array with table summary information (if any). + * + * @see template_preprocess_views_view_table() + */ +#} +{% + set classes = [ + 'views-table', + 'views-view-table', + 'cols-' ~ header|length, + responsive ? 'responsive-enabled', + sticky ? 'sticky-enabled', + ] +%} + + {% if caption_needed %} + + {% if caption %} +

    {{ caption }}

    + {% else %} + {{ title }} + {% endif %} + {% if (summary_element is not empty) %} + {{ summary_element }} + {% endif %} + + {% endif %} + {% if header %} + + + {% for key, column in header %} + {% if column.default_classes %} + {% + set column_classes = [ + 'views-field', + 'views-field-' ~ fields[key], + ] + %} + {% endif %} + + {%- if column.wrapper_element -%} + <{{ column.wrapper_element }}> + {%- if column.url -%} + {{ column.content }}{{ column.sort_indicator }} + {%- else -%} + {{ column.content }}{{ column.sort_indicator }} + {%- endif -%} + + {%- else -%} + {%- if column.url -%} + {{ column.content }}{{ column.sort_indicator }} + {%- else -%} + {{- column.content }}{{ column.sort_indicator }} + {%- endif -%} + {%- endif -%} + + {% endfor %} + + + {% endif %} + + {% for row in rows %} + + {% for key, column in row.columns %} + {% if column.default_classes %} + {% + set column_classes = [ + 'views-field' + ] + %} + {% for field in column.fields %} + {% set column_classes = column_classes|merge(['views-field-' ~ field]) %} + {% endfor %} + {% endif %} + + {%- if column.wrapper_element -%} + <{{ column.wrapper_element }}> + {% for content in column.content %} + {{ content.separator }}{{ content.field_output }} + {% endfor %} + + {%- else -%} + {% for content in column.content %} + {{- content.separator }}{{ content.field_output -}} + {% endfor %} + {%- endif %} + + {% endfor %} + + {% endfor %} + + diff --git a/public/themes/custom/ubccs/templates/views/views-view-unformatted.html.twig b/public/themes/custom/ubccs/templates/views/views-view-unformatted.html.twig new file mode 100644 index 0000000..486f734 --- /dev/null +++ b/public/themes/custom/ubccs/templates/views/views-view-unformatted.html.twig @@ -0,0 +1,30 @@ +{# +/** + * @file + * Theme override to display a view of unformatted rows. + * + * Available variables: + * - title: The title of this group of rows. May be empty. + * - rows: A list of the view's row items. + * - attributes: The row's HTML attributes. + * - content: The row's content. + * - view: The view object. + * - default_row_class: A flag indicating whether default classes should be + * used on rows. + * + * @see template_preprocess_views_view_unformatted() + */ +#} +{% if title %} +

    {{ title }}

    +{% endif %} +{% for row in rows %} + {% + set row_classes = [ + default_row_class ? 'views-row', + ] + %} + + {{- row.content -}} + +{% endfor %} diff --git a/public/themes/custom/ubccs/ubccs.info.yml b/public/themes/custom/ubccs/ubccs.info.yml new file mode 100644 index 0000000..e003076 --- /dev/null +++ b/public/themes/custom/ubccs/ubccs.info.yml @@ -0,0 +1,30 @@ +name: UBC CS +type: theme +description: This is a responsive UBC CLF (Common Look and Feel) theme, developed by UBC IT Web Services Department. The CLF is developed, managed and distributed by UBC Communications & Marketing. To find out more about the CLF, requirements and possible customizations please see brand.ubc.ca/clf.

    For more information, support or to report an issue with this theme, please contact UBC IT Web Services. +package: UBC +core_version_requirement: ^8 || ^9 +base theme: galactus + +libraries: + - ubccs/global + - ubccs/bootstrap + - ubccs/fancybox +# - ubccs/font + - ubccs/fontawesome.svg.base + - ubccs/fontawesome.svg.solid + - ubccs/fontawesome.svg.brands + +libraries-override: + # Replace with a newer version of normalize, fixes details elements. + core/normalize: false + # Replaced in components/_caption.scss. + filter/caption: false + # Replaced in core and stable align.module.css with components/_align.scss. + system/base: + css: + component: + css/components/align.module.css: false + /core/themes/stable/css/system/components/align.module.css: false + +ckeditor5-stylesheets: + - css/ckeditor5.css diff --git a/public/themes/custom/ubccs/ubccs.layouts.yml b/public/themes/custom/ubccs/ubccs.layouts.yml new file mode 100644 index 0000000..69a8c47 --- /dev/null +++ b/public/themes/custom/ubccs/ubccs.layouts.yml @@ -0,0 +1,13 @@ +landing_banner: + label: 'Landing Banner' + category: 'UBC CS' + template: templates/component/landing-banner + default_region: image + icon_map: + - [image] + - [title] + regions: + image: + label: Image + title: + label: Title diff --git a/public/themes/custom/ubccs/ubccs.libraries.yml b/public/themes/custom/ubccs/ubccs.libraries.yml new file mode 100644 index 0000000..17df682 --- /dev/null +++ b/public/themes/custom/ubccs/ubccs.libraries.yml @@ -0,0 +1,107 @@ +# Global Styles. +global: + css: + base: + css/normalize.css: { weight: -20 } + component: + /core/themes/classy/css/components/action-links.css: { weight: -10 } + /core/themes/classy/css/components/breadcrumb.css: { weight: -10 } + /core/themes/classy/css/components/button.css: { weight: -10 } + /core/themes/classy/css/components/collapse-processed.css: { weight: -10 } + /core/themes/classy/css/components/container-inline.css: { weight: -10 } + /core/themes/classy/css/components/details.css: { weight: -10 } + /core/themes/classy/css/components/exposed-filters.css: { weight: -10 } + /core/themes/classy/css/components/field.css: { weight: -10 } + /core/themes/classy/css/components/form.css: { weight: -10 } + /core/themes/classy/css/components/icons.css: { weight: -10 } + /core/themes/classy/css/components/inline-form.css: { weight: -10 } + /core/themes/classy/css/components/item-list.css: { weight: -10 } + /core/themes/classy/css/components/link.css: { weight: -10 } + /core/themes/classy/css/components/links.css: { weight: -10 } + /core/themes/classy/css/components/menu.css: { weight: -10 } + /core/themes/classy/css/components/more-link.css: { weight: -10 } +# /core/themes/classy/css/components/pager.css: false + /core/themes/classy/css/components/tabledrag.css: { weight: -10 } + /core/themes/classy/css/components/tableselect.css: { weight: -10 } + /core/themes/classy/css/components/tablesort.css: { weight: -10 } + /core/themes/classy/css/components/tabs.css: { weight: -10 } + /core/themes/classy/css/components/textarea.css: { weight: -10 } + /core/themes/classy/css/components/ui-dialog.css: { weight: -10 } + css/select2.css: {} + theme: + css/local.clf.fixes.css: {} + css/main.css: {} + css/layout.css: {} + css/timeline.css: {} + css/print.css: { media: print } + js: + js/main.js: {} + +# Fancybox. +fancybox: + css: + theme: + js/vendor/fancybox/jquery.fancybox.css: {} + js: + js/vendor/fancybox/jquery.fancybox.js: {} + +# Bootstrap Styles. +bootstrap: + css: + theme: + css/bootstrap.css: { weight: -9 } + +font: + remote: https://fonts.google.com + license: + name: Apache License, Version 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0 + gpl-compatible: false + css: + base: + 'https://fonts.googleapis.com/css2?family=Merriweather:ital@0;1&family=Open+Sans:ital,wght@0,400;0,700;1,400&display=swap': + type: external + weight: -20 + +# Fontawesome JS. +fontawesome.svg.base: + version: 5.13.1 + license: + url: https://fontawesome.com/license + gpl-compatible: false + header: true + js: + /libraries/fontawesome/js/fontawesome.min.js: { minified: true } + +fontawesome.svg.regular: + version: 5.13.1 + license: + url: https://fontawesome.com/license + gpl-compatible: false + header: true + js: + /libraries/fontawesome/js/regular.min.js: { minified: true } + dependencies: + - ubccs/fontawesome.svg.base + +fontawesome.svg.solid: + version: 5.13.1 + license: + url: https://fontawesome.com/license + gpl-compatible: false + header: true + js: + /libraries/fontawesome/js/solid.min.js: { minified: true } + dependencies: + - ubccs/fontawesome.svg.base + +fontawesome.svg.brands: + version: 5.13.1 + license: + url: https://fontawesome.com/license + gpl-compatible: false + header: true + js: + /libraries/fontawesome/js/brands.min.js: { minified: true } + dependencies: + - ubccs/fontawesome.svg.base diff --git a/public/themes/custom/ubccs/ubccs.theme b/public/themes/custom/ubccs/ubccs.theme new file mode 100644 index 0000000..c47c419 --- /dev/null +++ b/public/themes/custom/ubccs/ubccs.theme @@ -0,0 +1,100 @@ +getStorage('node'); + $schedule = $storage->loadByProperties(['field_event' => $variables['node']->ID()]); + + if (!empty($schedule)) { + $schedule = reset($schedule); + + /** @var \Drupal\Core\Entity\EntityViewBuilderInterface $render_controller */ + $render_controller = \Drupal::entityTypeManager()->getViewBuilder('node'); + // Inject the rendered content directly into variable twig can handle. + $variables['content']['schedule'] = $render_controller->view($schedule, 'teaser'); + } + +} + +/** + * Adjust styling of fields. + */ +function ubccs_preprocess_field(&$variables) { + // Customize only on profile pages. + if ($variables['entity_type'] != 'profile') { + return; + } + + $element = $variables['element']; + if (isset($element['#field_name'])) { + // Change labels to H2. + $fields_label_transform = [ + 'field_person_cv', + 'field_computing_keywords', + 'field_person_interests', + 'field_selected_publications', + 'field_research_interests', + 'field_research_groups', + ]; + if (in_array($element['#field_name'], $fields_label_transform)) { + $variables['label'] = ['#markup' => '

    ' . $variables['label'] . '

    ']; + } + + if ($element['#field_name'] == 'field_person_job_title') { + $variables['items'][0]['content']['#prefix'] = '

    '; + $variables['items'][0]['content']['#suffix'] = '

    '; + } + + } +} + +/** + * Implements hook_theme_suggestions_HOOK_alter(). + */ +function ubccs_theme_suggestions_node_alter(array &$suggestions, array $variables) { + $new_suggestions = []; + + // Order the view_mode more specific than the bundle. + $node = $variables['elements']['#node']; + $sanitized_view_mode = strtr($variables['elements']['#view_mode'], '.', '_'); + $new_suggestions[] = 'node__' . $node->bundle(); + $new_suggestions[] = 'node__' . $sanitized_view_mode; + $new_suggestions[] = 'node__' . $node->bundle() . '__' . $sanitized_view_mode; + $new_suggestions[] = 'node__' . $node->id() . '__' . $sanitized_view_mode; + $new_suggestions[] = 'node__' . $node->id(); + + $suggestions = array_diff($suggestions, $new_suggestions); + $suggestions = array_merge($new_suggestions, $suggestions); +} + +/** + * + */ +function ubccs_theme_suggestions_block_alter(array &$suggestions, array $variables) { + // Block suggestions for custom block bundles. + if (isset($variables['elements']['content']['#block_content'])) { + array_splice($suggestions, 1, 0, 'block__bundle__' . $variables['elements']['content']['#block_content']->bundle()); + } +} + +/** + * + */ +function ubccs_preprocess_html(&$variables) { + $current_uri = \Drupal::request()->getRequestUri(); + if (strpos($current_uri, 'reading-room/') !== FALSE) { + // Children pages of the reading room page. + $variables['head_title'] = 'ICICS/Computer Science Reading Room: ' . $variables['head_title']['title']; + } +}