From 6cb2dc40d8f5d6ec25c44df1a50e94ec14567a5e Mon Sep 17 00:00:00 2001 From: "@slovacus" Date: Tue, 13 Jun 2017 14:01:22 -0500 Subject: [PATCH 01/43] !#1 Add: settings projects --- .bumpversion.cfg | 6 - .editorconfig | 28 ---- .gitignore | 83 --------- .mailmap | 4 - .pre-commit-config.yaml | 90 ---------- .projectile | 10 -- .pylintrc | 361 ---------------------------------------- .travis.yml | 3 - 8 files changed, 585 deletions(-) delete mode 100644 .bumpversion.cfg delete mode 100644 .editorconfig delete mode 100644 .gitignore delete mode 100644 .mailmap delete mode 100644 .pre-commit-config.yaml delete mode 100644 .projectile delete mode 100644 .pylintrc delete mode 100644 .travis.yml diff --git a/.bumpversion.cfg b/.bumpversion.cfg deleted file mode 100644 index f72875d..0000000 --- a/.bumpversion.cfg +++ /dev/null @@ -1,6 +0,0 @@ -[bumpversion] -files = VERSION .bumpversion.cfg README.rst -commit = True -tag = False -current_version = 0.0.2 - diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index c7bd957..0000000 --- a/.editorconfig +++ /dev/null @@ -1,28 +0,0 @@ -# http://editorconfig.org -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -trim_trailing_whitespace = true -charset = utf-8 -insert_final_newline = false -max_line_length = 80 - -[*.{py,sh,sql}] -indent_size = 4 - -[*.md] -trim_trailing_whitespace = false - -# Tabs -[*.{less,css}] -indent_style = tab - -[Vagrantfile] -indent_style = tab - -[Makefile] -indent_style = tab -indent_size = 4 diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 1118a87..0000000 --- a/.gitignore +++ /dev/null @@ -1,83 +0,0 @@ -# Static and media development files. -media/ -src/assets/ -static/ -staticfiles/ - -# gulp-compass metafile - -# Node metadata -node_modules - -# SASS metadata -*.sass-cache - -# Bower directory -bower_components - -# Local databases -*.sqlite3 - -*.bak -.#* -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -env/ -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -*.egg-info/ -.installed.cfg -*.egg - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*,cover - -# Translations -*.mo -*.pot - -# Django stuff: -*.log - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# ignored files Vagrant -.vagrant diff --git a/.mailmap b/.mailmap deleted file mode 100644 index f6a2e2b..0000000 --- a/.mailmap +++ /dev/null @@ -1,4 +0,0 @@ -@slovacus luis mayta luis alberto mayta -@slovacus Luis Alberto Mayta Mamani -@slovacus luis alberto mayta -@slovacus Lmayta Luis Alberto Mayta M diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index c148923..0000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,90 +0,0 @@ -- repo: https://github.com/pre-commit/pre-commit-hooks.git - sha: v0.9.1 - hooks: - - id: detect-private-key - files: ^(?!\.?git-crypt) - - id: check-merge-conflict - - id: trailing-whitespace - language_version: python3 - files: ^tf|-|\.(py|tfvars|tf|tfenv|env|yml|yaml|pem|key|mock)$ - - id: end-of-file-fixer - files: ^tf|-|\.(py|tfvars|tf|tfenv|env|yml|yaml|pem|key|mock)$ - language_version: python3 - - id: check-added-large-files - files: ^tf|-|\.(py|env|yml|yaml)$ - - id: check-case-conflict - - id: check-json - language_version: python3 - - id: check-xml - language_version: python3 - - id: check-yaml - language_version: python3 - - id: check-case-conflict - - id: check-ast - language_version: python3 - - id: debug-statements - - id: autopep8-wrapper - args: - - -i - - --ignore=E501 - language_version: python3 - - id: double-quote-string-fixer - - id: check-docstring-first - - id: pretty-format-json - - id: debug-statements - - id: detect-aws-credentials - - id: requirements-txt-fixer - - id: name-tests-test - - id: file-contents-sorter - - id: fix-encoding-pragma - - id: no-commit-to-branch - - id: sort-simple-yaml - - id: flake8 - files: ^src/.*\.py$ - args: - - --max-line-length=80 - - --diff - - --exclude=docs,migrations -- repo: https://github.com/pre-commit/mirrors-pylint.git - sha: v1.7.2 - hooks: - - id: pylint - language_version: python3 - exclude: ^migrations/.*\.py$ - args: - - --rcfile=.pylintrc - - --errors-only - - --disable=no-name-in-module,import-error - - --ignore=settings_test, migrations -- repo: https://github.com/pre-commit/pre-commit.git - sha: v0.15.4 - hooks: - - id: validate_config - - id: validate_manifest -- repo: https://github.com/FalconSocial/pre-commit-python-sorter.git - sha: 1.0.4 - hooks: - - id: python-import-sorter - args: - - --silent-overwrite -- repo: https://github.com/detailyang/pre-commit-shell.git - sha: 1.0.1 - hooks: - - id: shell-lint - exclude: ^script/wait-for-it.sh$ - args: - - --exclude=SC1072,SC1073,SC2068 -- repo: https://github.com/antonbabenko/pre-commit-terraform.git - sha: v1.2.0 - hooks: - - id: terraform_fmt -- repo: https://github.com/Lucas-C/pre-commit-hooks-safety - sha: v1.1.0 - hooks: - - id: python-safety-dependencies-check -- repo: https://github.com/Lucas-C/pre-commit-hooks-bandit - sha: v1.0.3 - hooks: - - id: python-bandit-vulnerability-check - args: [] - files: .py$ diff --git a/.projectile b/.projectile deleted file mode 100644 index e30fa96..0000000 --- a/.projectile +++ /dev/null @@ -1,10 +0,0 @@ --/log --/tmp --/.git --/.vagrant --/vendor --/auto-save-list --*.cache --*.pyc --.wercker/* --projectile-bookmarks.eld diff --git a/.pylintrc b/.pylintrc deleted file mode 100644 index 248efc6..0000000 --- a/.pylintrc +++ /dev/null @@ -1,361 +0,0 @@ -[MASTER] - -# Specify a configuration file. -#rcfile= - -# Python code to execute, usually for sys.path manipulation such as -# pygtk.require(). -#init-hook= - -# Profiled execution. -# profile=no - -# Add files or directories to the blacklist. They should be base names, not -# paths. -ignore=migrations/{0000..1000}*, settings.py, settings_openshift.py, settings_test, settings_test.py, settings_test_mysql.py, settings_test_postgresql.py, settings_test_sqlite.py, .git, test-repos, repos, settings_test_nose.py - -# Pickle collected data for later comparisons. -persistent=yes - -# List of plugins (as comma separated values of python modules names) to load, -# usually to register additional checkers. -load-plugins= - - -[MESSAGES CONTROL] - -# Enable the message, report, category or checker with the given id(s). You can -# either give multiple identifier separated by comma (,) or put this option -# multiple time. See also the "--disable" option for examples. -#enable= - -# Disable the message, report, category or checker with the given id(s). You -# can either give multiple identifiers separated by comma (,) or put this -# option multiple times (only on the command line, not in the configuration -# file where it should appear only once).You can also use "--disable=all" to -# disable everything first and then reenable specific checks. For example, if -# you want to run only the similarities checker, you can use "--disable=all -# --enable=similarities". If you want to run only the classes checker, but have -# no Warning level messages displayed, use"--disable=all --enable=classes -# --disable=W" -# C0111 Missing docstring -# I0011 Warning locally suppressed using disable-msg -# W0142 Used * or * magic* Used when a function or method is called using *args or **kwargs to dispatch arguments. -# W0613 Unused argument %r Used when a function or method argument is not used. -# R0201 Method could be a function -# E1101 does not work well on metaclasses like Django models or Mechanize browser -# E1103 does not work with WSGIRequest or file objects -# W0703 Catching too general exception Exception -# R0921,R0922 Is raised when abstract classes are used in different module -# E1002 Produces lot of false positives with Django 1.5 -# R0401(cyclic-import) we have too many of them -# C0411(wrong-import-order) should be probably fixed -# E1102: _ is not callable -# C0103: Invalid name -# C0301: Line too long -# C0302: Too many lines in module -# R0903: Too few public method -# R0904: Too many public methods -# R0912: Too many branches -# R0913: Too many arguments -# R0914: Too many local variables -# R0915: Too many statements -# R0201: Method could be a function -# W0142: Used * or ** magic -# W0231: __init__ method from base class is not called -# W0232: Class has no __init__ method -# W0212: Access to a protected member _meta of a client class - -disable=import-error,missing-super-argument,too-few-public-methods, - no-member,no-init,old-style-class,C0111,I0011,W0142,W0613, - E1103,E1101,E1102,R0401,R0921,R0922,E1002,C0411,W0703,R0201, - C0301,W0231,W0232,W0212 - - -[REPORTS] - -# Set the output format. Available formats are text, parseable, colorized, msvs -# (visual studio) and html. You can also give a reporter class, eg -# mypackage.mymodule.MyReporterClass. -output-format=text - -# Put messages in a separate file for each module / package specified on the -# command line instead of printing them on stdout. Reports (if any) will be -# written in a file name "pylint_global.[txt|html]". -files-output=no - -# Tells whether to display a full report or only the messages -reports=no - -# Python expression which should return a note less than 10 (10 is the highest -# note). You have access to the variables errors warning, statement which -# respectively contain the number of errors / warnings messages and the total -# number of statements analyzed. This is used by the global evaluation report -# (RP0004). -evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) - -# Add a comment according to your evaluation note. This is used by the global -# evaluation report (RP0004). -# comment=no - -# Template used to display messages. This is a python new-style format string -# used to format the message information. See doc for all details -msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg} - - -[TYPECHECK] - -# Tells whether missing members accessed in mixin class should be ignored. A -# mixin class is detected if its name ends with "mixin" (case insensitive). -ignore-mixin-members=yes - -# List of module names for which member attributes should not be checked -# (useful for modules/projects where namespaces are manipulated during runtime -# and thus extisting member attributes cannot be deduced by static analysis -ignored-modules= - -# List of classes names for which member attributes should not be checked -# (useful for classes with attributes dynamically set). -ignored-classes=SQLObject - -# When zope mode is activated, add a predefined set of Zope acquired attributes -# to generated-members. -# zope=no - -# List of members which are set dynamically and missed by pylint inference -# system, and so shouldn't trigger E0201 when accessed. Python regular -# expressions are accepted. -generated-members=objects,DoesNotExist,id,pk,_meta,base_fields,context - - -[VARIABLES] - -# Tells whether we should check for unused import in __init__ files. -init-import=no - -# A regular expression matching the name of dummy variables (i.e. expectedly -# not used). -# dummy-variables-rgx=dummy,_ - -# List of additional names supposed to be defined in builtins. Remember that -# you should avoid to define new builtins when possible. -additional-builtins= - - -[FORMAT] - -# Maximum number of characters on a single line. -max-line-length=80 - -# Regexp for a line that is allowed to be longer than the limit. -ignore-long-lines=^\s*(# )??$ - -# Allow the body of an if to be on the same line as the test if there is no -# else. -single-line-if-stmt=no - -# List of optional constructs for which whitespace checking is disabled -no-space-check=trailing-comma,dict-separator - -# Maximum number of lines in a module -max-module-lines=1600 - -# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 -# tab). -indent-string=' ' - -# Number of spaces of indent required inside a hanging or continued line. -indent-after-paren=4 - - -[MISCELLANEOUS] - -# List of note tags to take in consideration, separated by a comma. -notes=FIXME,XXX,TODO - - -[SIMILARITIES] - -# Minimum lines number of a similarity. -min-similarity-lines=4 - -# Ignore comments when computing similarities. -ignore-comments=yes - -# Ignore docstrings when computing similarities. -ignore-docstrings=yes - -# Ignore imports when computing similarities. -ignore-imports=no - - -[BASIC] - -# Required attributes for module, separated by a comma -# required-attributes= - -# List of builtins function names that should not be used, separated by a comma -bad-functions=map,filter,apply,input,file - -# Good variable names which should always be accepted, separated by a comma -good-names=_,i,j,k,e,qs,pk,setUp,tearDown,id - -# Bad variable names which should always be refused, separated by a comma -bad-names=foo,bar,baz,toto,tutu,tata - -# Colon-delimited sets of names that determine each other's naming style when -# the name regexes allow several styles. -name-group= - -# Include a hint for the correct naming format with invalid-name -include-naming-hint=no - -# Regular expression matching correct function names -function-rgx=[a-zA_][a-zA-Z0-9_]{2,70}$ - -# Naming hint for function names -function-name-hint=[a-z_][a-z0-9_]{2,30}$ - -# Regular expression matching correct variable names -variable-rgx=[a-z_][a-z0-9_]{2,30}$ - -# Naming hint for variable names -variable-name-hint=[a-z_][a-z0-9_]{2,30}$ - -# Regular expression matching correct constant names -const-rgx=(([A-Z_][A-Z0-9_]*)|([a-z_][a-z0-9_]*)|(__.*__)|register|urlpatterns)$ - -# Naming hint for constant names -const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ - -# Regular expression matching correct attribute names -attr-rgx=[a-z_][a-z0-9_]{2,30}$ - -# Naming hint for attribute names -attr-name-hint=[a-z_][a-z0-9_]{2,30}$ - -# Regular expression matching correct argument names -argument-rgx=[a-z_][a-z0-9_]{2,30}$ - -# Naming hint for argument names -argument-name-hint=[a-z_][a-z0-9_]{2,30}$ - -# Regular expression matching correct class attribute names -class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ - -# Naming hint for class attribute names -class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ - -# Regular expression matching correct inline iteration names -inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ - -# Naming hint for inline iteration names -inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$ - -# Regular expression matching correct class names -class-rgx=[A-Z_][a-zA-Z0-9_]+$ - -# Naming hint for class names -class-name-hint=[A-Z_][a-zA-Z0-9]+$ - -# Regular expression matching correct module names -module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ - -# Naming hint for module names -module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ - -# Regular expression matching correct method names -method-rgx=[a-z_][a-zA-Z0-9_]{2,70}$ - -# Naming hint for method names -method-name-hint=[a-z_][a-z0-9_]{2,30}$ - -# Regular expression which should only match function or class names that do -# not require a docstring. -no-docstring-rgx=__.*__|_.* - -# Minimum line length for functions/classes that require docstrings, shorter -# ones are exempt. -docstring-min-length=-1 - - -[LOGGING] - -# Logging modules to check that the string format arguments are in logging -# function parameter format -logging-modules=logging - - -[IMPORTS] - -# Deprecated modules which should not be used, separated by a comma -deprecated-modules=regsub,TERMIOS,Bastion,rexec - -# Create a graph of every (i.e. internal and external) dependencies in the -# given file (report RP0402 must not be disabled) -import-graph= - -# Create a graph of external dependencies in the given file (report RP0402 must -# not be disabled) -ext-import-graph= - -# Create a graph of internal dependencies in the given file (report RP0402 must -# not be disabled) -int-import-graph= - - -[DESIGN] - -# Maximum number of arguments for function / method -max-args=10 - -# Argument names that match this expression will be ignored. Default to name -# with leading underscore -ignored-argument-names=_.* - -# Maximum number of locals for function / method body -max-locals=20 - -# Maximum number of return / yield for function / method body -max-returns=8 - -# Maximum number of branch for function / method body -max-branches=12 - -# Maximum number of statements in function / method body -max-statements=50 - -# Maximum number of parents for a class (see R0901). -max-parents=12 - -# Maximum number of attributes for a class (see R0902). -max-attributes=25 - -# Minimum number of public methods for a class (see R0903). -min-public-methods=0 - -# Maximum number of public methods for a class (see R0904). -max-public-methods=110 - - -[CLASSES] - -# List of interface methods to ignore, separated by a comma. This is used for -# instance to not check methods defines in Zope's Interface base class. -# ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by - -# List of method names used to declare (i.e. assign) instance attributes. -defining-attr-methods=__init__,__new__,setUp - -# List of valid names for the first argument in a class method. -valid-classmethod-first-arg=cls - -# List of valid names for the first argument in a metaclass class method. -valid-metaclass-classmethod-first-arg=mcs - - -[EXCEPTIONS] - -# Exceptions that will emit a warning when being caught. Defaults to -# "Exception" -overgeneral-exceptions=Exception diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 4cb949b..0000000 --- a/.travis.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- -language: python -python: "3.6.1" From 883c577e3a28632b69b76be53434d1941e0dd634 Mon Sep 17 00:00:00 2001 From: "@slovacus" Date: Tue, 13 Jun 2017 14:03:06 -0500 Subject: [PATCH 02/43] !#1 Add: dependences python --- requirements/dev.txt | 2 -- requirements/test.txt | 6 ------ 2 files changed, 8 deletions(-) delete mode 100644 requirements/dev.txt delete mode 100644 requirements/test.txt diff --git a/requirements/dev.txt b/requirements/dev.txt deleted file mode 100644 index ea06dfc..0000000 --- a/requirements/dev.txt +++ /dev/null @@ -1,2 +0,0 @@ --r ../requirements.txt --r setup.txt diff --git a/requirements/test.txt b/requirements/test.txt deleted file mode 100644 index 82a84a3..0000000 --- a/requirements/test.txt +++ /dev/null @@ -1,6 +0,0 @@ --r dev.txt -ansible-lint==3.4.3 -green==2.8.1 -mock==2.0.0 -PyHamcrest==1.9.0 -tox==2.7.0 From 0b24dac987659603058c9f981b86fb384d11111d Mon Sep 17 00:00:00 2001 From: "@slovacus" Date: Tue, 13 Jun 2017 14:03:53 -0500 Subject: [PATCH 03/43] !#1 Add: script for makefile --- Makefile | 103 ----------------------------------- script/bootstrap.sh | 22 -------- script/clean.sh | 20 ------- script/generate.sh | 9 +++ script/{setup.sh => grip.sh} | 3 +- script/gvm.sh | 21 +++++++ script/install.sh | 17 ------ script/linguist.sh | 6 ++ script/lintcode.sh | 8 +++ script/watch.sh | 9 +++ 10 files changed, 54 insertions(+), 164 deletions(-) delete mode 100644 Makefile delete mode 100755 script/bootstrap.sh delete mode 100755 script/clean.sh create mode 100755 script/generate.sh rename script/{setup.sh => grip.sh} (67%) create mode 100755 script/gvm.sh delete mode 100755 script/install.sh create mode 100755 script/linguist.sh create mode 100755 script/lintcode.sh create mode 100755 script/watch.sh diff --git a/Makefile b/Makefile deleted file mode 100644 index bf46784..0000000 --- a/Makefile +++ /dev/null @@ -1,103 +0,0 @@ -.PHONY: build deploy lint test functions help -.DEFAULT_GOAL := help - -DOCKER_NETWORK = slides-user-story_network -PROYECT_NAME = slides-user-story - -# Configuration. -SHELL = /bin/bash -ROOT_DIR = $(shell pwd) -MESSAGE="༼ つ ◕_◕ ༽つ" -MESSAGE_HAPPY="${MESSAGE} Happy Coding" -SCRIPT_DIR = $(ROOT_DIR)/script - -# Bin scripts -BUILD = $(shell) $(SCRIPT_DIR)/build.sh -CLEAN = $(shell) $(SCRIPT_DIR)/clean.sh -DOCUMENTATION = $(shell) $(SCRIPT_DIR)/documentation.sh -DOWN = $(shell) $(SCRIPT_DIR)/down.sh -PYENV = $(shell) $(SCRIPT_DIR)/pyenv.sh -INSTALL = $(shell) $(SCRIPT_DIR)/install.sh -LIST = $(shell) $(SCRIPT_DIR)/list.sh -LINT = $(shell) $(SCRIPT_DIR)/lint.sh -TEST = $(shell) $(SCRIPT_DIR)/test.sh -STOP = $(shell) $(SCRIPT_DIR)/stop.sh -SETUP = $(shell) $(SCRIPT_DIR)/setup.sh -UP = $(shell) $(SCRIPT_DIR)/up.sh - -build: ## Build docker container by env - make clean - @echo $(MESSAGE) "Building environment: ${env}" - $(BUILD) "${env}" && echo $(MESSAGE_HAPPY) - -clean: ## clean Files compiled - $(CLEAN) - - -environment: ## Make environment for developer - $(PYENV) - - -documentation: ## Make Documentation - make clean - $(DOCUMENTATION) - -down: ## remove containers docker by env - make clean - @echo $(MESSAGE) "Down Services Environment: ${env}" - $(DOWN) "${env}" && echo $(MESSAGE_HAPPY) - -env: ## Show envs available - @echo $(MESSAGE) "Environments:" - @echo "dev" - @echo "test" - @echo "stage" - -install: ## Install with var env Dependences - make clean - @echo $(MESSAGE) "Install environment: ${env}" - $(INSTALL) "${env}" && echo $(MESSAGE_HAPPY) - -list: ## List of current active services by env - make clean - @echo $(MESSAGE) "List Services: ${env}" - $(LIST) "${env}" && echo $(MESSAGE_HAPPY) - -lint: ## Clean files unnecesary - make clean - $(LINT) - -test: ## make test - make clean - $(TEST) - -up: ## Up application by env - make clean - make verify_network &> /dev/null - @echo $(MESSAGE) "Up Application environment: ${env}" - $(UP) "${env}" && echo $(MESSAGE_HAPPY) - -restart: ## Reload services - @echo $(MESSAGE) "restart Application environment: ${env}" - docker-compose restart - -ssh: ## Connect to container - docker exec -it $(CONTAINER) bash - -stop: ## stop containers docker by env - make clean - @echo $(MESSAGE) "Stop Services: ${env}" - $(STOP) "${env}" && echo $(MESSAGE_HAPPY) - -setup: ## Install dependences initial - make clean - $(SETUP) - -verify_network: ## Verify network - @if [ -z $$(docker network ls | grep $(DOCKER_NETWORK) | awk '{print $$2}') ]; then\ - (docker network create $(DOCKER_NETWORK));\ - fi - -help: ## Show help text - @echo $(MESSAGE) "Commands" - @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-20s\033[0m %s\n", $$1, $$2}' diff --git a/script/bootstrap.sh b/script/bootstrap.sh deleted file mode 100755 index 8eafa45..0000000 --- a/script/bootstrap.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash -# -*- coding: utf-8 -*- - -export PROJECT_NAME=slides-user-story -export PROJECT_NAME_DEV="${PROJECT_NAME}"-DEV -export PROJECT_NAME_STAGE="${PROJECT_NAME}"-STAGE -export PROJECT_NAME_TEST="${PROJECT_NAME}"-TEST - -export PYTHON_VERSION=3.6.1 -export PYENV_NAME="${PROJECT_NAME}" - -# Vars Dir -export ROOT_DIR -ROOT_DIR=$(pwd) -export RESOURCES_DIR="$ROOT_DIR/resources" -export RESOURCES_DB_DIR="$RESOURCES_DIR/db" -export PROVISION_DIR="$ROOT_DIR/provision/ansible" -export SOURCE_DIR="${ROOT_DIR}/" -export REQUIREMENTS_DIR="${ROOT_DIR}/requirements/" -export FILE_README="${ROOT_DIR}/README.rst" - -export MESSAGE="༼ つ ◕_◕ ༽つ" diff --git a/script/clean.sh b/script/clean.sh deleted file mode 100755 index b18815a..0000000 --- a/script/clean.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash -# -*- coding: utf-8 -*- - -# shellcheck source=/dev/null -[ -r "script/bootstrap.sh" ] && source "script/bootstrap.sh" - -# Clean - -# Code python -{ - rm -rf -- **/**/**/*_pycache__ - rm -rf -- **/**/**/*.pyc - rm -rf -- **/**/**/*.swp - find . -regex "\(.*__pycache__.*\|*.py[co]\)" -delete -} >> /dev/null 2>&1 - -# Sphinx -{ - rm -rf -- docs/_build/* -} >> /dev/null 2>&1 diff --git a/script/generate.sh b/script/generate.sh new file mode 100755 index 0000000..b7e87ce --- /dev/null +++ b/script/generate.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +# -*- coding: utf-8 -*- + +# shellcheck source=/dev/null +[ -r "script/bootstrap.sh" ] && source "script/bootstrap.sh" + +cd "${SOURCE_DIR}" || echo 'path not found' + +landslide "${ETC_DIR}/"landslide.cfg diff --git a/script/setup.sh b/script/grip.sh similarity index 67% rename from script/setup.sh rename to script/grip.sh index 656f593..7836582 100755 --- a/script/setup.sh +++ b/script/grip.sh @@ -4,5 +4,4 @@ # shellcheck source=/dev/null [ -r "script/bootstrap.sh" ] && source "script/bootstrap.sh" -pip install -r "${REQUIREMENTS_DIR}/"setup.txt -pre-commit install +grip --pass "${GITHUB_API_TOKEN}" "${GRIP_PORT}" diff --git a/script/gvm.sh b/script/gvm.sh new file mode 100755 index 0000000..0f07c8b --- /dev/null +++ b/script/gvm.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# -*- coding: utf-8 -*- + +# shellcheck source=/dev/null +[ -r "script/bootstrap.sh" ] && source "script/bootstrap.sh" + +# shellcheck source=/dev/null +[ -r "$HOME/.gvm/scripts/gvm" ] && source "$HOME/.gvm/scripts/gvm" + +gvm pkgset list | grep -q "${GVM_NAME}" +response=$? + +if [[ ! "${response}" -eq '0' ]]; then + gvm pkgset create "${GVM_NAME}" +fi + +gvm pkgset use "${GVM_NAME}" + +mkdir -p "${GOPATH}/src" +mkdir -p "${GOPATH}/pkg" +mkdir -p "${GOPATH}/bin" diff --git a/script/install.sh b/script/install.sh deleted file mode 100755 index dda0b98..0000000 --- a/script/install.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash -# -*- coding: utf-8 -*- - -# shellcheck source=/dev/null -[ -r "script/bootstrap.sh" ] && source "script/bootstrap.sh" - -if [ "$1" == "" ]; then - pip install -r requirements.txt -elif [ "$1" == "dev" ]; then - pip install -r "${REQUIREMENTS_DIR}/"dev.txt -elif [ "$1" == "stage" ]; then - pip install -r "${REQUIREMENTS_DIR}/"stage.txt -elif [ "$1" == "test" ]; then - pip install -r "${REQUIREMENTS_DIR}/"test.txt -elif [ "$1" == "prod" ]; then - pip install -r requirements.txt -fi diff --git a/script/linguist.sh b/script/linguist.sh new file mode 100755 index 0000000..ad2aca0 --- /dev/null +++ b/script/linguist.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +# -*- coding: utf-8 -*- + +[ -r "script/bootstrap.sh" ] && source "script/bootstrap.sh" + +bundle exec linguist --breakdown diff --git a/script/lintcode.sh b/script/lintcode.sh new file mode 100755 index 0000000..367a86a --- /dev/null +++ b/script/lintcode.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# -*- coding: utf-8 -*- + +# shellcheck source=/dev/null +[ -r "script/bootstrap.sh" ] && source "script/bootstrap.sh" + +pre-commit install -f --install-hooks +pre-commit run --all-files diff --git a/script/watch.sh b/script/watch.sh new file mode 100755 index 0000000..8a2a5b6 --- /dev/null +++ b/script/watch.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +# -*- coding: utf-8 -*- + +# shellcheck source=/dev/null +[ -r "script/bootstrap.sh" ] && source "script/bootstrap.sh" + +cd "${SOURCE_DIR}" || echo 'path not found' + +landslide "${ETC_DIR}/"landslide.cfg -w ./ From 808e2a1161e85db94715eb2bef9eb03f23744054 Mon Sep 17 00:00:00 2001 From: "@slovacus" Date: Tue, 13 Jun 2017 14:04:12 -0500 Subject: [PATCH 04/43] !#1 Add: file license --- LICENSE | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 LICENSE diff --git a/LICENSE b/LICENSE deleted file mode 100644 index b895ca4..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2017, LuisMayta - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file From a3584ba03c313959a371f2b9a3dba527a020a2eb Mon Sep 17 00:00:00 2001 From: "@slovacus" Date: Tue, 13 Jun 2017 14:04:43 -0500 Subject: [PATCH 05/43] !#1 Add: settings tmuxinator --- etc/landslide.cfg | 11 ++++++ etc/tmuxinator/slides-user-story.yml | 59 ++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 etc/landslide.cfg create mode 100644 etc/tmuxinator/slides-user-story.yml diff --git a/etc/landslide.cfg b/etc/landslide.cfg new file mode 100644 index 0000000..0f1edcb --- /dev/null +++ b/etc/landslide.cfg @@ -0,0 +1,11 @@ +[landslide] +source = slides/title.md + slides/agenda.md + slides/about.md + slides/home.md +destination = index.html +theme = theme/ +# css = custom_css/pygments/monokai.css +# relative = True +embed = True +# linenos = no diff --git a/etc/tmuxinator/slides-user-story.yml b/etc/tmuxinator/slides-user-story.yml new file mode 100644 index 0000000..5f677ff --- /dev/null +++ b/etc/tmuxinator/slides-user-story.yml @@ -0,0 +1,59 @@ +# ~/.tmuxinator/slides-user-story.yml +name: slides-user-story +root: <%= ENV["PROJECTS"] %>/slides/slides-user-story +tmux_options: -2 +# Optional tmux socket +# socket_name: foo + +# Runs before everything. Use it to start daemons etc. +# pre: sudo /etc/rc.d/mysqld start +pre: + - make environment + +# Runs in each window and pane before window/pane specific commands. Useful for setting up interpreter versions. +# pre_window: rbenv shell 2.0.0-p247 + +# Pass command line options to tmux. Useful for specifying a different tmux.conf. +# tmux_options: -f ~/.tmux.mac.conf + +# Change the command to call tmux. This can be used by derivatives/wrappers like byobu. +# tmux_command: byobu + +# Specifies (by name or index) which window will be selected on project startup. If not set, the first window is used. +# startup_window: logs + +# Controls whether the tmux session should be attached to automatically. Defaults to true. +# attach: false + +# Runs after everything. Use it to attach to tmux with custom options etc. +# post: tmux -CC attach -t go-stringutil + +windows: + - editor: + layout: even-horizontal + panes: + - editor: + - pyenv activate slides-user-story + - pwd: + - pyenv activate slides-user-story + - pwd: + - pyenv activate slides-user-story + - python: + layout: main-vertical + panes: + - python: + - pyenv activate slides-user-story + - databases: + layout: main-vertical + panes: + - ls: + - pyenv activate slides-user-story + - ls: + - pyenv activate slides-user-story + - docker: + layout: main-vertical + panes: + - ls: + - pyenv activate slides-user-story + - ls: + - pyenv activate slides-user-story From 83dada856221450422eda96a83fbd27b77b579db Mon Sep 17 00:00:00 2001 From: "@slovacus" Date: Tue, 13 Jun 2017 14:05:22 -0500 Subject: [PATCH 06/43] !#1 Add: dependences version --- VERSION | 1 - 1 file changed, 1 deletion(-) delete mode 100644 VERSION diff --git a/VERSION b/VERSION deleted file mode 100644 index 4e379d2..0000000 --- a/VERSION +++ /dev/null @@ -1 +0,0 @@ -0.0.2 From 37f99be2c5e9aebdb4c5f7be5181015dbb3873cf Mon Sep 17 00:00:00 2001 From: "@slovacus" Date: Tue, 13 Jun 2017 14:26:55 -0500 Subject: [PATCH 07/43] !#2 Fix: clean grip --- script/grip.sh | 7 ------- 1 file changed, 7 deletions(-) delete mode 100755 script/grip.sh diff --git a/script/grip.sh b/script/grip.sh deleted file mode 100755 index 7836582..0000000 --- a/script/grip.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash -# -*- coding: utf-8 -*- - -# shellcheck source=/dev/null -[ -r "script/bootstrap.sh" ] && source "script/bootstrap.sh" - -grip --pass "${GITHUB_API_TOKEN}" "${GRIP_PORT}" From 0d4bd68f91a8d69e0b8db6f6c670a48037ea7877 Mon Sep 17 00:00:00 2001 From: "@slovacus" Date: Tue, 13 Jun 2017 14:47:02 -0500 Subject: [PATCH 08/43] !#2 Add: info project --- CHANGELOG.rst | 19 --------- README.rst | 112 -------------------------------------------------- 2 files changed, 131 deletions(-) delete mode 100644 CHANGELOG.rst delete mode 100644 README.rst diff --git a/CHANGELOG.rst b/CHANGELOG.rst deleted file mode 100644 index 4a12b7a..0000000 --- a/CHANGELOG.rst +++ /dev/null @@ -1,19 +0,0 @@ -ChangeLog -######### - -All notable changes to this project will be documented in this file. -This file uses change log convention from `keep a CHANGELOG`_. - -`Unreleased`_ -************* - -`0.0.2`_ - 2017-09-02 -********************* - -`0.0.1`_ - 2017-06-14 -********************* - -.. _`Unreleased`: https://github.com/luismayta/slides-story-user/compare/0.0.1...HEAD -.. _0.0.1: https://github.com/luismayta/slides-story-user/compare/0.0.0...0.0.1 - -.. _`keep a CHANGELOG`: http://keepachangelog.com/en/0.3.0/ diff --git a/README.rst b/README.rst deleted file mode 100644 index 195f63e..0000000 --- a/README.rst +++ /dev/null @@ -1,112 +0,0 @@ -slides-user-story -################# - -|gitpitch| |build_status| |code_climate| |github_tag| |test_coverage| |license| - -:Version: 0.0.2 -:Web: https://github.com/luismayta/slides-user-story -:Slide: https://gitpitch.com/luismayta/slides-user-story -:Download: http://github.com/luismayta/slides-user-story -:Source: http://github.com/luismayta/slides-user-story -:Keywords: slides-user-story - -Slides User Story - -.. contents:: Table of Contents: - :local: - -Requirements -============ - -- `python`_ - -.. code-block:: bash - - $ make setup - - -Test -==== - -.. code-block:: bash - - $ make test - -Actions -======= - -Other commands for developing are written in Makefile: - -.. code-block:: bash - - λ make help - ༼ つ ◕_◕ ༽つ Commands - build Build docker container by env - clean clean Files compiled - environment Make environment for developer - documentation Make Documentation - down remove containers docker by env - env Show envs available - install Install with var env Dependences - list List of current active services by env - lint Clean files unnecesary - test make test - up Up application by env - restart Reload services - ssh Connect to container - stop stop containers docker by env - setup Install dependences initial - verify_network Verify network - help Show help text - - -Changelog -========= - -Please see `changelog`_ for more information what has changed recently. - -Contributing -============ - -Please see `contributing`_ for details. - -Credits -======= - -Made with :heart: :coffee:️and :pizza: by `company`_. - -- `All Contributors`_ - -.. |code_climate| image:: https://codeclimate.com/github/luismayta/slides-user-story/badges/gpa.svg - :target: https://codeclimate.com/github/luismayta/slides-user-story - :alt: Code Climate - -.. |github_tag| image:: https://img.shields.io/github/tag/luismayta/slides-user-story.svg?maxAge=2592000 - :target: https://github.com/luismayta/slides-user-story - :alt: Github Tag - -.. |build_status| image:: https://travis-ci.org/luismayta/slides-user-story.svg - :target: https://travis-ci.org/luismayta/slides-user-story - :alt: Build Status Tag - -.. |gitpitch| image:: https://gitpitch.com/assets/badge.svg - :target: https://gitpitch.com/luismayta/slides-user-story?grs=github&t=white - :alt: GitPitch - -.. |license| image:: https://img.shields.io/github/license/mashape/apistatus.svg?style=flat-square - :target: LICENSE - :alt: License - -.. |test_coverage| image:: https://codeclimate.com/github/luismayta/slides-user-story/badges/coverage.svg - :target: https://codeclimate.com/github/luismayta/slides-user-story/coverage - :alt: Test Coverage - -.. - Links - -.. _`changelog`: CHANGELOG.rst -.. _`contributors`: AUTHORS -.. _`contributing`: CONTRIBUTING.rst -.. _`company`: https://github.com/luismayta -.. _`author`: https://github.com/luismayta -.. _`python`: https://www.python.org From 4e0e92da74141d9da4d1d955504d6713d75fe323 Mon Sep 17 00:00:00 2001 From: "@slovacus" Date: Tue, 13 Jun 2017 14:47:27 -0500 Subject: [PATCH 09/43] !#2 Add: script lint --- script/lint.sh | 6 ------ 1 file changed, 6 deletions(-) delete mode 100755 script/lint.sh diff --git a/script/lint.sh b/script/lint.sh deleted file mode 100755 index 29280b0..0000000 --- a/script/lint.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash -# -*- coding: utf-8 -*- - -# shellcheck source=/dev/null -[ -r "script/bootstrap.sh" ] && source "script/bootstrap.sh" -pre-commit run --all-files --verbose From ac380e18164f53d397f21731ba050ff3f3ecc8f4 Mon Sep 17 00:00:00 2001 From: "@slovacus" Date: Tue, 13 Jun 2017 14:47:47 -0500 Subject: [PATCH 10/43] !#2 Add: info project --- slides/about.md | 0 slides/agenda.md | 0 slides/home.md | 1 + slides/title.md | 0 4 files changed, 1 insertion(+) create mode 100755 slides/about.md create mode 100644 slides/agenda.md create mode 100644 slides/home.md create mode 100755 slides/title.md diff --git a/slides/about.md b/slides/about.md new file mode 100755 index 0000000..e69de29 diff --git a/slides/agenda.md b/slides/agenda.md new file mode 100644 index 0000000..e69de29 diff --git a/slides/home.md b/slides/home.md new file mode 100644 index 0000000..291ca38 --- /dev/null +++ b/slides/home.md @@ -0,0 +1 @@ +# Home diff --git a/slides/title.md b/slides/title.md new file mode 100755 index 0000000..e69de29 From 8c5aa5d3e262bac89e1b5e9e9bfba0b7161ced65 Mon Sep 17 00:00:00 2001 From: "@slovacus" Date: Tue, 13 Jun 2017 15:32:21 -0500 Subject: [PATCH 11/43] !#3 Add: settings script watch of makefile --- script/watch.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/script/watch.sh b/script/watch.sh index 8a2a5b6..28b9b9d 100755 --- a/script/watch.sh +++ b/script/watch.sh @@ -1,9 +1,9 @@ #!/usr/bin/env bash # -*- coding: utf-8 -*- -# shellcheck source=/dev/null +#shellcheck source=/dev/null [ -r "script/bootstrap.sh" ] && source "script/bootstrap.sh" cd "${SOURCE_DIR}" || echo 'path not found' -landslide "${ETC_DIR}/"landslide.cfg -w ./ +landslide "${ETC_DIR}/"landslide.cfg -w ./ \ No newline at end of file From 1e2a0c011e2c88066f5bb53fea3a6577691e452e Mon Sep 17 00:00:00 2001 From: "@slovacus" Date: Tue, 13 Jun 2017 15:33:22 -0500 Subject: [PATCH 12/43] !#3 Add: files statics --- slides/static/img/User-Stories.jpg | Bin 0 -> 55209 bytes slides/static/img/maxresdefault.jpg | Bin 0 -> 120365 bytes slides/static/img/sharding.png | Bin 0 -> 62024 bytes slides/static/img/ustory.png | Bin 0 -> 36401 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 slides/static/img/User-Stories.jpg create mode 100644 slides/static/img/maxresdefault.jpg create mode 100755 slides/static/img/sharding.png create mode 100644 slides/static/img/ustory.png diff --git a/slides/static/img/User-Stories.jpg b/slides/static/img/User-Stories.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1083101e2e9022c2ddf9bde10d5b4e62a5b36f1f GIT binary patch literal 55209 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 C0My$D@VX2L0>Ht*A|W9lBOxIn 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

^2HKZLV@84(?4~gMtk8Vb#hpV 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

0fdPgN>F)0C78ts_ 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 GoBSWTt+s*y literal 0 HcmV?d00001 diff --git a/slides/static/img/sharding.png b/slides/static/img/sharding.png new file mode 100755 index 0000000000000000000000000000000000000000..079e926dfa29feed331e4b2c70041b0cb3a65b26 GIT binary patch literal 62024 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 Um0X;bVSq0M8P!*nFHPS6KSI13ssI20 literal 0 HcmV?d00001 diff --git a/slides/static/img/ustory.png b/slides/static/img/ustory.png new file mode 100644 index 0000000000000000000000000000000000000000..e3bf0b16a3ed3d4ece16e3e8692cd8357fe416b9 GIT binary patch literal 36401 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 Date: Tue, 13 Jun 2017 15:36:36 -0500 Subject: [PATCH 13/43] !#3 Add: theme template --- theme/.editorconfig | 20 + theme/.gitattributes | 134 + theme/.gitignore | 84 + theme/.mailmap | 4 + theme/.pre-commit-config.yaml | 61 + theme/.projectile | 8 + theme/AUTHORS | 1 + theme/CHANGELOG.md | 10 + theme/CONTRIBUTING.md | 29 + theme/LICENSE | 21 + theme/README.md | 43 + theme/base.html | 102 + theme/css/.gitkeep | 0 theme/css/print/paper.css | 202 + theme/css/print/pdf.css | 160 + theme/css/reveal.css | 1338 +++++ theme/css/reveal.scss | 1379 +++++ theme/css/theme/README.md | 21 + theme/css/theme/beige.css | 290 + theme/css/theme/black.css | 286 + theme/css/theme/blood.css | 309 ++ theme/css/theme/league.css | 292 + theme/css/theme/moon.css | 290 + theme/css/theme/night.css | 284 + theme/css/theme/serif.css | 286 + theme/css/theme/simple.css | 286 + theme/css/theme/sky.css | 293 ++ theme/css/theme/solarized.css | 290 + theme/css/theme/source/beige.scss | 39 + theme/css/theme/source/black.scss | 49 + theme/css/theme/source/blood.scss | 79 + theme/css/theme/source/league.scss | 34 + theme/css/theme/source/moon.scss | 57 + theme/css/theme/source/night.scss | 35 + theme/css/theme/source/serif.scss | 35 + theme/css/theme/source/simple.scss | 38 + theme/css/theme/source/sky.scss | 46 + theme/css/theme/source/solarized.scss | 63 + theme/css/theme/source/white.scss | 49 + theme/css/theme/template/mixins.scss | 29 + theme/css/theme/template/settings.scss | 43 + theme/css/theme/template/theme.scss | 345 ++ theme/css/theme/white.css | 286 + theme/js/reveal.js | 4677 +++++++++++++++++ theme/lib/css/zenburn.css | 115 + theme/lib/font/league-gothic/LICENSE | 2 + .../lib/font/league-gothic/league-gothic.css | 10 + .../lib/font/league-gothic/league-gothic.eot | Bin 0 -> 25696 bytes .../lib/font/league-gothic/league-gothic.ttf | Bin 0 -> 64227 bytes .../lib/font/league-gothic/league-gothic.woff | Bin 0 -> 30765 bytes theme/lib/font/source-sans-pro/LICENSE | 45 + .../source-sans-pro-italic.eot | Bin 0 -> 75719 bytes .../source-sans-pro-italic.ttf | Bin 0 -> 238020 bytes .../source-sans-pro-italic.woff | Bin 0 -> 98545 bytes .../source-sans-pro-regular.eot | Bin 0 -> 88063 bytes .../source-sans-pro-regular.ttf | Bin 0 -> 287865 bytes .../source-sans-pro-regular.woff | Bin 0 -> 114319 bytes .../source-sans-pro-semibold.eot | Bin 0 -> 89892 bytes .../source-sans-pro-semibold.ttf | Bin 0 -> 284481 bytes .../source-sans-pro-semibold.woff | Bin 0 -> 115639 bytes .../source-sans-pro-semibolditalic.eot | Bin 0 -> 75699 bytes .../source-sans-pro-semibolditalic.ttf | Bin 0 -> 240880 bytes .../source-sans-pro-semibolditalic.woff | Bin 0 -> 98813 bytes .../font/source-sans-pro/source-sans-pro.css | 39 + theme/lib/js/classList.js | 2 + theme/lib/js/head.min.js | 8 + theme/lib/js/html5shiv.js | 7 + theme/plugin/highlight/highlight.js | 32 + theme/plugin/markdown/example.html | 129 + theme/plugin/markdown/example.md | 31 + theme/plugin/markdown/markdown.js | 402 ++ theme/plugin/markdown/marked.js | 6 + theme/plugin/math/math.js | 67 + theme/plugin/multiplex/client.js | 13 + theme/plugin/multiplex/index.js | 56 + theme/plugin/multiplex/master.js | 31 + theme/plugin/notes-server/client.js | 65 + theme/plugin/notes-server/index.js | 68 + theme/plugin/notes-server/notes.html | 407 ++ theme/plugin/notes/notes.html | 407 ++ theme/plugin/notes/notes.js | 127 + theme/plugin/print-pdf/print-pdf.js | 47 + theme/plugin/search/search.js | 196 + theme/plugin/zoom-js/zoom.js | 275 + 84 files changed, 15014 insertions(+) create mode 100644 theme/.editorconfig create mode 100644 theme/.gitattributes create mode 100644 theme/.gitignore create mode 100644 theme/.mailmap create mode 100644 theme/.pre-commit-config.yaml create mode 100644 theme/.projectile create mode 100644 theme/AUTHORS create mode 100644 theme/CHANGELOG.md create mode 100644 theme/CONTRIBUTING.md create mode 100644 theme/LICENSE create mode 100644 theme/README.md create mode 100644 theme/base.html create mode 100644 theme/css/.gitkeep create mode 100644 theme/css/print/paper.css create mode 100644 theme/css/print/pdf.css create mode 100644 theme/css/reveal.css create mode 100644 theme/css/reveal.scss create mode 100644 theme/css/theme/README.md create mode 100644 theme/css/theme/beige.css create mode 100644 theme/css/theme/black.css create mode 100644 theme/css/theme/blood.css create mode 100644 theme/css/theme/league.css create mode 100644 theme/css/theme/moon.css create mode 100644 theme/css/theme/night.css create mode 100644 theme/css/theme/serif.css create mode 100644 theme/css/theme/simple.css create mode 100644 theme/css/theme/sky.css create mode 100644 theme/css/theme/solarized.css create mode 100644 theme/css/theme/source/beige.scss create mode 100644 theme/css/theme/source/black.scss create mode 100644 theme/css/theme/source/blood.scss create mode 100644 theme/css/theme/source/league.scss create mode 100644 theme/css/theme/source/moon.scss create mode 100644 theme/css/theme/source/night.scss create mode 100644 theme/css/theme/source/serif.scss create mode 100644 theme/css/theme/source/simple.scss create mode 100644 theme/css/theme/source/sky.scss create mode 100644 theme/css/theme/source/solarized.scss create mode 100644 theme/css/theme/source/white.scss create mode 100644 theme/css/theme/template/mixins.scss create mode 100644 theme/css/theme/template/settings.scss create mode 100644 theme/css/theme/template/theme.scss create mode 100644 theme/css/theme/white.css create mode 100644 theme/js/reveal.js create mode 100644 theme/lib/css/zenburn.css create mode 100644 theme/lib/font/league-gothic/LICENSE create mode 100644 theme/lib/font/league-gothic/league-gothic.css create mode 100755 theme/lib/font/league-gothic/league-gothic.eot create mode 100755 theme/lib/font/league-gothic/league-gothic.ttf create mode 100755 theme/lib/font/league-gothic/league-gothic.woff create mode 100644 theme/lib/font/source-sans-pro/LICENSE create mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-italic.eot create mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-italic.ttf create mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-italic.woff create mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-regular.eot create mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-regular.ttf create mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-regular.woff create mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-semibold.eot create mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-semibold.ttf create mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-semibold.woff create mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot create mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf create mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff create mode 100644 theme/lib/font/source-sans-pro/source-sans-pro.css create mode 100644 theme/lib/js/classList.js create mode 100644 theme/lib/js/head.min.js create mode 100644 theme/lib/js/html5shiv.js create mode 100644 theme/plugin/highlight/highlight.js create mode 100644 theme/plugin/markdown/example.html create mode 100644 theme/plugin/markdown/example.md create mode 100755 theme/plugin/markdown/markdown.js create mode 100644 theme/plugin/markdown/marked.js create mode 100755 theme/plugin/math/math.js create mode 100644 theme/plugin/multiplex/client.js create mode 100644 theme/plugin/multiplex/index.js create mode 100644 theme/plugin/multiplex/master.js create mode 100644 theme/plugin/notes-server/client.js create mode 100644 theme/plugin/notes-server/index.js create mode 100644 theme/plugin/notes-server/notes.html create mode 100644 theme/plugin/notes/notes.html create mode 100644 theme/plugin/notes/notes.js create mode 100644 theme/plugin/print-pdf/print-pdf.js create mode 100644 theme/plugin/search/search.js create mode 100644 theme/plugin/zoom-js/zoom.js diff --git a/theme/.editorconfig b/theme/.editorconfig new file mode 100644 index 0000000..f7650da --- /dev/null +++ b/theme/.editorconfig @@ -0,0 +1,20 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +trim_trailing_whitespace = true +charset = utf-8 +insert_final_newline = false + +[*.{py,sh,feature}] +indent_size = 4 + +# Tabs +[*.{less,css,Makefile,Vagrantfile}] +indent_style = tab + +[Makefile] +indent_size = 4 +indent_style = tab \ No newline at end of file diff --git a/theme/.gitattributes b/theme/.gitattributes new file mode 100644 index 0000000..383303e --- /dev/null +++ b/theme/.gitattributes @@ -0,0 +1,134 @@ +# Path-based git attributes +# https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html + +## Test/documentation + +# Ignore all test and documentation with "export-ignore". +/.gitattributes export-ignore +/.githooks export-ignore +/.gitignore export-ignore +/.travis.yml export-ignore +/.travis.yaml export-ignore +/phpunit.xml.dist export-ignore +/.scrutinizer.yml export-ignore +/.scrutinizer.yaml export-ignore +/tests export-ignore + +## Merging +CHANGELOG.md merge=union + +## Line endings + +### Automatic + +# Handle line endings automatically for files detected as text +# and leave all files detected as binary untouched. +* text=auto eol=lf + +### Text (should be normalized, convert crlf => lf) + +# Source +*.php text eol=lf +*.css text eol=lf +*.sass text eol=lf +*.scss text eol=lf +*.less text eol=lf +*.styl text eol=lf +*.js text eol=lf +*.coffee text eol=lf +*.json text eol=lf +*.htm text eol=lf +*.html text eol=lf +*.xml text eol=lf +*.svg text eol=lf +*.txt text eol=lf +*.ini text eol=lf +*.inc text eol=lf +*.pl text eol=lf +*.rb text eol=lf +*.py text eol=lf +*.scm text eol=lf +*.sql text eol=lf +*.sh text eol=lf +*.bat text eol=lf + +# Templates +*.ejs text eol=lf +*.hbt text eol=lf +*.jade text eol=lf +*.haml text eol=lf +*.hbs text eol=lf +*.dot text eol=lf +*.tmpl text eol=lf +*.phtml text eol=lf + +# App config +.env text eol=lf +.env.example text eol=lf + +# Server config +.htaccess text eol=lf + +# Git config +.gitattributes text eol=lf +.gitignore text eol=lf + +# Code analysis config +.jshintrc text eol=lf +.jscsrc text eol=lf +.jshintignore text eol=lf +.csslintrc text eol=lf + +# Misc config +*.yaml text eol=lf +*.yml text eol=lf +*.yaml text eol=lf +.editorconfig text eol=lf + +# Build config +composer.lock text eol=lf +*.npmignore text eol=lf +*.bowerrc text eol=lf + +# Heroku +Procfile text eol=lf +.slugignore text eol=lf + +# Documentation +*.md text eol=lf +LICENSE text eol=lf +AUTHORS text eol=lf + +# Vagrant +Vagrantfile eol=lf + +# Scripts +bin/* text eol=lf + +### Binary (left untouched) + +# (binary is a macro for -text -diff) +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.ico binary +*.mov binary +*.mp4 binary +*.mp3 binary +*.mwb binary +*.flv binary +*.fla binary +*.swf binary +*.gz binary +*.zip binary +*.7z binary +*.rar binary +*.ttf binary +*.eot binary +*.woff binary +*.woff2 binary +*.otf binary +*.pyc binary +*.pdf binary +*.bz2 binary diff --git a/theme/.gitignore b/theme/.gitignore new file mode 100644 index 0000000..f69e986 --- /dev/null +++ b/theme/.gitignore @@ -0,0 +1,84 @@ +# Static and media development files. +media/ +src/assets/ +static/ +staticfiles/ + +# gulp-compass metafile +css + +# Node metadata +node_modules + +# SASS metadata +*.sass-cache + +# Bower directory +bower_components + +# Local databases +*.sqlite3 + +*.bak +.#* +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*,cover + +# Translations +*.mo +*.pot + +# Django stuff: +*.log + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# ignored files Vagrant +.vagrant diff --git a/theme/.mailmap b/theme/.mailmap new file mode 100644 index 0000000..f6a2e2b --- /dev/null +++ b/theme/.mailmap @@ -0,0 +1,4 @@ +@slovacus luis mayta luis alberto mayta +@slovacus Luis Alberto Mayta Mamani +@slovacus luis alberto mayta +@slovacus Lmayta Luis Alberto Mayta M diff --git a/theme/.pre-commit-config.yaml b/theme/.pre-commit-config.yaml new file mode 100644 index 0000000..6286d06 --- /dev/null +++ b/theme/.pre-commit-config.yaml @@ -0,0 +1,61 @@ +- repo: git@github.com:pre-commit/pre-commit-hooks + sha: master + hooks: + - id: detect-private-key + files: ^(?!\.?git-crypt) + - id: check-merge-conflict + - id: trailing-whitespace + files: ^tf|-|\.(py|tfvars|tf|tfenv|env|yml|yaml|pem|key|mock)$ + - id: end-of-file-fixer + files: ^tf|-|\.(py|tfvars|tf|tfenv|env|yml|yaml|pem|key|mock)$ + - id: check-added-large-files + - id: check-case-conflict + - id: check-json + - id: check-xml + - id: check-yaml + - id: check-case-conflict + - id: check-ast + - id: debug-statements + - id: autopep8-wrapper + args: + - -i + - --ignore=E501 + - id: double-quote-string-fixer + - id: check-docstring-first + - id: pretty-format-json + - id: debug-statements + - id: requirements-txt-fixer + - id: name-tests-test +- repo: git://github.com/dgnest/mirrors-pylint + sha: eb20a4b9bbfe24ec8641f63214e2a7de25399796 + hooks: + - id: pylint + args: + - --rcfile=pylint.rc +- repo: git://github.com/pre-commit/mirrors-scss-lint + sha: master + hooks: + - id: scss-lint + files: \.(scss)$ +# - repo: git://github.com/FalconSocial/pre-commit-mirrors-pep257 +# sha: v0.3.2 +# hooks: +# - id: pep257 +# args: +# - --ignore=migrations +- repo: git@github.com:pre-commit/pre-commit + sha: 3d90b094fccf0ba5d811a0fdc876e987c2437b1c + hooks: + - id: validate_config + - id: validate_manifest +- repo: git://github.com/FalconSocial/pre-commit-python-sorter + sha: 934072fb29303aaa64bead610be042049e9db488 + hooks: + - id: python-import-sorter + args: + - --silent-overwrite +# - repo: git://github.com/pre-commit/mirrors-eslint +# sha: 'master' # Use the sha you want to point at +# hooks: +# - id: eslint +# language_version: 4.2.1 diff --git a/theme/.projectile b/theme/.projectile new file mode 100644 index 0000000..66cb228 --- /dev/null +++ b/theme/.projectile @@ -0,0 +1,8 @@ +-/log +-/tmp +-/.git +-/.vagrant +-/auto-save-list +-*.cache +-*.pyc +-projectile-bookmarks.eld diff --git a/theme/AUTHORS b/theme/AUTHORS new file mode 100644 index 0000000..e5496ab --- /dev/null +++ b/theme/AUTHORS @@ -0,0 +1 @@ +@slovacus diff --git a/theme/CHANGELOG.md b/theme/CHANGELOG.md new file mode 100644 index 0000000..c0e93c6 --- /dev/null +++ b/theme/CHANGELOG.md @@ -0,0 +1,10 @@ +# Change Log +All notable changes to this project will be documented in this file. +This file uses change log convention from [Keep a CHANGELOG](http://keepachangelog.com). + + + +[CHANGELOG.md]: CHANGELOG.md +[CONTRIBUTING.md]: CONTRIBUTING.md +[LICENCE]: LICENCE.md +[README.md]: README.md diff --git a/theme/CONTRIBUTING.md b/theme/CONTRIBUTING.md new file mode 100644 index 0000000..d263e6a --- /dev/null +++ b/theme/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# How to contribute + +Prerequisites: + +- Familiarity with [pull requests](https://help.github.com/articles/using-pull-requests) and [issues](https://guides.github.com/features/issues/). +- Knowledge of [Markdown](https://help.github.com/articles/markdown-basics/) for editing `.md` documents. + +In particular, this community seeks the following types of contributions: + +- **Ideas**: participate in an issue thread or start your own to have your voice +heard. +- **Resources**: submit a pull request to add to RESOURCES.md with links to related content. +- **Outline sections**: help us ensure that this repository is comprehensive. if +there is a topic that is overlooked, please add it, even if it is just a stub +in the form of a header and single sentence. Initially, most things fall into +this category. +- **Writing**: contribute your expertise in an area by helping us expand the included +content. +- **Copy editing**: fix typos, clarify language, and generally improve the quality +of the content. +- **Formatting**: help keep content easy to read with consistent formatting. + +# Conduct + +# Communication + +# Frequently Asked Questions + +*please add* diff --git a/theme/LICENSE b/theme/LICENSE new file mode 100644 index 0000000..9882e45 --- /dev/null +++ b/theme/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 luismayta + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/theme/README.md b/theme/README.md new file mode 100644 index 0000000..3c648e1 --- /dev/null +++ b/theme/README.md @@ -0,0 +1,43 @@ + + +# Theme Landslide + + +[![Build Status](https://travis-ci.org/luismayta/landslide-theme.svg)](https://travis-ci.org/luismayta/landslide-theme) +[![Stories in Ready](https://badge.waffle.io/luismayta/landslide-theme.svg?label=ready&title=Ready)](http://waffle.io/luismayta/landslide-theme) +[![GitHub issues](https://img.shields.io/github/issues/luismayta/landslide-theme.svg)](https://github.com/luismayta/landslide-theme/issues) +[![GitHub license](https://img.shields.io/github/license/mashape/apistatus.svg?style=flat-square)](LICENSE) + + +## Changelog + +Please see [CHANGELOG](CHANGELOG.md) for more information what has changed recently. + +## Contributing + +Please see [CONTRIBUTING](CONTRIBUTING.md) for details. + +### Documentation + +Es necesario instalar [Grip](link-python-grip) +para poder visualizar la documentación, ejecutando lo siguiente: + + +```bash +grip 5000 +``` + +## Credits + +- [Luis Mayta][link-author] +- [All Contributors][link-contributors] + + +[![](http://api.coderwall.com/luismayta/endorsecount.png)](http://coderwall.com/luismayta) +[![](http://www.linkedin.com/img/webpromo/btn_liprofile_blue_80x15.png)](http://pe.linkedin.com/in/luismayta) +[![Analytics](https://ga-beacon.appspot.com/UA-65019326-1/landslide-theme/readme)](https://github.com/luismayta/landslide-theme) + + +[link-python-grip]: https://github.com/joeyespo/grip +[link-author]: https://github.com/luismayta +[link-contributors]: contributors diff --git a/theme/base.html b/theme/base.html new file mode 100644 index 0000000..ce461f2 --- /dev/null +++ b/theme/base.html @@ -0,0 +1,102 @@ + + + + + {{ head_title }} + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + diff --git a/theme/css/.gitkeep b/theme/css/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/theme/css/print/paper.css b/theme/css/print/paper.css new file mode 100644 index 0000000..6588f48 --- /dev/null +++ b/theme/css/print/paper.css @@ -0,0 +1,202 @@ +/* Default Print Stylesheet Template + by Rob Glazebrook of CSSnewbie.com + Last Updated: June 4, 2008 + + Feel free (nay, compelled) to edit, append, and + manipulate this file as you see fit. */ + + +@media print { + + /* SECTION 1: Set default width, margin, float, and + background. This prevents elements from extending + beyond the edge of the printed page, and prevents + unnecessary background images from printing */ + html { + background: #fff; + width: auto; + height: auto; + overflow: visible; + } + body { + background: #fff; + font-size: 20pt; + width: auto; + height: auto; + border: 0; + margin: 0 5%; + padding: 0; + overflow: visible; + float: none !important; + } + + /* SECTION 2: Remove any elements not needed in print. + This would include navigation, ads, sidebars, etc. */ + .nestedarrow, + .controls, + .fork-reveal, + .share-reveal, + .state-background, + .reveal .progress, + .reveal .backgrounds { + display: none !important; + } + + /* SECTION 3: Set body font face, size, and color. + Consider using a serif font for readability. */ + body, p, td, li, div { + font-size: 20pt!important; + font-family: Georgia, "Times New Roman", Times, serif !important; + color: #000; + } + + /* SECTION 4: Set heading font face, sizes, and color. + Differentiate your headings from your body text. + Perhaps use a large sans-serif for distinction. */ + h1,h2,h3,h4,h5,h6 { + color: #000!important; + height: auto; + line-height: normal; + font-family: Georgia, "Times New Roman", Times, serif !important; + text-shadow: 0 0 0 #000 !important; + text-align: left; + letter-spacing: normal; + } + /* Need to reduce the size of the fonts for printing */ + h1 { font-size: 28pt !important; } + h2 { font-size: 24pt !important; } + h3 { font-size: 22pt !important; } + h4 { font-size: 22pt !important; font-variant: small-caps; } + h5 { font-size: 21pt !important; } + h6 { font-size: 20pt !important; font-style: italic; } + + /* SECTION 5: Make hyperlinks more usable. + Ensure links are underlined, and consider appending + the URL to the end of the link for usability. */ + a:link, + a:visited { + color: #000 !important; + font-weight: bold; + text-decoration: underline; + } + /* + .reveal a:link:after, + .reveal a:visited:after { + content: " (" attr(href) ") "; + color: #222 !important; + font-size: 90%; + } + */ + + + /* SECTION 6: more reveal.js specific additions by @skypanther */ + ul, ol, div, p { + visibility: visible; + position: static; + width: auto; + height: auto; + display: block; + overflow: visible; + margin: 0; + text-align: left !important; + } + .reveal pre, + .reveal table { + margin-left: 0; + margin-right: 0; + } + .reveal pre code { + padding: 20px; + border: 1px solid #ddd; + } + .reveal blockquote { + margin: 20px 0; + } + .reveal .slides { + position: static !important; + width: auto !important; + height: auto !important; + + left: 0 !important; + top: 0 !important; + margin-left: 0 !important; + margin-top: 0 !important; + padding: 0 !important; + zoom: 1 !important; + + overflow: visible !important; + display: block !important; + + text-align: left !important; + -webkit-perspective: none; + -moz-perspective: none; + -ms-perspective: none; + perspective: none; + + -webkit-perspective-origin: 50% 50%; + -moz-perspective-origin: 50% 50%; + -ms-perspective-origin: 50% 50%; + perspective-origin: 50% 50%; + } + .reveal .slides section { + visibility: visible !important; + position: static !important; + width: auto !important; + height: auto !important; + display: block !important; + overflow: visible !important; + + left: 0 !important; + top: 0 !important; + margin-left: 0 !important; + margin-top: 0 !important; + padding: 60px 20px !important; + z-index: auto !important; + + opacity: 1 !important; + + page-break-after: always !important; + + -webkit-transform-style: flat !important; + -moz-transform-style: flat !important; + -ms-transform-style: flat !important; + transform-style: flat !important; + + -webkit-transform: none !important; + -moz-transform: none !important; + -ms-transform: none !important; + transform: none !important; + + -webkit-transition: none !important; + -moz-transition: none !important; + -ms-transition: none !important; + transition: none !important; + } + .reveal .slides section.stack { + padding: 0 !important; + } + .reveal section:last-of-type { + page-break-after: avoid !important; + } + .reveal section .fragment { + opacity: 1 !important; + visibility: visible !important; + + -webkit-transform: none !important; + -moz-transform: none !important; + -ms-transform: none !important; + transform: none !important; + } + .reveal section img { + display: block; + margin: 15px 0px; + background: rgba(255,255,255,1); + border: 1px solid #666; + box-shadow: none; + } + + .reveal section small { + font-size: 0.8em; + } + +} \ No newline at end of file diff --git a/theme/css/print/pdf.css b/theme/css/print/pdf.css new file mode 100644 index 0000000..9ed90d6 --- /dev/null +++ b/theme/css/print/pdf.css @@ -0,0 +1,160 @@ +/** + * This stylesheet is used to print reveal.js + * presentations to PDF. + * + * https://github.com/hakimel/reveal.js#pdf-export + */ + +* { + -webkit-print-color-adjust: exact; +} + +body { + margin: 0 auto !important; + border: 0; + padding: 0; + float: none !important; + overflow: visible; +} + +html { + width: 100%; + height: 100%; + overflow: visible; +} + +/* Remove any elements not needed in print. */ +.nestedarrow, +.reveal .controls, +.reveal .progress, +.reveal .playback, +.reveal.overview, +.fork-reveal, +.share-reveal, +.state-background { + display: none !important; +} + +h1, h2, h3, h4, h5, h6 { + text-shadow: 0 0 0 #000 !important; +} + +.reveal pre code { + overflow: hidden !important; + font-family: Courier, 'Courier New', monospace !important; +} + +ul, ol, div, p { + visibility: visible; + position: static; + width: auto; + height: auto; + display: block; + overflow: visible; + margin: auto; +} +.reveal { + width: auto !important; + height: auto !important; + overflow: hidden !important; +} +.reveal .slides { + position: static; + width: 100%; + height: auto; + + left: auto; + top: auto; + margin: 0 !important; + padding: 0 !important; + + overflow: visible; + display: block; + + -webkit-perspective: none; + -moz-perspective: none; + -ms-perspective: none; + perspective: none; + + -webkit-perspective-origin: 50% 50%; /* there isn't a none/auto value but 50-50 is the default */ + -moz-perspective-origin: 50% 50%; + -ms-perspective-origin: 50% 50%; + perspective-origin: 50% 50%; +} + +.reveal .slides section { + page-break-after: always !important; + + visibility: visible !important; + position: relative !important; + display: block !important; + position: relative !important; + + margin: 0 !important; + padding: 0 !important; + box-sizing: border-box !important; + min-height: 1px; + + opacity: 1 !important; + + -webkit-transform-style: flat !important; + -moz-transform-style: flat !important; + -ms-transform-style: flat !important; + transform-style: flat !important; + + -webkit-transform: none !important; + -moz-transform: none !important; + -ms-transform: none !important; + transform: none !important; +} + +.reveal section.stack { + margin: 0 !important; + padding: 0 !important; + page-break-after: avoid !important; + height: auto !important; + min-height: auto !important; +} + +.reveal img { + box-shadow: none; +} + +.reveal .roll { + overflow: visible; + line-height: 1em; +} + +/* Slide backgrounds are placed inside of their slide when exporting to PDF */ +.reveal section .slide-background { + display: block !important; + position: absolute; + top: 0; + left: 0; + width: 100%; + z-index: -1; +} + +/* All elements should be above the slide-background */ +.reveal section>* { + position: relative; + z-index: 1; +} + +/* Display slide speaker notes when 'showNotes' is enabled */ +.reveal .speaker-notes-pdf { + display: block; + width: 100%; + max-height: none; + left: auto; + top: auto; + z-index: 100; +} + +/* Display slide numbers when 'slideNumber' is enabled */ +.reveal .slide-number-pdf { + display: block; + position: absolute; + font-size: 14px; +} + diff --git a/theme/css/reveal.css b/theme/css/reveal.css new file mode 100644 index 0000000..9739291 --- /dev/null +++ b/theme/css/reveal.css @@ -0,0 +1,1338 @@ +/*! + * reveal.js + * http://lab.hakim.se/reveal-js + * MIT licensed + * + * Copyright (C) 2016 Hakim El Hattab, http://hakim.se + */ +/********************************************* + * RESET STYLES + *********************************************/ +html, body, .reveal div, .reveal span, .reveal applet, .reveal object, .reveal iframe, +.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6, .reveal p, .reveal blockquote, .reveal pre, +.reveal a, .reveal abbr, .reveal acronym, .reveal address, .reveal big, .reveal cite, .reveal code, +.reveal del, .reveal dfn, .reveal em, .reveal img, .reveal ins, .reveal kbd, .reveal q, .reveal s, .reveal samp, +.reveal small, .reveal strike, .reveal strong, .reveal sub, .reveal sup, .reveal tt, .reveal var, +.reveal b, .reveal u, .reveal center, +.reveal dl, .reveal dt, .reveal dd, .reveal ol, .reveal ul, .reveal li, +.reveal fieldset, .reveal form, .reveal label, .reveal legend, +.reveal table, .reveal caption, .reveal tbody, .reveal tfoot, .reveal thead, .reveal tr, .reveal th, .reveal td, +.reveal article, .reveal aside, .reveal canvas, .reveal details, .reveal embed, +.reveal figure, .reveal figcaption, .reveal footer, .reveal header, .reveal hgroup, +.reveal menu, .reveal nav, .reveal output, .reveal ruby, .reveal section, .reveal summary, +.reveal time, .reveal mark, .reveal audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; } + +.reveal article, .reveal aside, .reveal details, .reveal figcaption, .reveal figure, +.reveal footer, .reveal header, .reveal hgroup, .reveal menu, .reveal nav, .reveal section { + display: block; } + +/********************************************* + * GLOBAL STYLES + *********************************************/ +html, +body { + width: 100%; + height: 100%; + overflow: hidden; } + +body { + position: relative; + line-height: 1; + background-color: #fff; + color: #000; } + +html:-webkit-full-screen-ancestor { + background-color: inherit; } + +html:-moz-full-screen-ancestor { + background-color: inherit; } + +/********************************************* + * VIEW FRAGMENTS + *********************************************/ +.reveal .slides section .fragment { + opacity: 0; + visibility: hidden; + -webkit-transition: all 0.2s ease; + transition: all 0.2s ease; } + .reveal .slides section .fragment.visible { + opacity: 1; + visibility: visible; } + +.reveal .slides section .fragment.grow { + opacity: 1; + visibility: visible; } + .reveal .slides section .fragment.grow.visible { + -webkit-transform: scale(1.3); + -ms-transform: scale(1.3); + transform: scale(1.3); } + +.reveal .slides section .fragment.shrink { + opacity: 1; + visibility: visible; } + .reveal .slides section .fragment.shrink.visible { + -webkit-transform: scale(0.7); + -ms-transform: scale(0.7); + transform: scale(0.7); } + +.reveal .slides section .fragment.zoom-in { + -webkit-transform: scale(0.1); + -ms-transform: scale(0.1); + transform: scale(0.1); } + .reveal .slides section .fragment.zoom-in.visible { + -webkit-transform: none; + -ms-transform: none; + transform: none; } + +.reveal .slides section .fragment.fade-out { + opacity: 1; + visibility: visible; } + .reveal .slides section .fragment.fade-out.visible { + opacity: 0; + visibility: hidden; } + +.reveal .slides section .fragment.semi-fade-out { + opacity: 1; + visibility: visible; } + .reveal .slides section .fragment.semi-fade-out.visible { + opacity: 0.5; + visibility: visible; } + +.reveal .slides section .fragment.strike { + opacity: 1; + visibility: visible; } + .reveal .slides section .fragment.strike.visible { + text-decoration: line-through; } + +.reveal .slides section .fragment.current-visible { + opacity: 0; + visibility: hidden; } + .reveal .slides section .fragment.current-visible.current-fragment { + opacity: 1; + visibility: visible; } + +.reveal .slides section .fragment.highlight-red, +.reveal .slides section .fragment.highlight-current-red, +.reveal .slides section .fragment.highlight-green, +.reveal .slides section .fragment.highlight-current-green, +.reveal .slides section .fragment.highlight-blue, +.reveal .slides section .fragment.highlight-current-blue { + opacity: 1; + visibility: visible; } + +.reveal .slides section .fragment.highlight-red.visible { + color: #ff2c2d; } + +.reveal .slides section .fragment.highlight-green.visible { + color: #17ff2e; } + +.reveal .slides section .fragment.highlight-blue.visible { + color: #1b91ff; } + +.reveal .slides section .fragment.highlight-current-red.current-fragment { + color: #ff2c2d; } + +.reveal .slides section .fragment.highlight-current-green.current-fragment { + color: #17ff2e; } + +.reveal .slides section .fragment.highlight-current-blue.current-fragment { + color: #1b91ff; } + +/********************************************* + * DEFAULT ELEMENT STYLES + *********************************************/ +/* Fixes issue in Chrome where italic fonts did not appear when printing to PDF */ +.reveal:after { + content: ''; + font-style: italic; } + +.reveal iframe { + z-index: 1; } + +/** Prevents layering issues in certain browser/transition combinations */ +.reveal a { + position: relative; } + +.reveal .stretch { + max-width: none; + max-height: none; } + +.reveal pre.stretch code { + height: 100%; + max-height: 100%; + box-sizing: border-box; } + +/********************************************* + * CONTROLS + *********************************************/ +.reveal .controls { + display: none; + position: fixed; + width: 110px; + height: 110px; + z-index: 30; + right: 10px; + bottom: 10px; + -webkit-user-select: none; } + +.reveal .controls button { + padding: 0; + position: absolute; + opacity: 0.05; + width: 0; + height: 0; + background-color: transparent; + border: 12px solid transparent; + -webkit-transform: scale(0.9999); + -ms-transform: scale(0.9999); + transform: scale(0.9999); + -webkit-transition: all 0.2s ease; + transition: all 0.2s ease; + -webkit-appearance: none; + -webkit-tap-highlight-color: transparent; } + +.reveal .controls .enabled { + opacity: 0.7; + cursor: pointer; } + +.reveal .controls .enabled:active { + margin-top: 1px; } + +.reveal .controls .navigate-left { + top: 42px; + border-right-width: 22px; + border-right-color: #000; } + +.reveal .controls .navigate-left.fragmented { + opacity: 0.3; } + +.reveal .controls .navigate-right { + left: 74px; + top: 42px; + border-left-width: 22px; + border-left-color: #000; } + +.reveal .controls .navigate-right.fragmented { + opacity: 0.3; } + +.reveal .controls .navigate-up { + left: 42px; + border-bottom-width: 22px; + border-bottom-color: #000; } + +.reveal .controls .navigate-up.fragmented { + opacity: 0.3; } + +.reveal .controls .navigate-down { + left: 42px; + top: 74px; + border-top-width: 22px; + border-top-color: #000; } + +.reveal .controls .navigate-down.fragmented { + opacity: 0.3; } + +/********************************************* + * PROGRESS BAR + *********************************************/ +.reveal .progress { + position: fixed; + display: none; + height: 3px; + width: 100%; + bottom: 0; + left: 0; + z-index: 10; + background-color: rgba(0, 0, 0, 0.2); } + +.reveal .progress:after { + content: ''; + display: block; + position: absolute; + height: 20px; + width: 100%; + top: -20px; } + +.reveal .progress span { + display: block; + height: 100%; + width: 0px; + background-color: #000; + -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } + +/********************************************* + * SLIDE NUMBER + *********************************************/ +.reveal .slide-number { + position: fixed; + display: block; + right: 8px; + bottom: 8px; + z-index: 31; + font-family: Helvetica, sans-serif; + font-size: 12px; + line-height: 1; + color: #fff; + background-color: rgba(0, 0, 0, 0.4); + padding: 5px; } + +.reveal .slide-number-delimiter { + margin: 0 3px; } + +/********************************************* + * SLIDES + *********************************************/ +.reveal { + position: relative; + width: 100%; + height: 100%; + overflow: hidden; + -ms-touch-action: none; + touch-action: none; } + +.reveal .slides { + position: absolute; + width: 100%; + height: 100%; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; + overflow: visible; + z-index: 1; + text-align: center; + -webkit-perspective: 600px; + perspective: 600px; + -webkit-perspective-origin: 50% 40%; + perspective-origin: 50% 40%; } + +.reveal .slides > section { + -ms-perspective: 600px; } + +.reveal .slides > section, +.reveal .slides > section > section { + display: none; + position: absolute; + width: 100%; + padding: 20px 0px; + z-index: 10; + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; + -webkit-transition: -webkit-transform-origin 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), -webkit-transform 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), visibility 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), opacity 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: -ms-transform-origin 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), transform 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), visibility 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), opacity 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: transform-origin 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), transform 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), visibility 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), opacity 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } + +/* Global transition speed settings */ +.reveal[data-transition-speed="fast"] .slides section { + -webkit-transition-duration: 400ms; + transition-duration: 400ms; } + +.reveal[data-transition-speed="slow"] .slides section { + -webkit-transition-duration: 1200ms; + transition-duration: 1200ms; } + +/* Slide-specific transition speed overrides */ +.reveal .slides section[data-transition-speed="fast"] { + -webkit-transition-duration: 400ms; + transition-duration: 400ms; } + +.reveal .slides section[data-transition-speed="slow"] { + -webkit-transition-duration: 1200ms; + transition-duration: 1200ms; } + +.reveal .slides > section.stack { + padding-top: 0; + padding-bottom: 0; } + +.reveal .slides > section.present, +.reveal .slides > section > section.present { + display: block; + z-index: 11; + opacity: 1; } + +.reveal.center, +.reveal.center .slides, +.reveal.center .slides section { + min-height: 0 !important; } + +/* Don't allow interaction with invisible slides */ +.reveal .slides > section.future, +.reveal .slides > section > section.future, +.reveal .slides > section.past, +.reveal .slides > section > section.past { + pointer-events: none; } + +.reveal.overview .slides > section, +.reveal.overview .slides > section > section { + pointer-events: auto; } + +.reveal .slides > section.past, +.reveal .slides > section.future, +.reveal .slides > section > section.past, +.reveal .slides > section > section.future { + opacity: 0; } + +/********************************************* + * Mixins for readability of transitions + *********************************************/ +/********************************************* + * SLIDE TRANSITION + * Aliased 'linear' for backwards compatibility + *********************************************/ +.reveal.slide section { + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.reveal .slides > section[data-transition=slide].past, +.reveal .slides > section[data-transition~=slide-out].past, +.reveal.slide .slides > section:not([data-transition]).past { + -webkit-transform: translate(-150%, 0); + -ms-transform: translate(-150%, 0); + transform: translate(-150%, 0); } + +.reveal .slides > section[data-transition=slide].future, +.reveal .slides > section[data-transition~=slide-in].future, +.reveal.slide .slides > section:not([data-transition]).future { + -webkit-transform: translate(150%, 0); + -ms-transform: translate(150%, 0); + transform: translate(150%, 0); } + +.reveal .slides > section > section[data-transition=slide].past, +.reveal .slides > section > section[data-transition~=slide-out].past, +.reveal.slide .slides > section > section:not([data-transition]).past { + -webkit-transform: translate(0, -150%); + -ms-transform: translate(0, -150%); + transform: translate(0, -150%); } + +.reveal .slides > section > section[data-transition=slide].future, +.reveal .slides > section > section[data-transition~=slide-in].future, +.reveal.slide .slides > section > section:not([data-transition]).future { + -webkit-transform: translate(0, 150%); + -ms-transform: translate(0, 150%); + transform: translate(0, 150%); } + +.reveal.linear section { + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.reveal .slides > section[data-transition=linear].past, +.reveal .slides > section[data-transition~=linear-out].past, +.reveal.linear .slides > section:not([data-transition]).past { + -webkit-transform: translate(-150%, 0); + -ms-transform: translate(-150%, 0); + transform: translate(-150%, 0); } + +.reveal .slides > section[data-transition=linear].future, +.reveal .slides > section[data-transition~=linear-in].future, +.reveal.linear .slides > section:not([data-transition]).future { + -webkit-transform: translate(150%, 0); + -ms-transform: translate(150%, 0); + transform: translate(150%, 0); } + +.reveal .slides > section > section[data-transition=linear].past, +.reveal .slides > section > section[data-transition~=linear-out].past, +.reveal.linear .slides > section > section:not([data-transition]).past { + -webkit-transform: translate(0, -150%); + -ms-transform: translate(0, -150%); + transform: translate(0, -150%); } + +.reveal .slides > section > section[data-transition=linear].future, +.reveal .slides > section > section[data-transition~=linear-in].future, +.reveal.linear .slides > section > section:not([data-transition]).future { + -webkit-transform: translate(0, 150%); + -ms-transform: translate(0, 150%); + transform: translate(0, 150%); } + +/********************************************* + * CONVEX TRANSITION + * Aliased 'default' for backwards compatibility + *********************************************/ +.reveal .slides > section[data-transition=default].past, +.reveal .slides > section[data-transition~=default-out].past, +.reveal.default .slides > section:not([data-transition]).past { + -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); } + +.reveal .slides > section[data-transition=default].future, +.reveal .slides > section[data-transition~=default-in].future, +.reveal.default .slides > section:not([data-transition]).future { + -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); } + +.reveal .slides > section > section[data-transition=default].past, +.reveal .slides > section > section[data-transition~=default-out].past, +.reveal.default .slides > section > section:not([data-transition]).past { + -webkit-transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); + transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); } + +.reveal .slides > section > section[data-transition=default].future, +.reveal .slides > section > section[data-transition~=default-in].future, +.reveal.default .slides > section > section:not([data-transition]).future { + -webkit-transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); + transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); } + +.reveal .slides > section[data-transition=convex].past, +.reveal .slides > section[data-transition~=convex-out].past, +.reveal.convex .slides > section:not([data-transition]).past { + -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); } + +.reveal .slides > section[data-transition=convex].future, +.reveal .slides > section[data-transition~=convex-in].future, +.reveal.convex .slides > section:not([data-transition]).future { + -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); } + +.reveal .slides > section > section[data-transition=convex].past, +.reveal .slides > section > section[data-transition~=convex-out].past, +.reveal.convex .slides > section > section:not([data-transition]).past { + -webkit-transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); + transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); } + +.reveal .slides > section > section[data-transition=convex].future, +.reveal .slides > section > section[data-transition~=convex-in].future, +.reveal.convex .slides > section > section:not([data-transition]).future { + -webkit-transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); + transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); } + +/********************************************* + * CONCAVE TRANSITION + *********************************************/ +.reveal .slides > section[data-transition=concave].past, +.reveal .slides > section[data-transition~=concave-out].past, +.reveal.concave .slides > section:not([data-transition]).past { + -webkit-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); } + +.reveal .slides > section[data-transition=concave].future, +.reveal .slides > section[data-transition~=concave-in].future, +.reveal.concave .slides > section:not([data-transition]).future { + -webkit-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); } + +.reveal .slides > section > section[data-transition=concave].past, +.reveal .slides > section > section[data-transition~=concave-out].past, +.reveal.concave .slides > section > section:not([data-transition]).past { + -webkit-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); + transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); } + +.reveal .slides > section > section[data-transition=concave].future, +.reveal .slides > section > section[data-transition~=concave-in].future, +.reveal.concave .slides > section > section:not([data-transition]).future { + -webkit-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); + transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); } + +/********************************************* + * ZOOM TRANSITION + *********************************************/ +.reveal .slides section[data-transition=zoom], +.reveal.zoom .slides section:not([data-transition]) { + -webkit-transition-timing-function: ease; + transition-timing-function: ease; } + +.reveal .slides > section[data-transition=zoom].past, +.reveal .slides > section[data-transition~=zoom-out].past, +.reveal.zoom .slides > section:not([data-transition]).past { + visibility: hidden; + -webkit-transform: scale(16); + -ms-transform: scale(16); + transform: scale(16); } + +.reveal .slides > section[data-transition=zoom].future, +.reveal .slides > section[data-transition~=zoom-in].future, +.reveal.zoom .slides > section:not([data-transition]).future { + visibility: hidden; + -webkit-transform: scale(0.2); + -ms-transform: scale(0.2); + transform: scale(0.2); } + +.reveal .slides > section > section[data-transition=zoom].past, +.reveal .slides > section > section[data-transition~=zoom-out].past, +.reveal.zoom .slides > section > section:not([data-transition]).past { + -webkit-transform: translate(0, -150%); + -ms-transform: translate(0, -150%); + transform: translate(0, -150%); } + +.reveal .slides > section > section[data-transition=zoom].future, +.reveal .slides > section > section[data-transition~=zoom-in].future, +.reveal.zoom .slides > section > section:not([data-transition]).future { + -webkit-transform: translate(0, 150%); + -ms-transform: translate(0, 150%); + transform: translate(0, 150%); } + +/********************************************* + * CUBE TRANSITION + *********************************************/ +.reveal.cube .slides { + -webkit-perspective: 1300px; + perspective: 1300px; } + +.reveal.cube .slides section { + padding: 30px; + min-height: 700px; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + box-sizing: border-box; } + +.reveal.center.cube .slides section { + min-height: 0; } + +.reveal.cube .slides section:not(.stack):before { + content: ''; + position: absolute; + display: block; + width: 100%; + height: 100%; + left: 0; + top: 0; + background: rgba(0, 0, 0, 0.1); + border-radius: 4px; + -webkit-transform: translateZ(-20px); + transform: translateZ(-20px); } + +.reveal.cube .slides section:not(.stack):after { + content: ''; + position: absolute; + display: block; + width: 90%; + height: 30px; + left: 5%; + bottom: 0; + background: none; + z-index: 1; + border-radius: 4px; + box-shadow: 0px 95px 25px rgba(0, 0, 0, 0.2); + -webkit-transform: translateZ(-90px) rotateX(65deg); + transform: translateZ(-90px) rotateX(65deg); } + +.reveal.cube .slides > section.stack { + padding: 0; + background: none; } + +.reveal.cube .slides > section.past { + -webkit-transform-origin: 100% 0%; + -ms-transform-origin: 100% 0%; + transform-origin: 100% 0%; + -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg); + transform: translate3d(-100%, 0, 0) rotateY(-90deg); } + +.reveal.cube .slides > section.future { + -webkit-transform-origin: 0% 0%; + -ms-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg); + transform: translate3d(100%, 0, 0) rotateY(90deg); } + +.reveal.cube .slides > section > section.past { + -webkit-transform-origin: 0% 100%; + -ms-transform-origin: 0% 100%; + transform-origin: 0% 100%; + -webkit-transform: translate3d(0, -100%, 0) rotateX(90deg); + transform: translate3d(0, -100%, 0) rotateX(90deg); } + +.reveal.cube .slides > section > section.future { + -webkit-transform-origin: 0% 0%; + -ms-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: translate3d(0, 100%, 0) rotateX(-90deg); + transform: translate3d(0, 100%, 0) rotateX(-90deg); } + +/********************************************* + * PAGE TRANSITION + *********************************************/ +.reveal.page .slides { + -webkit-perspective-origin: 0% 50%; + perspective-origin: 0% 50%; + -webkit-perspective: 3000px; + perspective: 3000px; } + +.reveal.page .slides section { + padding: 30px; + min-height: 700px; + box-sizing: border-box; } + +.reveal.page .slides section.past { + z-index: 12; } + +.reveal.page .slides section:not(.stack):before { + content: ''; + position: absolute; + display: block; + width: 100%; + height: 100%; + left: 0; + top: 0; + background: rgba(0, 0, 0, 0.1); + -webkit-transform: translateZ(-20px); + transform: translateZ(-20px); } + +.reveal.page .slides section:not(.stack):after { + content: ''; + position: absolute; + display: block; + width: 90%; + height: 30px; + left: 5%; + bottom: 0; + background: none; + z-index: 1; + border-radius: 4px; + box-shadow: 0px 95px 25px rgba(0, 0, 0, 0.2); + -webkit-transform: translateZ(-90px) rotateX(65deg); } + +.reveal.page .slides > section.stack { + padding: 0; + background: none; } + +.reveal.page .slides > section.past { + -webkit-transform-origin: 0% 0%; + -ms-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: translate3d(-40%, 0, 0) rotateY(-80deg); + transform: translate3d(-40%, 0, 0) rotateY(-80deg); } + +.reveal.page .slides > section.future { + -webkit-transform-origin: 100% 0%; + -ms-transform-origin: 100% 0%; + transform-origin: 100% 0%; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); } + +.reveal.page .slides > section > section.past { + -webkit-transform-origin: 0% 0%; + -ms-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: translate3d(0, -40%, 0) rotateX(80deg); + transform: translate3d(0, -40%, 0) rotateX(80deg); } + +.reveal.page .slides > section > section.future { + -webkit-transform-origin: 0% 100%; + -ms-transform-origin: 0% 100%; + transform-origin: 0% 100%; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); } + +/********************************************* + * FADE TRANSITION + *********************************************/ +.reveal .slides section[data-transition=fade], +.reveal.fade .slides section:not([data-transition]), +.reveal.fade .slides > section > section:not([data-transition]) { + -webkit-transform: none; + -ms-transform: none; + transform: none; + -webkit-transition: opacity 0.5s; + transition: opacity 0.5s; } + +.reveal.fade.overview .slides section, +.reveal.fade.overview .slides > section > section { + -webkit-transition: none; + transition: none; } + +/********************************************* + * NO TRANSITION + *********************************************/ +.reveal .slides section[data-transition=none], +.reveal.none .slides section:not([data-transition]) { + -webkit-transform: none; + -ms-transform: none; + transform: none; + -webkit-transition: none; + transition: none; } + +/********************************************* + * PAUSED MODE + *********************************************/ +.reveal .pause-overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: black; + visibility: hidden; + opacity: 0; + z-index: 100; + -webkit-transition: all 1s ease; + transition: all 1s ease; } + +.reveal.paused .pause-overlay { + visibility: visible; + opacity: 1; } + +/********************************************* + * FALLBACK + *********************************************/ +.no-transforms { + overflow-y: auto; } + +.no-transforms .reveal .slides { + position: relative; + width: 80%; + height: auto !important; + top: 0; + left: 50%; + margin: 0; + text-align: center; } + +.no-transforms .reveal .controls, +.no-transforms .reveal .progress { + display: none !important; } + +.no-transforms .reveal .slides section { + display: block !important; + opacity: 1 !important; + position: relative !important; + height: auto; + min-height: 0; + top: 0; + left: -50%; + margin: 70px 0; + -webkit-transform: none; + -ms-transform: none; + transform: none; } + +.no-transforms .reveal .slides section section { + left: 0; } + +.reveal .no-transition, +.reveal .no-transition * { + -webkit-transition: none !important; + transition: none !important; } + +/********************************************* + * PER-SLIDE BACKGROUNDS + *********************************************/ +.reveal .backgrounds { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + -webkit-perspective: 600px; + perspective: 600px; } + +.reveal .slide-background { + display: none; + position: absolute; + width: 100%; + height: 100%; + opacity: 0; + visibility: hidden; + background-color: transparent; + background-position: 50% 50%; + background-repeat: no-repeat; + background-size: cover; + -webkit-transition: all 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: all 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } + +.reveal .slide-background.stack { + display: block; } + +.reveal .slide-background.present { + opacity: 1; + visibility: visible; } + +.print-pdf .reveal .slide-background { + opacity: 1 !important; + visibility: visible !important; } + +/* Video backgrounds */ +.reveal .slide-background video { + position: absolute; + width: 100%; + height: 100%; + max-width: none; + max-height: none; + top: 0; + left: 0; } + +/* Immediate transition style */ +.reveal[data-background-transition=none] > .backgrounds .slide-background, +.reveal > .backgrounds .slide-background[data-background-transition=none] { + -webkit-transition: none; + transition: none; } + +/* Slide */ +.reveal[data-background-transition=slide] > .backgrounds .slide-background, +.reveal > .backgrounds .slide-background[data-background-transition=slide] { + opacity: 1; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.reveal[data-background-transition=slide] > .backgrounds .slide-background.past, +.reveal > .backgrounds .slide-background.past[data-background-transition=slide] { + -webkit-transform: translate(-100%, 0); + -ms-transform: translate(-100%, 0); + transform: translate(-100%, 0); } + +.reveal[data-background-transition=slide] > .backgrounds .slide-background.future, +.reveal > .backgrounds .slide-background.future[data-background-transition=slide] { + -webkit-transform: translate(100%, 0); + -ms-transform: translate(100%, 0); + transform: translate(100%, 0); } + +.reveal[data-background-transition=slide] > .backgrounds .slide-background > .slide-background.past, +.reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=slide] { + -webkit-transform: translate(0, -100%); + -ms-transform: translate(0, -100%); + transform: translate(0, -100%); } + +.reveal[data-background-transition=slide] > .backgrounds .slide-background > .slide-background.future, +.reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=slide] { + -webkit-transform: translate(0, 100%); + -ms-transform: translate(0, 100%); + transform: translate(0, 100%); } + +/* Convex */ +.reveal[data-background-transition=convex] > .backgrounds .slide-background.past, +.reveal > .backgrounds .slide-background.past[data-background-transition=convex] { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); } + +.reveal[data-background-transition=convex] > .backgrounds .slide-background.future, +.reveal > .backgrounds .slide-background.future[data-background-transition=convex] { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); } + +.reveal[data-background-transition=convex] > .backgrounds .slide-background > .slide-background.past, +.reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=convex] { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0); } + +.reveal[data-background-transition=convex] > .backgrounds .slide-background > .slide-background.future, +.reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=convex] { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0); } + +/* Concave */ +.reveal[data-background-transition=concave] > .backgrounds .slide-background.past, +.reveal > .backgrounds .slide-background.past[data-background-transition=concave] { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); } + +.reveal[data-background-transition=concave] > .backgrounds .slide-background.future, +.reveal > .backgrounds .slide-background.future[data-background-transition=concave] { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); } + +.reveal[data-background-transition=concave] > .backgrounds .slide-background > .slide-background.past, +.reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=concave] { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0); } + +.reveal[data-background-transition=concave] > .backgrounds .slide-background > .slide-background.future, +.reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=concave] { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0); } + +/* Zoom */ +.reveal[data-background-transition=zoom] > .backgrounds .slide-background, +.reveal > .backgrounds .slide-background[data-background-transition=zoom] { + -webkit-transition-timing-function: ease; + transition-timing-function: ease; } + +.reveal[data-background-transition=zoom] > .backgrounds .slide-background.past, +.reveal > .backgrounds .slide-background.past[data-background-transition=zoom] { + opacity: 0; + visibility: hidden; + -webkit-transform: scale(16); + -ms-transform: scale(16); + transform: scale(16); } + +.reveal[data-background-transition=zoom] > .backgrounds .slide-background.future, +.reveal > .backgrounds .slide-background.future[data-background-transition=zoom] { + opacity: 0; + visibility: hidden; + -webkit-transform: scale(0.2); + -ms-transform: scale(0.2); + transform: scale(0.2); } + +.reveal[data-background-transition=zoom] > .backgrounds .slide-background > .slide-background.past, +.reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=zoom] { + opacity: 0; + visibility: hidden; + -webkit-transform: scale(16); + -ms-transform: scale(16); + transform: scale(16); } + +.reveal[data-background-transition=zoom] > .backgrounds .slide-background > .slide-background.future, +.reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=zoom] { + opacity: 0; + visibility: hidden; + -webkit-transform: scale(0.2); + -ms-transform: scale(0.2); + transform: scale(0.2); } + +/* Global transition speed settings */ +.reveal[data-transition-speed="fast"] > .backgrounds .slide-background { + -webkit-transition-duration: 400ms; + transition-duration: 400ms; } + +.reveal[data-transition-speed="slow"] > .backgrounds .slide-background { + -webkit-transition-duration: 1200ms; + transition-duration: 1200ms; } + +/********************************************* + * OVERVIEW + *********************************************/ +.reveal.overview { + -webkit-perspective-origin: 50% 50%; + perspective-origin: 50% 50%; + -webkit-perspective: 700px; + perspective: 700px; } + .reveal.overview .slides section { + height: 700px; + opacity: 1 !important; + overflow: hidden; + visibility: visible !important; + cursor: pointer; + box-sizing: border-box; } + .reveal.overview .slides section:hover, + .reveal.overview .slides section.present { + outline: 10px solid rgba(150, 150, 150, 0.4); + outline-offset: 10px; } + .reveal.overview .slides section .fragment { + opacity: 1; + -webkit-transition: none; + transition: none; } + .reveal.overview .slides section:after, + .reveal.overview .slides section:before { + display: none !important; } + .reveal.overview .slides > section.stack { + padding: 0; + top: 0 !important; + background: none; + outline: none; + overflow: visible; } + .reveal.overview .backgrounds { + -webkit-perspective: inherit; + perspective: inherit; } + .reveal.overview .backgrounds .slide-background { + opacity: 1; + visibility: visible; + outline: 10px solid rgba(150, 150, 150, 0.1); + outline-offset: 10px; } + +.reveal.overview .slides section, +.reveal.overview-deactivating .slides section { + -webkit-transition: none; + transition: none; } + +.reveal.overview .backgrounds .slide-background, +.reveal.overview-deactivating .backgrounds .slide-background { + -webkit-transition: none; + transition: none; } + +.reveal.overview-animated .slides { + -webkit-transition: -webkit-transform 0.4s ease; + transition: transform 0.4s ease; } + +/********************************************* + * RTL SUPPORT + *********************************************/ +.reveal.rtl .slides, +.reveal.rtl .slides h1, +.reveal.rtl .slides h2, +.reveal.rtl .slides h3, +.reveal.rtl .slides h4, +.reveal.rtl .slides h5, +.reveal.rtl .slides h6 { + direction: rtl; + font-family: sans-serif; } + +.reveal.rtl pre, +.reveal.rtl code { + direction: ltr; } + +.reveal.rtl ol, +.reveal.rtl ul { + text-align: right; } + +.reveal.rtl .progress span { + float: right; } + +/********************************************* + * PARALLAX BACKGROUND + *********************************************/ +.reveal.has-parallax-background .backgrounds { + -webkit-transition: all 0.8s ease; + transition: all 0.8s ease; } + +/* Global transition speed settings */ +.reveal.has-parallax-background[data-transition-speed="fast"] .backgrounds { + -webkit-transition-duration: 400ms; + transition-duration: 400ms; } + +.reveal.has-parallax-background[data-transition-speed="slow"] .backgrounds { + -webkit-transition-duration: 1200ms; + transition-duration: 1200ms; } + +/********************************************* + * LINK PREVIEW OVERLAY + *********************************************/ +.reveal .overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1000; + background: rgba(0, 0, 0, 0.9); + opacity: 0; + visibility: hidden; + -webkit-transition: all 0.3s ease; + transition: all 0.3s ease; } + +.reveal .overlay.visible { + opacity: 1; + visibility: visible; } + +.reveal .overlay .spinner { + position: absolute; + display: block; + top: 50%; + left: 50%; + width: 32px; + height: 32px; + margin: -16px 0 0 -16px; + z-index: 10; + background-image: url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D); + visibility: visible; + opacity: 0.6; + -webkit-transition: all 0.3s ease; + transition: all 0.3s ease; } + +.reveal .overlay header { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 40px; + z-index: 2; + border-bottom: 1px solid #222; } + +.reveal .overlay header a { + display: inline-block; + width: 40px; + height: 40px; + padding: 0 10px; + float: right; + opacity: 0.6; + box-sizing: border-box; } + +.reveal .overlay header a:hover { + opacity: 1; } + +.reveal .overlay header a .icon { + display: inline-block; + width: 20px; + height: 20px; + background-position: 50% 50%; + background-size: 100%; + background-repeat: no-repeat; } + +.reveal .overlay header a.close .icon { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC); } + +.reveal .overlay header a.external .icon { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==); } + +.reveal .overlay .viewport { + position: absolute; + top: 40px; + right: 0; + bottom: 0; + left: 0; } + +.reveal .overlay.overlay-preview .viewport iframe { + width: 100%; + height: 100%; + max-width: 100%; + max-height: 100%; + border: 0; + opacity: 0; + visibility: hidden; + -webkit-transition: all 0.3s ease; + transition: all 0.3s ease; } + +.reveal .overlay.overlay-preview.loaded .viewport iframe { + opacity: 1; + visibility: visible; } + +.reveal .overlay.overlay-preview.loaded .spinner { + opacity: 0; + visibility: hidden; + -webkit-transform: scale(0.2); + -ms-transform: scale(0.2); + transform: scale(0.2); } + +.reveal .overlay.overlay-help .viewport { + overflow: auto; + color: #fff; } + +.reveal .overlay.overlay-help .viewport .viewport-inner { + width: 600px; + margin: 0 auto; + padding: 60px; + text-align: center; + letter-spacing: normal; } + +.reveal .overlay.overlay-help .viewport .viewport-inner .title { + font-size: 20px; } + +.reveal .overlay.overlay-help .viewport .viewport-inner table { + border: 1px solid #fff; + border-collapse: collapse; + font-size: 14px; } + +.reveal .overlay.overlay-help .viewport .viewport-inner table th, +.reveal .overlay.overlay-help .viewport .viewport-inner table td { + width: 200px; + padding: 10px; + border: 1px solid #fff; + vertical-align: middle; } + +.reveal .overlay.overlay-help .viewport .viewport-inner table th { + padding-top: 20px; + padding-bottom: 20px; } + +/********************************************* + * PLAYBACK COMPONENT + *********************************************/ +.reveal .playback { + position: fixed; + left: 15px; + bottom: 20px; + z-index: 30; + cursor: pointer; + -webkit-transition: all 400ms ease; + transition: all 400ms ease; } + +.reveal.overview .playback { + opacity: 0; + visibility: hidden; } + +/********************************************* + * ROLLING LINKS + *********************************************/ +.reveal .roll { + display: inline-block; + line-height: 1.2; + overflow: hidden; + vertical-align: top; + -webkit-perspective: 400px; + perspective: 400px; + -webkit-perspective-origin: 50% 50%; + perspective-origin: 50% 50%; } + +.reveal .roll:hover { + background: none; + text-shadow: none; } + +.reveal .roll span { + display: block; + position: relative; + padding: 0 2px; + pointer-events: none; + -webkit-transition: all 400ms ease; + transition: all 400ms ease; + -webkit-transform-origin: 50% 0%; + -ms-transform-origin: 50% 0%; + transform-origin: 50% 0%; + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; } + +.reveal .roll:hover span { + background: rgba(0, 0, 0, 0.5); + -webkit-transform: translate3d(0px, 0px, -45px) rotateX(90deg); + transform: translate3d(0px, 0px, -45px) rotateX(90deg); } + +.reveal .roll span:after { + content: attr(data-title); + display: block; + position: absolute; + left: 0; + top: 0; + padding: 0 2px; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transform-origin: 50% 0%; + -ms-transform-origin: 50% 0%; + transform-origin: 50% 0%; + -webkit-transform: translate3d(0px, 110%, 0px) rotateX(-90deg); + transform: translate3d(0px, 110%, 0px) rotateX(-90deg); } + +/********************************************* + * SPEAKER NOTES + *********************************************/ +.reveal aside.notes { + display: none; } + +.reveal .speaker-notes { + display: none; + position: absolute; + width: 70%; + max-height: 15%; + left: 15%; + bottom: 26px; + padding: 10px; + z-index: 1; + font-size: 18px; + line-height: 1.4; + color: #fff; + background-color: rgba(0, 0, 0, 0.5); + overflow: auto; + box-sizing: border-box; + text-align: left; + font-family: Helvetica, sans-serif; + -webkit-overflow-scrolling: touch; } + +.reveal .speaker-notes.visible:not(:empty) { + display: block; } + +@media screen and (max-width: 1024px) { + .reveal .speaker-notes { + font-size: 14px; } } + +@media screen and (max-width: 600px) { + .reveal .speaker-notes { + width: 90%; + left: 5%; } } + +/********************************************* + * ZOOM PLUGIN + *********************************************/ +.zoomed .reveal *, +.zoomed .reveal *:before, +.zoomed .reveal *:after { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; } + +.zoomed .reveal .progress, +.zoomed .reveal .controls { + opacity: 0; } + +.zoomed .reveal .roll span { + background: none; } + +.zoomed .reveal .roll span:after { + visibility: hidden; } diff --git a/theme/css/reveal.scss b/theme/css/reveal.scss new file mode 100644 index 0000000..eb600ac --- /dev/null +++ b/theme/css/reveal.scss @@ -0,0 +1,1379 @@ +/*! + * reveal.js + * http://lab.hakim.se/reveal-js + * MIT licensed + * + * Copyright (C) 2016 Hakim El Hattab, http://hakim.se + */ + + +/********************************************* + * RESET STYLES + *********************************************/ + +html, body, .reveal div, .reveal span, .reveal applet, .reveal object, .reveal iframe, +.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6, .reveal p, .reveal blockquote, .reveal pre, +.reveal a, .reveal abbr, .reveal acronym, .reveal address, .reveal big, .reveal cite, .reveal code, +.reveal del, .reveal dfn, .reveal em, .reveal img, .reveal ins, .reveal kbd, .reveal q, .reveal s, .reveal samp, +.reveal small, .reveal strike, .reveal strong, .reveal sub, .reveal sup, .reveal tt, .reveal var, +.reveal b, .reveal u, .reveal center, +.reveal dl, .reveal dt, .reveal dd, .reveal ol, .reveal ul, .reveal li, +.reveal fieldset, .reveal form, .reveal label, .reveal legend, +.reveal table, .reveal caption, .reveal tbody, .reveal tfoot, .reveal thead, .reveal tr, .reveal th, .reveal td, +.reveal article, .reveal aside, .reveal canvas, .reveal details, .reveal embed, +.reveal figure, .reveal figcaption, .reveal footer, .reveal header, .reveal hgroup, +.reveal menu, .reveal nav, .reveal output, .reveal ruby, .reveal section, .reveal summary, +.reveal time, .reveal mark, .reveal audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} + +.reveal article, .reveal aside, .reveal details, .reveal figcaption, .reveal figure, +.reveal footer, .reveal header, .reveal hgroup, .reveal menu, .reveal nav, .reveal section { + display: block; +} + + +/********************************************* + * GLOBAL STYLES + *********************************************/ + +html, +body { + width: 100%; + height: 100%; + overflow: hidden; +} + +body { + position: relative; + line-height: 1; + + background-color: #fff; + color: #000; +} + +// Ensures that the main background color matches the +// theme in fullscreen mode +html:-webkit-full-screen-ancestor { + background-color: inherit; +} +html:-moz-full-screen-ancestor { + background-color: inherit; +} + + +/********************************************* + * VIEW FRAGMENTS + *********************************************/ + +.reveal .slides section .fragment { + opacity: 0; + visibility: hidden; + transition: all .2s ease; + + &.visible { + opacity: 1; + visibility: visible; + } +} + +.reveal .slides section .fragment.grow { + opacity: 1; + visibility: visible; + + &.visible { + transform: scale( 1.3 ); + } +} + +.reveal .slides section .fragment.shrink { + opacity: 1; + visibility: visible; + + &.visible { + transform: scale( 0.7 ); + } +} + +.reveal .slides section .fragment.zoom-in { + transform: scale( 0.1 ); + + &.visible { + transform: none; + } +} + +.reveal .slides section .fragment.fade-out { + opacity: 1; + visibility: visible; + + &.visible { + opacity: 0; + visibility: hidden; + } +} + +.reveal .slides section .fragment.semi-fade-out { + opacity: 1; + visibility: visible; + + &.visible { + opacity: 0.5; + visibility: visible; + } +} + +.reveal .slides section .fragment.strike { + opacity: 1; + visibility: visible; + + &.visible { + text-decoration: line-through; + } +} + +.reveal .slides section .fragment.current-visible { + opacity: 0; + visibility: hidden; + + &.current-fragment { + opacity: 1; + visibility: visible; + } +} + +.reveal .slides section .fragment.highlight-red, +.reveal .slides section .fragment.highlight-current-red, +.reveal .slides section .fragment.highlight-green, +.reveal .slides section .fragment.highlight-current-green, +.reveal .slides section .fragment.highlight-blue, +.reveal .slides section .fragment.highlight-current-blue { + opacity: 1; + visibility: visible; +} + .reveal .slides section .fragment.highlight-red.visible { + color: #ff2c2d + } + .reveal .slides section .fragment.highlight-green.visible { + color: #17ff2e; + } + .reveal .slides section .fragment.highlight-blue.visible { + color: #1b91ff; + } + +.reveal .slides section .fragment.highlight-current-red.current-fragment { + color: #ff2c2d +} +.reveal .slides section .fragment.highlight-current-green.current-fragment { + color: #17ff2e; +} +.reveal .slides section .fragment.highlight-current-blue.current-fragment { + color: #1b91ff; +} + + +/********************************************* + * DEFAULT ELEMENT STYLES + *********************************************/ + +/* Fixes issue in Chrome where italic fonts did not appear when printing to PDF */ +.reveal:after { + content: ''; + font-style: italic; +} + +.reveal iframe { + z-index: 1; +} + +/** Prevents layering issues in certain browser/transition combinations */ +.reveal a { + position: relative; +} + +.reveal .stretch { + max-width: none; + max-height: none; +} + +.reveal pre.stretch code { + height: 100%; + max-height: 100%; + box-sizing: border-box; +} + + +/********************************************* + * CONTROLS + *********************************************/ + +.reveal .controls { + display: none; + position: fixed; + width: 110px; + height: 110px; + z-index: 30; + right: 10px; + bottom: 10px; + + -webkit-user-select: none; +} + +.reveal .controls button { + padding: 0; + position: absolute; + opacity: 0.05; + width: 0; + height: 0; + background-color: transparent; + border: 12px solid transparent; + transform: scale(.9999); + transition: all 0.2s ease; + -webkit-appearance: none; + -webkit-tap-highlight-color: rgba( 0, 0, 0, 0 ); +} + +.reveal .controls .enabled { + opacity: 0.7; + cursor: pointer; +} + +.reveal .controls .enabled:active { + margin-top: 1px; +} + + .reveal .controls .navigate-left { + top: 42px; + + border-right-width: 22px; + border-right-color: #000; + } + .reveal .controls .navigate-left.fragmented { + opacity: 0.3; + } + + .reveal .controls .navigate-right { + left: 74px; + top: 42px; + + border-left-width: 22px; + border-left-color: #000; + } + .reveal .controls .navigate-right.fragmented { + opacity: 0.3; + } + + .reveal .controls .navigate-up { + left: 42px; + + border-bottom-width: 22px; + border-bottom-color: #000; + } + .reveal .controls .navigate-up.fragmented { + opacity: 0.3; + } + + .reveal .controls .navigate-down { + left: 42px; + top: 74px; + + border-top-width: 22px; + border-top-color: #000; + } + .reveal .controls .navigate-down.fragmented { + opacity: 0.3; + } + + +/********************************************* + * PROGRESS BAR + *********************************************/ + +.reveal .progress { + position: fixed; + display: none; + height: 3px; + width: 100%; + bottom: 0; + left: 0; + z-index: 10; + + background-color: rgba( 0, 0, 0, 0.2 ); +} + .reveal .progress:after { + content: ''; + display: block; + position: absolute; + height: 20px; + width: 100%; + top: -20px; + } + .reveal .progress span { + display: block; + height: 100%; + width: 0px; + + background-color: #000; + transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + } + +/********************************************* + * SLIDE NUMBER + *********************************************/ + +.reveal .slide-number { + position: fixed; + display: block; + right: 8px; + bottom: 8px; + z-index: 31; + font-family: Helvetica, sans-serif; + font-size: 12px; + line-height: 1; + color: #fff; + background-color: rgba( 0, 0, 0, 0.4 ); + padding: 5px; +} + +.reveal .slide-number-delimiter { + margin: 0 3px; +} + +/********************************************* + * SLIDES + *********************************************/ + +.reveal { + position: relative; + width: 100%; + height: 100%; + overflow: hidden; + touch-action: none; +} + +.reveal .slides { + position: absolute; + width: 100%; + height: 100%; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; + + overflow: visible; + z-index: 1; + text-align: center; + perspective: 600px; + perspective-origin: 50% 40%; +} + +.reveal .slides>section { + -ms-perspective: 600px; +} + +.reveal .slides>section, +.reveal .slides>section>section { + display: none; + position: absolute; + width: 100%; + padding: 20px 0px; + + z-index: 10; + transform-style: preserve-3d; + transition: transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), + transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), + visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), + opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); +} + +/* Global transition speed settings */ +.reveal[data-transition-speed="fast"] .slides section { + transition-duration: 400ms; +} +.reveal[data-transition-speed="slow"] .slides section { + transition-duration: 1200ms; +} + +/* Slide-specific transition speed overrides */ +.reveal .slides section[data-transition-speed="fast"] { + transition-duration: 400ms; +} +.reveal .slides section[data-transition-speed="slow"] { + transition-duration: 1200ms; +} + +.reveal .slides>section.stack { + padding-top: 0; + padding-bottom: 0; +} + +.reveal .slides>section.present, +.reveal .slides>section>section.present { + display: block; + z-index: 11; + opacity: 1; +} + +.reveal.center, +.reveal.center .slides, +.reveal.center .slides section { + min-height: 0 !important; +} + +/* Don't allow interaction with invisible slides */ +.reveal .slides>section.future, +.reveal .slides>section>section.future, +.reveal .slides>section.past, +.reveal .slides>section>section.past { + pointer-events: none; +} + +.reveal.overview .slides>section, +.reveal.overview .slides>section>section { + pointer-events: auto; +} + +.reveal .slides>section.past, +.reveal .slides>section.future, +.reveal .slides>section>section.past, +.reveal .slides>section>section.future { + opacity: 0; +} + + +/********************************************* + * Mixins for readability of transitions + *********************************************/ + +@mixin transition-global($style) { + .reveal .slides section[data-transition=#{$style}], + .reveal.#{$style} .slides section:not([data-transition]) { + @content; + } +} +@mixin transition-horizontal-past($style) { + .reveal .slides>section[data-transition=#{$style}].past, + .reveal .slides>section[data-transition~=#{$style}-out].past, + .reveal.#{$style} .slides>section:not([data-transition]).past { + @content; + } +} +@mixin transition-horizontal-future($style) { + .reveal .slides>section[data-transition=#{$style}].future, + .reveal .slides>section[data-transition~=#{$style}-in].future, + .reveal.#{$style} .slides>section:not([data-transition]).future { + @content; + } +} + +@mixin transition-vertical-past($style) { + .reveal .slides>section>section[data-transition=#{$style}].past, + .reveal .slides>section>section[data-transition~=#{$style}-out].past, + .reveal.#{$style} .slides>section>section:not([data-transition]).past { + @content; + } +} +@mixin transition-vertical-future($style) { + .reveal .slides>section>section[data-transition=#{$style}].future, + .reveal .slides>section>section[data-transition~=#{$style}-in].future, + .reveal.#{$style} .slides>section>section:not([data-transition]).future { + @content; + } +} + +/********************************************* + * SLIDE TRANSITION + * Aliased 'linear' for backwards compatibility + *********************************************/ + +@each $stylename in slide, linear { + .reveal.#{$stylename} section { + backface-visibility: hidden; + } + @include transition-horizontal-past(#{$stylename}) { + transform: translate(-150%, 0); + } + @include transition-horizontal-future(#{$stylename}) { + transform: translate(150%, 0); + } + @include transition-vertical-past(#{$stylename}) { + transform: translate(0, -150%); + } + @include transition-vertical-future(#{$stylename}) { + transform: translate(0, 150%); + } +} + +/********************************************* + * CONVEX TRANSITION + * Aliased 'default' for backwards compatibility + *********************************************/ + +@each $stylename in default, convex { + @include transition-horizontal-past(#{$stylename}) { + transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); + } + @include transition-horizontal-future(#{$stylename}) { + transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); + } + @include transition-vertical-past(#{$stylename}) { + transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); + } + @include transition-vertical-future(#{$stylename}) { + transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); + } +} + +/********************************************* + * CONCAVE TRANSITION + *********************************************/ + +@include transition-horizontal-past(concave) { + transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); +} +@include transition-horizontal-future(concave) { + transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); +} +@include transition-vertical-past(concave) { + transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); +} +@include transition-vertical-future(concave) { + transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); +} + + +/********************************************* + * ZOOM TRANSITION + *********************************************/ + +@include transition-global(zoom) { + transition-timing-function: ease; +} +@include transition-horizontal-past(zoom) { + visibility: hidden; + transform: scale(16); +} +@include transition-horizontal-future(zoom) { + visibility: hidden; + transform: scale(0.2); +} +@include transition-vertical-past(zoom) { + transform: translate(0, -150%); +} +@include transition-vertical-future(zoom) { + transform: translate(0, 150%); +} + + +/********************************************* + * CUBE TRANSITION + *********************************************/ + +.reveal.cube .slides { + perspective: 1300px; +} + +.reveal.cube .slides section { + padding: 30px; + min-height: 700px; + backface-visibility: hidden; + box-sizing: border-box; +} + .reveal.center.cube .slides section { + min-height: 0; + } + .reveal.cube .slides section:not(.stack):before { + content: ''; + position: absolute; + display: block; + width: 100%; + height: 100%; + left: 0; + top: 0; + background: rgba(0,0,0,0.1); + border-radius: 4px; + transform: translateZ( -20px ); + } + .reveal.cube .slides section:not(.stack):after { + content: ''; + position: absolute; + display: block; + width: 90%; + height: 30px; + left: 5%; + bottom: 0; + background: none; + z-index: 1; + + border-radius: 4px; + box-shadow: 0px 95px 25px rgba(0,0,0,0.2); + transform: translateZ(-90px) rotateX( 65deg ); + } + +.reveal.cube .slides>section.stack { + padding: 0; + background: none; +} + +.reveal.cube .slides>section.past { + transform-origin: 100% 0%; + transform: translate3d(-100%, 0, 0) rotateY(-90deg); +} + +.reveal.cube .slides>section.future { + transform-origin: 0% 0%; + transform: translate3d(100%, 0, 0) rotateY(90deg); +} + +.reveal.cube .slides>section>section.past { + transform-origin: 0% 100%; + transform: translate3d(0, -100%, 0) rotateX(90deg); +} + +.reveal.cube .slides>section>section.future { + transform-origin: 0% 0%; + transform: translate3d(0, 100%, 0) rotateX(-90deg); +} + + +/********************************************* + * PAGE TRANSITION + *********************************************/ + +.reveal.page .slides { + perspective-origin: 0% 50%; + perspective: 3000px; +} + +.reveal.page .slides section { + padding: 30px; + min-height: 700px; + box-sizing: border-box; +} + .reveal.page .slides section.past { + z-index: 12; + } + .reveal.page .slides section:not(.stack):before { + content: ''; + position: absolute; + display: block; + width: 100%; + height: 100%; + left: 0; + top: 0; + background: rgba(0,0,0,0.1); + transform: translateZ( -20px ); + } + .reveal.page .slides section:not(.stack):after { + content: ''; + position: absolute; + display: block; + width: 90%; + height: 30px; + left: 5%; + bottom: 0; + background: none; + z-index: 1; + + border-radius: 4px; + box-shadow: 0px 95px 25px rgba(0,0,0,0.2); + + -webkit-transform: translateZ(-90px) rotateX( 65deg ); + } + +.reveal.page .slides>section.stack { + padding: 0; + background: none; +} + +.reveal.page .slides>section.past { + transform-origin: 0% 0%; + transform: translate3d(-40%, 0, 0) rotateY(-80deg); +} + +.reveal.page .slides>section.future { + transform-origin: 100% 0%; + transform: translate3d(0, 0, 0); +} + +.reveal.page .slides>section>section.past { + transform-origin: 0% 0%; + transform: translate3d(0, -40%, 0) rotateX(80deg); +} + +.reveal.page .slides>section>section.future { + transform-origin: 0% 100%; + transform: translate3d(0, 0, 0); +} + + +/********************************************* + * FADE TRANSITION + *********************************************/ + +.reveal .slides section[data-transition=fade], +.reveal.fade .slides section:not([data-transition]), +.reveal.fade .slides>section>section:not([data-transition]) { + transform: none; + transition: opacity 0.5s; +} + + +.reveal.fade.overview .slides section, +.reveal.fade.overview .slides>section>section { + transition: none; +} + + +/********************************************* + * NO TRANSITION + *********************************************/ + +@include transition-global(none) { + transform: none; + transition: none; +} + + +/********************************************* + * PAUSED MODE + *********************************************/ + +.reveal .pause-overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: black; + visibility: hidden; + opacity: 0; + z-index: 100; + transition: all 1s ease; +} +.reveal.paused .pause-overlay { + visibility: visible; + opacity: 1; +} + + +/********************************************* + * FALLBACK + *********************************************/ + +.no-transforms { + overflow-y: auto; +} + +.no-transforms .reveal .slides { + position: relative; + width: 80%; + height: auto !important; + top: 0; + left: 50%; + margin: 0; + text-align: center; +} + +.no-transforms .reveal .controls, +.no-transforms .reveal .progress { + display: none !important; +} + +.no-transforms .reveal .slides section { + display: block !important; + opacity: 1 !important; + position: relative !important; + height: auto; + min-height: 0; + top: 0; + left: -50%; + margin: 70px 0; + transform: none; +} + +.no-transforms .reveal .slides section section { + left: 0; +} + +.reveal .no-transition, +.reveal .no-transition * { + transition: none !important; +} + + +/********************************************* + * PER-SLIDE BACKGROUNDS + *********************************************/ + +.reveal .backgrounds { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + perspective: 600px; +} + .reveal .slide-background { + display: none; + position: absolute; + width: 100%; + height: 100%; + opacity: 0; + visibility: hidden; + + background-color: rgba( 0, 0, 0, 0 ); + background-position: 50% 50%; + background-repeat: no-repeat; + background-size: cover; + + transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + } + + .reveal .slide-background.stack { + display: block; + } + + .reveal .slide-background.present { + opacity: 1; + visibility: visible; + } + + .print-pdf .reveal .slide-background { + opacity: 1 !important; + visibility: visible !important; + } + +/* Video backgrounds */ +.reveal .slide-background video { + position: absolute; + width: 100%; + height: 100%; + max-width: none; + max-height: none; + top: 0; + left: 0; +} + +/* Immediate transition style */ +.reveal[data-background-transition=none]>.backgrounds .slide-background, +.reveal>.backgrounds .slide-background[data-background-transition=none] { + transition: none; +} + +/* Slide */ +.reveal[data-background-transition=slide]>.backgrounds .slide-background, +.reveal>.backgrounds .slide-background[data-background-transition=slide] { + opacity: 1; + backface-visibility: hidden; +} + .reveal[data-background-transition=slide]>.backgrounds .slide-background.past, + .reveal>.backgrounds .slide-background.past[data-background-transition=slide] { + transform: translate(-100%, 0); + } + .reveal[data-background-transition=slide]>.backgrounds .slide-background.future, + .reveal>.backgrounds .slide-background.future[data-background-transition=slide] { + transform: translate(100%, 0); + } + + .reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.past, + .reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=slide] { + transform: translate(0, -100%); + } + .reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.future, + .reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=slide] { + transform: translate(0, 100%); + } + + +/* Convex */ +.reveal[data-background-transition=convex]>.backgrounds .slide-background.past, +.reveal>.backgrounds .slide-background.past[data-background-transition=convex] { + opacity: 0; + transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); +} +.reveal[data-background-transition=convex]>.backgrounds .slide-background.future, +.reveal>.backgrounds .slide-background.future[data-background-transition=convex] { + opacity: 0; + transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); +} + +.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.past, +.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=convex] { + opacity: 0; + transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0); +} +.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.future, +.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=convex] { + opacity: 0; + transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0); +} + + +/* Concave */ +.reveal[data-background-transition=concave]>.backgrounds .slide-background.past, +.reveal>.backgrounds .slide-background.past[data-background-transition=concave] { + opacity: 0; + transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); +} +.reveal[data-background-transition=concave]>.backgrounds .slide-background.future, +.reveal>.backgrounds .slide-background.future[data-background-transition=concave] { + opacity: 0; + transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); +} + +.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.past, +.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=concave] { + opacity: 0; + transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0); +} +.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.future, +.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=concave] { + opacity: 0; + transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0); +} + +/* Zoom */ +.reveal[data-background-transition=zoom]>.backgrounds .slide-background, +.reveal>.backgrounds .slide-background[data-background-transition=zoom] { + transition-timing-function: ease; +} + +.reveal[data-background-transition=zoom]>.backgrounds .slide-background.past, +.reveal>.backgrounds .slide-background.past[data-background-transition=zoom] { + opacity: 0; + visibility: hidden; + transform: scale(16); +} +.reveal[data-background-transition=zoom]>.backgrounds .slide-background.future, +.reveal>.backgrounds .slide-background.future[data-background-transition=zoom] { + opacity: 0; + visibility: hidden; + transform: scale(0.2); +} + +.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.past, +.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=zoom] { + opacity: 0; + visibility: hidden; + transform: scale(16); +} +.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.future, +.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=zoom] { + opacity: 0; + visibility: hidden; + transform: scale(0.2); +} + + +/* Global transition speed settings */ +.reveal[data-transition-speed="fast"]>.backgrounds .slide-background { + transition-duration: 400ms; +} +.reveal[data-transition-speed="slow"]>.backgrounds .slide-background { + transition-duration: 1200ms; +} + + +/********************************************* + * OVERVIEW + *********************************************/ + +.reveal.overview { + perspective-origin: 50% 50%; + perspective: 700px; + + .slides section { + height: 700px; + opacity: 1 !important; + overflow: hidden; + visibility: visible !important; + cursor: pointer; + box-sizing: border-box; + } + .slides section:hover, + .slides section.present { + outline: 10px solid rgba(150,150,150,0.4); + outline-offset: 10px; + } + .slides section .fragment { + opacity: 1; + transition: none; + } + .slides section:after, + .slides section:before { + display: none !important; + } + .slides>section.stack { + padding: 0; + top: 0 !important; + background: none; + outline: none; + overflow: visible; + } + + .backgrounds { + perspective: inherit; + } + + .backgrounds .slide-background { + opacity: 1; + visibility: visible; + + // This can't be applied to the slide itself in Safari + outline: 10px solid rgba(150,150,150,0.1); + outline-offset: 10px; + } +} + +// Disable transitions transitions while we're activating +// or deactivating the overview mode. +.reveal.overview .slides section, +.reveal.overview-deactivating .slides section { + transition: none; +} + +.reveal.overview .backgrounds .slide-background, +.reveal.overview-deactivating .backgrounds .slide-background { + transition: none; +} + +.reveal.overview-animated .slides { + transition: transform 0.4s ease; +} + + +/********************************************* + * RTL SUPPORT + *********************************************/ + +.reveal.rtl .slides, +.reveal.rtl .slides h1, +.reveal.rtl .slides h2, +.reveal.rtl .slides h3, +.reveal.rtl .slides h4, +.reveal.rtl .slides h5, +.reveal.rtl .slides h6 { + direction: rtl; + font-family: sans-serif; +} + +.reveal.rtl pre, +.reveal.rtl code { + direction: ltr; +} + +.reveal.rtl ol, +.reveal.rtl ul { + text-align: right; +} + +.reveal.rtl .progress span { + float: right +} + +/********************************************* + * PARALLAX BACKGROUND + *********************************************/ + +.reveal.has-parallax-background .backgrounds { + transition: all 0.8s ease; +} + +/* Global transition speed settings */ +.reveal.has-parallax-background[data-transition-speed="fast"] .backgrounds { + transition-duration: 400ms; +} +.reveal.has-parallax-background[data-transition-speed="slow"] .backgrounds { + transition-duration: 1200ms; +} + + +/********************************************* + * LINK PREVIEW OVERLAY + *********************************************/ + +.reveal .overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1000; + background: rgba( 0, 0, 0, 0.9 ); + opacity: 0; + visibility: hidden; + transition: all 0.3s ease; +} + .reveal .overlay.visible { + opacity: 1; + visibility: visible; + } + + .reveal .overlay .spinner { + position: absolute; + display: block; + top: 50%; + left: 50%; + width: 32px; + height: 32px; + margin: -16px 0 0 -16px; + z-index: 10; + background-image: url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D); + + visibility: visible; + opacity: 0.6; + transition: all 0.3s ease; + } + + .reveal .overlay header { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 40px; + z-index: 2; + border-bottom: 1px solid #222; + } + .reveal .overlay header a { + display: inline-block; + width: 40px; + height: 40px; + padding: 0 10px; + float: right; + opacity: 0.6; + + box-sizing: border-box; + } + .reveal .overlay header a:hover { + opacity: 1; + } + .reveal .overlay header a .icon { + display: inline-block; + width: 20px; + height: 20px; + + background-position: 50% 50%; + background-size: 100%; + background-repeat: no-repeat; + } + .reveal .overlay header a.close .icon { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC); + } + .reveal .overlay header a.external .icon { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==); + } + + .reveal .overlay .viewport { + position: absolute; + top: 40px; + right: 0; + bottom: 0; + left: 0; + } + + .reveal .overlay.overlay-preview .viewport iframe { + width: 100%; + height: 100%; + max-width: 100%; + max-height: 100%; + border: 0; + + opacity: 0; + visibility: hidden; + transition: all 0.3s ease; + } + + .reveal .overlay.overlay-preview.loaded .viewport iframe { + opacity: 1; + visibility: visible; + } + + .reveal .overlay.overlay-preview.loaded .spinner { + opacity: 0; + visibility: hidden; + transform: scale(0.2); + } + + .reveal .overlay.overlay-help .viewport { + overflow: auto; + color: #fff; + } + + .reveal .overlay.overlay-help .viewport .viewport-inner { + width: 600px; + margin: 0 auto; + padding: 60px; + text-align: center; + letter-spacing: normal; + } + + .reveal .overlay.overlay-help .viewport .viewport-inner .title { + font-size: 20px; + } + + .reveal .overlay.overlay-help .viewport .viewport-inner table { + border: 1px solid #fff; + border-collapse: collapse; + font-size: 14px; + } + + .reveal .overlay.overlay-help .viewport .viewport-inner table th, + .reveal .overlay.overlay-help .viewport .viewport-inner table td { + width: 200px; + padding: 10px; + border: 1px solid #fff; + vertical-align: middle; + } + + .reveal .overlay.overlay-help .viewport .viewport-inner table th { + padding-top: 20px; + padding-bottom: 20px; + } + + + +/********************************************* + * PLAYBACK COMPONENT + *********************************************/ + +.reveal .playback { + position: fixed; + left: 15px; + bottom: 20px; + z-index: 30; + cursor: pointer; + transition: all 400ms ease; +} + +.reveal.overview .playback { + opacity: 0; + visibility: hidden; +} + + +/********************************************* + * ROLLING LINKS + *********************************************/ + +.reveal .roll { + display: inline-block; + line-height: 1.2; + overflow: hidden; + + vertical-align: top; + perspective: 400px; + perspective-origin: 50% 50%; +} + .reveal .roll:hover { + background: none; + text-shadow: none; + } +.reveal .roll span { + display: block; + position: relative; + padding: 0 2px; + + pointer-events: none; + transition: all 400ms ease; + transform-origin: 50% 0%; + transform-style: preserve-3d; + backface-visibility: hidden; +} + .reveal .roll:hover span { + background: rgba(0,0,0,0.5); + transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg ); + } +.reveal .roll span:after { + content: attr(data-title); + + display: block; + position: absolute; + left: 0; + top: 0; + padding: 0 2px; + backface-visibility: hidden; + transform-origin: 50% 0%; + transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg ); +} + + +/********************************************* + * SPEAKER NOTES + *********************************************/ + +// Hide on-page notes +.reveal aside.notes { + display: none; +} + +// An interface element that can optionally be used to show the +// speaker notes to all viewers, on top of the presentation +.reveal .speaker-notes { + display: none; + position: absolute; + width: 70%; + max-height: 15%; + left: 15%; + bottom: 26px; + padding: 10px; + z-index: 1; + font-size: 18px; + line-height: 1.4; + color: #fff; + background-color: rgba(0,0,0,0.5); + overflow: auto; + box-sizing: border-box; + text-align: left; + font-family: Helvetica, sans-serif; + -webkit-overflow-scrolling: touch; +} + +.reveal .speaker-notes.visible:not(:empty) { + display: block; +} + +@media screen and (max-width: 1024px) { + .reveal .speaker-notes { + font-size: 14px; + } +} + +@media screen and (max-width: 600px) { + .reveal .speaker-notes { + width: 90%; + left: 5%; + } +} + + +/********************************************* + * ZOOM PLUGIN + *********************************************/ + +.zoomed .reveal *, +.zoomed .reveal *:before, +.zoomed .reveal *:after { + backface-visibility: visible !important; +} + +.zoomed .reveal .progress, +.zoomed .reveal .controls { + opacity: 0; +} + +.zoomed .reveal .roll span { + background: none; +} + +.zoomed .reveal .roll span:after { + visibility: hidden; +} + + diff --git a/theme/css/theme/README.md b/theme/css/theme/README.md new file mode 100644 index 0000000..5a6c8fa --- /dev/null +++ b/theme/css/theme/README.md @@ -0,0 +1,21 @@ +## Dependencies + +Themes are written using Sass to keep things modular and reduce the need for repeated selectors across files. Make sure that you have the reveal.js development environment including the Grunt dependencies installed before proceding: https://github.com/hakimel/reveal.js#full-setup + +## Creating a Theme + +To create your own theme, start by duplicating a ```.scss``` file in [/css/theme/source](https://github.com/hakimel/reveal.js/blob/master/css/theme/source). It will be automatically compiled by Grunt from Sass to CSS (see the [Gruntfile](https://github.com/hakimel/reveal.js/blob/master/Gruntfile.js)) when you run `grunt css-themes`. + +Each theme file does four things in the following order: + +1. **Include [/css/theme/template/mixins.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/mixins.scss)** +Shared utility functions. + +2. **Include [/css/theme/template/settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss)** +Declares a set of custom variables that the template file (step 4) expects. Can be overridden in step 3. + +3. **Override** +This is where you override the default theme. Either by specifying variables (see [settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss) for reference) or by adding any selectors and styles you please. + +4. **Include [/css/theme/template/theme.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/theme.scss)** +The template theme file which will generate final CSS output based on the currently defined variables. diff --git a/theme/css/theme/beige.css b/theme/css/theme/beige.css new file mode 100644 index 0000000..be18733 --- /dev/null +++ b/theme/css/theme/beige.css @@ -0,0 +1,290 @@ +/** + * Beige theme for reveal.js. + * + * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ +@import url(../../lib/font/league-gothic/league-gothic.css); +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); +/********************************************* + * GLOBAL STYLES + *********************************************/ +body { + background: #f7f2d3; + background: -moz-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%); + background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, white), color-stop(100%, #f7f2d3)); + background: -webkit-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%); + background: -o-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%); + background: -ms-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%); + background: radial-gradient(center, circle cover, white 0%, #f7f2d3 100%); + background-color: #f7f3de; } + +.reveal { + font-family: "Lato", sans-serif; + font-size: 36px; + font-weight: normal; + color: #333; } + +::selection { + color: #fff; + background: rgba(79, 64, 28, 0.99); + text-shadow: none; } + +.reveal .slides > section, +.reveal .slides > section > section { + line-height: 1.3; + font-weight: inherit; } + +/********************************************* + * HEADERS + *********************************************/ +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: 0 0 20px 0; + color: #333; + font-family: "League Gothic", Impact, sans-serif; + font-weight: normal; + line-height: 1.2; + letter-spacing: normal; + text-transform: uppercase; + text-shadow: none; + word-wrap: break-word; } + +.reveal h1 { + font-size: 3.77em; } + +.reveal h2 { + font-size: 2.11em; } + +.reveal h3 { + font-size: 1.55em; } + +.reveal h4 { + font-size: 1em; } + +.reveal h1 { + text-shadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); } + +/********************************************* + * OTHER + *********************************************/ +.reveal p { + margin: 20px 0; + line-height: 1.3; } + +/* Ensure certain elements are never larger than the slide itself */ +.reveal img, +.reveal video, +.reveal iframe { + max-width: 95%; + max-height: 95%; } + +.reveal strong, +.reveal b { + font-weight: bold; } + +.reveal em { + font-style: italic; } + +.reveal ol, +.reveal dl, +.reveal ul { + display: inline-block; + text-align: left; + margin: 0 0 0 1em; } + +.reveal ol { + list-style-type: decimal; } + +.reveal ul { + list-style-type: disc; } + +.reveal ul ul { + list-style-type: square; } + +.reveal ul ul ul { + list-style-type: circle; } + +.reveal ul ul, +.reveal ul ol, +.reveal ol ol, +.reveal ol ul { + display: block; + margin-left: 40px; } + +.reveal dt { + font-weight: bold; } + +.reveal dd { + margin-left: 40px; } + +.reveal q, +.reveal blockquote { + quotes: none; } + +.reveal blockquote { + display: block; + position: relative; + width: 70%; + margin: 20px auto; + padding: 5px; + font-style: italic; + background: rgba(255, 255, 255, 0.05); + box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } + +.reveal blockquote p:first-child, +.reveal blockquote p:last-child { + display: inline-block; } + +.reveal q { + font-style: italic; } + +.reveal pre { + display: block; + position: relative; + width: 90%; + margin: 20px auto; + text-align: left; + font-size: 0.55em; + font-family: monospace; + line-height: 1.2em; + word-wrap: break-word; + box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } + +.reveal code { + font-family: monospace; } + +.reveal pre code { + display: block; + padding: 5px; + overflow: auto; + max-height: 400px; + word-wrap: normal; } + +.reveal table { + margin: auto; + border-collapse: collapse; + border-spacing: 0; } + +.reveal table th { + font-weight: bold; } + +.reveal table th, +.reveal table td { + text-align: left; + padding: 0.2em 0.5em 0.2em 0.5em; + border-bottom: 1px solid; } + +.reveal table th[align="center"], +.reveal table td[align="center"] { + text-align: center; } + +.reveal table th[align="right"], +.reveal table td[align="right"] { + text-align: right; } + +.reveal table tr:last-child td { + border-bottom: none; } + +.reveal sup { + vertical-align: super; } + +.reveal sub { + vertical-align: sub; } + +.reveal small { + display: inline-block; + font-size: 0.6em; + line-height: 1.2em; + vertical-align: top; } + +.reveal small * { + vertical-align: top; } + +/********************************************* + * LINKS + *********************************************/ +.reveal a { + color: #8b743d; + text-decoration: none; + -webkit-transition: color 0.15s ease; + -moz-transition: color 0.15s ease; + transition: color 0.15s ease; } + +.reveal a:hover { + color: #c0a86e; + text-shadow: none; + border: none; } + +.reveal .roll span:after { + color: #fff; + background: #564826; } + +/********************************************* + * IMAGES + *********************************************/ +.reveal section img { + margin: 15px 0px; + background: rgba(255, 255, 255, 0.12); + border: 4px solid #333; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } + +.reveal section img.plain { + border: 0; + box-shadow: none; } + +.reveal a img { + -webkit-transition: all 0.15s linear; + -moz-transition: all 0.15s linear; + transition: all 0.15s linear; } + +.reveal a:hover img { + background: rgba(255, 255, 255, 0.2); + border-color: #8b743d; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ +.reveal .controls .navigate-left, +.reveal .controls .navigate-left.enabled { + border-right-color: #8b743d; } + +.reveal .controls .navigate-right, +.reveal .controls .navigate-right.enabled { + border-left-color: #8b743d; } + +.reveal .controls .navigate-up, +.reveal .controls .navigate-up.enabled { + border-bottom-color: #8b743d; } + +.reveal .controls .navigate-down, +.reveal .controls .navigate-down.enabled { + border-top-color: #8b743d; } + +.reveal .controls .navigate-left.enabled:hover { + border-right-color: #c0a86e; } + +.reveal .controls .navigate-right.enabled:hover { + border-left-color: #c0a86e; } + +.reveal .controls .navigate-up.enabled:hover { + border-bottom-color: #c0a86e; } + +.reveal .controls .navigate-down.enabled:hover { + border-top-color: #c0a86e; } + +/********************************************* + * PROGRESS BAR + *********************************************/ +.reveal .progress { + background: rgba(0, 0, 0, 0.2); } + +.reveal .progress span { + background: #8b743d; + -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/theme/css/theme/black.css b/theme/css/theme/black.css new file mode 100644 index 0000000..deccc46 --- /dev/null +++ b/theme/css/theme/black.css @@ -0,0 +1,286 @@ +/** + * Black theme for reveal.js. This is the opposite of the 'white' theme. + * + * By Hakim El Hattab, http://hakim.se + */ +@import url(../../lib/font/source-sans-pro/source-sans-pro.css); +section.has-light-background, section.has-light-background h1, section.has-light-background h2, section.has-light-background h3, section.has-light-background h4, section.has-light-background h5, section.has-light-background h6 { + color: #222; } + +/********************************************* + * GLOBAL STYLES + *********************************************/ +body { + background: #222; + background-color: #222; } + +.reveal { + font-family: "Source Sans Pro", Helvetica, sans-serif; + font-size: 38px; + font-weight: normal; + color: #fff; } + +::selection { + color: #fff; + background: #bee4fd; + text-shadow: none; } + +.reveal .slides > section, +.reveal .slides > section > section { + line-height: 1.3; + font-weight: inherit; } + +/********************************************* + * HEADERS + *********************************************/ +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: 0 0 20px 0; + color: #fff; + font-family: "Source Sans Pro", Helvetica, sans-serif; + font-weight: 600; + line-height: 1.2; + letter-spacing: normal; + text-transform: uppercase; + text-shadow: none; + word-wrap: break-word; } + +.reveal h1 { + font-size: 2.5em; } + +.reveal h2 { + font-size: 1.6em; } + +.reveal h3 { + font-size: 1.3em; } + +.reveal h4 { + font-size: 1em; } + +.reveal h1 { + text-shadow: none; } + +/********************************************* + * OTHER + *********************************************/ +.reveal p { + margin: 20px 0; + line-height: 1.3; } + +/* Ensure certain elements are never larger than the slide itself */ +.reveal img, +.reveal video, +.reveal iframe { + max-width: 95%; + max-height: 95%; } + +.reveal strong, +.reveal b { + font-weight: bold; } + +.reveal em { + font-style: italic; } + +.reveal ol, +.reveal dl, +.reveal ul { + display: inline-block; + text-align: left; + margin: 0 0 0 1em; } + +.reveal ol { + list-style-type: decimal; } + +.reveal ul { + list-style-type: disc; } + +.reveal ul ul { + list-style-type: square; } + +.reveal ul ul ul { + list-style-type: circle; } + +.reveal ul ul, +.reveal ul ol, +.reveal ol ol, +.reveal ol ul { + display: block; + margin-left: 40px; } + +.reveal dt { + font-weight: bold; } + +.reveal dd { + margin-left: 40px; } + +.reveal q, +.reveal blockquote { + quotes: none; } + +.reveal blockquote { + display: block; + position: relative; + width: 70%; + margin: 20px auto; + padding: 5px; + font-style: italic; + background: rgba(255, 255, 255, 0.05); + box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } + +.reveal blockquote p:first-child, +.reveal blockquote p:last-child { + display: inline-block; } + +.reveal q { + font-style: italic; } + +.reveal pre { + display: block; + position: relative; + width: 90%; + margin: 20px auto; + text-align: left; + font-size: 0.55em; + font-family: monospace; + line-height: 1.2em; + word-wrap: break-word; + box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } + +.reveal code { + font-family: monospace; } + +.reveal pre code { + display: block; + padding: 5px; + overflow: auto; + max-height: 400px; + word-wrap: normal; } + +.reveal table { + margin: auto; + border-collapse: collapse; + border-spacing: 0; } + +.reveal table th { + font-weight: bold; } + +.reveal table th, +.reveal table td { + text-align: left; + padding: 0.2em 0.5em 0.2em 0.5em; + border-bottom: 1px solid; } + +.reveal table th[align="center"], +.reveal table td[align="center"] { + text-align: center; } + +.reveal table th[align="right"], +.reveal table td[align="right"] { + text-align: right; } + +.reveal table tr:last-child td { + border-bottom: none; } + +.reveal sup { + vertical-align: super; } + +.reveal sub { + vertical-align: sub; } + +.reveal small { + display: inline-block; + font-size: 0.6em; + line-height: 1.2em; + vertical-align: top; } + +.reveal small * { + vertical-align: top; } + +/********************************************* + * LINKS + *********************************************/ +.reveal a { + color: #42affa; + text-decoration: none; + -webkit-transition: color 0.15s ease; + -moz-transition: color 0.15s ease; + transition: color 0.15s ease; } + +.reveal a:hover { + color: #8dcffc; + text-shadow: none; + border: none; } + +.reveal .roll span:after { + color: #fff; + background: #068de9; } + +/********************************************* + * IMAGES + *********************************************/ +.reveal section img { + margin: 15px 0px; + background: rgba(255, 255, 255, 0.12); + border: 4px solid #fff; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } + +.reveal section img.plain { + border: 0; + box-shadow: none; } + +.reveal a img { + -webkit-transition: all 0.15s linear; + -moz-transition: all 0.15s linear; + transition: all 0.15s linear; } + +.reveal a:hover img { + background: rgba(255, 255, 255, 0.2); + border-color: #42affa; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ +.reveal .controls .navigate-left, +.reveal .controls .navigate-left.enabled { + border-right-color: #42affa; } + +.reveal .controls .navigate-right, +.reveal .controls .navigate-right.enabled { + border-left-color: #42affa; } + +.reveal .controls .navigate-up, +.reveal .controls .navigate-up.enabled { + border-bottom-color: #42affa; } + +.reveal .controls .navigate-down, +.reveal .controls .navigate-down.enabled { + border-top-color: #42affa; } + +.reveal .controls .navigate-left.enabled:hover { + border-right-color: #8dcffc; } + +.reveal .controls .navigate-right.enabled:hover { + border-left-color: #8dcffc; } + +.reveal .controls .navigate-up.enabled:hover { + border-bottom-color: #8dcffc; } + +.reveal .controls .navigate-down.enabled:hover { + border-top-color: #8dcffc; } + +/********************************************* + * PROGRESS BAR + *********************************************/ +.reveal .progress { + background: rgba(0, 0, 0, 0.2); } + +.reveal .progress span { + background: #42affa; + -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/theme/css/theme/blood.css b/theme/css/theme/blood.css new file mode 100644 index 0000000..e035ab6 --- /dev/null +++ b/theme/css/theme/blood.css @@ -0,0 +1,309 @@ +/** + * Blood theme for reveal.js + * Author: Walther http://github.com/Walther + * + * Designed to be used with highlight.js theme + * "monokai_sublime.css" available from + * https://github.com/isagalaev/highlight.js/ + * + * For other themes, change $codeBackground accordingly. + * + */ +@import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic); +/********************************************* + * GLOBAL STYLES + *********************************************/ +body { + background: #222; + background-color: #222; } + +.reveal { + font-family: Ubuntu, "sans-serif"; + font-size: 36px; + font-weight: normal; + color: #eee; } + +::selection { + color: #fff; + background: #a23; + text-shadow: none; } + +.reveal .slides > section, +.reveal .slides > section > section { + line-height: 1.3; + font-weight: inherit; } + +/********************************************* + * HEADERS + *********************************************/ +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: 0 0 20px 0; + color: #eee; + font-family: Ubuntu, "sans-serif"; + font-weight: normal; + line-height: 1.2; + letter-spacing: normal; + text-transform: uppercase; + text-shadow: 2px 2px 2px #222; + word-wrap: break-word; } + +.reveal h1 { + font-size: 3.77em; } + +.reveal h2 { + font-size: 2.11em; } + +.reveal h3 { + font-size: 1.55em; } + +.reveal h4 { + font-size: 1em; } + +.reveal h1 { + text-shadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); } + +/********************************************* + * OTHER + *********************************************/ +.reveal p { + margin: 20px 0; + line-height: 1.3; } + +/* Ensure certain elements are never larger than the slide itself */ +.reveal img, +.reveal video, +.reveal iframe { + max-width: 95%; + max-height: 95%; } + +.reveal strong, +.reveal b { + font-weight: bold; } + +.reveal em { + font-style: italic; } + +.reveal ol, +.reveal dl, +.reveal ul { + display: inline-block; + text-align: left; + margin: 0 0 0 1em; } + +.reveal ol { + list-style-type: decimal; } + +.reveal ul { + list-style-type: disc; } + +.reveal ul ul { + list-style-type: square; } + +.reveal ul ul ul { + list-style-type: circle; } + +.reveal ul ul, +.reveal ul ol, +.reveal ol ol, +.reveal ol ul { + display: block; + margin-left: 40px; } + +.reveal dt { + font-weight: bold; } + +.reveal dd { + margin-left: 40px; } + +.reveal q, +.reveal blockquote { + quotes: none; } + +.reveal blockquote { + display: block; + position: relative; + width: 70%; + margin: 20px auto; + padding: 5px; + font-style: italic; + background: rgba(255, 255, 255, 0.05); + box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } + +.reveal blockquote p:first-child, +.reveal blockquote p:last-child { + display: inline-block; } + +.reveal q { + font-style: italic; } + +.reveal pre { + display: block; + position: relative; + width: 90%; + margin: 20px auto; + text-align: left; + font-size: 0.55em; + font-family: monospace; + line-height: 1.2em; + word-wrap: break-word; + box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } + +.reveal code { + font-family: monospace; } + +.reveal pre code { + display: block; + padding: 5px; + overflow: auto; + max-height: 400px; + word-wrap: normal; } + +.reveal table { + margin: auto; + border-collapse: collapse; + border-spacing: 0; } + +.reveal table th { + font-weight: bold; } + +.reveal table th, +.reveal table td { + text-align: left; + padding: 0.2em 0.5em 0.2em 0.5em; + border-bottom: 1px solid; } + +.reveal table th[align="center"], +.reveal table td[align="center"] { + text-align: center; } + +.reveal table th[align="right"], +.reveal table td[align="right"] { + text-align: right; } + +.reveal table tr:last-child td { + border-bottom: none; } + +.reveal sup { + vertical-align: super; } + +.reveal sub { + vertical-align: sub; } + +.reveal small { + display: inline-block; + font-size: 0.6em; + line-height: 1.2em; + vertical-align: top; } + +.reveal small * { + vertical-align: top; } + +/********************************************* + * LINKS + *********************************************/ +.reveal a { + color: #a23; + text-decoration: none; + -webkit-transition: color 0.15s ease; + -moz-transition: color 0.15s ease; + transition: color 0.15s ease; } + +.reveal a:hover { + color: #dd5566; + text-shadow: none; + border: none; } + +.reveal .roll span:after { + color: #fff; + background: #6a1520; } + +/********************************************* + * IMAGES + *********************************************/ +.reveal section img { + margin: 15px 0px; + background: rgba(255, 255, 255, 0.12); + border: 4px solid #eee; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } + +.reveal section img.plain { + border: 0; + box-shadow: none; } + +.reveal a img { + -webkit-transition: all 0.15s linear; + -moz-transition: all 0.15s linear; + transition: all 0.15s linear; } + +.reveal a:hover img { + background: rgba(255, 255, 255, 0.2); + border-color: #a23; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ +.reveal .controls .navigate-left, +.reveal .controls .navigate-left.enabled { + border-right-color: #a23; } + +.reveal .controls .navigate-right, +.reveal .controls .navigate-right.enabled { + border-left-color: #a23; } + +.reveal .controls .navigate-up, +.reveal .controls .navigate-up.enabled { + border-bottom-color: #a23; } + +.reveal .controls .navigate-down, +.reveal .controls .navigate-down.enabled { + border-top-color: #a23; } + +.reveal .controls .navigate-left.enabled:hover { + border-right-color: #dd5566; } + +.reveal .controls .navigate-right.enabled:hover { + border-left-color: #dd5566; } + +.reveal .controls .navigate-up.enabled:hover { + border-bottom-color: #dd5566; } + +.reveal .controls .navigate-down.enabled:hover { + border-top-color: #dd5566; } + +/********************************************* + * PROGRESS BAR + *********************************************/ +.reveal .progress { + background: rgba(0, 0, 0, 0.2); } + +.reveal .progress span { + background: #a23; + -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } + +.reveal p { + font-weight: 300; + text-shadow: 1px 1px #222; } + +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + font-weight: 700; } + +.reveal p code { + background-color: #23241f; + display: inline-block; + border-radius: 7px; } + +.reveal small code { + vertical-align: baseline; } diff --git a/theme/css/theme/league.css b/theme/css/theme/league.css new file mode 100644 index 0000000..fa9f53c --- /dev/null +++ b/theme/css/theme/league.css @@ -0,0 +1,292 @@ +/** + * League theme for reveal.js. + * + * This was the default theme pre-3.0.0. + * + * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ +@import url(../../lib/font/league-gothic/league-gothic.css); +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); +/********************************************* + * GLOBAL STYLES + *********************************************/ +body { + background: #1c1e20; + background: -moz-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); + background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #555a5f), color-stop(100%, #1c1e20)); + background: -webkit-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); + background: -o-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); + background: -ms-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); + background: radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); + background-color: #2b2b2b; } + +.reveal { + font-family: "Lato", sans-serif; + font-size: 36px; + font-weight: normal; + color: #eee; } + +::selection { + color: #fff; + background: #FF5E99; + text-shadow: none; } + +.reveal .slides > section, +.reveal .slides > section > section { + line-height: 1.3; + font-weight: inherit; } + +/********************************************* + * HEADERS + *********************************************/ +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: 0 0 20px 0; + color: #eee; + font-family: "League Gothic", Impact, sans-serif; + font-weight: normal; + line-height: 1.2; + letter-spacing: normal; + text-transform: uppercase; + text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); + word-wrap: break-word; } + +.reveal h1 { + font-size: 3.77em; } + +.reveal h2 { + font-size: 2.11em; } + +.reveal h3 { + font-size: 1.55em; } + +.reveal h4 { + font-size: 1em; } + +.reveal h1 { + text-shadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); } + +/********************************************* + * OTHER + *********************************************/ +.reveal p { + margin: 20px 0; + line-height: 1.3; } + +/* Ensure certain elements are never larger than the slide itself */ +.reveal img, +.reveal video, +.reveal iframe { + max-width: 95%; + max-height: 95%; } + +.reveal strong, +.reveal b { + font-weight: bold; } + +.reveal em { + font-style: italic; } + +.reveal ol, +.reveal dl, +.reveal ul { + display: inline-block; + text-align: left; + margin: 0 0 0 1em; } + +.reveal ol { + list-style-type: decimal; } + +.reveal ul { + list-style-type: disc; } + +.reveal ul ul { + list-style-type: square; } + +.reveal ul ul ul { + list-style-type: circle; } + +.reveal ul ul, +.reveal ul ol, +.reveal ol ol, +.reveal ol ul { + display: block; + margin-left: 40px; } + +.reveal dt { + font-weight: bold; } + +.reveal dd { + margin-left: 40px; } + +.reveal q, +.reveal blockquote { + quotes: none; } + +.reveal blockquote { + display: block; + position: relative; + width: 70%; + margin: 20px auto; + padding: 5px; + font-style: italic; + background: rgba(255, 255, 255, 0.05); + box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } + +.reveal blockquote p:first-child, +.reveal blockquote p:last-child { + display: inline-block; } + +.reveal q { + font-style: italic; } + +.reveal pre { + display: block; + position: relative; + width: 90%; + margin: 20px auto; + text-align: left; + font-size: 0.55em; + font-family: monospace; + line-height: 1.2em; + word-wrap: break-word; + box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } + +.reveal code { + font-family: monospace; } + +.reveal pre code { + display: block; + padding: 5px; + overflow: auto; + max-height: 400px; + word-wrap: normal; } + +.reveal table { + margin: auto; + border-collapse: collapse; + border-spacing: 0; } + +.reveal table th { + font-weight: bold; } + +.reveal table th, +.reveal table td { + text-align: left; + padding: 0.2em 0.5em 0.2em 0.5em; + border-bottom: 1px solid; } + +.reveal table th[align="center"], +.reveal table td[align="center"] { + text-align: center; } + +.reveal table th[align="right"], +.reveal table td[align="right"] { + text-align: right; } + +.reveal table tr:last-child td { + border-bottom: none; } + +.reveal sup { + vertical-align: super; } + +.reveal sub { + vertical-align: sub; } + +.reveal small { + display: inline-block; + font-size: 0.6em; + line-height: 1.2em; + vertical-align: top; } + +.reveal small * { + vertical-align: top; } + +/********************************************* + * LINKS + *********************************************/ +.reveal a { + color: #13DAEC; + text-decoration: none; + -webkit-transition: color 0.15s ease; + -moz-transition: color 0.15s ease; + transition: color 0.15s ease; } + +.reveal a:hover { + color: #71e9f4; + text-shadow: none; + border: none; } + +.reveal .roll span:after { + color: #fff; + background: #0d99a5; } + +/********************************************* + * IMAGES + *********************************************/ +.reveal section img { + margin: 15px 0px; + background: rgba(255, 255, 255, 0.12); + border: 4px solid #eee; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } + +.reveal section img.plain { + border: 0; + box-shadow: none; } + +.reveal a img { + -webkit-transition: all 0.15s linear; + -moz-transition: all 0.15s linear; + transition: all 0.15s linear; } + +.reveal a:hover img { + background: rgba(255, 255, 255, 0.2); + border-color: #13DAEC; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ +.reveal .controls .navigate-left, +.reveal .controls .navigate-left.enabled { + border-right-color: #13DAEC; } + +.reveal .controls .navigate-right, +.reveal .controls .navigate-right.enabled { + border-left-color: #13DAEC; } + +.reveal .controls .navigate-up, +.reveal .controls .navigate-up.enabled { + border-bottom-color: #13DAEC; } + +.reveal .controls .navigate-down, +.reveal .controls .navigate-down.enabled { + border-top-color: #13DAEC; } + +.reveal .controls .navigate-left.enabled:hover { + border-right-color: #71e9f4; } + +.reveal .controls .navigate-right.enabled:hover { + border-left-color: #71e9f4; } + +.reveal .controls .navigate-up.enabled:hover { + border-bottom-color: #71e9f4; } + +.reveal .controls .navigate-down.enabled:hover { + border-top-color: #71e9f4; } + +/********************************************* + * PROGRESS BAR + *********************************************/ +.reveal .progress { + background: rgba(0, 0, 0, 0.2); } + +.reveal .progress span { + background: #13DAEC; + -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/theme/css/theme/moon.css b/theme/css/theme/moon.css new file mode 100644 index 0000000..b119576 --- /dev/null +++ b/theme/css/theme/moon.css @@ -0,0 +1,290 @@ +/** + * Solarized Dark theme for reveal.js. + * Author: Achim Staebler + */ +@import url(../../lib/font/league-gothic/league-gothic.css); +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); +/** + * Solarized colors by Ethan Schoonover + */ +html * { + color-profile: sRGB; + rendering-intent: auto; } + +/********************************************* + * GLOBAL STYLES + *********************************************/ +body { + background: #002b36; + background-color: #002b36; } + +.reveal { + font-family: "Lato", sans-serif; + font-size: 36px; + font-weight: normal; + color: #93a1a1; } + +::selection { + color: #fff; + background: #d33682; + text-shadow: none; } + +.reveal .slides > section, +.reveal .slides > section > section { + line-height: 1.3; + font-weight: inherit; } + +/********************************************* + * HEADERS + *********************************************/ +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: 0 0 20px 0; + color: #eee8d5; + font-family: "League Gothic", Impact, sans-serif; + font-weight: normal; + line-height: 1.2; + letter-spacing: normal; + text-transform: uppercase; + text-shadow: none; + word-wrap: break-word; } + +.reveal h1 { + font-size: 3.77em; } + +.reveal h2 { + font-size: 2.11em; } + +.reveal h3 { + font-size: 1.55em; } + +.reveal h4 { + font-size: 1em; } + +.reveal h1 { + text-shadow: none; } + +/********************************************* + * OTHER + *********************************************/ +.reveal p { + margin: 20px 0; + line-height: 1.3; } + +/* Ensure certain elements are never larger than the slide itself */ +.reveal img, +.reveal video, +.reveal iframe { + max-width: 95%; + max-height: 95%; } + +.reveal strong, +.reveal b { + font-weight: bold; } + +.reveal em { + font-style: italic; } + +.reveal ol, +.reveal dl, +.reveal ul { + display: inline-block; + text-align: left; + margin: 0 0 0 1em; } + +.reveal ol { + list-style-type: decimal; } + +.reveal ul { + list-style-type: disc; } + +.reveal ul ul { + list-style-type: square; } + +.reveal ul ul ul { + list-style-type: circle; } + +.reveal ul ul, +.reveal ul ol, +.reveal ol ol, +.reveal ol ul { + display: block; + margin-left: 40px; } + +.reveal dt { + font-weight: bold; } + +.reveal dd { + margin-left: 40px; } + +.reveal q, +.reveal blockquote { + quotes: none; } + +.reveal blockquote { + display: block; + position: relative; + width: 70%; + margin: 20px auto; + padding: 5px; + font-style: italic; + background: rgba(255, 255, 255, 0.05); + box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } + +.reveal blockquote p:first-child, +.reveal blockquote p:last-child { + display: inline-block; } + +.reveal q { + font-style: italic; } + +.reveal pre { + display: block; + position: relative; + width: 90%; + margin: 20px auto; + text-align: left; + font-size: 0.55em; + font-family: monospace; + line-height: 1.2em; + word-wrap: break-word; + box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } + +.reveal code { + font-family: monospace; } + +.reveal pre code { + display: block; + padding: 5px; + overflow: auto; + max-height: 400px; + word-wrap: normal; } + +.reveal table { + margin: auto; + border-collapse: collapse; + border-spacing: 0; } + +.reveal table th { + font-weight: bold; } + +.reveal table th, +.reveal table td { + text-align: left; + padding: 0.2em 0.5em 0.2em 0.5em; + border-bottom: 1px solid; } + +.reveal table th[align="center"], +.reveal table td[align="center"] { + text-align: center; } + +.reveal table th[align="right"], +.reveal table td[align="right"] { + text-align: right; } + +.reveal table tr:last-child td { + border-bottom: none; } + +.reveal sup { + vertical-align: super; } + +.reveal sub { + vertical-align: sub; } + +.reveal small { + display: inline-block; + font-size: 0.6em; + line-height: 1.2em; + vertical-align: top; } + +.reveal small * { + vertical-align: top; } + +/********************************************* + * LINKS + *********************************************/ +.reveal a { + color: #268bd2; + text-decoration: none; + -webkit-transition: color 0.15s ease; + -moz-transition: color 0.15s ease; + transition: color 0.15s ease; } + +.reveal a:hover { + color: #78b9e6; + text-shadow: none; + border: none; } + +.reveal .roll span:after { + color: #fff; + background: #1a6091; } + +/********************************************* + * IMAGES + *********************************************/ +.reveal section img { + margin: 15px 0px; + background: rgba(255, 255, 255, 0.12); + border: 4px solid #93a1a1; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } + +.reveal section img.plain { + border: 0; + box-shadow: none; } + +.reveal a img { + -webkit-transition: all 0.15s linear; + -moz-transition: all 0.15s linear; + transition: all 0.15s linear; } + +.reveal a:hover img { + background: rgba(255, 255, 255, 0.2); + border-color: #268bd2; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ +.reveal .controls .navigate-left, +.reveal .controls .navigate-left.enabled { + border-right-color: #268bd2; } + +.reveal .controls .navigate-right, +.reveal .controls .navigate-right.enabled { + border-left-color: #268bd2; } + +.reveal .controls .navigate-up, +.reveal .controls .navigate-up.enabled { + border-bottom-color: #268bd2; } + +.reveal .controls .navigate-down, +.reveal .controls .navigate-down.enabled { + border-top-color: #268bd2; } + +.reveal .controls .navigate-left.enabled:hover { + border-right-color: #78b9e6; } + +.reveal .controls .navigate-right.enabled:hover { + border-left-color: #78b9e6; } + +.reveal .controls .navigate-up.enabled:hover { + border-bottom-color: #78b9e6; } + +.reveal .controls .navigate-down.enabled:hover { + border-top-color: #78b9e6; } + +/********************************************* + * PROGRESS BAR + *********************************************/ +.reveal .progress { + background: rgba(0, 0, 0, 0.2); } + +.reveal .progress span { + background: #268bd2; + -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/theme/css/theme/night.css b/theme/css/theme/night.css new file mode 100644 index 0000000..3d0e3c5 --- /dev/null +++ b/theme/css/theme/night.css @@ -0,0 +1,284 @@ +/** + * Black theme for reveal.js. + * + * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ +@import url(https://fonts.googleapis.com/css?family=Montserrat:700); +@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic); +/********************************************* + * GLOBAL STYLES + *********************************************/ +body { + background: #111; + background-color: #111; } + +.reveal { + font-family: "Open Sans", sans-serif; + font-size: 30px; + font-weight: normal; + color: #eee; } + +::selection { + color: #fff; + background: #e7ad52; + text-shadow: none; } + +.reveal .slides > section, +.reveal .slides > section > section { + line-height: 1.3; + font-weight: inherit; } + +/********************************************* + * HEADERS + *********************************************/ +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: 0 0 20px 0; + color: #eee; + font-family: "Montserrat", Impact, sans-serif; + font-weight: normal; + line-height: 1.2; + letter-spacing: -0.03em; + text-transform: none; + text-shadow: none; + word-wrap: break-word; } + +.reveal h1 { + font-size: 3.77em; } + +.reveal h2 { + font-size: 2.11em; } + +.reveal h3 { + font-size: 1.55em; } + +.reveal h4 { + font-size: 1em; } + +.reveal h1 { + text-shadow: none; } + +/********************************************* + * OTHER + *********************************************/ +.reveal p { + margin: 20px 0; + line-height: 1.3; } + +/* Ensure certain elements are never larger than the slide itself */ +.reveal img, +.reveal video, +.reveal iframe { + max-width: 95%; + max-height: 95%; } + +.reveal strong, +.reveal b { + font-weight: bold; } + +.reveal em { + font-style: italic; } + +.reveal ol, +.reveal dl, +.reveal ul { + display: inline-block; + text-align: left; + margin: 0 0 0 1em; } + +.reveal ol { + list-style-type: decimal; } + +.reveal ul { + list-style-type: disc; } + +.reveal ul ul { + list-style-type: square; } + +.reveal ul ul ul { + list-style-type: circle; } + +.reveal ul ul, +.reveal ul ol, +.reveal ol ol, +.reveal ol ul { + display: block; + margin-left: 40px; } + +.reveal dt { + font-weight: bold; } + +.reveal dd { + margin-left: 40px; } + +.reveal q, +.reveal blockquote { + quotes: none; } + +.reveal blockquote { + display: block; + position: relative; + width: 70%; + margin: 20px auto; + padding: 5px; + font-style: italic; + background: rgba(255, 255, 255, 0.05); + box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } + +.reveal blockquote p:first-child, +.reveal blockquote p:last-child { + display: inline-block; } + +.reveal q { + font-style: italic; } + +.reveal pre { + display: block; + position: relative; + width: 90%; + margin: 20px auto; + text-align: left; + font-size: 0.55em; + font-family: monospace; + line-height: 1.2em; + word-wrap: break-word; + box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } + +.reveal code { + font-family: monospace; } + +.reveal pre code { + display: block; + padding: 5px; + overflow: auto; + max-height: 400px; + word-wrap: normal; } + +.reveal table { + margin: auto; + border-collapse: collapse; + border-spacing: 0; } + +.reveal table th { + font-weight: bold; } + +.reveal table th, +.reveal table td { + text-align: left; + padding: 0.2em 0.5em 0.2em 0.5em; + border-bottom: 1px solid; } + +.reveal table th[align="center"], +.reveal table td[align="center"] { + text-align: center; } + +.reveal table th[align="right"], +.reveal table td[align="right"] { + text-align: right; } + +.reveal table tr:last-child td { + border-bottom: none; } + +.reveal sup { + vertical-align: super; } + +.reveal sub { + vertical-align: sub; } + +.reveal small { + display: inline-block; + font-size: 0.6em; + line-height: 1.2em; + vertical-align: top; } + +.reveal small * { + vertical-align: top; } + +/********************************************* + * LINKS + *********************************************/ +.reveal a { + color: #e7ad52; + text-decoration: none; + -webkit-transition: color 0.15s ease; + -moz-transition: color 0.15s ease; + transition: color 0.15s ease; } + +.reveal a:hover { + color: #f3d7ac; + text-shadow: none; + border: none; } + +.reveal .roll span:after { + color: #fff; + background: #d08a1d; } + +/********************************************* + * IMAGES + *********************************************/ +.reveal section img { + margin: 15px 0px; + background: rgba(255, 255, 255, 0.12); + border: 4px solid #eee; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } + +.reveal section img.plain { + border: 0; + box-shadow: none; } + +.reveal a img { + -webkit-transition: all 0.15s linear; + -moz-transition: all 0.15s linear; + transition: all 0.15s linear; } + +.reveal a:hover img { + background: rgba(255, 255, 255, 0.2); + border-color: #e7ad52; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ +.reveal .controls .navigate-left, +.reveal .controls .navigate-left.enabled { + border-right-color: #e7ad52; } + +.reveal .controls .navigate-right, +.reveal .controls .navigate-right.enabled { + border-left-color: #e7ad52; } + +.reveal .controls .navigate-up, +.reveal .controls .navigate-up.enabled { + border-bottom-color: #e7ad52; } + +.reveal .controls .navigate-down, +.reveal .controls .navigate-down.enabled { + border-top-color: #e7ad52; } + +.reveal .controls .navigate-left.enabled:hover { + border-right-color: #f3d7ac; } + +.reveal .controls .navigate-right.enabled:hover { + border-left-color: #f3d7ac; } + +.reveal .controls .navigate-up.enabled:hover { + border-bottom-color: #f3d7ac; } + +.reveal .controls .navigate-down.enabled:hover { + border-top-color: #f3d7ac; } + +/********************************************* + * PROGRESS BAR + *********************************************/ +.reveal .progress { + background: rgba(0, 0, 0, 0.2); } + +.reveal .progress span { + background: #e7ad52; + -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/theme/css/theme/serif.css b/theme/css/theme/serif.css new file mode 100644 index 0000000..736c0b5 --- /dev/null +++ b/theme/css/theme/serif.css @@ -0,0 +1,286 @@ +/** + * A simple theme for reveal.js presentations, similar + * to the default theme. The accent color is brown. + * + * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed. + */ +.reveal a { + line-height: 1.3em; } + +/********************************************* + * GLOBAL STYLES + *********************************************/ +body { + background: #F0F1EB; + background-color: #F0F1EB; } + +.reveal { + font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif; + font-size: 36px; + font-weight: normal; + color: #000; } + +::selection { + color: #fff; + background: #26351C; + text-shadow: none; } + +.reveal .slides > section, +.reveal .slides > section > section { + line-height: 1.3; + font-weight: inherit; } + +/********************************************* + * HEADERS + *********************************************/ +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: 0 0 20px 0; + color: #383D3D; + font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif; + font-weight: normal; + line-height: 1.2; + letter-spacing: normal; + text-transform: none; + text-shadow: none; + word-wrap: break-word; } + +.reveal h1 { + font-size: 3.77em; } + +.reveal h2 { + font-size: 2.11em; } + +.reveal h3 { + font-size: 1.55em; } + +.reveal h4 { + font-size: 1em; } + +.reveal h1 { + text-shadow: none; } + +/********************************************* + * OTHER + *********************************************/ +.reveal p { + margin: 20px 0; + line-height: 1.3; } + +/* Ensure certain elements are never larger than the slide itself */ +.reveal img, +.reveal video, +.reveal iframe { + max-width: 95%; + max-height: 95%; } + +.reveal strong, +.reveal b { + font-weight: bold; } + +.reveal em { + font-style: italic; } + +.reveal ol, +.reveal dl, +.reveal ul { + display: inline-block; + text-align: left; + margin: 0 0 0 1em; } + +.reveal ol { + list-style-type: decimal; } + +.reveal ul { + list-style-type: disc; } + +.reveal ul ul { + list-style-type: square; } + +.reveal ul ul ul { + list-style-type: circle; } + +.reveal ul ul, +.reveal ul ol, +.reveal ol ol, +.reveal ol ul { + display: block; + margin-left: 40px; } + +.reveal dt { + font-weight: bold; } + +.reveal dd { + margin-left: 40px; } + +.reveal q, +.reveal blockquote { + quotes: none; } + +.reveal blockquote { + display: block; + position: relative; + width: 70%; + margin: 20px auto; + padding: 5px; + font-style: italic; + background: rgba(255, 255, 255, 0.05); + box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } + +.reveal blockquote p:first-child, +.reveal blockquote p:last-child { + display: inline-block; } + +.reveal q { + font-style: italic; } + +.reveal pre { + display: block; + position: relative; + width: 90%; + margin: 20px auto; + text-align: left; + font-size: 0.55em; + font-family: monospace; + line-height: 1.2em; + word-wrap: break-word; + box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } + +.reveal code { + font-family: monospace; } + +.reveal pre code { + display: block; + padding: 5px; + overflow: auto; + max-height: 400px; + word-wrap: normal; } + +.reveal table { + margin: auto; + border-collapse: collapse; + border-spacing: 0; } + +.reveal table th { + font-weight: bold; } + +.reveal table th, +.reveal table td { + text-align: left; + padding: 0.2em 0.5em 0.2em 0.5em; + border-bottom: 1px solid; } + +.reveal table th[align="center"], +.reveal table td[align="center"] { + text-align: center; } + +.reveal table th[align="right"], +.reveal table td[align="right"] { + text-align: right; } + +.reveal table tr:last-child td { + border-bottom: none; } + +.reveal sup { + vertical-align: super; } + +.reveal sub { + vertical-align: sub; } + +.reveal small { + display: inline-block; + font-size: 0.6em; + line-height: 1.2em; + vertical-align: top; } + +.reveal small * { + vertical-align: top; } + +/********************************************* + * LINKS + *********************************************/ +.reveal a { + color: #51483D; + text-decoration: none; + -webkit-transition: color 0.15s ease; + -moz-transition: color 0.15s ease; + transition: color 0.15s ease; } + +.reveal a:hover { + color: #8b7c69; + text-shadow: none; + border: none; } + +.reveal .roll span:after { + color: #fff; + background: #25211c; } + +/********************************************* + * IMAGES + *********************************************/ +.reveal section img { + margin: 15px 0px; + background: rgba(255, 255, 255, 0.12); + border: 4px solid #000; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } + +.reveal section img.plain { + border: 0; + box-shadow: none; } + +.reveal a img { + -webkit-transition: all 0.15s linear; + -moz-transition: all 0.15s linear; + transition: all 0.15s linear; } + +.reveal a:hover img { + background: rgba(255, 255, 255, 0.2); + border-color: #51483D; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ +.reveal .controls .navigate-left, +.reveal .controls .navigate-left.enabled { + border-right-color: #51483D; } + +.reveal .controls .navigate-right, +.reveal .controls .navigate-right.enabled { + border-left-color: #51483D; } + +.reveal .controls .navigate-up, +.reveal .controls .navigate-up.enabled { + border-bottom-color: #51483D; } + +.reveal .controls .navigate-down, +.reveal .controls .navigate-down.enabled { + border-top-color: #51483D; } + +.reveal .controls .navigate-left.enabled:hover { + border-right-color: #8b7c69; } + +.reveal .controls .navigate-right.enabled:hover { + border-left-color: #8b7c69; } + +.reveal .controls .navigate-up.enabled:hover { + border-bottom-color: #8b7c69; } + +.reveal .controls .navigate-down.enabled:hover { + border-top-color: #8b7c69; } + +/********************************************* + * PROGRESS BAR + *********************************************/ +.reveal .progress { + background: rgba(0, 0, 0, 0.2); } + +.reveal .progress span { + background: #51483D; + -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/theme/css/theme/simple.css b/theme/css/theme/simple.css new file mode 100644 index 0000000..20d919d --- /dev/null +++ b/theme/css/theme/simple.css @@ -0,0 +1,286 @@ +/** + * A simple theme for reveal.js presentations, similar + * to the default theme. The accent color is darkblue. + * + * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed. + * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ +@import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700); +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); +/********************************************* + * GLOBAL STYLES + *********************************************/ +body { + background: #fff; + background-color: #fff; } + +.reveal { + font-family: "Lato", sans-serif; + font-size: 36px; + font-weight: normal; + color: #000; } + +::selection { + color: #fff; + background: rgba(0, 0, 0, 0.99); + text-shadow: none; } + +.reveal .slides > section, +.reveal .slides > section > section { + line-height: 1.3; + font-weight: inherit; } + +/********************************************* + * HEADERS + *********************************************/ +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: 0 0 20px 0; + color: #000; + font-family: "News Cycle", Impact, sans-serif; + font-weight: normal; + line-height: 1.2; + letter-spacing: normal; + text-transform: none; + text-shadow: none; + word-wrap: break-word; } + +.reveal h1 { + font-size: 3.77em; } + +.reveal h2 { + font-size: 2.11em; } + +.reveal h3 { + font-size: 1.55em; } + +.reveal h4 { + font-size: 1em; } + +.reveal h1 { + text-shadow: none; } + +/********************************************* + * OTHER + *********************************************/ +.reveal p { + margin: 20px 0; + line-height: 1.3; } + +/* Ensure certain elements are never larger than the slide itself */ +.reveal img, +.reveal video, +.reveal iframe { + max-width: 95%; + max-height: 95%; } + +.reveal strong, +.reveal b { + font-weight: bold; } + +.reveal em { + font-style: italic; } + +.reveal ol, +.reveal dl, +.reveal ul { + display: inline-block; + text-align: left; + margin: 0 0 0 1em; } + +.reveal ol { + list-style-type: decimal; } + +.reveal ul { + list-style-type: disc; } + +.reveal ul ul { + list-style-type: square; } + +.reveal ul ul ul { + list-style-type: circle; } + +.reveal ul ul, +.reveal ul ol, +.reveal ol ol, +.reveal ol ul { + display: block; + margin-left: 40px; } + +.reveal dt { + font-weight: bold; } + +.reveal dd { + margin-left: 40px; } + +.reveal q, +.reveal blockquote { + quotes: none; } + +.reveal blockquote { + display: block; + position: relative; + width: 70%; + margin: 20px auto; + padding: 5px; + font-style: italic; + background: rgba(255, 255, 255, 0.05); + box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } + +.reveal blockquote p:first-child, +.reveal blockquote p:last-child { + display: inline-block; } + +.reveal q { + font-style: italic; } + +.reveal pre { + display: block; + position: relative; + width: 90%; + margin: 20px auto; + text-align: left; + font-size: 0.55em; + font-family: monospace; + line-height: 1.2em; + word-wrap: break-word; + box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } + +.reveal code { + font-family: monospace; } + +.reveal pre code { + display: block; + padding: 5px; + overflow: auto; + max-height: 400px; + word-wrap: normal; } + +.reveal table { + margin: auto; + border-collapse: collapse; + border-spacing: 0; } + +.reveal table th { + font-weight: bold; } + +.reveal table th, +.reveal table td { + text-align: left; + padding: 0.2em 0.5em 0.2em 0.5em; + border-bottom: 1px solid; } + +.reveal table th[align="center"], +.reveal table td[align="center"] { + text-align: center; } + +.reveal table th[align="right"], +.reveal table td[align="right"] { + text-align: right; } + +.reveal table tr:last-child td { + border-bottom: none; } + +.reveal sup { + vertical-align: super; } + +.reveal sub { + vertical-align: sub; } + +.reveal small { + display: inline-block; + font-size: 0.6em; + line-height: 1.2em; + vertical-align: top; } + +.reveal small * { + vertical-align: top; } + +/********************************************* + * LINKS + *********************************************/ +.reveal a { + color: #00008B; + text-decoration: none; + -webkit-transition: color 0.15s ease; + -moz-transition: color 0.15s ease; + transition: color 0.15s ease; } + +.reveal a:hover { + color: #0000f1; + text-shadow: none; + border: none; } + +.reveal .roll span:after { + color: #fff; + background: #00003f; } + +/********************************************* + * IMAGES + *********************************************/ +.reveal section img { + margin: 15px 0px; + background: rgba(255, 255, 255, 0.12); + border: 4px solid #000; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } + +.reveal section img.plain { + border: 0; + box-shadow: none; } + +.reveal a img { + -webkit-transition: all 0.15s linear; + -moz-transition: all 0.15s linear; + transition: all 0.15s linear; } + +.reveal a:hover img { + background: rgba(255, 255, 255, 0.2); + border-color: #00008B; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ +.reveal .controls .navigate-left, +.reveal .controls .navigate-left.enabled { + border-right-color: #00008B; } + +.reveal .controls .navigate-right, +.reveal .controls .navigate-right.enabled { + border-left-color: #00008B; } + +.reveal .controls .navigate-up, +.reveal .controls .navigate-up.enabled { + border-bottom-color: #00008B; } + +.reveal .controls .navigate-down, +.reveal .controls .navigate-down.enabled { + border-top-color: #00008B; } + +.reveal .controls .navigate-left.enabled:hover { + border-right-color: #0000f1; } + +.reveal .controls .navigate-right.enabled:hover { + border-left-color: #0000f1; } + +.reveal .controls .navigate-up.enabled:hover { + border-bottom-color: #0000f1; } + +.reveal .controls .navigate-down.enabled:hover { + border-top-color: #0000f1; } + +/********************************************* + * PROGRESS BAR + *********************************************/ +.reveal .progress { + background: rgba(0, 0, 0, 0.2); } + +.reveal .progress span { + background: #00008B; + -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/theme/css/theme/sky.css b/theme/css/theme/sky.css new file mode 100644 index 0000000..e762a50 --- /dev/null +++ b/theme/css/theme/sky.css @@ -0,0 +1,293 @@ +/** + * Sky theme for reveal.js. + * + * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ +@import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic); +@import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700); +.reveal a { + line-height: 1.3em; } + +/********************************************* + * GLOBAL STYLES + *********************************************/ +body { + background: #add9e4; + background: -moz-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); + background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #f7fbfc), color-stop(100%, #add9e4)); + background: -webkit-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); + background: -o-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); + background: -ms-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); + background: radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); + background-color: #f7fbfc; } + +.reveal { + font-family: "Open Sans", sans-serif; + font-size: 36px; + font-weight: normal; + color: #333; } + +::selection { + color: #fff; + background: #134674; + text-shadow: none; } + +.reveal .slides > section, +.reveal .slides > section > section { + line-height: 1.3; + font-weight: inherit; } + +/********************************************* + * HEADERS + *********************************************/ +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: 0 0 20px 0; + color: #333; + font-family: "Quicksand", sans-serif; + font-weight: normal; + line-height: 1.2; + letter-spacing: -0.08em; + text-transform: uppercase; + text-shadow: none; + word-wrap: break-word; } + +.reveal h1 { + font-size: 3.77em; } + +.reveal h2 { + font-size: 2.11em; } + +.reveal h3 { + font-size: 1.55em; } + +.reveal h4 { + font-size: 1em; } + +.reveal h1 { + text-shadow: none; } + +/********************************************* + * OTHER + *********************************************/ +.reveal p { + margin: 20px 0; + line-height: 1.3; } + +/* Ensure certain elements are never larger than the slide itself */ +.reveal img, +.reveal video, +.reveal iframe { + max-width: 95%; + max-height: 95%; } + +.reveal strong, +.reveal b { + font-weight: bold; } + +.reveal em { + font-style: italic; } + +.reveal ol, +.reveal dl, +.reveal ul { + display: inline-block; + text-align: left; + margin: 0 0 0 1em; } + +.reveal ol { + list-style-type: decimal; } + +.reveal ul { + list-style-type: disc; } + +.reveal ul ul { + list-style-type: square; } + +.reveal ul ul ul { + list-style-type: circle; } + +.reveal ul ul, +.reveal ul ol, +.reveal ol ol, +.reveal ol ul { + display: block; + margin-left: 40px; } + +.reveal dt { + font-weight: bold; } + +.reveal dd { + margin-left: 40px; } + +.reveal q, +.reveal blockquote { + quotes: none; } + +.reveal blockquote { + display: block; + position: relative; + width: 70%; + margin: 20px auto; + padding: 5px; + font-style: italic; + background: rgba(255, 255, 255, 0.05); + box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } + +.reveal blockquote p:first-child, +.reveal blockquote p:last-child { + display: inline-block; } + +.reveal q { + font-style: italic; } + +.reveal pre { + display: block; + position: relative; + width: 90%; + margin: 20px auto; + text-align: left; + font-size: 0.55em; + font-family: monospace; + line-height: 1.2em; + word-wrap: break-word; + box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } + +.reveal code { + font-family: monospace; } + +.reveal pre code { + display: block; + padding: 5px; + overflow: auto; + max-height: 400px; + word-wrap: normal; } + +.reveal table { + margin: auto; + border-collapse: collapse; + border-spacing: 0; } + +.reveal table th { + font-weight: bold; } + +.reveal table th, +.reveal table td { + text-align: left; + padding: 0.2em 0.5em 0.2em 0.5em; + border-bottom: 1px solid; } + +.reveal table th[align="center"], +.reveal table td[align="center"] { + text-align: center; } + +.reveal table th[align="right"], +.reveal table td[align="right"] { + text-align: right; } + +.reveal table tr:last-child td { + border-bottom: none; } + +.reveal sup { + vertical-align: super; } + +.reveal sub { + vertical-align: sub; } + +.reveal small { + display: inline-block; + font-size: 0.6em; + line-height: 1.2em; + vertical-align: top; } + +.reveal small * { + vertical-align: top; } + +/********************************************* + * LINKS + *********************************************/ +.reveal a { + color: #3b759e; + text-decoration: none; + -webkit-transition: color 0.15s ease; + -moz-transition: color 0.15s ease; + transition: color 0.15s ease; } + +.reveal a:hover { + color: #74a7cb; + text-shadow: none; + border: none; } + +.reveal .roll span:after { + color: #fff; + background: #264c66; } + +/********************************************* + * IMAGES + *********************************************/ +.reveal section img { + margin: 15px 0px; + background: rgba(255, 255, 255, 0.12); + border: 4px solid #333; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } + +.reveal section img.plain { + border: 0; + box-shadow: none; } + +.reveal a img { + -webkit-transition: all 0.15s linear; + -moz-transition: all 0.15s linear; + transition: all 0.15s linear; } + +.reveal a:hover img { + background: rgba(255, 255, 255, 0.2); + border-color: #3b759e; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ +.reveal .controls .navigate-left, +.reveal .controls .navigate-left.enabled { + border-right-color: #3b759e; } + +.reveal .controls .navigate-right, +.reveal .controls .navigate-right.enabled { + border-left-color: #3b759e; } + +.reveal .controls .navigate-up, +.reveal .controls .navigate-up.enabled { + border-bottom-color: #3b759e; } + +.reveal .controls .navigate-down, +.reveal .controls .navigate-down.enabled { + border-top-color: #3b759e; } + +.reveal .controls .navigate-left.enabled:hover { + border-right-color: #74a7cb; } + +.reveal .controls .navigate-right.enabled:hover { + border-left-color: #74a7cb; } + +.reveal .controls .navigate-up.enabled:hover { + border-bottom-color: #74a7cb; } + +.reveal .controls .navigate-down.enabled:hover { + border-top-color: #74a7cb; } + +/********************************************* + * PROGRESS BAR + *********************************************/ +.reveal .progress { + background: rgba(0, 0, 0, 0.2); } + +.reveal .progress span { + background: #3b759e; + -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/theme/css/theme/solarized.css b/theme/css/theme/solarized.css new file mode 100644 index 0000000..bf2f651 --- /dev/null +++ b/theme/css/theme/solarized.css @@ -0,0 +1,290 @@ +/** + * Solarized Light theme for reveal.js. + * Author: Achim Staebler + */ +@import url(../../lib/font/league-gothic/league-gothic.css); +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); +/** + * Solarized colors by Ethan Schoonover + */ +html * { + color-profile: sRGB; + rendering-intent: auto; } + +/********************************************* + * GLOBAL STYLES + *********************************************/ +body { + background: #fdf6e3; + background-color: #fdf6e3; } + +.reveal { + font-family: "Lato", sans-serif; + font-size: 36px; + font-weight: normal; + color: #657b83; } + +::selection { + color: #fff; + background: #d33682; + text-shadow: none; } + +.reveal .slides > section, +.reveal .slides > section > section { + line-height: 1.3; + font-weight: inherit; } + +/********************************************* + * HEADERS + *********************************************/ +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: 0 0 20px 0; + color: #586e75; + font-family: "League Gothic", Impact, sans-serif; + font-weight: normal; + line-height: 1.2; + letter-spacing: normal; + text-transform: uppercase; + text-shadow: none; + word-wrap: break-word; } + +.reveal h1 { + font-size: 3.77em; } + +.reveal h2 { + font-size: 2.11em; } + +.reveal h3 { + font-size: 1.55em; } + +.reveal h4 { + font-size: 1em; } + +.reveal h1 { + text-shadow: none; } + +/********************************************* + * OTHER + *********************************************/ +.reveal p { + margin: 20px 0; + line-height: 1.3; } + +/* Ensure certain elements are never larger than the slide itself */ +.reveal img, +.reveal video, +.reveal iframe { + max-width: 95%; + max-height: 95%; } + +.reveal strong, +.reveal b { + font-weight: bold; } + +.reveal em { + font-style: italic; } + +.reveal ol, +.reveal dl, +.reveal ul { + display: inline-block; + text-align: left; + margin: 0 0 0 1em; } + +.reveal ol { + list-style-type: decimal; } + +.reveal ul { + list-style-type: disc; } + +.reveal ul ul { + list-style-type: square; } + +.reveal ul ul ul { + list-style-type: circle; } + +.reveal ul ul, +.reveal ul ol, +.reveal ol ol, +.reveal ol ul { + display: block; + margin-left: 40px; } + +.reveal dt { + font-weight: bold; } + +.reveal dd { + margin-left: 40px; } + +.reveal q, +.reveal blockquote { + quotes: none; } + +.reveal blockquote { + display: block; + position: relative; + width: 70%; + margin: 20px auto; + padding: 5px; + font-style: italic; + background: rgba(255, 255, 255, 0.05); + box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } + +.reveal blockquote p:first-child, +.reveal blockquote p:last-child { + display: inline-block; } + +.reveal q { + font-style: italic; } + +.reveal pre { + display: block; + position: relative; + width: 90%; + margin: 20px auto; + text-align: left; + font-size: 0.55em; + font-family: monospace; + line-height: 1.2em; + word-wrap: break-word; + box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } + +.reveal code { + font-family: monospace; } + +.reveal pre code { + display: block; + padding: 5px; + overflow: auto; + max-height: 400px; + word-wrap: normal; } + +.reveal table { + margin: auto; + border-collapse: collapse; + border-spacing: 0; } + +.reveal table th { + font-weight: bold; } + +.reveal table th, +.reveal table td { + text-align: left; + padding: 0.2em 0.5em 0.2em 0.5em; + border-bottom: 1px solid; } + +.reveal table th[align="center"], +.reveal table td[align="center"] { + text-align: center; } + +.reveal table th[align="right"], +.reveal table td[align="right"] { + text-align: right; } + +.reveal table tr:last-child td { + border-bottom: none; } + +.reveal sup { + vertical-align: super; } + +.reveal sub { + vertical-align: sub; } + +.reveal small { + display: inline-block; + font-size: 0.6em; + line-height: 1.2em; + vertical-align: top; } + +.reveal small * { + vertical-align: top; } + +/********************************************* + * LINKS + *********************************************/ +.reveal a { + color: #268bd2; + text-decoration: none; + -webkit-transition: color 0.15s ease; + -moz-transition: color 0.15s ease; + transition: color 0.15s ease; } + +.reveal a:hover { + color: #78b9e6; + text-shadow: none; + border: none; } + +.reveal .roll span:after { + color: #fff; + background: #1a6091; } + +/********************************************* + * IMAGES + *********************************************/ +.reveal section img { + margin: 15px 0px; + background: rgba(255, 255, 255, 0.12); + border: 4px solid #657b83; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } + +.reveal section img.plain { + border: 0; + box-shadow: none; } + +.reveal a img { + -webkit-transition: all 0.15s linear; + -moz-transition: all 0.15s linear; + transition: all 0.15s linear; } + +.reveal a:hover img { + background: rgba(255, 255, 255, 0.2); + border-color: #268bd2; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ +.reveal .controls .navigate-left, +.reveal .controls .navigate-left.enabled { + border-right-color: #268bd2; } + +.reveal .controls .navigate-right, +.reveal .controls .navigate-right.enabled { + border-left-color: #268bd2; } + +.reveal .controls .navigate-up, +.reveal .controls .navigate-up.enabled { + border-bottom-color: #268bd2; } + +.reveal .controls .navigate-down, +.reveal .controls .navigate-down.enabled { + border-top-color: #268bd2; } + +.reveal .controls .navigate-left.enabled:hover { + border-right-color: #78b9e6; } + +.reveal .controls .navigate-right.enabled:hover { + border-left-color: #78b9e6; } + +.reveal .controls .navigate-up.enabled:hover { + border-bottom-color: #78b9e6; } + +.reveal .controls .navigate-down.enabled:hover { + border-top-color: #78b9e6; } + +/********************************************* + * PROGRESS BAR + *********************************************/ +.reveal .progress { + background: rgba(0, 0, 0, 0.2); } + +.reveal .progress span { + background: #268bd2; + -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/theme/css/theme/source/beige.scss b/theme/css/theme/source/beige.scss new file mode 100644 index 0000000..5564f53 --- /dev/null +++ b/theme/css/theme/source/beige.scss @@ -0,0 +1,39 @@ +/** + * Beige theme for reveal.js. + * + * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + + +// Include theme-specific fonts +@import url(../../lib/font/league-gothic/league-gothic.css); +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); + + +// Override theme settings (see ../template/settings.scss) +$mainColor: #333; +$headingColor: #333; +$headingTextShadow: none; +$backgroundColor: #f7f3de; +$linkColor: #8b743d; +$linkColorHover: lighten( $linkColor, 20% ); +$selectionBackgroundColor: rgba(79, 64, 28, 0.99); +$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15); + +// Background generator +@mixin bodyBackground() { + @include radial-gradient( rgba(247,242,211,1), rgba(255,255,255,1) ); +} + + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- \ No newline at end of file diff --git a/theme/css/theme/source/black.scss b/theme/css/theme/source/black.scss new file mode 100644 index 0000000..5f7f601 --- /dev/null +++ b/theme/css/theme/source/black.scss @@ -0,0 +1,49 @@ +/** + * Black theme for reveal.js. This is the opposite of the 'white' theme. + * + * By Hakim El Hattab, http://hakim.se + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + +// Include theme-specific fonts +@import url(../../lib/font/source-sans-pro/source-sans-pro.css); + + +// Override theme settings (see ../template/settings.scss) +$backgroundColor: #222; + +$mainColor: #fff; +$headingColor: #fff; + +$mainFontSize: 38px; +$mainFont: 'Source Sans Pro', Helvetica, sans-serif; +$headingFont: 'Source Sans Pro', Helvetica, sans-serif; +$headingTextShadow: none; +$headingLetterSpacing: normal; +$headingTextTransform: uppercase; +$headingFontWeight: 600; +$linkColor: #42affa; +$linkColorHover: lighten( $linkColor, 15% ); +$selectionBackgroundColor: lighten( $linkColor, 25% ); + +$heading1Size: 2.5em; +$heading2Size: 1.6em; +$heading3Size: 1.3em; +$heading4Size: 1.0em; + +section.has-light-background { + &, h1, h2, h3, h4, h5, h6 { + color: #222; + } +} + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- \ No newline at end of file diff --git a/theme/css/theme/source/blood.scss b/theme/css/theme/source/blood.scss new file mode 100644 index 0000000..d22b53d --- /dev/null +++ b/theme/css/theme/source/blood.scss @@ -0,0 +1,79 @@ +/** + * Blood theme for reveal.js + * Author: Walther http://github.com/Walther + * + * Designed to be used with highlight.js theme + * "monokai_sublime.css" available from + * https://github.com/isagalaev/highlight.js/ + * + * For other themes, change $codeBackground accordingly. + * + */ + + // Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + +// Include theme-specific fonts + +@import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic); + +// Colors used in the theme +$blood: #a23; +$coal: #222; +$codeBackground: #23241f; + +$backgroundColor: $coal; + +// Main text +$mainFont: Ubuntu, 'sans-serif'; +$mainFontSize: 36px; +$mainColor: #eee; + +// Headings +$headingFont: Ubuntu, 'sans-serif'; +$headingTextShadow: 2px 2px 2px $coal; + +// h1 shadow, borrowed humbly from +// (c) Default theme by Hakim El Hattab +$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15); + +// Links +$linkColor: $blood; +$linkColorHover: lighten( $linkColor, 20% ); + +// Text selection +$selectionBackgroundColor: $blood; +$selectionColor: #fff; + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- + +// some overrides after theme template import + +.reveal p { + font-weight: 300; + text-shadow: 1px 1px $coal; +} + +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + font-weight: 700; +} + +.reveal p code { + background-color: $codeBackground; + display: inline-block; + border-radius: 7px; +} + +.reveal small code { + vertical-align: baseline; +} \ No newline at end of file diff --git a/theme/css/theme/source/league.scss b/theme/css/theme/source/league.scss new file mode 100644 index 0000000..46ea04a --- /dev/null +++ b/theme/css/theme/source/league.scss @@ -0,0 +1,34 @@ +/** + * League theme for reveal.js. + * + * This was the default theme pre-3.0.0. + * + * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + + +// Include theme-specific fonts +@import url(../../lib/font/league-gothic/league-gothic.css); +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); + +// Override theme settings (see ../template/settings.scss) +$headingTextShadow: 0px 0px 6px rgba(0,0,0,0.2); +$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15); + +// Background generator +@mixin bodyBackground() { + @include radial-gradient( rgba(28,30,32,1), rgba(85,90,95,1) ); +} + + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- \ No newline at end of file diff --git a/theme/css/theme/source/moon.scss b/theme/css/theme/source/moon.scss new file mode 100644 index 0000000..e47e5b5 --- /dev/null +++ b/theme/css/theme/source/moon.scss @@ -0,0 +1,57 @@ +/** + * Solarized Dark theme for reveal.js. + * Author: Achim Staebler + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + + +// Include theme-specific fonts +@import url(../../lib/font/league-gothic/league-gothic.css); +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); + +/** + * Solarized colors by Ethan Schoonover + */ +html * { + color-profile: sRGB; + rendering-intent: auto; +} + +// Solarized colors +$base03: #002b36; +$base02: #073642; +$base01: #586e75; +$base00: #657b83; +$base0: #839496; +$base1: #93a1a1; +$base2: #eee8d5; +$base3: #fdf6e3; +$yellow: #b58900; +$orange: #cb4b16; +$red: #dc322f; +$magenta: #d33682; +$violet: #6c71c4; +$blue: #268bd2; +$cyan: #2aa198; +$green: #859900; + +// Override theme settings (see ../template/settings.scss) +$mainColor: $base1; +$headingColor: $base2; +$headingTextShadow: none; +$backgroundColor: $base03; +$linkColor: $blue; +$linkColorHover: lighten( $linkColor, 20% ); +$selectionBackgroundColor: $magenta; + + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- diff --git a/theme/css/theme/source/night.scss b/theme/css/theme/source/night.scss new file mode 100644 index 0000000..b0cb57f --- /dev/null +++ b/theme/css/theme/source/night.scss @@ -0,0 +1,35 @@ +/** + * Black theme for reveal.js. + * + * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + +// Include theme-specific fonts +@import url(https://fonts.googleapis.com/css?family=Montserrat:700); +@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic); + + +// Override theme settings (see ../template/settings.scss) +$backgroundColor: #111; + +$mainFont: 'Open Sans', sans-serif; +$linkColor: #e7ad52; +$linkColorHover: lighten( $linkColor, 20% ); +$headingFont: 'Montserrat', Impact, sans-serif; +$headingTextShadow: none; +$headingLetterSpacing: -0.03em; +$headingTextTransform: none; +$selectionBackgroundColor: #e7ad52; +$mainFontSize: 30px; + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- \ No newline at end of file diff --git a/theme/css/theme/source/serif.scss b/theme/css/theme/source/serif.scss new file mode 100644 index 0000000..ec3fcb3 --- /dev/null +++ b/theme/css/theme/source/serif.scss @@ -0,0 +1,35 @@ +/** + * A simple theme for reveal.js presentations, similar + * to the default theme. The accent color is brown. + * + * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed. + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + + +// Override theme settings (see ../template/settings.scss) +$mainFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; +$mainColor: #000; +$headingFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; +$headingColor: #383D3D; +$headingTextShadow: none; +$headingTextTransform: none; +$backgroundColor: #F0F1EB; +$linkColor: #51483D; +$linkColorHover: lighten( $linkColor, 20% ); +$selectionBackgroundColor: #26351C; + +.reveal a { + line-height: 1.3em; +} + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- diff --git a/theme/css/theme/source/simple.scss b/theme/css/theme/source/simple.scss new file mode 100644 index 0000000..84c7d9b --- /dev/null +++ b/theme/css/theme/source/simple.scss @@ -0,0 +1,38 @@ +/** + * A simple theme for reveal.js presentations, similar + * to the default theme. The accent color is darkblue. + * + * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed. + * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + + +// Include theme-specific fonts +@import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700); +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); + + +// Override theme settings (see ../template/settings.scss) +$mainFont: 'Lato', sans-serif; +$mainColor: #000; +$headingFont: 'News Cycle', Impact, sans-serif; +$headingColor: #000; +$headingTextShadow: none; +$headingTextTransform: none; +$backgroundColor: #fff; +$linkColor: #00008B; +$linkColorHover: lighten( $linkColor, 20% ); +$selectionBackgroundColor: rgba(0, 0, 0, 0.99); + + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- \ No newline at end of file diff --git a/theme/css/theme/source/sky.scss b/theme/css/theme/source/sky.scss new file mode 100644 index 0000000..3fee67c --- /dev/null +++ b/theme/css/theme/source/sky.scss @@ -0,0 +1,46 @@ +/** + * Sky theme for reveal.js. + * + * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + + +// Include theme-specific fonts +@import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic); +@import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700); + + +// Override theme settings (see ../template/settings.scss) +$mainFont: 'Open Sans', sans-serif; +$mainColor: #333; +$headingFont: 'Quicksand', sans-serif; +$headingColor: #333; +$headingLetterSpacing: -0.08em; +$headingTextShadow: none; +$backgroundColor: #f7fbfc; +$linkColor: #3b759e; +$linkColorHover: lighten( $linkColor, 20% ); +$selectionBackgroundColor: #134674; + +// Fix links so they are not cut off +.reveal a { + line-height: 1.3em; +} + +// Background generator +@mixin bodyBackground() { + @include radial-gradient( #add9e4, #f7fbfc ); +} + + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- diff --git a/theme/css/theme/source/solarized.scss b/theme/css/theme/source/solarized.scss new file mode 100644 index 0000000..912be56 --- /dev/null +++ b/theme/css/theme/source/solarized.scss @@ -0,0 +1,63 @@ +/** + * Solarized Light theme for reveal.js. + * Author: Achim Staebler + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + + +// Include theme-specific fonts +@import url(../../lib/font/league-gothic/league-gothic.css); +@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); + + +/** + * Solarized colors by Ethan Schoonover + */ +html * { + color-profile: sRGB; + rendering-intent: auto; +} + +// Solarized colors +$base03: #002b36; +$base02: #073642; +$base01: #586e75; +$base00: #657b83; +$base0: #839496; +$base1: #93a1a1; +$base2: #eee8d5; +$base3: #fdf6e3; +$yellow: #b58900; +$orange: #cb4b16; +$red: #dc322f; +$magenta: #d33682; +$violet: #6c71c4; +$blue: #268bd2; +$cyan: #2aa198; +$green: #859900; + +// Override theme settings (see ../template/settings.scss) +$mainColor: $base00; +$headingColor: $base01; +$headingTextShadow: none; +$backgroundColor: $base3; +$linkColor: $blue; +$linkColorHover: lighten( $linkColor, 20% ); +$selectionBackgroundColor: $magenta; + +// Background generator +// @mixin bodyBackground() { +// @include radial-gradient( rgba($base3,1), rgba(lighten($base3, 20%),1) ); +// } + + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- diff --git a/theme/css/theme/source/white.scss b/theme/css/theme/source/white.scss new file mode 100644 index 0000000..6758ce0 --- /dev/null +++ b/theme/css/theme/source/white.scss @@ -0,0 +1,49 @@ +/** + * White theme for reveal.js. This is the opposite of the 'black' theme. + * + * By Hakim El Hattab, http://hakim.se + */ + + +// Default mixins and settings ----------------- +@import "../template/mixins"; +@import "../template/settings"; +// --------------------------------------------- + + +// Include theme-specific fonts +@import url(../../lib/font/source-sans-pro/source-sans-pro.css); + + +// Override theme settings (see ../template/settings.scss) +$backgroundColor: #fff; + +$mainColor: #222; +$headingColor: #222; + +$mainFontSize: 38px; +$mainFont: 'Source Sans Pro', Helvetica, sans-serif; +$headingFont: 'Source Sans Pro', Helvetica, sans-serif; +$headingTextShadow: none; +$headingLetterSpacing: normal; +$headingTextTransform: uppercase; +$headingFontWeight: 600; +$linkColor: #2a76dd; +$linkColorHover: lighten( $linkColor, 15% ); +$selectionBackgroundColor: lighten( $linkColor, 25% ); + +$heading1Size: 2.5em; +$heading2Size: 1.6em; +$heading3Size: 1.3em; +$heading4Size: 1.0em; + +section.has-dark-background { + &, h1, h2, h3, h4, h5, h6 { + color: #fff; + } +} + + +// Theme template ------------------------------ +@import "../template/theme"; +// --------------------------------------------- \ No newline at end of file diff --git a/theme/css/theme/template/mixins.scss b/theme/css/theme/template/mixins.scss new file mode 100644 index 0000000..e0c5606 --- /dev/null +++ b/theme/css/theme/template/mixins.scss @@ -0,0 +1,29 @@ +@mixin vertical-gradient( $top, $bottom ) { + background: $top; + background: -moz-linear-gradient( top, $top 0%, $bottom 100% ); + background: -webkit-gradient( linear, left top, left bottom, color-stop(0%,$top), color-stop(100%,$bottom) ); + background: -webkit-linear-gradient( top, $top 0%, $bottom 100% ); + background: -o-linear-gradient( top, $top 0%, $bottom 100% ); + background: -ms-linear-gradient( top, $top 0%, $bottom 100% ); + background: linear-gradient( top, $top 0%, $bottom 100% ); +} + +@mixin horizontal-gradient( $top, $bottom ) { + background: $top; + background: -moz-linear-gradient( left, $top 0%, $bottom 100% ); + background: -webkit-gradient( linear, left top, right top, color-stop(0%,$top), color-stop(100%,$bottom) ); + background: -webkit-linear-gradient( left, $top 0%, $bottom 100% ); + background: -o-linear-gradient( left, $top 0%, $bottom 100% ); + background: -ms-linear-gradient( left, $top 0%, $bottom 100% ); + background: linear-gradient( left, $top 0%, $bottom 100% ); +} + +@mixin radial-gradient( $outer, $inner, $type: circle ) { + background: $outer; + background: -moz-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); + background: -webkit-gradient( radial, center center, 0px, center center, 100%, color-stop(0%,$inner), color-stop(100%,$outer) ); + background: -webkit-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); + background: -o-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); + background: -ms-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); + background: radial-gradient( center, $type cover, $inner 0%, $outer 100% ); +} \ No newline at end of file diff --git a/theme/css/theme/template/settings.scss b/theme/css/theme/template/settings.scss new file mode 100644 index 0000000..ffaac23 --- /dev/null +++ b/theme/css/theme/template/settings.scss @@ -0,0 +1,43 @@ +// Base settings for all themes that can optionally be +// overridden by the super-theme + +// Background of the presentation +$backgroundColor: #2b2b2b; + +// Primary/body text +$mainFont: 'Lato', sans-serif; +$mainFontSize: 36px; +$mainColor: #eee; + +// Vertical spacing between blocks of text +$blockMargin: 20px; + +// Headings +$headingMargin: 0 0 $blockMargin 0; +$headingFont: 'League Gothic', Impact, sans-serif; +$headingColor: #eee; +$headingLineHeight: 1.2; +$headingLetterSpacing: normal; +$headingTextTransform: uppercase; +$headingTextShadow: none; +$headingFontWeight: normal; +$heading1TextShadow: $headingTextShadow; + +$heading1Size: 3.77em; +$heading2Size: 2.11em; +$heading3Size: 1.55em; +$heading4Size: 1.00em; + +// Links and actions +$linkColor: #13DAEC; +$linkColorHover: lighten( $linkColor, 20% ); + +// Text selection +$selectionBackgroundColor: #FF5E99; +$selectionColor: #fff; + +// Generates the presentation background, can be overridden +// to return a background image or gradient +@mixin bodyBackground() { + background: $backgroundColor; +} \ No newline at end of file diff --git a/theme/css/theme/template/theme.scss b/theme/css/theme/template/theme.scss new file mode 100644 index 0000000..9bb416a --- /dev/null +++ b/theme/css/theme/template/theme.scss @@ -0,0 +1,345 @@ +// Base theme template for reveal.js + +/********************************************* + * GLOBAL STYLES + *********************************************/ + +body { + @include bodyBackground(); + background-color: $backgroundColor; +} + +.reveal { + font-family: $mainFont; + font-size: $mainFontSize; + font-weight: normal; + color: $mainColor; +} + +::selection { + color: $selectionColor; + background: $selectionBackgroundColor; + text-shadow: none; +} + +.reveal .slides>section, +.reveal .slides>section>section { + line-height: 1.3; + font-weight: inherit; +} + +/********************************************* + * HEADERS + *********************************************/ + +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: $headingMargin; + color: $headingColor; + + font-family: $headingFont; + font-weight: $headingFontWeight; + line-height: $headingLineHeight; + letter-spacing: $headingLetterSpacing; + + text-transform: $headingTextTransform; + text-shadow: $headingTextShadow; + + word-wrap: break-word; +} + +.reveal h1 {font-size: $heading1Size; } +.reveal h2 {font-size: $heading2Size; } +.reveal h3 {font-size: $heading3Size; } +.reveal h4 {font-size: $heading4Size; } + +.reveal h1 { + text-shadow: $heading1TextShadow; +} + + +/********************************************* + * OTHER + *********************************************/ + +.reveal p { + margin: $blockMargin 0; + line-height: 1.3; +} + +/* Ensure certain elements are never larger than the slide itself */ +.reveal img, +.reveal video, +.reveal iframe { + max-width: 95%; + max-height: 95%; +} +.reveal strong, +.reveal b { + font-weight: bold; +} + +.reveal em { + font-style: italic; +} + +.reveal ol, +.reveal dl, +.reveal ul { + display: inline-block; + + text-align: left; + margin: 0 0 0 1em; +} + +.reveal ol { + list-style-type: decimal; +} + +.reveal ul { + list-style-type: disc; +} + +.reveal ul ul { + list-style-type: square; +} + +.reveal ul ul ul { + list-style-type: circle; +} + +.reveal ul ul, +.reveal ul ol, +.reveal ol ol, +.reveal ol ul { + display: block; + margin-left: 40px; +} + +.reveal dt { + font-weight: bold; +} + +.reveal dd { + margin-left: 40px; +} + +.reveal q, +.reveal blockquote { + quotes: none; +} + +.reveal blockquote { + display: block; + position: relative; + width: 70%; + margin: $blockMargin auto; + padding: 5px; + + font-style: italic; + background: rgba(255, 255, 255, 0.05); + box-shadow: 0px 0px 2px rgba(0,0,0,0.2); +} + .reveal blockquote p:first-child, + .reveal blockquote p:last-child { + display: inline-block; + } + +.reveal q { + font-style: italic; +} + +.reveal pre { + display: block; + position: relative; + width: 90%; + margin: $blockMargin auto; + + text-align: left; + font-size: 0.55em; + font-family: monospace; + line-height: 1.2em; + + word-wrap: break-word; + + box-shadow: 0px 0px 6px rgba(0,0,0,0.3); +} +.reveal code { + font-family: monospace; +} + +.reveal pre code { + display: block; + padding: 5px; + overflow: auto; + max-height: 400px; + word-wrap: normal; +} + +.reveal table { + margin: auto; + border-collapse: collapse; + border-spacing: 0; +} + +.reveal table th { + font-weight: bold; +} + +.reveal table th, +.reveal table td { + text-align: left; + padding: 0.2em 0.5em 0.2em 0.5em; + border-bottom: 1px solid; +} + +.reveal table th[align="center"], +.reveal table td[align="center"] { + text-align: center; +} + +.reveal table th[align="right"], +.reveal table td[align="right"] { + text-align: right; +} + +.reveal table tr:last-child td { + border-bottom: none; +} + +.reveal sup { + vertical-align: super; +} +.reveal sub { + vertical-align: sub; +} + +.reveal small { + display: inline-block; + font-size: 0.6em; + line-height: 1.2em; + vertical-align: top; +} + +.reveal small * { + vertical-align: top; +} + + +/********************************************* + * LINKS + *********************************************/ + +.reveal a { + color: $linkColor; + text-decoration: none; + + -webkit-transition: color .15s ease; + -moz-transition: color .15s ease; + transition: color .15s ease; +} + .reveal a:hover { + color: $linkColorHover; + + text-shadow: none; + border: none; + } + +.reveal .roll span:after { + color: #fff; + background: darken( $linkColor, 15% ); +} + + +/********************************************* + * IMAGES + *********************************************/ + +.reveal section img { + margin: 15px 0px; + background: rgba(255,255,255,0.12); + border: 4px solid $mainColor; + + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); +} + + .reveal section img.plain { + border: 0; + box-shadow: none; + } + + .reveal a img { + -webkit-transition: all .15s linear; + -moz-transition: all .15s linear; + transition: all .15s linear; + } + + .reveal a:hover img { + background: rgba(255,255,255,0.2); + border-color: $linkColor; + + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); + } + + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ + +.reveal .controls .navigate-left, +.reveal .controls .navigate-left.enabled { + border-right-color: $linkColor; +} + +.reveal .controls .navigate-right, +.reveal .controls .navigate-right.enabled { + border-left-color: $linkColor; +} + +.reveal .controls .navigate-up, +.reveal .controls .navigate-up.enabled { + border-bottom-color: $linkColor; +} + +.reveal .controls .navigate-down, +.reveal .controls .navigate-down.enabled { + border-top-color: $linkColor; +} + +.reveal .controls .navigate-left.enabled:hover { + border-right-color: $linkColorHover; +} + +.reveal .controls .navigate-right.enabled:hover { + border-left-color: $linkColorHover; +} + +.reveal .controls .navigate-up.enabled:hover { + border-bottom-color: $linkColorHover; +} + +.reveal .controls .navigate-down.enabled:hover { + border-top-color: $linkColorHover; +} + + +/********************************************* + * PROGRESS BAR + *********************************************/ + +.reveal .progress { + background: rgba(0,0,0,0.2); +} + .reveal .progress span { + background: $linkColor; + + -webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + -moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); + } + + diff --git a/theme/css/theme/white.css b/theme/css/theme/white.css new file mode 100644 index 0000000..14e1703 --- /dev/null +++ b/theme/css/theme/white.css @@ -0,0 +1,286 @@ +/** + * White theme for reveal.js. This is the opposite of the 'black' theme. + * + * By Hakim El Hattab, http://hakim.se + */ +@import url(../../lib/font/source-sans-pro/source-sans-pro.css); +section.has-dark-background, section.has-dark-background h1, section.has-dark-background h2, section.has-dark-background h3, section.has-dark-background h4, section.has-dark-background h5, section.has-dark-background h6 { + color: #fff; } + +/********************************************* + * GLOBAL STYLES + *********************************************/ +body { + background: #fff; + background-color: #fff; } + +.reveal { + font-family: "Source Sans Pro", Helvetica, sans-serif; + font-size: 38px; + font-weight: normal; + color: #222; } + +::selection { + color: #fff; + background: #98bdef; + text-shadow: none; } + +.reveal .slides > section, +.reveal .slides > section > section { + line-height: 1.3; + font-weight: inherit; } + +/********************************************* + * HEADERS + *********************************************/ +.reveal h1, +.reveal h2, +.reveal h3, +.reveal h4, +.reveal h5, +.reveal h6 { + margin: 0 0 20px 0; + color: #222; + font-family: "Source Sans Pro", Helvetica, sans-serif; + font-weight: 600; + line-height: 1.2; + letter-spacing: normal; + text-transform: uppercase; + text-shadow: none; + word-wrap: break-word; } + +.reveal h1 { + font-size: 2.5em; } + +.reveal h2 { + font-size: 1.6em; } + +.reveal h3 { + font-size: 1.3em; } + +.reveal h4 { + font-size: 1em; } + +.reveal h1 { + text-shadow: none; } + +/********************************************* + * OTHER + *********************************************/ +.reveal p { + margin: 20px 0; + line-height: 1.3; } + +/* Ensure certain elements are never larger than the slide itself */ +.reveal img, +.reveal video, +.reveal iframe { + max-width: 95%; + max-height: 95%; } + +.reveal strong, +.reveal b { + font-weight: bold; } + +.reveal em { + font-style: italic; } + +.reveal ol, +.reveal dl, +.reveal ul { + display: inline-block; + text-align: left; + margin: 0 0 0 1em; } + +.reveal ol { + list-style-type: decimal; } + +.reveal ul { + list-style-type: disc; } + +.reveal ul ul { + list-style-type: square; } + +.reveal ul ul ul { + list-style-type: circle; } + +.reveal ul ul, +.reveal ul ol, +.reveal ol ol, +.reveal ol ul { + display: block; + margin-left: 40px; } + +.reveal dt { + font-weight: bold; } + +.reveal dd { + margin-left: 40px; } + +.reveal q, +.reveal blockquote { + quotes: none; } + +.reveal blockquote { + display: block; + position: relative; + width: 70%; + margin: 20px auto; + padding: 5px; + font-style: italic; + background: rgba(255, 255, 255, 0.05); + box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } + +.reveal blockquote p:first-child, +.reveal blockquote p:last-child { + display: inline-block; } + +.reveal q { + font-style: italic; } + +.reveal pre { + display: block; + position: relative; + width: 90%; + margin: 20px auto; + text-align: left; + font-size: 0.55em; + font-family: monospace; + line-height: 1.2em; + word-wrap: break-word; + box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } + +.reveal code { + font-family: monospace; } + +.reveal pre code { + display: block; + padding: 5px; + overflow: auto; + max-height: 400px; + word-wrap: normal; } + +.reveal table { + margin: auto; + border-collapse: collapse; + border-spacing: 0; } + +.reveal table th { + font-weight: bold; } + +.reveal table th, +.reveal table td { + text-align: left; + padding: 0.2em 0.5em 0.2em 0.5em; + border-bottom: 1px solid; } + +.reveal table th[align="center"], +.reveal table td[align="center"] { + text-align: center; } + +.reveal table th[align="right"], +.reveal table td[align="right"] { + text-align: right; } + +.reveal table tr:last-child td { + border-bottom: none; } + +.reveal sup { + vertical-align: super; } + +.reveal sub { + vertical-align: sub; } + +.reveal small { + display: inline-block; + font-size: 0.6em; + line-height: 1.2em; + vertical-align: top; } + +.reveal small * { + vertical-align: top; } + +/********************************************* + * LINKS + *********************************************/ +.reveal a { + color: #2a76dd; + text-decoration: none; + -webkit-transition: color 0.15s ease; + -moz-transition: color 0.15s ease; + transition: color 0.15s ease; } + +.reveal a:hover { + color: #6ca0e8; + text-shadow: none; + border: none; } + +.reveal .roll span:after { + color: #fff; + background: #1a53a1; } + +/********************************************* + * IMAGES + *********************************************/ +.reveal section img { + margin: 15px 0px; + background: rgba(255, 255, 255, 0.12); + border: 4px solid #222; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } + +.reveal section img.plain { + border: 0; + box-shadow: none; } + +.reveal a img { + -webkit-transition: all 0.15s linear; + -moz-transition: all 0.15s linear; + transition: all 0.15s linear; } + +.reveal a:hover img { + background: rgba(255, 255, 255, 0.2); + border-color: #2a76dd; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } + +/********************************************* + * NAVIGATION CONTROLS + *********************************************/ +.reveal .controls .navigate-left, +.reveal .controls .navigate-left.enabled { + border-right-color: #2a76dd; } + +.reveal .controls .navigate-right, +.reveal .controls .navigate-right.enabled { + border-left-color: #2a76dd; } + +.reveal .controls .navigate-up, +.reveal .controls .navigate-up.enabled { + border-bottom-color: #2a76dd; } + +.reveal .controls .navigate-down, +.reveal .controls .navigate-down.enabled { + border-top-color: #2a76dd; } + +.reveal .controls .navigate-left.enabled:hover { + border-right-color: #6ca0e8; } + +.reveal .controls .navigate-right.enabled:hover { + border-left-color: #6ca0e8; } + +.reveal .controls .navigate-up.enabled:hover { + border-bottom-color: #6ca0e8; } + +.reveal .controls .navigate-down.enabled:hover { + border-top-color: #6ca0e8; } + +/********************************************* + * PROGRESS BAR + *********************************************/ +.reveal .progress { + background: rgba(0, 0, 0, 0.2); } + +.reveal .progress span { + background: #2a76dd; + -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); + transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/theme/js/reveal.js b/theme/js/reveal.js new file mode 100644 index 0000000..2c92954 --- /dev/null +++ b/theme/js/reveal.js @@ -0,0 +1,4677 @@ +/*! + * reveal.js + * http://lab.hakim.se/reveal-js + * MIT licensed + * + * Copyright (C) 2016 Hakim El Hattab, http://hakim.se + */ +(function( root, factory ) { + if( typeof define === 'function' && define.amd ) { + // AMD. Register as an anonymous module. + define( function() { + root.Reveal = factory(); + return root.Reveal; + } ); + } else if( typeof exports === 'object' ) { + // Node. Does not work with strict CommonJS. + module.exports = factory(); + } else { + // Browser globals. + root.Reveal = factory(); + } +}( this, function() { + + 'use strict'; + + var Reveal; + + var SLIDES_SELECTOR = '.slides section', + HORIZONTAL_SLIDES_SELECTOR = '.slides>section', + VERTICAL_SLIDES_SELECTOR = '.slides>section.present>section', + HOME_SLIDE_SELECTOR = '.slides>section:first-of-type', + + // Configuration defaults, can be overridden at initialization time + config = { + + // The "normal" size of the presentation, aspect ratio will be preserved + // when the presentation is scaled to fit different resolutions + width: 960, + height: 700, + + // Factor of the display size that should remain empty around the content + margin: 0.1, + + // Bounds for smallest/largest possible scale to apply to content + minScale: 0.2, + maxScale: 1.5, + + // Display controls in the bottom right corner + controls: true, + + // Display a presentation progress bar + progress: true, + + // Display the page number of the current slide + slideNumber: false, + + // Push each slide change to the browser history + history: false, + + // Enable keyboard shortcuts for navigation + keyboard: true, + + // Optional function that blocks keyboard events when retuning false + keyboardCondition: null, + + // Enable the slide overview mode + overview: true, + + // Vertical centering of slides + center: true, + + // Enables touch navigation on devices with touch input + touch: true, + + // Loop the presentation + loop: false, + + // Change the presentation direction to be RTL + rtl: false, + + // Turns fragments on and off globally + fragments: true, + + // Flags if the presentation is running in an embedded mode, + // i.e. contained within a limited portion of the screen + embedded: false, + + // Flags if we should show a help overlay when the questionmark + // key is pressed + help: true, + + // Flags if it should be possible to pause the presentation (blackout) + pause: true, + + // Flags if speaker notes should be visible to all viewers + showNotes: false, + + // Number of milliseconds between automatically proceeding to the + // next slide, disabled when set to 0, this value can be overwritten + // by using a data-autoslide attribute on your slides + autoSlide: 0, + + // Stop auto-sliding after user input + autoSlideStoppable: true, + + // Enable slide navigation via mouse wheel + mouseWheel: false, + + // Apply a 3D roll to links on hover + rollingLinks: false, + + // Hides the address bar on mobile devices + hideAddressBar: true, + + // Opens links in an iframe preview overlay + previewLinks: false, + + // Exposes the reveal.js API through window.postMessage + postMessage: true, + + // Dispatches all reveal.js events to the parent window through postMessage + postMessageEvents: false, + + // Focuses body when page changes visiblity to ensure keyboard shortcuts work + focusBodyOnPageVisibilityChange: true, + + // Transition style + transition: 'slide', // none/fade/slide/convex/concave/zoom + + // Transition speed + transitionSpeed: 'default', // default/fast/slow + + // Transition style for full page slide backgrounds + backgroundTransition: 'fade', // none/fade/slide/convex/concave/zoom + + // Parallax background image + parallaxBackgroundImage: '', // CSS syntax, e.g. "a.jpg" + + // Parallax background size + parallaxBackgroundSize: '', // CSS syntax, e.g. "3000px 2000px" + + // Amount of pixels to move the parallax background per slide step + parallaxBackgroundHorizontal: null, + parallaxBackgroundVertical: null, + + // Number of slides away from the current that are visible + viewDistance: 3, + + // Script dependencies to load + dependencies: [] + + }, + + // Flags if reveal.js is loaded (has dispatched the 'ready' event) + loaded = false, + + // Flags if the overview mode is currently active + overview = false, + + // The horizontal and vertical index of the currently active slide + indexh, + indexv, + + // The previous and current slide HTML elements + previousSlide, + currentSlide, + + previousBackground, + + // Slides may hold a data-state attribute which we pick up and apply + // as a class to the body. This list contains the combined state of + // all current slides. + state = [], + + // The current scale of the presentation (see width/height config) + scale = 1, + + // CSS transform that is currently applied to the slides container, + // split into two groups + slidesTransform = { layout: '', overview: '' }, + + // Cached references to DOM elements + dom = {}, + + // Features supported by the browser, see #checkCapabilities() + features = {}, + + // Client is a mobile device, see #checkCapabilities() + isMobileDevice, + + // Throttles mouse wheel navigation + lastMouseWheelStep = 0, + + // Delays updates to the URL due to a Chrome thumbnailer bug + writeURLTimeout = 0, + + // Flags if the interaction event listeners are bound + eventsAreBound = false, + + // The current auto-slide duration + autoSlide = 0, + + // Auto slide properties + autoSlidePlayer, + autoSlideTimeout = 0, + autoSlideStartTime = -1, + autoSlidePaused = false, + + // Holds information about the currently ongoing touch input + touch = { + startX: 0, + startY: 0, + startSpan: 0, + startCount: 0, + captured: false, + threshold: 40 + }, + + // Holds information about the keyboard shortcuts + keyboardShortcuts = { + 'N , SPACE': 'Next slide', + 'P': 'Previous slide', + '← , H': 'Navigate left', + '→ , L': 'Navigate right', + '↑ , K': 'Navigate up', + '↓ , J': 'Navigate down', + 'Home': 'First slide', + 'End': 'Last slide', + 'B , .': 'Pause', + 'F': 'Fullscreen', + 'ESC, O': 'Slide overview' + }; + + /** + * Starts up the presentation if the client is capable. + */ + function initialize( options ) { + + checkCapabilities(); + + if( !features.transforms2d && !features.transforms3d ) { + document.body.setAttribute( 'class', 'no-transforms' ); + + // Since JS won't be running any further, we load all lazy + // loading elements upfront + var images = toArray( document.getElementsByTagName( 'img' ) ), + iframes = toArray( document.getElementsByTagName( 'iframe' ) ); + + var lazyLoadable = images.concat( iframes ); + + for( var i = 0, len = lazyLoadable.length; i < len; i++ ) { + var element = lazyLoadable[i]; + if( element.getAttribute( 'data-src' ) ) { + element.setAttribute( 'src', element.getAttribute( 'data-src' ) ); + element.removeAttribute( 'data-src' ); + } + } + + // If the browser doesn't support core features we won't be + // using JavaScript to control the presentation + return; + } + + // Cache references to key DOM elements + dom.wrapper = document.querySelector( '.reveal' ); + dom.slides = document.querySelector( '.reveal .slides' ); + + // Force a layout when the whole page, incl fonts, has loaded + window.addEventListener( 'load', layout, false ); + + var query = Reveal.getQueryHash(); + + // Do not accept new dependencies via query config to avoid + // the potential of malicious script injection + if( typeof query['dependencies'] !== 'undefined' ) delete query['dependencies']; + + // Copy options over to our config object + extend( config, options ); + extend( config, query ); + + // Hide the address bar in mobile browsers + hideAddressBar(); + + // Loads the dependencies and continues to #start() once done + load(); + + } + + /** + * Inspect the client to see what it's capable of, this + * should only happens once per runtime. + */ + function checkCapabilities() { + + features.transforms3d = 'WebkitPerspective' in document.body.style || + 'MozPerspective' in document.body.style || + 'msPerspective' in document.body.style || + 'OPerspective' in document.body.style || + 'perspective' in document.body.style; + + features.transforms2d = 'WebkitTransform' in document.body.style || + 'MozTransform' in document.body.style || + 'msTransform' in document.body.style || + 'OTransform' in document.body.style || + 'transform' in document.body.style; + + features.requestAnimationFrameMethod = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame; + features.requestAnimationFrame = typeof features.requestAnimationFrameMethod === 'function'; + + features.canvas = !!document.createElement( 'canvas' ).getContext; + + features.touch = !!( 'ontouchstart' in window ); + + // Transitions in the overview are disabled in desktop and + // mobile Safari due to lag + features.overviewTransitions = !/Version\/[\d\.]+.*Safari/.test( navigator.userAgent ); + + isMobileDevice = /(iphone|ipod|ipad|android)/gi.test( navigator.userAgent ); + + } + + /** + * Loads the dependencies of reveal.js. Dependencies are + * defined via the configuration option 'dependencies' + * and will be loaded prior to starting/binding reveal.js. + * Some dependencies may have an 'async' flag, if so they + * will load after reveal.js has been started up. + */ + function load() { + + var scripts = [], + scriptsAsync = [], + scriptsToPreload = 0; + + // Called once synchronous scripts finish loading + function proceed() { + if( scriptsAsync.length ) { + // Load asynchronous scripts + head.js.apply( null, scriptsAsync ); + } + + start(); + } + + function loadScript( s ) { + head.ready( s.src.match( /([\w\d_\-]*)\.?js$|[^\\\/]*$/i )[0], function() { + // Extension may contain callback functions + if( typeof s.callback === 'function' ) { + s.callback.apply( this ); + } + + if( --scriptsToPreload === 0 ) { + proceed(); + } + }); + } + + for( var i = 0, len = config.dependencies.length; i < len; i++ ) { + var s = config.dependencies[i]; + + // Load if there's no condition or the condition is truthy + if( !s.condition || s.condition() ) { + if( s.async ) { + scriptsAsync.push( s.src ); + } + else { + scripts.push( s.src ); + } + + loadScript( s ); + } + } + + if( scripts.length ) { + scriptsToPreload = scripts.length; + + // Load synchronous scripts + head.js.apply( null, scripts ); + } + else { + proceed(); + } + + } + + /** + * Starts up reveal.js by binding input events and navigating + * to the current URL deeplink if there is one. + */ + function start() { + + // Make sure we've got all the DOM elements we need + setupDOM(); + + // Listen to messages posted to this window + setupPostMessage(); + + // Prevent iframes from scrolling the slides out of view + setupIframeScrollPrevention(); + + // Resets all vertical slides so that only the first is visible + resetVerticalSlides(); + + // Updates the presentation to match the current configuration values + configure(); + + // Read the initial hash + readURL(); + + // Update all backgrounds + updateBackground( true ); + + // Notify listeners that the presentation is ready but use a 1ms + // timeout to ensure it's not fired synchronously after #initialize() + setTimeout( function() { + // Enable transitions now that we're loaded + dom.slides.classList.remove( 'no-transition' ); + + loaded = true; + + dispatchEvent( 'ready', { + 'indexh': indexh, + 'indexv': indexv, + 'currentSlide': currentSlide + } ); + }, 1 ); + + // Special setup and config is required when printing to PDF + if( isPrintingPDF() ) { + removeEventListeners(); + + // The document needs to have loaded for the PDF layout + // measurements to be accurate + if( document.readyState === 'complete' ) { + setupPDF(); + } + else { + window.addEventListener( 'load', setupPDF ); + } + } + + } + + /** + * Finds and stores references to DOM elements which are + * required by the presentation. If a required element is + * not found, it is created. + */ + function setupDOM() { + + // Prevent transitions while we're loading + dom.slides.classList.add( 'no-transition' ); + + // Background element + dom.background = createSingletonNode( dom.wrapper, 'div', 'backgrounds', null ); + + // Progress bar + dom.progress = createSingletonNode( dom.wrapper, 'div', 'progress', '' ); + dom.progressbar = dom.progress.querySelector( 'span' ); + + // Arrow controls + createSingletonNode( dom.wrapper, 'aside', 'controls', + '' + + '' + + '' + + '' ); + + // Slide number + dom.slideNumber = createSingletonNode( dom.wrapper, 'div', 'slide-number', '' ); + + // Element containing notes that are visible to the audience + dom.speakerNotes = createSingletonNode( dom.wrapper, 'div', 'speaker-notes', null ); + dom.speakerNotes.setAttribute( 'data-prevent-swipe', '' ); + + // Overlay graphic which is displayed during the paused mode + createSingletonNode( dom.wrapper, 'div', 'pause-overlay', null ); + + // Cache references to elements + dom.controls = document.querySelector( '.reveal .controls' ); + dom.theme = document.querySelector( '#theme' ); + + dom.wrapper.setAttribute( 'role', 'application' ); + + // There can be multiple instances of controls throughout the page + dom.controlsLeft = toArray( document.querySelectorAll( '.navigate-left' ) ); + dom.controlsRight = toArray( document.querySelectorAll( '.navigate-right' ) ); + dom.controlsUp = toArray( document.querySelectorAll( '.navigate-up' ) ); + dom.controlsDown = toArray( document.querySelectorAll( '.navigate-down' ) ); + dom.controlsPrev = toArray( document.querySelectorAll( '.navigate-prev' ) ); + dom.controlsNext = toArray( document.querySelectorAll( '.navigate-next' ) ); + + dom.statusDiv = createStatusDiv(); + } + + /** + * Creates a hidden div with role aria-live to announce the + * current slide content. Hide the div off-screen to make it + * available only to Assistive Technologies. + */ + function createStatusDiv() { + + var statusDiv = document.getElementById( 'aria-status-div' ); + if( !statusDiv ) { + statusDiv = document.createElement( 'div' ); + statusDiv.style.position = 'absolute'; + statusDiv.style.height = '1px'; + statusDiv.style.width = '1px'; + statusDiv.style.overflow ='hidden'; + statusDiv.style.clip = 'rect( 1px, 1px, 1px, 1px )'; + statusDiv.setAttribute( 'id', 'aria-status-div' ); + statusDiv.setAttribute( 'aria-live', 'polite' ); + statusDiv.setAttribute( 'aria-atomic','true' ); + dom.wrapper.appendChild( statusDiv ); + } + return statusDiv; + + } + + /** + * Configures the presentation for printing to a static + * PDF. + */ + function setupPDF() { + + var slideSize = getComputedSlideSize( window.innerWidth, window.innerHeight ); + + // Dimensions of the PDF pages + var pageWidth = Math.floor( slideSize.width * ( 1 + config.margin ) ), + pageHeight = Math.floor( slideSize.height * ( 1 + config.margin ) ); + + // Dimensions of slides within the pages + var slideWidth = slideSize.width, + slideHeight = slideSize.height; + + // Let the browser know what page size we want to print + injectStyleSheet( '@page{size:'+ pageWidth +'px '+ pageHeight +'px; margin: 0;}' ); + + // Limit the size of certain elements to the dimensions of the slide + injectStyleSheet( '.reveal section>img, .reveal section>video, .reveal section>iframe{max-width: '+ slideWidth +'px; max-height:'+ slideHeight +'px}' ); + + document.body.classList.add( 'print-pdf' ); + document.body.style.width = pageWidth + 'px'; + document.body.style.height = pageHeight + 'px'; + + // Add each slide's index as attributes on itself, we need these + // indices to generate slide numbers below + toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).forEach( function( hslide, h ) { + hslide.setAttribute( 'data-index-h', h ); + + if( hslide.classList.contains( 'stack' ) ) { + toArray( hslide.querySelectorAll( 'section' ) ).forEach( function( vslide, v ) { + vslide.setAttribute( 'data-index-h', h ); + vslide.setAttribute( 'data-index-v', v ); + } ); + } + } ); + + // Slide and slide background layout + toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ).forEach( function( slide ) { + + // Vertical stacks are not centred since their section + // children will be + if( slide.classList.contains( 'stack' ) === false ) { + // Center the slide inside of the page, giving the slide some margin + var left = ( pageWidth - slideWidth ) / 2, + top = ( pageHeight - slideHeight ) / 2; + + var contentHeight = getAbsoluteHeight( slide ); + var numberOfPages = Math.max( Math.ceil( contentHeight / pageHeight ), 1 ); + + // Center slides vertically + if( numberOfPages === 1 && config.center || slide.classList.contains( 'center' ) ) { + top = Math.max( ( pageHeight - contentHeight ) / 2, 0 ); + } + + // Position the slide inside of the page + slide.style.left = left + 'px'; + slide.style.top = top + 'px'; + slide.style.width = slideWidth + 'px'; + + // TODO Backgrounds need to be multiplied when the slide + // stretches over multiple pages + var background = slide.querySelector( '.slide-background' ); + if( background ) { + background.style.width = pageWidth + 'px'; + background.style.height = ( pageHeight * numberOfPages ) + 'px'; + background.style.top = -top + 'px'; + background.style.left = -left + 'px'; + } + + // Inject notes if `showNotes` is enabled + if( config.showNotes ) { + var notes = getSlideNotes( slide ); + if( notes ) { + var notesSpacing = 8; + var notesElement = document.createElement( 'div' ); + notesElement.classList.add( 'speaker-notes' ); + notesElement.classList.add( 'speaker-notes-pdf' ); + notesElement.innerHTML = notes; + notesElement.style.left = ( notesSpacing - left ) + 'px'; + notesElement.style.bottom = ( notesSpacing - top ) + 'px'; + notesElement.style.width = ( pageWidth - notesSpacing*2 ) + 'px'; + slide.appendChild( notesElement ); + } + } + + // Inject slide numbers if `slideNumbers` are enabled + if( config.slideNumber ) { + var slideNumberH = parseInt( slide.getAttribute( 'data-index-h' ), 10 ) + 1, + slideNumberV = parseInt( slide.getAttribute( 'data-index-v' ), 10 ) + 1; + + var numberElement = document.createElement( 'div' ); + numberElement.classList.add( 'slide-number' ); + numberElement.classList.add( 'slide-number-pdf' ); + numberElement.innerHTML = formatSlideNumber( slideNumberH, '.', slideNumberV ); + background.appendChild( numberElement ); + } + } + + } ); + + // Show all fragments + toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR + ' .fragment' ) ).forEach( function( fragment ) { + fragment.classList.add( 'visible' ); + } ); + + } + + /** + * This is an unfortunate necessity. Iframes can trigger the + * parent window to scroll, for example by focusing an input. + * This scrolling can not be prevented by hiding overflow in + * CSS so we have to resort to repeatedly checking if the + * browser has decided to offset our slides :( + */ + function setupIframeScrollPrevention() { + + if( dom.slides.querySelector( 'iframe' ) ) { + setInterval( function() { + if( dom.wrapper.scrollTop !== 0 || dom.wrapper.scrollLeft !== 0 ) { + dom.wrapper.scrollTop = 0; + dom.wrapper.scrollLeft = 0; + } + }, 500 ); + } + + } + + /** + * Creates an HTML element and returns a reference to it. + * If the element already exists the existing instance will + * be returned. + */ + function createSingletonNode( container, tagname, classname, innerHTML ) { + + // Find all nodes matching the description + var nodes = container.querySelectorAll( '.' + classname ); + + // Check all matches to find one which is a direct child of + // the specified container + for( var i = 0; i < nodes.length; i++ ) { + var testNode = nodes[i]; + if( testNode.parentNode === container ) { + return testNode; + } + } + + // If no node was found, create it now + var node = document.createElement( tagname ); + node.classList.add( classname ); + if( typeof innerHTML === 'string' ) { + node.innerHTML = innerHTML; + } + container.appendChild( node ); + + return node; + + } + + /** + * Creates the slide background elements and appends them + * to the background container. One element is created per + * slide no matter if the given slide has visible background. + */ + function createBackgrounds() { + + var printMode = isPrintingPDF(); + + // Clear prior backgrounds + dom.background.innerHTML = ''; + dom.background.classList.add( 'no-transition' ); + + // Iterate over all horizontal slides + toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).forEach( function( slideh ) { + + var backgroundStack; + + if( printMode ) { + backgroundStack = createBackground( slideh, slideh ); + } + else { + backgroundStack = createBackground( slideh, dom.background ); + } + + // Iterate over all vertical slides + toArray( slideh.querySelectorAll( 'section' ) ).forEach( function( slidev ) { + + if( printMode ) { + createBackground( slidev, slidev ); + } + else { + createBackground( slidev, backgroundStack ); + } + + backgroundStack.classList.add( 'stack' ); + + } ); + + } ); + + // Add parallax background if specified + if( config.parallaxBackgroundImage ) { + + dom.background.style.backgroundImage = 'url("' + config.parallaxBackgroundImage + '")'; + dom.background.style.backgroundSize = config.parallaxBackgroundSize; + + // Make sure the below properties are set on the element - these properties are + // needed for proper transitions to be set on the element via CSS. To remove + // annoying background slide-in effect when the presentation starts, apply + // these properties after short time delay + setTimeout( function() { + dom.wrapper.classList.add( 'has-parallax-background' ); + }, 1 ); + + } + else { + + dom.background.style.backgroundImage = ''; + dom.wrapper.classList.remove( 'has-parallax-background' ); + + } + + } + + /** + * Creates a background for the given slide. + * + * @param {HTMLElement} slide + * @param {HTMLElement} container The element that the background + * should be appended to + */ + function createBackground( slide, container ) { + + var data = { + background: slide.getAttribute( 'data-background' ), + backgroundSize: slide.getAttribute( 'data-background-size' ), + backgroundImage: slide.getAttribute( 'data-background-image' ), + backgroundVideo: slide.getAttribute( 'data-background-video' ), + backgroundIframe: slide.getAttribute( 'data-background-iframe' ), + backgroundColor: slide.getAttribute( 'data-background-color' ), + backgroundRepeat: slide.getAttribute( 'data-background-repeat' ), + backgroundPosition: slide.getAttribute( 'data-background-position' ), + backgroundTransition: slide.getAttribute( 'data-background-transition' ) + }; + + var element = document.createElement( 'div' ); + + // Carry over custom classes from the slide to the background + element.className = 'slide-background ' + slide.className.replace( /present|past|future/, '' ); + + if( data.background ) { + // Auto-wrap image urls in url(...) + if( /^(http|file|\/\/)/gi.test( data.background ) || /\.(svg|png|jpg|jpeg|gif|bmp)$/gi.test( data.background ) ) { + slide.setAttribute( 'data-background-image', data.background ); + } + else { + element.style.background = data.background; + } + } + + // Create a hash for this combination of background settings. + // This is used to determine when two slide backgrounds are + // the same. + if( data.background || data.backgroundColor || data.backgroundImage || data.backgroundVideo || data.backgroundIframe ) { + element.setAttribute( 'data-background-hash', data.background + + data.backgroundSize + + data.backgroundImage + + data.backgroundVideo + + data.backgroundIframe + + data.backgroundColor + + data.backgroundRepeat + + data.backgroundPosition + + data.backgroundTransition ); + } + + // Additional and optional background properties + if( data.backgroundSize ) element.style.backgroundSize = data.backgroundSize; + if( data.backgroundColor ) element.style.backgroundColor = data.backgroundColor; + if( data.backgroundRepeat ) element.style.backgroundRepeat = data.backgroundRepeat; + if( data.backgroundPosition ) element.style.backgroundPosition = data.backgroundPosition; + if( data.backgroundTransition ) element.setAttribute( 'data-background-transition', data.backgroundTransition ); + + container.appendChild( element ); + + // If backgrounds are being recreated, clear old classes + slide.classList.remove( 'has-dark-background' ); + slide.classList.remove( 'has-light-background' ); + + // If this slide has a background color, add a class that + // signals if it is light or dark. If the slide has no background + // color, no class will be set + var computedBackgroundColor = window.getComputedStyle( element ).backgroundColor; + if( computedBackgroundColor ) { + var rgb = colorToRgb( computedBackgroundColor ); + + // Ignore fully transparent backgrounds. Some browsers return + // rgba(0,0,0,0) when reading the computed background color of + // an element with no background + if( rgb && rgb.a !== 0 ) { + if( colorBrightness( computedBackgroundColor ) < 128 ) { + slide.classList.add( 'has-dark-background' ); + } + else { + slide.classList.add( 'has-light-background' ); + } + } + } + + return element; + + } + + /** + * Registers a listener to postMessage events, this makes it + * possible to call all reveal.js API methods from another + * window. For example: + * + * revealWindow.postMessage( JSON.stringify({ + * method: 'slide', + * args: [ 2 ] + * }), '*' ); + */ + function setupPostMessage() { + + if( config.postMessage ) { + window.addEventListener( 'message', function ( event ) { + var data = event.data; + + // Make sure we're dealing with JSON + if( typeof data === 'string' && data.charAt( 0 ) === '{' && data.charAt( data.length - 1 ) === '}' ) { + data = JSON.parse( data ); + + // Check if the requested method can be found + if( data.method && typeof Reveal[data.method] === 'function' ) { + Reveal[data.method].apply( Reveal, data.args ); + } + } + }, false ); + } + + } + + /** + * Applies the configuration settings from the config + * object. May be called multiple times. + */ + function configure( options ) { + + var numberOfSlides = dom.wrapper.querySelectorAll( SLIDES_SELECTOR ).length; + + dom.wrapper.classList.remove( config.transition ); + + // New config options may be passed when this method + // is invoked through the API after initialization + if( typeof options === 'object' ) extend( config, options ); + + // Force linear transition based on browser capabilities + if( features.transforms3d === false ) config.transition = 'linear'; + + dom.wrapper.classList.add( config.transition ); + + dom.wrapper.setAttribute( 'data-transition-speed', config.transitionSpeed ); + dom.wrapper.setAttribute( 'data-background-transition', config.backgroundTransition ); + + dom.controls.style.display = config.controls ? 'block' : 'none'; + dom.progress.style.display = config.progress ? 'block' : 'none'; + dom.slideNumber.style.display = config.slideNumber && !isPrintingPDF() ? 'block' : 'none'; + + if( config.rtl ) { + dom.wrapper.classList.add( 'rtl' ); + } + else { + dom.wrapper.classList.remove( 'rtl' ); + } + + if( config.center ) { + dom.wrapper.classList.add( 'center' ); + } + else { + dom.wrapper.classList.remove( 'center' ); + } + + // Exit the paused mode if it was configured off + if( config.pause === false ) { + resume(); + } + + if( config.showNotes ) { + dom.speakerNotes.classList.add( 'visible' ); + } + else { + dom.speakerNotes.classList.remove( 'visible' ); + } + + if( config.mouseWheel ) { + document.addEventListener( 'DOMMouseScroll', onDocumentMouseScroll, false ); // FF + document.addEventListener( 'mousewheel', onDocumentMouseScroll, false ); + } + else { + document.removeEventListener( 'DOMMouseScroll', onDocumentMouseScroll, false ); // FF + document.removeEventListener( 'mousewheel', onDocumentMouseScroll, false ); + } + + // Rolling 3D links + if( config.rollingLinks ) { + enableRollingLinks(); + } + else { + disableRollingLinks(); + } + + // Iframe link previews + if( config.previewLinks ) { + enablePreviewLinks(); + } + else { + disablePreviewLinks(); + enablePreviewLinks( '[data-preview-link]' ); + } + + // Remove existing auto-slide controls + if( autoSlidePlayer ) { + autoSlidePlayer.destroy(); + autoSlidePlayer = null; + } + + // Generate auto-slide controls if needed + if( numberOfSlides > 1 && config.autoSlide && config.autoSlideStoppable && features.canvas && features.requestAnimationFrame ) { + autoSlidePlayer = new Playback( dom.wrapper, function() { + return Math.min( Math.max( ( Date.now() - autoSlideStartTime ) / autoSlide, 0 ), 1 ); + } ); + + autoSlidePlayer.on( 'click', onAutoSlidePlayerClick ); + autoSlidePaused = false; + } + + // When fragments are turned off they should be visible + if( config.fragments === false ) { + toArray( dom.slides.querySelectorAll( '.fragment' ) ).forEach( function( element ) { + element.classList.add( 'visible' ); + element.classList.remove( 'current-fragment' ); + } ); + } + + sync(); + + } + + /** + * Binds all event listeners. + */ + function addEventListeners() { + + eventsAreBound = true; + + window.addEventListener( 'hashchange', onWindowHashChange, false ); + window.addEventListener( 'resize', onWindowResize, false ); + + if( config.touch ) { + dom.wrapper.addEventListener( 'touchstart', onTouchStart, false ); + dom.wrapper.addEventListener( 'touchmove', onTouchMove, false ); + dom.wrapper.addEventListener( 'touchend', onTouchEnd, false ); + + // Support pointer-style touch interaction as well + if( window.navigator.pointerEnabled ) { + // IE 11 uses un-prefixed version of pointer events + dom.wrapper.addEventListener( 'pointerdown', onPointerDown, false ); + dom.wrapper.addEventListener( 'pointermove', onPointerMove, false ); + dom.wrapper.addEventListener( 'pointerup', onPointerUp, false ); + } + else if( window.navigator.msPointerEnabled ) { + // IE 10 uses prefixed version of pointer events + dom.wrapper.addEventListener( 'MSPointerDown', onPointerDown, false ); + dom.wrapper.addEventListener( 'MSPointerMove', onPointerMove, false ); + dom.wrapper.addEventListener( 'MSPointerUp', onPointerUp, false ); + } + } + + if( config.keyboard ) { + document.addEventListener( 'keydown', onDocumentKeyDown, false ); + document.addEventListener( 'keypress', onDocumentKeyPress, false ); + } + + if( config.progress && dom.progress ) { + dom.progress.addEventListener( 'click', onProgressClicked, false ); + } + + if( config.focusBodyOnPageVisibilityChange ) { + var visibilityChange; + + if( 'hidden' in document ) { + visibilityChange = 'visibilitychange'; + } + else if( 'msHidden' in document ) { + visibilityChange = 'msvisibilitychange'; + } + else if( 'webkitHidden' in document ) { + visibilityChange = 'webkitvisibilitychange'; + } + + if( visibilityChange ) { + document.addEventListener( visibilityChange, onPageVisibilityChange, false ); + } + } + + // Listen to both touch and click events, in case the device + // supports both + var pointerEvents = [ 'touchstart', 'click' ]; + + // Only support touch for Android, fixes double navigations in + // stock browser + if( navigator.userAgent.match( /android/gi ) ) { + pointerEvents = [ 'touchstart' ]; + } + + pointerEvents.forEach( function( eventName ) { + dom.controlsLeft.forEach( function( el ) { el.addEventListener( eventName, onNavigateLeftClicked, false ); } ); + dom.controlsRight.forEach( function( el ) { el.addEventListener( eventName, onNavigateRightClicked, false ); } ); + dom.controlsUp.forEach( function( el ) { el.addEventListener( eventName, onNavigateUpClicked, false ); } ); + dom.controlsDown.forEach( function( el ) { el.addEventListener( eventName, onNavigateDownClicked, false ); } ); + dom.controlsPrev.forEach( function( el ) { el.addEventListener( eventName, onNavigatePrevClicked, false ); } ); + dom.controlsNext.forEach( function( el ) { el.addEventListener( eventName, onNavigateNextClicked, false ); } ); + } ); + + } + + /** + * Unbinds all event listeners. + */ + function removeEventListeners() { + + eventsAreBound = false; + + document.removeEventListener( 'keydown', onDocumentKeyDown, false ); + document.removeEventListener( 'keypress', onDocumentKeyPress, false ); + window.removeEventListener( 'hashchange', onWindowHashChange, false ); + window.removeEventListener( 'resize', onWindowResize, false ); + + dom.wrapper.removeEventListener( 'touchstart', onTouchStart, false ); + dom.wrapper.removeEventListener( 'touchmove', onTouchMove, false ); + dom.wrapper.removeEventListener( 'touchend', onTouchEnd, false ); + + // IE11 + if( window.navigator.pointerEnabled ) { + dom.wrapper.removeEventListener( 'pointerdown', onPointerDown, false ); + dom.wrapper.removeEventListener( 'pointermove', onPointerMove, false ); + dom.wrapper.removeEventListener( 'pointerup', onPointerUp, false ); + } + // IE10 + else if( window.navigator.msPointerEnabled ) { + dom.wrapper.removeEventListener( 'MSPointerDown', onPointerDown, false ); + dom.wrapper.removeEventListener( 'MSPointerMove', onPointerMove, false ); + dom.wrapper.removeEventListener( 'MSPointerUp', onPointerUp, false ); + } + + if ( config.progress && dom.progress ) { + dom.progress.removeEventListener( 'click', onProgressClicked, false ); + } + + [ 'touchstart', 'click' ].forEach( function( eventName ) { + dom.controlsLeft.forEach( function( el ) { el.removeEventListener( eventName, onNavigateLeftClicked, false ); } ); + dom.controlsRight.forEach( function( el ) { el.removeEventListener( eventName, onNavigateRightClicked, false ); } ); + dom.controlsUp.forEach( function( el ) { el.removeEventListener( eventName, onNavigateUpClicked, false ); } ); + dom.controlsDown.forEach( function( el ) { el.removeEventListener( eventName, onNavigateDownClicked, false ); } ); + dom.controlsPrev.forEach( function( el ) { el.removeEventListener( eventName, onNavigatePrevClicked, false ); } ); + dom.controlsNext.forEach( function( el ) { el.removeEventListener( eventName, onNavigateNextClicked, false ); } ); + } ); + + } + + /** + * Extend object a with the properties of object b. + * If there's a conflict, object b takes precedence. + */ + function extend( a, b ) { + + for( var i in b ) { + a[ i ] = b[ i ]; + } + + } + + /** + * Converts the target object to an array. + */ + function toArray( o ) { + + return Array.prototype.slice.call( o ); + + } + + /** + * Utility for deserializing a value. + */ + function deserialize( value ) { + + if( typeof value === 'string' ) { + if( value === 'null' ) return null; + else if( value === 'true' ) return true; + else if( value === 'false' ) return false; + else if( value.match( /^\d+$/ ) ) return parseFloat( value ); + } + + return value; + + } + + /** + * Measures the distance in pixels between point a + * and point b. + * + * @param {Object} a point with x/y properties + * @param {Object} b point with x/y properties + */ + function distanceBetween( a, b ) { + + var dx = a.x - b.x, + dy = a.y - b.y; + + return Math.sqrt( dx*dx + dy*dy ); + + } + + /** + * Applies a CSS transform to the target element. + */ + function transformElement( element, transform ) { + + element.style.WebkitTransform = transform; + element.style.MozTransform = transform; + element.style.msTransform = transform; + element.style.transform = transform; + + } + + /** + * Applies CSS transforms to the slides container. The container + * is transformed from two separate sources: layout and the overview + * mode. + */ + function transformSlides( transforms ) { + + // Pick up new transforms from arguments + if( typeof transforms.layout === 'string' ) slidesTransform.layout = transforms.layout; + if( typeof transforms.overview === 'string' ) slidesTransform.overview = transforms.overview; + + // Apply the transforms to the slides container + if( slidesTransform.layout ) { + transformElement( dom.slides, slidesTransform.layout + ' ' + slidesTransform.overview ); + } + else { + transformElement( dom.slides, slidesTransform.overview ); + } + + } + + /** + * Injects the given CSS styles into the DOM. + */ + function injectStyleSheet( value ) { + + var tag = document.createElement( 'style' ); + tag.type = 'text/css'; + if( tag.styleSheet ) { + tag.styleSheet.cssText = value; + } + else { + tag.appendChild( document.createTextNode( value ) ); + } + document.getElementsByTagName( 'head' )[0].appendChild( tag ); + + } + + /** + * Converts various color input formats to an {r:0,g:0,b:0} object. + * + * @param {String} color The string representation of a color, + * the following formats are supported: + * - #000 + * - #000000 + * - rgb(0,0,0) + */ + function colorToRgb( color ) { + + var hex3 = color.match( /^#([0-9a-f]{3})$/i ); + if( hex3 && hex3[1] ) { + hex3 = hex3[1]; + return { + r: parseInt( hex3.charAt( 0 ), 16 ) * 0x11, + g: parseInt( hex3.charAt( 1 ), 16 ) * 0x11, + b: parseInt( hex3.charAt( 2 ), 16 ) * 0x11 + }; + } + + var hex6 = color.match( /^#([0-9a-f]{6})$/i ); + if( hex6 && hex6[1] ) { + hex6 = hex6[1]; + return { + r: parseInt( hex6.substr( 0, 2 ), 16 ), + g: parseInt( hex6.substr( 2, 2 ), 16 ), + b: parseInt( hex6.substr( 4, 2 ), 16 ) + }; + } + + var rgb = color.match( /^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i ); + if( rgb ) { + return { + r: parseInt( rgb[1], 10 ), + g: parseInt( rgb[2], 10 ), + b: parseInt( rgb[3], 10 ) + }; + } + + var rgba = color.match( /^rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\,\s*([\d]+|[\d]*.[\d]+)\s*\)$/i ); + if( rgba ) { + return { + r: parseInt( rgba[1], 10 ), + g: parseInt( rgba[2], 10 ), + b: parseInt( rgba[3], 10 ), + a: parseFloat( rgba[4] ) + }; + } + + return null; + + } + + /** + * Calculates brightness on a scale of 0-255. + * + * @param color See colorStringToRgb for supported formats. + */ + function colorBrightness( color ) { + + if( typeof color === 'string' ) color = colorToRgb( color ); + + if( color ) { + return ( color.r * 299 + color.g * 587 + color.b * 114 ) / 1000; + } + + return null; + + } + + /** + * Retrieves the height of the given element by looking + * at the position and height of its immediate children. + */ + function getAbsoluteHeight( element ) { + + var height = 0; + + if( element ) { + var absoluteChildren = 0; + + toArray( element.childNodes ).forEach( function( child ) { + + if( typeof child.offsetTop === 'number' && child.style ) { + // Count # of abs children + if( window.getComputedStyle( child ).position === 'absolute' ) { + absoluteChildren += 1; + } + + height = Math.max( height, child.offsetTop + child.offsetHeight ); + } + + } ); + + // If there are no absolute children, use offsetHeight + if( absoluteChildren === 0 ) { + height = element.offsetHeight; + } + + } + + return height; + + } + + /** + * Returns the remaining height within the parent of the + * target element. + * + * remaining height = [ configured parent height ] - [ current parent height ] + */ + function getRemainingHeight( element, height ) { + + height = height || 0; + + if( element ) { + var newHeight, oldHeight = element.style.height; + + // Change the .stretch element height to 0 in order find the height of all + // the other elements + element.style.height = '0px'; + newHeight = height - element.parentNode.offsetHeight; + + // Restore the old height, just in case + element.style.height = oldHeight + 'px'; + + return newHeight; + } + + return height; + + } + + /** + * Checks if this instance is being used to print a PDF. + */ + function isPrintingPDF() { + + return ( /print-pdf/gi ).test( window.location.search ); + + } + + /** + * Hides the address bar if we're on a mobile device. + */ + function hideAddressBar() { + + if( config.hideAddressBar && isMobileDevice ) { + // Events that should trigger the address bar to hide + window.addEventListener( 'load', removeAddressBar, false ); + window.addEventListener( 'orientationchange', removeAddressBar, false ); + } + + } + + /** + * Causes the address bar to hide on mobile devices, + * more vertical space ftw. + */ + function removeAddressBar() { + + setTimeout( function() { + window.scrollTo( 0, 1 ); + }, 10 ); + + } + + /** + * Dispatches an event of the specified type from the + * reveal DOM element. + */ + function dispatchEvent( type, args ) { + + var event = document.createEvent( 'HTMLEvents', 1, 2 ); + event.initEvent( type, true, true ); + extend( event, args ); + dom.wrapper.dispatchEvent( event ); + + // If we're in an iframe, post each reveal.js event to the + // parent window. Used by the notes plugin + if( config.postMessageEvents && window.parent !== window.self ) { + window.parent.postMessage( JSON.stringify({ namespace: 'reveal', eventName: type, state: getState() }), '*' ); + } + + } + + /** + * Wrap all links in 3D goodness. + */ + function enableRollingLinks() { + + if( features.transforms3d && !( 'msPerspective' in document.body.style ) ) { + var anchors = dom.wrapper.querySelectorAll( SLIDES_SELECTOR + ' a' ); + + for( var i = 0, len = anchors.length; i < len; i++ ) { + var anchor = anchors[i]; + + if( anchor.textContent && !anchor.querySelector( '*' ) && ( !anchor.className || !anchor.classList.contains( anchor, 'roll' ) ) ) { + var span = document.createElement('span'); + span.setAttribute('data-title', anchor.text); + span.innerHTML = anchor.innerHTML; + + anchor.classList.add( 'roll' ); + anchor.innerHTML = ''; + anchor.appendChild(span); + } + } + } + + } + + /** + * Unwrap all 3D links. + */ + function disableRollingLinks() { + + var anchors = dom.wrapper.querySelectorAll( SLIDES_SELECTOR + ' a.roll' ); + + for( var i = 0, len = anchors.length; i < len; i++ ) { + var anchor = anchors[i]; + var span = anchor.querySelector( 'span' ); + + if( span ) { + anchor.classList.remove( 'roll' ); + anchor.innerHTML = span.innerHTML; + } + } + + } + + /** + * Bind preview frame links. + */ + function enablePreviewLinks( selector ) { + + var anchors = toArray( document.querySelectorAll( selector ? selector : 'a' ) ); + + anchors.forEach( function( element ) { + if( /^(http|www)/gi.test( element.getAttribute( 'href' ) ) ) { + element.addEventListener( 'click', onPreviewLinkClicked, false ); + } + } ); + + } + + /** + * Unbind preview frame links. + */ + function disablePreviewLinks() { + + var anchors = toArray( document.querySelectorAll( 'a' ) ); + + anchors.forEach( function( element ) { + if( /^(http|www)/gi.test( element.getAttribute( 'href' ) ) ) { + element.removeEventListener( 'click', onPreviewLinkClicked, false ); + } + } ); + + } + + /** + * Opens a preview window for the target URL. + */ + function showPreview( url ) { + + closeOverlay(); + + dom.overlay = document.createElement( 'div' ); + dom.overlay.classList.add( 'overlay' ); + dom.overlay.classList.add( 'overlay-preview' ); + dom.wrapper.appendChild( dom.overlay ); + + dom.overlay.innerHTML = [ + '
', + '', + '', + '
', + '
', + '
', + '', + '
' + ].join(''); + + dom.overlay.querySelector( 'iframe' ).addEventListener( 'load', function( event ) { + dom.overlay.classList.add( 'loaded' ); + }, false ); + + dom.overlay.querySelector( '.close' ).addEventListener( 'click', function( event ) { + closeOverlay(); + event.preventDefault(); + }, false ); + + dom.overlay.querySelector( '.external' ).addEventListener( 'click', function( event ) { + closeOverlay(); + }, false ); + + setTimeout( function() { + dom.overlay.classList.add( 'visible' ); + }, 1 ); + + } + + /** + * Opens a overlay window with help material. + */ + function showHelp() { + + if( config.help ) { + + closeOverlay(); + + dom.overlay = document.createElement( 'div' ); + dom.overlay.classList.add( 'overlay' ); + dom.overlay.classList.add( 'overlay-help' ); + dom.wrapper.appendChild( dom.overlay ); + + var html = '

Keyboard Shortcuts


'; + + html += ''; + for( var key in keyboardShortcuts ) { + html += ''; + } + + html += '
KEYACTION
' + key + '' + keyboardShortcuts[ key ] + '
'; + + dom.overlay.innerHTML = [ + '
', + '', + '
', + '
', + '
'+ html +'
', + '
' + ].join(''); + + dom.overlay.querySelector( '.close' ).addEventListener( 'click', function( event ) { + closeOverlay(); + event.preventDefault(); + }, false ); + + setTimeout( function() { + dom.overlay.classList.add( 'visible' ); + }, 1 ); + + } + + } + + /** + * Closes any currently open overlay. + */ + function closeOverlay() { + + if( dom.overlay ) { + dom.overlay.parentNode.removeChild( dom.overlay ); + dom.overlay = null; + } + + } + + /** + * Applies JavaScript-controlled layout rules to the + * presentation. + */ + function layout() { + + if( dom.wrapper && !isPrintingPDF() ) { + + var size = getComputedSlideSize(); + + var slidePadding = 20; // TODO Dig this out of DOM + + // Layout the contents of the slides + layoutSlideContents( config.width, config.height, slidePadding ); + + dom.slides.style.width = size.width + 'px'; + dom.slides.style.height = size.height + 'px'; + + // Determine scale of content to fit within available space + scale = Math.min( size.presentationWidth / size.width, size.presentationHeight / size.height ); + + // Respect max/min scale settings + scale = Math.max( scale, config.minScale ); + scale = Math.min( scale, config.maxScale ); + + // Don't apply any scaling styles if scale is 1 + if( scale === 1 ) { + dom.slides.style.zoom = ''; + dom.slides.style.left = ''; + dom.slides.style.top = ''; + dom.slides.style.bottom = ''; + dom.slides.style.right = ''; + transformSlides( { layout: '' } ); + } + else { + // Use zoom to scale up in desktop Chrome so that content + // remains crisp. We don't use zoom to scale down since that + // can lead to shifts in text layout/line breaks. + if( scale > 1 && !isMobileDevice && /chrome/i.test( navigator.userAgent ) && typeof dom.slides.style.zoom !== 'undefined' ) { + dom.slides.style.zoom = scale; + dom.slides.style.left = ''; + dom.slides.style.top = ''; + dom.slides.style.bottom = ''; + dom.slides.style.right = ''; + transformSlides( { layout: '' } ); + } + // Apply scale transform as a fallback + else { + dom.slides.style.zoom = ''; + dom.slides.style.left = '50%'; + dom.slides.style.top = '50%'; + dom.slides.style.bottom = 'auto'; + dom.slides.style.right = 'auto'; + transformSlides( { layout: 'translate(-50%, -50%) scale('+ scale +')' } ); + } + } + + // Select all slides, vertical and horizontal + var slides = toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ); + + for( var i = 0, len = slides.length; i < len; i++ ) { + var slide = slides[ i ]; + + // Don't bother updating invisible slides + if( slide.style.display === 'none' ) { + continue; + } + + if( config.center || slide.classList.contains( 'center' ) ) { + // Vertical stacks are not centred since their section + // children will be + if( slide.classList.contains( 'stack' ) ) { + slide.style.top = 0; + } + else { + slide.style.top = Math.max( ( ( size.height - getAbsoluteHeight( slide ) ) / 2 ) - slidePadding, 0 ) + 'px'; + } + } + else { + slide.style.top = ''; + } + + } + + updateProgress(); + updateParallax(); + + } + + } + + /** + * Applies layout logic to the contents of all slides in + * the presentation. + */ + function layoutSlideContents( width, height, padding ) { + + // Handle sizing of elements with the 'stretch' class + toArray( dom.slides.querySelectorAll( 'section > .stretch' ) ).forEach( function( element ) { + + // Determine how much vertical space we can use + var remainingHeight = getRemainingHeight( element, height ); + + // Consider the aspect ratio of media elements + if( /(img|video)/gi.test( element.nodeName ) ) { + var nw = element.naturalWidth || element.videoWidth, + nh = element.naturalHeight || element.videoHeight; + + var es = Math.min( width / nw, remainingHeight / nh ); + + element.style.width = ( nw * es ) + 'px'; + element.style.height = ( nh * es ) + 'px'; + + } + else { + element.style.width = width + 'px'; + element.style.height = remainingHeight + 'px'; + } + + } ); + + } + + /** + * Calculates the computed pixel size of our slides. These + * values are based on the width and height configuration + * options. + */ + function getComputedSlideSize( presentationWidth, presentationHeight ) { + + var size = { + // Slide size + width: config.width, + height: config.height, + + // Presentation size + presentationWidth: presentationWidth || dom.wrapper.offsetWidth, + presentationHeight: presentationHeight || dom.wrapper.offsetHeight + }; + + // Reduce available space by margin + size.presentationWidth -= ( size.presentationWidth * config.margin ); + size.presentationHeight -= ( size.presentationHeight * config.margin ); + + // Slide width may be a percentage of available width + if( typeof size.width === 'string' && /%$/.test( size.width ) ) { + size.width = parseInt( size.width, 10 ) / 100 * size.presentationWidth; + } + + // Slide height may be a percentage of available height + if( typeof size.height === 'string' && /%$/.test( size.height ) ) { + size.height = parseInt( size.height, 10 ) / 100 * size.presentationHeight; + } + + return size; + + } + + /** + * Stores the vertical index of a stack so that the same + * vertical slide can be selected when navigating to and + * from the stack. + * + * @param {HTMLElement} stack The vertical stack element + * @param {int} v Index to memorize + */ + function setPreviousVerticalIndex( stack, v ) { + + if( typeof stack === 'object' && typeof stack.setAttribute === 'function' ) { + stack.setAttribute( 'data-previous-indexv', v || 0 ); + } + + } + + /** + * Retrieves the vertical index which was stored using + * #setPreviousVerticalIndex() or 0 if no previous index + * exists. + * + * @param {HTMLElement} stack The vertical stack element + */ + function getPreviousVerticalIndex( stack ) { + + if( typeof stack === 'object' && typeof stack.setAttribute === 'function' && stack.classList.contains( 'stack' ) ) { + // Prefer manually defined start-indexv + var attributeName = stack.hasAttribute( 'data-start-indexv' ) ? 'data-start-indexv' : 'data-previous-indexv'; + + return parseInt( stack.getAttribute( attributeName ) || 0, 10 ); + } + + return 0; + + } + + /** + * Displays the overview of slides (quick nav) by scaling + * down and arranging all slide elements. + */ + function activateOverview() { + + // Only proceed if enabled in config + if( config.overview && !isOverview() ) { + + overview = true; + + dom.wrapper.classList.add( 'overview' ); + dom.wrapper.classList.remove( 'overview-deactivating' ); + + if( features.overviewTransitions ) { + setTimeout( function() { + dom.wrapper.classList.add( 'overview-animated' ); + }, 1 ); + } + + // Don't auto-slide while in overview mode + cancelAutoSlide(); + + // Move the backgrounds element into the slide container to + // that the same scaling is applied + dom.slides.appendChild( dom.background ); + + // Clicking on an overview slide navigates to it + toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ).forEach( function( slide ) { + if( !slide.classList.contains( 'stack' ) ) { + slide.addEventListener( 'click', onOverviewSlideClicked, true ); + } + } ); + + updateSlidesVisibility(); + layoutOverview(); + updateOverview(); + + layout(); + + // Notify observers of the overview showing + dispatchEvent( 'overviewshown', { + 'indexh': indexh, + 'indexv': indexv, + 'currentSlide': currentSlide + } ); + + } + + } + + /** + * Uses CSS transforms to position all slides in a grid for + * display inside of the overview mode. + */ + function layoutOverview() { + + var margin = 70; + var slideWidth = config.width + margin, + slideHeight = config.height + margin; + + // Reverse in RTL mode + if( config.rtl ) { + slideWidth = -slideWidth; + } + + // Layout slides + toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).forEach( function( hslide, h ) { + hslide.setAttribute( 'data-index-h', h ); + transformElement( hslide, 'translate3d(' + ( h * slideWidth ) + 'px, 0, 0)' ); + + if( hslide.classList.contains( 'stack' ) ) { + + toArray( hslide.querySelectorAll( 'section' ) ).forEach( function( vslide, v ) { + vslide.setAttribute( 'data-index-h', h ); + vslide.setAttribute( 'data-index-v', v ); + + transformElement( vslide, 'translate3d(0, ' + ( v * slideHeight ) + 'px, 0)' ); + } ); + + } + } ); + + // Layout slide backgrounds + toArray( dom.background.childNodes ).forEach( function( hbackground, h ) { + transformElement( hbackground, 'translate3d(' + ( h * slideWidth ) + 'px, 0, 0)' ); + + toArray( hbackground.querySelectorAll( '.slide-background' ) ).forEach( function( vbackground, v ) { + transformElement( vbackground, 'translate3d(0, ' + ( v * slideHeight ) + 'px, 0)' ); + } ); + } ); + + } + + /** + * Moves the overview viewport to the current slides. + * Called each time the current slide changes. + */ + function updateOverview() { + + var margin = 70; + var slideWidth = config.width + margin, + slideHeight = config.height + margin; + + // Reverse in RTL mode + if( config.rtl ) { + slideWidth = -slideWidth; + } + + transformSlides( { + overview: [ + 'translateX('+ ( -indexh * slideWidth ) +'px)', + 'translateY('+ ( -indexv * slideHeight ) +'px)', + 'translateZ('+ ( window.innerWidth < 400 ? -1000 : -2500 ) +'px)' + ].join( ' ' ) + } ); + + } + + /** + * Exits the slide overview and enters the currently + * active slide. + */ + function deactivateOverview() { + + // Only proceed if enabled in config + if( config.overview ) { + + overview = false; + + dom.wrapper.classList.remove( 'overview' ); + dom.wrapper.classList.remove( 'overview-animated' ); + + // Temporarily add a class so that transitions can do different things + // depending on whether they are exiting/entering overview, or just + // moving from slide to slide + dom.wrapper.classList.add( 'overview-deactivating' ); + + setTimeout( function () { + dom.wrapper.classList.remove( 'overview-deactivating' ); + }, 1 ); + + // Move the background element back out + dom.wrapper.appendChild( dom.background ); + + // Clean up changes made to slides + toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ).forEach( function( slide ) { + transformElement( slide, '' ); + + slide.removeEventListener( 'click', onOverviewSlideClicked, true ); + } ); + + // Clean up changes made to backgrounds + toArray( dom.background.querySelectorAll( '.slide-background' ) ).forEach( function( background ) { + transformElement( background, '' ); + } ); + + transformSlides( { overview: '' } ); + + slide( indexh, indexv ); + + layout(); + + cueAutoSlide(); + + // Notify observers of the overview hiding + dispatchEvent( 'overviewhidden', { + 'indexh': indexh, + 'indexv': indexv, + 'currentSlide': currentSlide + } ); + + } + } + + /** + * Toggles the slide overview mode on and off. + * + * @param {Boolean} override Optional flag which overrides the + * toggle logic and forcibly sets the desired state. True means + * overview is open, false means it's closed. + */ + function toggleOverview( override ) { + + if( typeof override === 'boolean' ) { + override ? activateOverview() : deactivateOverview(); + } + else { + isOverview() ? deactivateOverview() : activateOverview(); + } + + } + + /** + * Checks if the overview is currently active. + * + * @return {Boolean} true if the overview is active, + * false otherwise + */ + function isOverview() { + + return overview; + + } + + /** + * Checks if the current or specified slide is vertical + * (nested within another slide). + * + * @param {HTMLElement} slide [optional] The slide to check + * orientation of + */ + function isVerticalSlide( slide ) { + + // Prefer slide argument, otherwise use current slide + slide = slide ? slide : currentSlide; + + return slide && slide.parentNode && !!slide.parentNode.nodeName.match( /section/i ); + + } + + /** + * Handling the fullscreen functionality via the fullscreen API + * + * @see http://fullscreen.spec.whatwg.org/ + * @see https://developer.mozilla.org/en-US/docs/DOM/Using_fullscreen_mode + */ + function enterFullscreen() { + + var element = document.body; + + // Check which implementation is available + var requestMethod = element.requestFullScreen || + element.webkitRequestFullscreen || + element.webkitRequestFullScreen || + element.mozRequestFullScreen || + element.msRequestFullscreen; + + if( requestMethod ) { + requestMethod.apply( element ); + } + + } + + /** + * Enters the paused mode which fades everything on screen to + * black. + */ + function pause() { + + if( config.pause ) { + var wasPaused = dom.wrapper.classList.contains( 'paused' ); + + cancelAutoSlide(); + dom.wrapper.classList.add( 'paused' ); + + if( wasPaused === false ) { + dispatchEvent( 'paused' ); + } + } + + } + + /** + * Exits from the paused mode. + */ + function resume() { + + var wasPaused = dom.wrapper.classList.contains( 'paused' ); + dom.wrapper.classList.remove( 'paused' ); + + cueAutoSlide(); + + if( wasPaused ) { + dispatchEvent( 'resumed' ); + } + + } + + /** + * Toggles the paused mode on and off. + */ + function togglePause( override ) { + + if( typeof override === 'boolean' ) { + override ? pause() : resume(); + } + else { + isPaused() ? resume() : pause(); + } + + } + + /** + * Checks if we are currently in the paused mode. + */ + function isPaused() { + + return dom.wrapper.classList.contains( 'paused' ); + + } + + /** + * Toggles the auto slide mode on and off. + * + * @param {Boolean} override Optional flag which sets the desired state. + * True means autoplay starts, false means it stops. + */ + + function toggleAutoSlide( override ) { + + if( typeof override === 'boolean' ) { + override ? resumeAutoSlide() : pauseAutoSlide(); + } + + else { + autoSlidePaused ? resumeAutoSlide() : pauseAutoSlide(); + } + + } + + /** + * Checks if the auto slide mode is currently on. + */ + function isAutoSliding() { + + return !!( autoSlide && !autoSlidePaused ); + + } + + /** + * Steps from the current point in the presentation to the + * slide which matches the specified horizontal and vertical + * indices. + * + * @param {int} h Horizontal index of the target slide + * @param {int} v Vertical index of the target slide + * @param {int} f Optional index of a fragment within the + * target slide to activate + * @param {int} o Optional origin for use in multimaster environments + */ + function slide( h, v, f, o ) { + + // Remember where we were at before + previousSlide = currentSlide; + + // Query all horizontal slides in the deck + var horizontalSlides = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ); + + // If no vertical index is specified and the upcoming slide is a + // stack, resume at its previous vertical index + if( v === undefined && !isOverview() ) { + v = getPreviousVerticalIndex( horizontalSlides[ h ] ); + } + + // If we were on a vertical stack, remember what vertical index + // it was on so we can resume at the same position when returning + if( previousSlide && previousSlide.parentNode && previousSlide.parentNode.classList.contains( 'stack' ) ) { + setPreviousVerticalIndex( previousSlide.parentNode, indexv ); + } + + // Remember the state before this slide + var stateBefore = state.concat(); + + // Reset the state array + state.length = 0; + + var indexhBefore = indexh || 0, + indexvBefore = indexv || 0; + + // Activate and transition to the new slide + indexh = updateSlides( HORIZONTAL_SLIDES_SELECTOR, h === undefined ? indexh : h ); + indexv = updateSlides( VERTICAL_SLIDES_SELECTOR, v === undefined ? indexv : v ); + + // Update the visibility of slides now that the indices have changed + updateSlidesVisibility(); + + layout(); + + // Apply the new state + stateLoop: for( var i = 0, len = state.length; i < len; i++ ) { + // Check if this state existed on the previous slide. If it + // did, we will avoid adding it repeatedly + for( var j = 0; j < stateBefore.length; j++ ) { + if( stateBefore[j] === state[i] ) { + stateBefore.splice( j, 1 ); + continue stateLoop; + } + } + + document.documentElement.classList.add( state[i] ); + + // Dispatch custom event matching the state's name + dispatchEvent( state[i] ); + } + + // Clean up the remains of the previous state + while( stateBefore.length ) { + document.documentElement.classList.remove( stateBefore.pop() ); + } + + // Update the overview if it's currently active + if( isOverview() ) { + updateOverview(); + } + + // Find the current horizontal slide and any possible vertical slides + // within it + var currentHorizontalSlide = horizontalSlides[ indexh ], + currentVerticalSlides = currentHorizontalSlide.querySelectorAll( 'section' ); + + // Store references to the previous and current slides + currentSlide = currentVerticalSlides[ indexv ] || currentHorizontalSlide; + + // Show fragment, if specified + if( typeof f !== 'undefined' ) { + navigateFragment( f ); + } + + // Dispatch an event if the slide changed + var slideChanged = ( indexh !== indexhBefore || indexv !== indexvBefore ); + if( slideChanged ) { + dispatchEvent( 'slidechanged', { + 'indexh': indexh, + 'indexv': indexv, + 'previousSlide': previousSlide, + 'currentSlide': currentSlide, + 'origin': o + } ); + } + else { + // Ensure that the previous slide is never the same as the current + previousSlide = null; + } + + // Solves an edge case where the previous slide maintains the + // 'present' class when navigating between adjacent vertical + // stacks + if( previousSlide ) { + previousSlide.classList.remove( 'present' ); + previousSlide.setAttribute( 'aria-hidden', 'true' ); + + // Reset all slides upon navigate to home + // Issue: #285 + if ( dom.wrapper.querySelector( HOME_SLIDE_SELECTOR ).classList.contains( 'present' ) ) { + // Launch async task + setTimeout( function () { + var slides = toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.stack') ), i; + for( i in slides ) { + if( slides[i] ) { + // Reset stack + setPreviousVerticalIndex( slides[i], 0 ); + } + } + }, 0 ); + } + } + + // Handle embedded content + if( slideChanged || !previousSlide ) { + stopEmbeddedContent( previousSlide ); + startEmbeddedContent( currentSlide ); + } + + // Announce the current slide contents, for screen readers + dom.statusDiv.textContent = currentSlide.textContent; + + updateControls(); + updateProgress(); + updateBackground(); + updateParallax(); + updateSlideNumber(); + updateNotes(); + + // Update the URL hash + writeURL(); + + cueAutoSlide(); + + } + + /** + * Syncs the presentation with the current DOM. Useful + * when new slides or control elements are added or when + * the configuration has changed. + */ + function sync() { + + // Subscribe to input + removeEventListeners(); + addEventListeners(); + + // Force a layout to make sure the current config is accounted for + layout(); + + // Reflect the current autoSlide value + autoSlide = config.autoSlide; + + // Start auto-sliding if it's enabled + cueAutoSlide(); + + // Re-create the slide backgrounds + createBackgrounds(); + + // Write the current hash to the URL + writeURL(); + + sortAllFragments(); + + updateControls(); + updateProgress(); + updateBackground( true ); + updateSlideNumber(); + updateSlidesVisibility(); + updateNotes(); + + formatEmbeddedContent(); + startEmbeddedContent( currentSlide ); + + if( isOverview() ) { + layoutOverview(); + } + + } + + /** + * Resets all vertical slides so that only the first + * is visible. + */ + function resetVerticalSlides() { + + var horizontalSlides = toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ); + horizontalSlides.forEach( function( horizontalSlide ) { + + var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ); + verticalSlides.forEach( function( verticalSlide, y ) { + + if( y > 0 ) { + verticalSlide.classList.remove( 'present' ); + verticalSlide.classList.remove( 'past' ); + verticalSlide.classList.add( 'future' ); + verticalSlide.setAttribute( 'aria-hidden', 'true' ); + } + + } ); + + } ); + + } + + /** + * Sorts and formats all of fragments in the + * presentation. + */ + function sortAllFragments() { + + var horizontalSlides = toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ); + horizontalSlides.forEach( function( horizontalSlide ) { + + var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ); + verticalSlides.forEach( function( verticalSlide, y ) { + + sortFragments( verticalSlide.querySelectorAll( '.fragment' ) ); + + } ); + + if( verticalSlides.length === 0 ) sortFragments( horizontalSlide.querySelectorAll( '.fragment' ) ); + + } ); + + } + + /** + * Updates one dimension of slides by showing the slide + * with the specified index. + * + * @param {String} selector A CSS selector that will fetch + * the group of slides we are working with + * @param {Number} index The index of the slide that should be + * shown + * + * @return {Number} The index of the slide that is now shown, + * might differ from the passed in index if it was out of + * bounds. + */ + function updateSlides( selector, index ) { + + // Select all slides and convert the NodeList result to + // an array + var slides = toArray( dom.wrapper.querySelectorAll( selector ) ), + slidesLength = slides.length; + + var printMode = isPrintingPDF(); + + if( slidesLength ) { + + // Should the index loop? + if( config.loop ) { + index %= slidesLength; + + if( index < 0 ) { + index = slidesLength + index; + } + } + + // Enforce max and minimum index bounds + index = Math.max( Math.min( index, slidesLength - 1 ), 0 ); + + for( var i = 0; i < slidesLength; i++ ) { + var element = slides[i]; + + var reverse = config.rtl && !isVerticalSlide( element ); + + element.classList.remove( 'past' ); + element.classList.remove( 'present' ); + element.classList.remove( 'future' ); + + // http://www.w3.org/html/wg/drafts/html/master/editing.html#the-hidden-attribute + element.setAttribute( 'hidden', '' ); + element.setAttribute( 'aria-hidden', 'true' ); + + // If this element contains vertical slides + if( element.querySelector( 'section' ) ) { + element.classList.add( 'stack' ); + } + + // If we're printing static slides, all slides are "present" + if( printMode ) { + element.classList.add( 'present' ); + continue; + } + + if( i < index ) { + // Any element previous to index is given the 'past' class + element.classList.add( reverse ? 'future' : 'past' ); + + if( config.fragments ) { + var pastFragments = toArray( element.querySelectorAll( '.fragment' ) ); + + // Show all fragments on prior slides + while( pastFragments.length ) { + var pastFragment = pastFragments.pop(); + pastFragment.classList.add( 'visible' ); + pastFragment.classList.remove( 'current-fragment' ); + } + } + } + else if( i > index ) { + // Any element subsequent to index is given the 'future' class + element.classList.add( reverse ? 'past' : 'future' ); + + if( config.fragments ) { + var futureFragments = toArray( element.querySelectorAll( '.fragment.visible' ) ); + + // No fragments in future slides should be visible ahead of time + while( futureFragments.length ) { + var futureFragment = futureFragments.pop(); + futureFragment.classList.remove( 'visible' ); + futureFragment.classList.remove( 'current-fragment' ); + } + } + } + } + + // Mark the current slide as present + slides[index].classList.add( 'present' ); + slides[index].removeAttribute( 'hidden' ); + slides[index].removeAttribute( 'aria-hidden' ); + + // If this slide has a state associated with it, add it + // onto the current state of the deck + var slideState = slides[index].getAttribute( 'data-state' ); + if( slideState ) { + state = state.concat( slideState.split( ' ' ) ); + } + + } + else { + // Since there are no slides we can't be anywhere beyond the + // zeroth index + index = 0; + } + + return index; + + } + + /** + * Optimization method; hide all slides that are far away + * from the present slide. + */ + function updateSlidesVisibility() { + + // Select all slides and convert the NodeList result to + // an array + var horizontalSlides = toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ), + horizontalSlidesLength = horizontalSlides.length, + distanceX, + distanceY; + + if( horizontalSlidesLength && typeof indexh !== 'undefined' ) { + + // The number of steps away from the present slide that will + // be visible + var viewDistance = isOverview() ? 10 : config.viewDistance; + + // Limit view distance on weaker devices + if( isMobileDevice ) { + viewDistance = isOverview() ? 6 : 2; + } + + // All slides need to be visible when exporting to PDF + if( isPrintingPDF() ) { + viewDistance = Number.MAX_VALUE; + } + + for( var x = 0; x < horizontalSlidesLength; x++ ) { + var horizontalSlide = horizontalSlides[x]; + + var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ), + verticalSlidesLength = verticalSlides.length; + + // Determine how far away this slide is from the present + distanceX = Math.abs( ( indexh || 0 ) - x ) || 0; + + // If the presentation is looped, distance should measure + // 1 between the first and last slides + if( config.loop ) { + distanceX = Math.abs( ( ( indexh || 0 ) - x ) % ( horizontalSlidesLength - viewDistance ) ) || 0; + } + + // Show the horizontal slide if it's within the view distance + if( distanceX < viewDistance ) { + showSlide( horizontalSlide ); + } + else { + hideSlide( horizontalSlide ); + } + + if( verticalSlidesLength ) { + + var oy = getPreviousVerticalIndex( horizontalSlide ); + + for( var y = 0; y < verticalSlidesLength; y++ ) { + var verticalSlide = verticalSlides[y]; + + distanceY = x === ( indexh || 0 ) ? Math.abs( ( indexv || 0 ) - y ) : Math.abs( y - oy ); + + if( distanceX + distanceY < viewDistance ) { + showSlide( verticalSlide ); + } + else { + hideSlide( verticalSlide ); + } + } + + } + } + + } + + } + + /** + * Pick up notes from the current slide and display tham + * to the viewer. + * + * @see `showNotes` config value + */ + function updateNotes() { + + if( config.showNotes && dom.speakerNotes && currentSlide && !isPrintingPDF() ) { + + dom.speakerNotes.innerHTML = getSlideNotes() || ''; + + } + + } + + /** + * Updates the progress bar to reflect the current slide. + */ + function updateProgress() { + + // Update progress if enabled + if( config.progress && dom.progressbar ) { + + dom.progressbar.style.width = getProgress() * dom.wrapper.offsetWidth + 'px'; + + } + + } + + /** + * Updates the slide number div to reflect the current slide. + * + * The following slide number formats are available: + * "h.v": horizontal . vertical slide number (default) + * "h/v": horizontal / vertical slide number + * "c": flattened slide number + * "c/t": flattened slide number / total slides + */ + function updateSlideNumber() { + + // Update slide number if enabled + if( config.slideNumber && dom.slideNumber ) { + + var value = []; + var format = 'h.v'; + + // Check if a custom number format is available + if( typeof config.slideNumber === 'string' ) { + format = config.slideNumber; + } + + switch( format ) { + case 'c': + value.push( getSlidePastCount() + 1 ); + break; + case 'c/t': + value.push( getSlidePastCount() + 1, '/', getTotalSlides() ); + break; + case 'h/v': + value.push( indexh + 1 ); + if( isVerticalSlide() ) value.push( '/', indexv + 1 ); + break; + default: + value.push( indexh + 1 ); + if( isVerticalSlide() ) value.push( '.', indexv + 1 ); + } + + dom.slideNumber.innerHTML = formatSlideNumber( value[0], value[1], value[2] ); + } + + } + + /** + * Applies HTML formatting to a slide number before it's + * written to the DOM. + */ + function formatSlideNumber( a, delimiter, b ) { + + if( typeof b === 'number' && !isNaN( b ) ) { + return ''+ a +'' + + ''+ delimiter +'' + + ''+ b +''; + } + else { + return ''+ a +''; + } + + } + + /** + * Updates the state of all control/navigation arrows. + */ + function updateControls() { + + var routes = availableRoutes(); + var fragments = availableFragments(); + + // Remove the 'enabled' class from all directions + dom.controlsLeft.concat( dom.controlsRight ) + .concat( dom.controlsUp ) + .concat( dom.controlsDown ) + .concat( dom.controlsPrev ) + .concat( dom.controlsNext ).forEach( function( node ) { + node.classList.remove( 'enabled' ); + node.classList.remove( 'fragmented' ); + } ); + + // Add the 'enabled' class to the available routes + if( routes.left ) dom.controlsLeft.forEach( function( el ) { el.classList.add( 'enabled' ); } ); + if( routes.right ) dom.controlsRight.forEach( function( el ) { el.classList.add( 'enabled' ); } ); + if( routes.up ) dom.controlsUp.forEach( function( el ) { el.classList.add( 'enabled' ); } ); + if( routes.down ) dom.controlsDown.forEach( function( el ) { el.classList.add( 'enabled' ); } ); + + // Prev/next buttons + if( routes.left || routes.up ) dom.controlsPrev.forEach( function( el ) { el.classList.add( 'enabled' ); } ); + if( routes.right || routes.down ) dom.controlsNext.forEach( function( el ) { el.classList.add( 'enabled' ); } ); + + // Highlight fragment directions + if( currentSlide ) { + + // Always apply fragment decorator to prev/next buttons + if( fragments.prev ) dom.controlsPrev.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); + if( fragments.next ) dom.controlsNext.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); + + // Apply fragment decorators to directional buttons based on + // what slide axis they are in + if( isVerticalSlide( currentSlide ) ) { + if( fragments.prev ) dom.controlsUp.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); + if( fragments.next ) dom.controlsDown.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); + } + else { + if( fragments.prev ) dom.controlsLeft.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); + if( fragments.next ) dom.controlsRight.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); + } + + } + + } + + /** + * Updates the background elements to reflect the current + * slide. + * + * @param {Boolean} includeAll If true, the backgrounds of + * all vertical slides (not just the present) will be updated. + */ + function updateBackground( includeAll ) { + + var currentBackground = null; + + // Reverse past/future classes when in RTL mode + var horizontalPast = config.rtl ? 'future' : 'past', + horizontalFuture = config.rtl ? 'past' : 'future'; + + // Update the classes of all backgrounds to match the + // states of their slides (past/present/future) + toArray( dom.background.childNodes ).forEach( function( backgroundh, h ) { + + backgroundh.classList.remove( 'past' ); + backgroundh.classList.remove( 'present' ); + backgroundh.classList.remove( 'future' ); + + if( h < indexh ) { + backgroundh.classList.add( horizontalPast ); + } + else if ( h > indexh ) { + backgroundh.classList.add( horizontalFuture ); + } + else { + backgroundh.classList.add( 'present' ); + + // Store a reference to the current background element + currentBackground = backgroundh; + } + + if( includeAll || h === indexh ) { + toArray( backgroundh.querySelectorAll( '.slide-background' ) ).forEach( function( backgroundv, v ) { + + backgroundv.classList.remove( 'past' ); + backgroundv.classList.remove( 'present' ); + backgroundv.classList.remove( 'future' ); + + if( v < indexv ) { + backgroundv.classList.add( 'past' ); + } + else if ( v > indexv ) { + backgroundv.classList.add( 'future' ); + } + else { + backgroundv.classList.add( 'present' ); + + // Only if this is the present horizontal and vertical slide + if( h === indexh ) currentBackground = backgroundv; + } + + } ); + } + + } ); + + // Stop any currently playing video background + if( previousBackground ) { + + var previousVideo = previousBackground.querySelector( 'video' ); + if( previousVideo ) previousVideo.pause(); + + } + + if( currentBackground ) { + + // Start video playback + var currentVideo = currentBackground.querySelector( 'video' ); + if( currentVideo ) { + if( currentVideo.currentTime > 0 ) currentVideo.currentTime = 0; + currentVideo.play(); + } + + var backgroundImageURL = currentBackground.style.backgroundImage || ''; + + // Restart GIFs (doesn't work in Firefox) + if( /\.gif/i.test( backgroundImageURL ) ) { + currentBackground.style.backgroundImage = ''; + window.getComputedStyle( currentBackground ).opacity; + currentBackground.style.backgroundImage = backgroundImageURL; + } + + // Don't transition between identical backgrounds. This + // prevents unwanted flicker. + var previousBackgroundHash = previousBackground ? previousBackground.getAttribute( 'data-background-hash' ) : null; + var currentBackgroundHash = currentBackground.getAttribute( 'data-background-hash' ); + if( currentBackgroundHash && currentBackgroundHash === previousBackgroundHash && currentBackground !== previousBackground ) { + dom.background.classList.add( 'no-transition' ); + } + + previousBackground = currentBackground; + + } + + // If there's a background brightness flag for this slide, + // bubble it to the .reveal container + if( currentSlide ) { + [ 'has-light-background', 'has-dark-background' ].forEach( function( classToBubble ) { + if( currentSlide.classList.contains( classToBubble ) ) { + dom.wrapper.classList.add( classToBubble ); + } + else { + dom.wrapper.classList.remove( classToBubble ); + } + } ); + } + + // Allow the first background to apply without transition + setTimeout( function() { + dom.background.classList.remove( 'no-transition' ); + }, 1 ); + + } + + /** + * Updates the position of the parallax background based + * on the current slide index. + */ + function updateParallax() { + + if( config.parallaxBackgroundImage ) { + + var horizontalSlides = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ), + verticalSlides = dom.wrapper.querySelectorAll( VERTICAL_SLIDES_SELECTOR ); + + var backgroundSize = dom.background.style.backgroundSize.split( ' ' ), + backgroundWidth, backgroundHeight; + + if( backgroundSize.length === 1 ) { + backgroundWidth = backgroundHeight = parseInt( backgroundSize[0], 10 ); + } + else { + backgroundWidth = parseInt( backgroundSize[0], 10 ); + backgroundHeight = parseInt( backgroundSize[1], 10 ); + } + + var slideWidth = dom.background.offsetWidth, + horizontalSlideCount = horizontalSlides.length, + horizontalOffsetMultiplier, + horizontalOffset; + + if( typeof config.parallaxBackgroundHorizontal === 'number' ) { + horizontalOffsetMultiplier = config.parallaxBackgroundHorizontal; + } + else { + horizontalOffsetMultiplier = horizontalSlideCount > 1 ? ( backgroundWidth - slideWidth ) / ( horizontalSlideCount-1 ) : 0; + } + + horizontalOffset = horizontalOffsetMultiplier * indexh * -1; + + var slideHeight = dom.background.offsetHeight, + verticalSlideCount = verticalSlides.length, + verticalOffsetMultiplier, + verticalOffset; + + if( typeof config.parallaxBackgroundVertical === 'number' ) { + verticalOffsetMultiplier = config.parallaxBackgroundVertical; + } + else { + verticalOffsetMultiplier = ( backgroundHeight - slideHeight ) / ( verticalSlideCount-1 ); + } + + verticalOffset = verticalSlideCount > 0 ? verticalOffsetMultiplier * indexv * 1 : 0; + + dom.background.style.backgroundPosition = horizontalOffset + 'px ' + -verticalOffset + 'px'; + + } + + } + + /** + * Called when the given slide is within the configured view + * distance. Shows the slide element and loads any content + * that is set to load lazily (data-src). + */ + function showSlide( slide ) { + + // Show the slide element + slide.style.display = 'block'; + + // Media elements with data-src attributes + toArray( slide.querySelectorAll( 'img[data-src], video[data-src], audio[data-src]' ) ).forEach( function( element ) { + element.setAttribute( 'src', element.getAttribute( 'data-src' ) ); + element.removeAttribute( 'data-src' ); + } ); + + // Media elements with children + toArray( slide.querySelectorAll( 'video, audio' ) ).forEach( function( media ) { + var sources = 0; + + toArray( media.querySelectorAll( 'source[data-src]' ) ).forEach( function( source ) { + source.setAttribute( 'src', source.getAttribute( 'data-src' ) ); + source.removeAttribute( 'data-src' ); + sources += 1; + } ); + + // If we rewrote sources for this video/audio element, we need + // to manually tell it to load from its new origin + if( sources > 0 ) { + media.load(); + } + } ); + + + // Show the corresponding background element + var indices = getIndices( slide ); + var background = getSlideBackground( indices.h, indices.v ); + if( background ) { + background.style.display = 'block'; + + // If the background contains media, load it + if( background.hasAttribute( 'data-loaded' ) === false ) { + background.setAttribute( 'data-loaded', 'true' ); + + var backgroundImage = slide.getAttribute( 'data-background-image' ), + backgroundVideo = slide.getAttribute( 'data-background-video' ), + backgroundVideoLoop = slide.hasAttribute( 'data-background-video-loop' ), + backgroundIframe = slide.getAttribute( 'data-background-iframe' ); + + // Images + if( backgroundImage ) { + background.style.backgroundImage = 'url('+ backgroundImage +')'; + } + // Videos + else if ( backgroundVideo && !isSpeakerNotes() ) { + var video = document.createElement( 'video' ); + + if( backgroundVideoLoop ) { + video.setAttribute( 'loop', '' ); + } + + // Support comma separated lists of video sources + backgroundVideo.split( ',' ).forEach( function( source ) { + video.innerHTML += ''; + } ); + + background.appendChild( video ); + } + // Iframes + else if( backgroundIframe ) { + var iframe = document.createElement( 'iframe' ); + iframe.setAttribute( 'src', backgroundIframe ); + iframe.style.width = '100%'; + iframe.style.height = '100%'; + iframe.style.maxHeight = '100%'; + iframe.style.maxWidth = '100%'; + + background.appendChild( iframe ); + } + } + } + + } + + /** + * Called when the given slide is moved outside of the + * configured view distance. + */ + function hideSlide( slide ) { + + // Hide the slide element + slide.style.display = 'none'; + + // Hide the corresponding background element + var indices = getIndices( slide ); + var background = getSlideBackground( indices.h, indices.v ); + if( background ) { + background.style.display = 'none'; + } + + } + + /** + * Determine what available routes there are for navigation. + * + * @return {Object} containing four booleans: left/right/up/down + */ + function availableRoutes() { + + var horizontalSlides = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ), + verticalSlides = dom.wrapper.querySelectorAll( VERTICAL_SLIDES_SELECTOR ); + + var routes = { + left: indexh > 0 || config.loop, + right: indexh < horizontalSlides.length - 1 || config.loop, + up: indexv > 0, + down: indexv < verticalSlides.length - 1 + }; + + // reverse horizontal controls for rtl + if( config.rtl ) { + var left = routes.left; + routes.left = routes.right; + routes.right = left; + } + + return routes; + + } + + /** + * Returns an object describing the available fragment + * directions. + * + * @return {Object} two boolean properties: prev/next + */ + function availableFragments() { + + if( currentSlide && config.fragments ) { + var fragments = currentSlide.querySelectorAll( '.fragment' ); + var hiddenFragments = currentSlide.querySelectorAll( '.fragment:not(.visible)' ); + + return { + prev: fragments.length - hiddenFragments.length > 0, + next: !!hiddenFragments.length + }; + } + else { + return { prev: false, next: false }; + } + + } + + /** + * Enforces origin-specific format rules for embedded media. + */ + function formatEmbeddedContent() { + + var _appendParamToIframeSource = function( sourceAttribute, sourceURL, param ) { + toArray( dom.slides.querySelectorAll( 'iframe['+ sourceAttribute +'*="'+ sourceURL +'"]' ) ).forEach( function( el ) { + var src = el.getAttribute( sourceAttribute ); + if( src && src.indexOf( param ) === -1 ) { + el.setAttribute( sourceAttribute, src + ( !/\?/.test( src ) ? '?' : '&' ) + param ); + } + }); + }; + + // YouTube frames must include "?enablejsapi=1" + _appendParamToIframeSource( 'src', 'youtube.com/embed/', 'enablejsapi=1' ); + _appendParamToIframeSource( 'data-src', 'youtube.com/embed/', 'enablejsapi=1' ); + + // Vimeo frames must include "?api=1" + _appendParamToIframeSource( 'src', 'player.vimeo.com/', 'api=1' ); + _appendParamToIframeSource( 'data-src', 'player.vimeo.com/', 'api=1' ); + + } + + /** + * Start playback of any embedded content inside of + * the targeted slide. + */ + function startEmbeddedContent( slide ) { + + if( slide && !isSpeakerNotes() ) { + // Restart GIFs + toArray( slide.querySelectorAll( 'img[src$=".gif"]' ) ).forEach( function( el ) { + // Setting the same unchanged source like this was confirmed + // to work in Chrome, FF & Safari + el.setAttribute( 'src', el.getAttribute( 'src' ) ); + } ); + + // HTML5 media elements + toArray( slide.querySelectorAll( 'video, audio' ) ).forEach( function( el ) { + if( el.hasAttribute( 'data-autoplay' ) && typeof el.play === 'function' ) { + el.play(); + } + } ); + + // Normal iframes + toArray( slide.querySelectorAll( 'iframe[src]' ) ).forEach( function( el ) { + startEmbeddedIframe( { target: el } ); + } ); + + // Lazy loading iframes + toArray( slide.querySelectorAll( 'iframe[data-src]' ) ).forEach( function( el ) { + if( el.getAttribute( 'src' ) !== el.getAttribute( 'data-src' ) ) { + el.removeEventListener( 'load', startEmbeddedIframe ); // remove first to avoid dupes + el.addEventListener( 'load', startEmbeddedIframe ); + el.setAttribute( 'src', el.getAttribute( 'data-src' ) ); + } + } ); + } + + } + + /** + * "Starts" the content of an embedded iframe using the + * postmessage API. + */ + function startEmbeddedIframe( event ) { + + var iframe = event.target; + + // YouTube postMessage API + if( /youtube\.com\/embed\//.test( iframe.getAttribute( 'src' ) ) && iframe.hasAttribute( 'data-autoplay' ) ) { + iframe.contentWindow.postMessage( '{"event":"command","func":"playVideo","args":""}', '*' ); + } + // Vimeo postMessage API + else if( /player\.vimeo\.com\//.test( iframe.getAttribute( 'src' ) ) && iframe.hasAttribute( 'data-autoplay' ) ) { + iframe.contentWindow.postMessage( '{"method":"play"}', '*' ); + } + // Generic postMessage API + else { + iframe.contentWindow.postMessage( 'slide:start', '*' ); + } + + } + + /** + * Stop playback of any embedded content inside of + * the targeted slide. + */ + function stopEmbeddedContent( slide ) { + + if( slide && slide.parentNode ) { + // HTML5 media elements + toArray( slide.querySelectorAll( 'video, audio' ) ).forEach( function( el ) { + if( !el.hasAttribute( 'data-ignore' ) && typeof el.pause === 'function' ) { + el.pause(); + } + } ); + + // Generic postMessage API for non-lazy loaded iframes + toArray( slide.querySelectorAll( 'iframe' ) ).forEach( function( el ) { + el.contentWindow.postMessage( 'slide:stop', '*' ); + el.removeEventListener( 'load', startEmbeddedIframe ); + }); + + // YouTube postMessage API + toArray( slide.querySelectorAll( 'iframe[src*="youtube.com/embed/"]' ) ).forEach( function( el ) { + if( !el.hasAttribute( 'data-ignore' ) && typeof el.contentWindow.postMessage === 'function' ) { + el.contentWindow.postMessage( '{"event":"command","func":"pauseVideo","args":""}', '*' ); + } + }); + + // Vimeo postMessage API + toArray( slide.querySelectorAll( 'iframe[src*="player.vimeo.com/"]' ) ).forEach( function( el ) { + if( !el.hasAttribute( 'data-ignore' ) && typeof el.contentWindow.postMessage === 'function' ) { + el.contentWindow.postMessage( '{"method":"pause"}', '*' ); + } + }); + + // Lazy loading iframes + toArray( slide.querySelectorAll( 'iframe[data-src]' ) ).forEach( function( el ) { + // Only removing the src doesn't actually unload the frame + // in all browsers (Firefox) so we set it to blank first + el.setAttribute( 'src', 'about:blank' ); + el.removeAttribute( 'src' ); + } ); + } + + } + + /** + * Returns the number of past slides. This can be used as a global + * flattened index for slides. + */ + function getSlidePastCount() { + + var horizontalSlides = toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ); + + // The number of past slides + var pastCount = 0; + + // Step through all slides and count the past ones + mainLoop: for( var i = 0; i < horizontalSlides.length; i++ ) { + + var horizontalSlide = horizontalSlides[i]; + var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ); + + for( var j = 0; j < verticalSlides.length; j++ ) { + + // Stop as soon as we arrive at the present + if( verticalSlides[j].classList.contains( 'present' ) ) { + break mainLoop; + } + + pastCount++; + + } + + // Stop as soon as we arrive at the present + if( horizontalSlide.classList.contains( 'present' ) ) { + break; + } + + // Don't count the wrapping section for vertical slides + if( horizontalSlide.classList.contains( 'stack' ) === false ) { + pastCount++; + } + + } + + return pastCount; + + } + + /** + * Returns a value ranging from 0-1 that represents + * how far into the presentation we have navigated. + */ + function getProgress() { + + // The number of past and total slides + var totalCount = getTotalSlides(); + var pastCount = getSlidePastCount(); + + if( currentSlide ) { + + var allFragments = currentSlide.querySelectorAll( '.fragment' ); + + // If there are fragments in the current slide those should be + // accounted for in the progress. + if( allFragments.length > 0 ) { + var visibleFragments = currentSlide.querySelectorAll( '.fragment.visible' ); + + // This value represents how big a portion of the slide progress + // that is made up by its fragments (0-1) + var fragmentWeight = 0.9; + + // Add fragment progress to the past slide count + pastCount += ( visibleFragments.length / allFragments.length ) * fragmentWeight; + } + + } + + return pastCount / ( totalCount - 1 ); + + } + + /** + * Checks if this presentation is running inside of the + * speaker notes window. + */ + function isSpeakerNotes() { + + return !!window.location.search.match( /receiver/gi ); + + } + + /** + * Reads the current URL (hash) and navigates accordingly. + */ + function readURL() { + + var hash = window.location.hash; + + // Attempt to parse the hash as either an index or name + var bits = hash.slice( 2 ).split( '/' ), + name = hash.replace( /#|\//gi, '' ); + + // If the first bit is invalid and there is a name we can + // assume that this is a named link + if( isNaN( parseInt( bits[0], 10 ) ) && name.length ) { + var element; + + // Ensure the named link is a valid HTML ID attribute + if( /^[a-zA-Z][\w:.-]*$/.test( name ) ) { + // Find the slide with the specified ID + element = document.getElementById( name ); + } + + if( element ) { + // Find the position of the named slide and navigate to it + var indices = Reveal.getIndices( element ); + slide( indices.h, indices.v ); + } + // If the slide doesn't exist, navigate to the current slide + else { + slide( indexh || 0, indexv || 0 ); + } + } + else { + // Read the index components of the hash + var h = parseInt( bits[0], 10 ) || 0, + v = parseInt( bits[1], 10 ) || 0; + + if( h !== indexh || v !== indexv ) { + slide( h, v ); + } + } + + } + + /** + * Updates the page URL (hash) to reflect the current + * state. + * + * @param {Number} delay The time in ms to wait before + * writing the hash + */ + function writeURL( delay ) { + + if( config.history ) { + + // Make sure there's never more than one timeout running + clearTimeout( writeURLTimeout ); + + // If a delay is specified, timeout this call + if( typeof delay === 'number' ) { + writeURLTimeout = setTimeout( writeURL, delay ); + } + else if( currentSlide ) { + var url = '/'; + + // Attempt to create a named link based on the slide's ID + var id = currentSlide.getAttribute( 'id' ); + if( id ) { + id = id.replace( /[^a-zA-Z0-9\-\_\:\.]/g, '' ); + } + + // If the current slide has an ID, use that as a named link + if( typeof id === 'string' && id.length ) { + url = '/' + id; + } + // Otherwise use the /h/v index + else { + if( indexh > 0 || indexv > 0 ) url += indexh; + if( indexv > 0 ) url += '/' + indexv; + } + + window.location.hash = url; + } + } + + } + + /** + * Retrieves the h/v location of the current, or specified, + * slide. + * + * @param {HTMLElement} slide If specified, the returned + * index will be for this slide rather than the currently + * active one + * + * @return {Object} { h: , v: , f: } + */ + function getIndices( slide ) { + + // By default, return the current indices + var h = indexh, + v = indexv, + f; + + // If a slide is specified, return the indices of that slide + if( slide ) { + var isVertical = isVerticalSlide( slide ); + var slideh = isVertical ? slide.parentNode : slide; + + // Select all horizontal slides + var horizontalSlides = toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ); + + // Now that we know which the horizontal slide is, get its index + h = Math.max( horizontalSlides.indexOf( slideh ), 0 ); + + // Assume we're not vertical + v = undefined; + + // If this is a vertical slide, grab the vertical index + if( isVertical ) { + v = Math.max( toArray( slide.parentNode.querySelectorAll( 'section' ) ).indexOf( slide ), 0 ); + } + } + + if( !slide && currentSlide ) { + var hasFragments = currentSlide.querySelectorAll( '.fragment' ).length > 0; + if( hasFragments ) { + var currentFragment = currentSlide.querySelector( '.current-fragment' ); + if( currentFragment && currentFragment.hasAttribute( 'data-fragment-index' ) ) { + f = parseInt( currentFragment.getAttribute( 'data-fragment-index' ), 10 ); + } + else { + f = currentSlide.querySelectorAll( '.fragment.visible' ).length - 1; + } + } + } + + return { h: h, v: v, f: f }; + + } + + /** + * Retrieves the total number of slides in this presentation. + */ + function getTotalSlides() { + + return dom.wrapper.querySelectorAll( SLIDES_SELECTOR + ':not(.stack)' ).length; + + } + + /** + * Returns the slide element matching the specified index. + */ + function getSlide( x, y ) { + + var horizontalSlide = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR )[ x ]; + var verticalSlides = horizontalSlide && horizontalSlide.querySelectorAll( 'section' ); + + if( verticalSlides && verticalSlides.length && typeof y === 'number' ) { + return verticalSlides ? verticalSlides[ y ] : undefined; + } + + return horizontalSlide; + + } + + /** + * Returns the background element for the given slide. + * All slides, even the ones with no background properties + * defined, have a background element so as long as the + * index is valid an element will be returned. + */ + function getSlideBackground( x, y ) { + + // When printing to PDF the slide backgrounds are nested + // inside of the slides + if( isPrintingPDF() ) { + var slide = getSlide( x, y ); + if( slide ) { + var background = slide.querySelector( '.slide-background' ); + if( background && background.parentNode === slide ) { + return background; + } + } + + return undefined; + } + + var horizontalBackground = dom.wrapper.querySelectorAll( '.backgrounds>.slide-background' )[ x ]; + var verticalBackgrounds = horizontalBackground && horizontalBackground.querySelectorAll( '.slide-background' ); + + if( verticalBackgrounds && verticalBackgrounds.length && typeof y === 'number' ) { + return verticalBackgrounds ? verticalBackgrounds[ y ] : undefined; + } + + return horizontalBackground; + + } + + /** + * Retrieves the speaker notes from a slide. Notes can be + * defined in two ways: + * 1. As a data-notes attribute on the slide
+ * 2. As an
+ + +
+ +

Scrum no es una metodologia es un Framework

+
@@ -106,7 +114,7 @@

Vision

-

Incepcion Agil

+

Inception

inception

@@ -151,7 +159,10 @@

Perspectiva

Requerimiento

-

Requerimiento Sistema

+
    +
  • Los Requisitos del sistema están escritos desde la perspectiva del sistema y no en la interacción del usuario, representan las características en estado puro.
  • +
+

Requerimiento Sistema

@@ -162,6 +173,19 @@

Requerimiento

Historia De Usuario

+
    +
  • sirven para describir lo que el usuario desea ser capaz de hacer.
  • +
  • se centran en el valor que viene a usar el sistema en lugar de una especificación detallada de lo que el sistema debe hacer.
  • +
  • Están concebidos como un medio para fomentar la colaboración.
  • +
+ + + + + +
+ +

Historia de Usuario

From e934ff73ed786d735b4247cdd7bc9a291fdf3ac5 Mon Sep 17 00:00:00 2001 From: "@slovacus" Date: Wed, 14 Jun 2017 14:56:55 -0500 Subject: [PATCH 30/43] !#5 Add: slides references --- etc/landslide.cfg | 1 + slides/references.md | 14 ++++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 slides/references.md diff --git a/etc/landslide.cfg b/etc/landslide.cfg index 05cc252..d3061d4 100644 --- a/etc/landslide.cfg +++ b/etc/landslide.cfg @@ -3,6 +3,7 @@ source = slides/title.md slides/about.md slides/letsremember.md slides/story-user.md + slides/references.md destination = index.html theme = theme/ # css = custom_css/pygments/monokai.css diff --git a/slides/references.md b/slides/references.md new file mode 100644 index 0000000..0722dfc --- /dev/null +++ b/slides/references.md @@ -0,0 +1,14 @@ +# References + +* [La guia de scrum](http://www.scrumguides.org/docs/scrumguide/v2016/2016-Scrum-Guide-Spanish.pdf) +* [Javier Garzas Blog](http://www.javiergarzas.com/metodologias-agiles) +* [scrum y xp desde las trincheras](http://www.proyectalis.com/wp-content/uploads/2008/02/scrum-y-xp-desde-las-trincheras.pdf) + +-------------- + +## Gracias + +**Caminar sobre el agua y desarrollar software en base a una especificación es fácil, +si ambos están congelados** + + From e8128e41f9ba365dc74516047634d975963c0f8d Mon Sep 17 00:00:00 2001 From: "@slovacus" Date: Wed, 14 Jun 2017 14:57:24 -0500 Subject: [PATCH 31/43] !#5 Add: generate index --- index.html | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/index.html b/index.html index 2c3e727..915b651 100644 --- a/index.html +++ b/index.html @@ -249,6 +249,33 @@

Criterios de aceptación

+ +
+ +

References

+ + +
+ + +
+ + +
+ +

Gracias

+ + +

Caminar sobre el agua y desarrollar software en base a una especificación es fácil, +si ambos están congelados

+ + +
+ From 41875b0245d7ab3dde5c57960cb878bbb698730e Mon Sep 17 00:00:00 2001 From: "@slovacus" Date: Wed, 14 Jun 2017 15:02:20 -0500 Subject: [PATCH 32/43] !#5 Add: settings bumplus --- .bumplus.toml | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 .bumplus.toml diff --git a/.bumplus.toml b/.bumplus.toml deleted file mode 100644 index ae4b577..0000000 --- a/.bumplus.toml +++ /dev/null @@ -1,25 +0,0 @@ -version = '0.0.2' - -[[files."CHANGELOG.rst"]] -search = """ -`Unreleased`_ -************* -""" - - -replace = """ -`Unreleased`_ -************* - -`{{new_version}}`_ - {{utcnow | strftime('%Y-%m-%d')}} -********************* -""" - -[[files."CHANGELOG.rst"]] -search = """ -.. _`Unreleased`: https://github.com/luismayta/slides-user-story/compare/{{old_version}}...HEAD -""" -replace = """ -.. _`Unreleased`: https://github.com/luismayta/slides-user-story/compare/{{new_version}}...HEAD -.. _{{new_version}}: https://github.com/luismayta/slides-user-story/compare/{{old_version}}...{{new_version}} -""" From e880abe192420397aa881c2c2726d7b38c09b9ef Mon Sep 17 00:00:00 2001 From: "@slovacus" Date: Sat, 2 Sep 2017 02:06:33 -0500 Subject: [PATCH 33/43] !#6 Fix: clean fles unnecesary --- etc/tmuxinator/slides-user-story.yml | 59 ----- index.html | 330 --------------------------- script/gvm.sh | 21 -- script/linguist.sh | 6 - script/lintcode.sh | 8 - script/watch.sh | 9 - 6 files changed, 433 deletions(-) delete mode 100644 etc/tmuxinator/slides-user-story.yml delete mode 100644 index.html delete mode 100755 script/gvm.sh delete mode 100755 script/linguist.sh delete mode 100755 script/lintcode.sh delete mode 100755 script/watch.sh diff --git a/etc/tmuxinator/slides-user-story.yml b/etc/tmuxinator/slides-user-story.yml deleted file mode 100644 index 5f677ff..0000000 --- a/etc/tmuxinator/slides-user-story.yml +++ /dev/null @@ -1,59 +0,0 @@ -# ~/.tmuxinator/slides-user-story.yml -name: slides-user-story -root: <%= ENV["PROJECTS"] %>/slides/slides-user-story -tmux_options: -2 -# Optional tmux socket -# socket_name: foo - -# Runs before everything. Use it to start daemons etc. -# pre: sudo /etc/rc.d/mysqld start -pre: - - make environment - -# Runs in each window and pane before window/pane specific commands. Useful for setting up interpreter versions. -# pre_window: rbenv shell 2.0.0-p247 - -# Pass command line options to tmux. Useful for specifying a different tmux.conf. -# tmux_options: -f ~/.tmux.mac.conf - -# Change the command to call tmux. This can be used by derivatives/wrappers like byobu. -# tmux_command: byobu - -# Specifies (by name or index) which window will be selected on project startup. If not set, the first window is used. -# startup_window: logs - -# Controls whether the tmux session should be attached to automatically. Defaults to true. -# attach: false - -# Runs after everything. Use it to attach to tmux with custom options etc. -# post: tmux -CC attach -t go-stringutil - -windows: - - editor: - layout: even-horizontal - panes: - - editor: - - pyenv activate slides-user-story - - pwd: - - pyenv activate slides-user-story - - pwd: - - pyenv activate slides-user-story - - python: - layout: main-vertical - panes: - - python: - - pyenv activate slides-user-story - - databases: - layout: main-vertical - panes: - - ls: - - pyenv activate slides-user-story - - ls: - - pyenv activate slides-user-story - - docker: - layout: main-vertical - panes: - - ls: - - pyenv activate slides-user-story - - ls: - - pyenv activate slides-user-story diff --git a/index.html b/index.html deleted file mode 100644 index 915b651..0000000 --- a/index.html +++ /dev/null @@ -1,330 +0,0 @@ - - - - - Historias de Usuario - - - - - - - - - - - - - - - - - - - - - - -
- -
- - -
- -

Historias de Usuario

- - -

Historias de usuario

- - -
- - -
- -

Luis Mayta

- - - - - -
- - -
- -

Recordemos

- - - -
- - -
- - -

scrum in five minutes

- - -
- - -
- -

Scrum no es una metodologia es un Framework

- - - -
- - -
- -

Vision

- - -

Vision

- - -
- - -
- - -

Sin un plan solo es un deseo

- - -
- - -
- -

Inception

- - -

inception

- - -
- - -
- -

Historias de Usuario

- - -

Historias de usuario

- - -
- - -
- -

Diagrama

- - -

Diagram of story user

- - -
- - -
- -

Perspectiva

- - - -
- - -
- -

Requerimiento

- - -
    -
  • Los Requisitos del sistema están escritos desde la perspectiva del sistema y no en la interacción del usuario, representan las características en estado puro.
  • -
-

Requerimiento Sistema

- - -
- - -
- -

Historia De Usuario

- - -
    -
  • sirven para describir lo que el usuario desea ser capaz de hacer.
  • -
  • se centran en el valor que viene a usar el sistema en lugar de una especificación detallada de lo que el sistema debe hacer.
  • -
  • Están concebidos como un medio para fomentar la colaboración.
  • -
- - -
- - -
- - -

Historia de Usuario

- - -
- - -
- -

Perspectiva

- - -

Historia de Usuario

- - -
- - -
- -

Estructura

- - -

Estructura

- - -
- - -
- - -

Invent

- - -
- - -
- -

Criterios de aceptación

- - -

acceptance-requirements

- - -
- - -
- -

Criterios de aceptación

- - -
    -
  • (Scenario) Escenario [Número de escenario] [Titulo del escenario]:
  • -
  • (Given) En caso que [Contexto] y adicionalmente [Contexto],
  • -
  • (When) cuando [Evento],
  • -
  • (Then) entonces el sistema [Resultado / Comportamiento esperado]
  • -
- - -
- - -
- -

References

- - - - - -
- - -
- -

Gracias

- - -

Caminar sobre el agua y desarrollar software en base a una especificación es fácil, -si ambos están congelados

- - -
- -
-
- - - - - - - - - - \ No newline at end of file diff --git a/script/gvm.sh b/script/gvm.sh deleted file mode 100755 index 0f07c8b..0000000 --- a/script/gvm.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash -# -*- coding: utf-8 -*- - -# shellcheck source=/dev/null -[ -r "script/bootstrap.sh" ] && source "script/bootstrap.sh" - -# shellcheck source=/dev/null -[ -r "$HOME/.gvm/scripts/gvm" ] && source "$HOME/.gvm/scripts/gvm" - -gvm pkgset list | grep -q "${GVM_NAME}" -response=$? - -if [[ ! "${response}" -eq '0' ]]; then - gvm pkgset create "${GVM_NAME}" -fi - -gvm pkgset use "${GVM_NAME}" - -mkdir -p "${GOPATH}/src" -mkdir -p "${GOPATH}/pkg" -mkdir -p "${GOPATH}/bin" diff --git a/script/linguist.sh b/script/linguist.sh deleted file mode 100755 index ad2aca0..0000000 --- a/script/linguist.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash -# -*- coding: utf-8 -*- - -[ -r "script/bootstrap.sh" ] && source "script/bootstrap.sh" - -bundle exec linguist --breakdown diff --git a/script/lintcode.sh b/script/lintcode.sh deleted file mode 100755 index 367a86a..0000000 --- a/script/lintcode.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -# -*- coding: utf-8 -*- - -# shellcheck source=/dev/null -[ -r "script/bootstrap.sh" ] && source "script/bootstrap.sh" - -pre-commit install -f --install-hooks -pre-commit run --all-files diff --git a/script/watch.sh b/script/watch.sh deleted file mode 100755 index 51c2e48..0000000 --- a/script/watch.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash -# -*- coding: utf-8 -*- - -#shellcheck source=/dev/null -[ -r "script/bootstrap.sh" ] && source "script/bootstrap.sh" - -cd "${SOURCE_DIR}" || echo 'path not found' - -landslide "${ETC_DIR}/"landslide.cfg -w ./slides \ No newline at end of file From 78a745f9bf8821db08df530a617575e950c1a396 Mon Sep 17 00:00:00 2001 From: "@slovacus" Date: Sat, 2 Sep 2017 02:07:14 -0500 Subject: [PATCH 34/43] !#6 Fix: clean theme unnecesary --- theme/.editorconfig | 20 - theme/.gitattributes | 134 - theme/.gitignore | 84 - theme/.mailmap | 4 - theme/.pre-commit-config.yaml | 61 - theme/.projectile | 8 - theme/AUTHORS | 1 - theme/CHANGELOG.md | 10 - theme/CONTRIBUTING.md | 29 - theme/LICENSE | 21 - theme/README.md | 43 - theme/base.html | 102 - theme/css/.gitkeep | 0 theme/css/print/paper.css | 202 - theme/css/print/pdf.css | 160 - theme/css/reveal.css | 1338 ----- theme/css/reveal.scss | 1379 ----- theme/css/theme/README.md | 21 - theme/css/theme/beige.css | 290 - theme/css/theme/black.css | 286 - theme/css/theme/blood.css | 309 -- theme/css/theme/league.css | 292 - theme/css/theme/moon.css | 290 - theme/css/theme/night.css | 284 - theme/css/theme/serif.css | 286 - theme/css/theme/simple.css | 286 - theme/css/theme/sky.css | 293 -- theme/css/theme/solarized.css | 289 - theme/css/theme/source/beige.scss | 39 - theme/css/theme/source/black.scss | 49 - theme/css/theme/source/blood.scss | 79 - theme/css/theme/source/league.scss | 34 - theme/css/theme/source/moon.scss | 57 - theme/css/theme/source/night.scss | 35 - theme/css/theme/source/serif.scss | 35 - theme/css/theme/source/simple.scss | 38 - theme/css/theme/source/sky.scss | 46 - theme/css/theme/source/solarized.scss | 63 - theme/css/theme/source/white.scss | 49 - theme/css/theme/template/mixins.scss | 29 - theme/css/theme/template/settings.scss | 43 - theme/css/theme/template/theme.scss | 345 -- theme/css/theme/white.css | 286 - theme/js/reveal.js | 4677 ----------------- theme/lib/css/zenburn.css | 115 - theme/lib/font/league-gothic/LICENSE | 2 - .../lib/font/league-gothic/league-gothic.css | 10 - .../lib/font/league-gothic/league-gothic.eot | Bin 25696 -> 0 bytes .../lib/font/league-gothic/league-gothic.ttf | Bin 64227 -> 0 bytes .../lib/font/league-gothic/league-gothic.woff | Bin 30765 -> 0 bytes theme/lib/font/source-sans-pro/LICENSE | 45 - .../source-sans-pro-italic.eot | Bin 75719 -> 0 bytes .../source-sans-pro-italic.ttf | Bin 238020 -> 0 bytes .../source-sans-pro-italic.woff | Bin 98545 -> 0 bytes .../source-sans-pro-regular.eot | Bin 88063 -> 0 bytes .../source-sans-pro-regular.ttf | Bin 287865 -> 0 bytes .../source-sans-pro-regular.woff | Bin 114319 -> 0 bytes .../source-sans-pro-semibold.eot | Bin 89892 -> 0 bytes .../source-sans-pro-semibold.ttf | Bin 284481 -> 0 bytes .../source-sans-pro-semibold.woff | Bin 115639 -> 0 bytes .../source-sans-pro-semibolditalic.eot | Bin 75699 -> 0 bytes .../source-sans-pro-semibolditalic.ttf | Bin 240880 -> 0 bytes .../source-sans-pro-semibolditalic.woff | Bin 98813 -> 0 bytes .../font/source-sans-pro/source-sans-pro.css | 39 - theme/lib/js/classList.js | 2 - theme/lib/js/head.min.js | 8 - theme/lib/js/html5shiv.js | 7 - theme/plugin/highlight/highlight.js | 32 - theme/plugin/markdown/example.html | 129 - theme/plugin/markdown/example.md | 31 - theme/plugin/markdown/markdown.js | 402 -- theme/plugin/markdown/marked.js | 6 - theme/plugin/math/math.js | 67 - theme/plugin/multiplex/client.js | 13 - theme/plugin/multiplex/index.js | 56 - theme/plugin/multiplex/master.js | 31 - theme/plugin/notes-server/client.js | 65 - theme/plugin/notes-server/index.js | 68 - theme/plugin/notes-server/notes.html | 407 -- theme/plugin/notes/notes.html | 407 -- theme/plugin/notes/notes.js | 127 - theme/plugin/print-pdf/print-pdf.js | 47 - theme/plugin/search/search.js | 196 - theme/plugin/zoom-js/zoom.js | 275 - 84 files changed, 15013 deletions(-) delete mode 100644 theme/.editorconfig delete mode 100644 theme/.gitattributes delete mode 100644 theme/.gitignore delete mode 100644 theme/.mailmap delete mode 100644 theme/.pre-commit-config.yaml delete mode 100644 theme/.projectile delete mode 100644 theme/AUTHORS delete mode 100644 theme/CHANGELOG.md delete mode 100644 theme/CONTRIBUTING.md delete mode 100644 theme/LICENSE delete mode 100644 theme/README.md delete mode 100644 theme/base.html delete mode 100644 theme/css/.gitkeep delete mode 100644 theme/css/print/paper.css delete mode 100644 theme/css/print/pdf.css delete mode 100644 theme/css/reveal.css delete mode 100644 theme/css/reveal.scss delete mode 100644 theme/css/theme/README.md delete mode 100644 theme/css/theme/beige.css delete mode 100644 theme/css/theme/black.css delete mode 100644 theme/css/theme/blood.css delete mode 100644 theme/css/theme/league.css delete mode 100644 theme/css/theme/moon.css delete mode 100644 theme/css/theme/night.css delete mode 100644 theme/css/theme/serif.css delete mode 100644 theme/css/theme/simple.css delete mode 100644 theme/css/theme/sky.css delete mode 100644 theme/css/theme/solarized.css delete mode 100644 theme/css/theme/source/beige.scss delete mode 100644 theme/css/theme/source/black.scss delete mode 100644 theme/css/theme/source/blood.scss delete mode 100644 theme/css/theme/source/league.scss delete mode 100644 theme/css/theme/source/moon.scss delete mode 100644 theme/css/theme/source/night.scss delete mode 100644 theme/css/theme/source/serif.scss delete mode 100644 theme/css/theme/source/simple.scss delete mode 100644 theme/css/theme/source/sky.scss delete mode 100644 theme/css/theme/source/solarized.scss delete mode 100644 theme/css/theme/source/white.scss delete mode 100644 theme/css/theme/template/mixins.scss delete mode 100644 theme/css/theme/template/settings.scss delete mode 100644 theme/css/theme/template/theme.scss delete mode 100644 theme/css/theme/white.css delete mode 100644 theme/js/reveal.js delete mode 100644 theme/lib/css/zenburn.css delete mode 100644 theme/lib/font/league-gothic/LICENSE delete mode 100644 theme/lib/font/league-gothic/league-gothic.css delete mode 100755 theme/lib/font/league-gothic/league-gothic.eot delete mode 100755 theme/lib/font/league-gothic/league-gothic.ttf delete mode 100755 theme/lib/font/league-gothic/league-gothic.woff delete mode 100644 theme/lib/font/source-sans-pro/LICENSE delete mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-italic.eot delete mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-italic.ttf delete mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-italic.woff delete mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-regular.eot delete mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-regular.ttf delete mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-regular.woff delete mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-semibold.eot delete mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-semibold.ttf delete mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-semibold.woff delete mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot delete mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf delete mode 100755 theme/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff delete mode 100644 theme/lib/font/source-sans-pro/source-sans-pro.css delete mode 100644 theme/lib/js/classList.js delete mode 100644 theme/lib/js/head.min.js delete mode 100644 theme/lib/js/html5shiv.js delete mode 100644 theme/plugin/highlight/highlight.js delete mode 100644 theme/plugin/markdown/example.html delete mode 100644 theme/plugin/markdown/example.md delete mode 100755 theme/plugin/markdown/markdown.js delete mode 100644 theme/plugin/markdown/marked.js delete mode 100755 theme/plugin/math/math.js delete mode 100644 theme/plugin/multiplex/client.js delete mode 100644 theme/plugin/multiplex/index.js delete mode 100644 theme/plugin/multiplex/master.js delete mode 100644 theme/plugin/notes-server/client.js delete mode 100644 theme/plugin/notes-server/index.js delete mode 100644 theme/plugin/notes-server/notes.html delete mode 100644 theme/plugin/notes/notes.html delete mode 100644 theme/plugin/notes/notes.js delete mode 100644 theme/plugin/print-pdf/print-pdf.js delete mode 100644 theme/plugin/search/search.js delete mode 100644 theme/plugin/zoom-js/zoom.js diff --git a/theme/.editorconfig b/theme/.editorconfig deleted file mode 100644 index f7650da..0000000 --- a/theme/.editorconfig +++ /dev/null @@ -1,20 +0,0 @@ -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -trim_trailing_whitespace = true -charset = utf-8 -insert_final_newline = false - -[*.{py,sh,feature}] -indent_size = 4 - -# Tabs -[*.{less,css,Makefile,Vagrantfile}] -indent_style = tab - -[Makefile] -indent_size = 4 -indent_style = tab \ No newline at end of file diff --git a/theme/.gitattributes b/theme/.gitattributes deleted file mode 100644 index 383303e..0000000 --- a/theme/.gitattributes +++ /dev/null @@ -1,134 +0,0 @@ -# Path-based git attributes -# https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html - -## Test/documentation - -# Ignore all test and documentation with "export-ignore". -/.gitattributes export-ignore -/.githooks export-ignore -/.gitignore export-ignore -/.travis.yml export-ignore -/.travis.yaml export-ignore -/phpunit.xml.dist export-ignore -/.scrutinizer.yml export-ignore -/.scrutinizer.yaml export-ignore -/tests export-ignore - -## Merging -CHANGELOG.md merge=union - -## Line endings - -### Automatic - -# Handle line endings automatically for files detected as text -# and leave all files detected as binary untouched. -* text=auto eol=lf - -### Text (should be normalized, convert crlf => lf) - -# Source -*.php text eol=lf -*.css text eol=lf -*.sass text eol=lf -*.scss text eol=lf -*.less text eol=lf -*.styl text eol=lf -*.js text eol=lf -*.coffee text eol=lf -*.json text eol=lf -*.htm text eol=lf -*.html text eol=lf -*.xml text eol=lf -*.svg text eol=lf -*.txt text eol=lf -*.ini text eol=lf -*.inc text eol=lf -*.pl text eol=lf -*.rb text eol=lf -*.py text eol=lf -*.scm text eol=lf -*.sql text eol=lf -*.sh text eol=lf -*.bat text eol=lf - -# Templates -*.ejs text eol=lf -*.hbt text eol=lf -*.jade text eol=lf -*.haml text eol=lf -*.hbs text eol=lf -*.dot text eol=lf -*.tmpl text eol=lf -*.phtml text eol=lf - -# App config -.env text eol=lf -.env.example text eol=lf - -# Server config -.htaccess text eol=lf - -# Git config -.gitattributes text eol=lf -.gitignore text eol=lf - -# Code analysis config -.jshintrc text eol=lf -.jscsrc text eol=lf -.jshintignore text eol=lf -.csslintrc text eol=lf - -# Misc config -*.yaml text eol=lf -*.yml text eol=lf -*.yaml text eol=lf -.editorconfig text eol=lf - -# Build config -composer.lock text eol=lf -*.npmignore text eol=lf -*.bowerrc text eol=lf - -# Heroku -Procfile text eol=lf -.slugignore text eol=lf - -# Documentation -*.md text eol=lf -LICENSE text eol=lf -AUTHORS text eol=lf - -# Vagrant -Vagrantfile eol=lf - -# Scripts -bin/* text eol=lf - -### Binary (left untouched) - -# (binary is a macro for -text -diff) -*.png binary -*.jpg binary -*.jpeg binary -*.gif binary -*.ico binary -*.mov binary -*.mp4 binary -*.mp3 binary -*.mwb binary -*.flv binary -*.fla binary -*.swf binary -*.gz binary -*.zip binary -*.7z binary -*.rar binary -*.ttf binary -*.eot binary -*.woff binary -*.woff2 binary -*.otf binary -*.pyc binary -*.pdf binary -*.bz2 binary diff --git a/theme/.gitignore b/theme/.gitignore deleted file mode 100644 index f69e986..0000000 --- a/theme/.gitignore +++ /dev/null @@ -1,84 +0,0 @@ -# Static and media development files. -media/ -src/assets/ -static/ -staticfiles/ - -# gulp-compass metafile -css - -# Node metadata -node_modules - -# SASS metadata -*.sass-cache - -# Bower directory -bower_components - -# Local databases -*.sqlite3 - -*.bak -.#* -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -env/ -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -*.egg-info/ -.installed.cfg -*.egg - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*,cover - -# Translations -*.mo -*.pot - -# Django stuff: -*.log - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# ignored files Vagrant -.vagrant diff --git a/theme/.mailmap b/theme/.mailmap deleted file mode 100644 index f6a2e2b..0000000 --- a/theme/.mailmap +++ /dev/null @@ -1,4 +0,0 @@ -@slovacus luis mayta luis alberto mayta -@slovacus Luis Alberto Mayta Mamani -@slovacus luis alberto mayta -@slovacus Lmayta Luis Alberto Mayta M diff --git a/theme/.pre-commit-config.yaml b/theme/.pre-commit-config.yaml deleted file mode 100644 index 6286d06..0000000 --- a/theme/.pre-commit-config.yaml +++ /dev/null @@ -1,61 +0,0 @@ -- repo: git@github.com:pre-commit/pre-commit-hooks - sha: master - hooks: - - id: detect-private-key - files: ^(?!\.?git-crypt) - - id: check-merge-conflict - - id: trailing-whitespace - files: ^tf|-|\.(py|tfvars|tf|tfenv|env|yml|yaml|pem|key|mock)$ - - id: end-of-file-fixer - files: ^tf|-|\.(py|tfvars|tf|tfenv|env|yml|yaml|pem|key|mock)$ - - id: check-added-large-files - - id: check-case-conflict - - id: check-json - - id: check-xml - - id: check-yaml - - id: check-case-conflict - - id: check-ast - - id: debug-statements - - id: autopep8-wrapper - args: - - -i - - --ignore=E501 - - id: double-quote-string-fixer - - id: check-docstring-first - - id: pretty-format-json - - id: debug-statements - - id: requirements-txt-fixer - - id: name-tests-test -- repo: git://github.com/dgnest/mirrors-pylint - sha: eb20a4b9bbfe24ec8641f63214e2a7de25399796 - hooks: - - id: pylint - args: - - --rcfile=pylint.rc -- repo: git://github.com/pre-commit/mirrors-scss-lint - sha: master - hooks: - - id: scss-lint - files: \.(scss)$ -# - repo: git://github.com/FalconSocial/pre-commit-mirrors-pep257 -# sha: v0.3.2 -# hooks: -# - id: pep257 -# args: -# - --ignore=migrations -- repo: git@github.com:pre-commit/pre-commit - sha: 3d90b094fccf0ba5d811a0fdc876e987c2437b1c - hooks: - - id: validate_config - - id: validate_manifest -- repo: git://github.com/FalconSocial/pre-commit-python-sorter - sha: 934072fb29303aaa64bead610be042049e9db488 - hooks: - - id: python-import-sorter - args: - - --silent-overwrite -# - repo: git://github.com/pre-commit/mirrors-eslint -# sha: 'master' # Use the sha you want to point at -# hooks: -# - id: eslint -# language_version: 4.2.1 diff --git a/theme/.projectile b/theme/.projectile deleted file mode 100644 index 66cb228..0000000 --- a/theme/.projectile +++ /dev/null @@ -1,8 +0,0 @@ --/log --/tmp --/.git --/.vagrant --/auto-save-list --*.cache --*.pyc --projectile-bookmarks.eld diff --git a/theme/AUTHORS b/theme/AUTHORS deleted file mode 100644 index e5496ab..0000000 --- a/theme/AUTHORS +++ /dev/null @@ -1 +0,0 @@ -@slovacus diff --git a/theme/CHANGELOG.md b/theme/CHANGELOG.md deleted file mode 100644 index c0e93c6..0000000 --- a/theme/CHANGELOG.md +++ /dev/null @@ -1,10 +0,0 @@ -# Change Log -All notable changes to this project will be documented in this file. -This file uses change log convention from [Keep a CHANGELOG](http://keepachangelog.com). - - - -[CHANGELOG.md]: CHANGELOG.md -[CONTRIBUTING.md]: CONTRIBUTING.md -[LICENCE]: LICENCE.md -[README.md]: README.md diff --git a/theme/CONTRIBUTING.md b/theme/CONTRIBUTING.md deleted file mode 100644 index d263e6a..0000000 --- a/theme/CONTRIBUTING.md +++ /dev/null @@ -1,29 +0,0 @@ -# How to contribute - -Prerequisites: - -- Familiarity with [pull requests](https://help.github.com/articles/using-pull-requests) and [issues](https://guides.github.com/features/issues/). -- Knowledge of [Markdown](https://help.github.com/articles/markdown-basics/) for editing `.md` documents. - -In particular, this community seeks the following types of contributions: - -- **Ideas**: participate in an issue thread or start your own to have your voice -heard. -- **Resources**: submit a pull request to add to RESOURCES.md with links to related content. -- **Outline sections**: help us ensure that this repository is comprehensive. if -there is a topic that is overlooked, please add it, even if it is just a stub -in the form of a header and single sentence. Initially, most things fall into -this category. -- **Writing**: contribute your expertise in an area by helping us expand the included -content. -- **Copy editing**: fix typos, clarify language, and generally improve the quality -of the content. -- **Formatting**: help keep content easy to read with consistent formatting. - -# Conduct - -# Communication - -# Frequently Asked Questions - -*please add* diff --git a/theme/LICENSE b/theme/LICENSE deleted file mode 100644 index 9882e45..0000000 --- a/theme/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 luismayta - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/theme/README.md b/theme/README.md deleted file mode 100644 index 3c648e1..0000000 --- a/theme/README.md +++ /dev/null @@ -1,43 +0,0 @@ - - -# Theme Landslide - - -[![Build Status](https://travis-ci.org/luismayta/landslide-theme.svg)](https://travis-ci.org/luismayta/landslide-theme) -[![Stories in Ready](https://badge.waffle.io/luismayta/landslide-theme.svg?label=ready&title=Ready)](http://waffle.io/luismayta/landslide-theme) -[![GitHub issues](https://img.shields.io/github/issues/luismayta/landslide-theme.svg)](https://github.com/luismayta/landslide-theme/issues) -[![GitHub license](https://img.shields.io/github/license/mashape/apistatus.svg?style=flat-square)](LICENSE) - - -## Changelog - -Please see [CHANGELOG](CHANGELOG.md) for more information what has changed recently. - -## Contributing - -Please see [CONTRIBUTING](CONTRIBUTING.md) for details. - -### Documentation - -Es necesario instalar [Grip](link-python-grip) -para poder visualizar la documentación, ejecutando lo siguiente: - - -```bash -grip 5000 -``` - -## Credits - -- [Luis Mayta][link-author] -- [All Contributors][link-contributors] - - -[![](http://api.coderwall.com/luismayta/endorsecount.png)](http://coderwall.com/luismayta) -[![](http://www.linkedin.com/img/webpromo/btn_liprofile_blue_80x15.png)](http://pe.linkedin.com/in/luismayta) -[![Analytics](https://ga-beacon.appspot.com/UA-65019326-1/landslide-theme/readme)](https://github.com/luismayta/landslide-theme) - - -[link-python-grip]: https://github.com/joeyespo/grip -[link-author]: https://github.com/luismayta -[link-contributors]: contributors diff --git a/theme/base.html b/theme/base.html deleted file mode 100644 index ce461f2..0000000 --- a/theme/base.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - {{ head_title }} - - - - - - - - - - - - - - - - - - - - - - -
- -
- {% for slide in slides %} - -
- {% if slide.header %} - {{ slide.header }} - {% endif %} - {% if slide.content %} - {{ slide.content }} - {% endif %} - {% if slide.presenter_notes %} - - {% endif %} -
- {% endfor %} -
-
- - - - - - - - - - diff --git a/theme/css/.gitkeep b/theme/css/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/theme/css/print/paper.css b/theme/css/print/paper.css deleted file mode 100644 index 6588f48..0000000 --- a/theme/css/print/paper.css +++ /dev/null @@ -1,202 +0,0 @@ -/* Default Print Stylesheet Template - by Rob Glazebrook of CSSnewbie.com - Last Updated: June 4, 2008 - - Feel free (nay, compelled) to edit, append, and - manipulate this file as you see fit. */ - - -@media print { - - /* SECTION 1: Set default width, margin, float, and - background. This prevents elements from extending - beyond the edge of the printed page, and prevents - unnecessary background images from printing */ - html { - background: #fff; - width: auto; - height: auto; - overflow: visible; - } - body { - background: #fff; - font-size: 20pt; - width: auto; - height: auto; - border: 0; - margin: 0 5%; - padding: 0; - overflow: visible; - float: none !important; - } - - /* SECTION 2: Remove any elements not needed in print. - This would include navigation, ads, sidebars, etc. */ - .nestedarrow, - .controls, - .fork-reveal, - .share-reveal, - .state-background, - .reveal .progress, - .reveal .backgrounds { - display: none !important; - } - - /* SECTION 3: Set body font face, size, and color. - Consider using a serif font for readability. */ - body, p, td, li, div { - font-size: 20pt!important; - font-family: Georgia, "Times New Roman", Times, serif !important; - color: #000; - } - - /* SECTION 4: Set heading font face, sizes, and color. - Differentiate your headings from your body text. - Perhaps use a large sans-serif for distinction. */ - h1,h2,h3,h4,h5,h6 { - color: #000!important; - height: auto; - line-height: normal; - font-family: Georgia, "Times New Roman", Times, serif !important; - text-shadow: 0 0 0 #000 !important; - text-align: left; - letter-spacing: normal; - } - /* Need to reduce the size of the fonts for printing */ - h1 { font-size: 28pt !important; } - h2 { font-size: 24pt !important; } - h3 { font-size: 22pt !important; } - h4 { font-size: 22pt !important; font-variant: small-caps; } - h5 { font-size: 21pt !important; } - h6 { font-size: 20pt !important; font-style: italic; } - - /* SECTION 5: Make hyperlinks more usable. - Ensure links are underlined, and consider appending - the URL to the end of the link for usability. */ - a:link, - a:visited { - color: #000 !important; - font-weight: bold; - text-decoration: underline; - } - /* - .reveal a:link:after, - .reveal a:visited:after { - content: " (" attr(href) ") "; - color: #222 !important; - font-size: 90%; - } - */ - - - /* SECTION 6: more reveal.js specific additions by @skypanther */ - ul, ol, div, p { - visibility: visible; - position: static; - width: auto; - height: auto; - display: block; - overflow: visible; - margin: 0; - text-align: left !important; - } - .reveal pre, - .reveal table { - margin-left: 0; - margin-right: 0; - } - .reveal pre code { - padding: 20px; - border: 1px solid #ddd; - } - .reveal blockquote { - margin: 20px 0; - } - .reveal .slides { - position: static !important; - width: auto !important; - height: auto !important; - - left: 0 !important; - top: 0 !important; - margin-left: 0 !important; - margin-top: 0 !important; - padding: 0 !important; - zoom: 1 !important; - - overflow: visible !important; - display: block !important; - - text-align: left !important; - -webkit-perspective: none; - -moz-perspective: none; - -ms-perspective: none; - perspective: none; - - -webkit-perspective-origin: 50% 50%; - -moz-perspective-origin: 50% 50%; - -ms-perspective-origin: 50% 50%; - perspective-origin: 50% 50%; - } - .reveal .slides section { - visibility: visible !important; - position: static !important; - width: auto !important; - height: auto !important; - display: block !important; - overflow: visible !important; - - left: 0 !important; - top: 0 !important; - margin-left: 0 !important; - margin-top: 0 !important; - padding: 60px 20px !important; - z-index: auto !important; - - opacity: 1 !important; - - page-break-after: always !important; - - -webkit-transform-style: flat !important; - -moz-transform-style: flat !important; - -ms-transform-style: flat !important; - transform-style: flat !important; - - -webkit-transform: none !important; - -moz-transform: none !important; - -ms-transform: none !important; - transform: none !important; - - -webkit-transition: none !important; - -moz-transition: none !important; - -ms-transition: none !important; - transition: none !important; - } - .reveal .slides section.stack { - padding: 0 !important; - } - .reveal section:last-of-type { - page-break-after: avoid !important; - } - .reveal section .fragment { - opacity: 1 !important; - visibility: visible !important; - - -webkit-transform: none !important; - -moz-transform: none !important; - -ms-transform: none !important; - transform: none !important; - } - .reveal section img { - display: block; - margin: 15px 0px; - background: rgba(255,255,255,1); - border: 1px solid #666; - box-shadow: none; - } - - .reveal section small { - font-size: 0.8em; - } - -} \ No newline at end of file diff --git a/theme/css/print/pdf.css b/theme/css/print/pdf.css deleted file mode 100644 index 9ed90d6..0000000 --- a/theme/css/print/pdf.css +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This stylesheet is used to print reveal.js - * presentations to PDF. - * - * https://github.com/hakimel/reveal.js#pdf-export - */ - -* { - -webkit-print-color-adjust: exact; -} - -body { - margin: 0 auto !important; - border: 0; - padding: 0; - float: none !important; - overflow: visible; -} - -html { - width: 100%; - height: 100%; - overflow: visible; -} - -/* Remove any elements not needed in print. */ -.nestedarrow, -.reveal .controls, -.reveal .progress, -.reveal .playback, -.reveal.overview, -.fork-reveal, -.share-reveal, -.state-background { - display: none !important; -} - -h1, h2, h3, h4, h5, h6 { - text-shadow: 0 0 0 #000 !important; -} - -.reveal pre code { - overflow: hidden !important; - font-family: Courier, 'Courier New', monospace !important; -} - -ul, ol, div, p { - visibility: visible; - position: static; - width: auto; - height: auto; - display: block; - overflow: visible; - margin: auto; -} -.reveal { - width: auto !important; - height: auto !important; - overflow: hidden !important; -} -.reveal .slides { - position: static; - width: 100%; - height: auto; - - left: auto; - top: auto; - margin: 0 !important; - padding: 0 !important; - - overflow: visible; - display: block; - - -webkit-perspective: none; - -moz-perspective: none; - -ms-perspective: none; - perspective: none; - - -webkit-perspective-origin: 50% 50%; /* there isn't a none/auto value but 50-50 is the default */ - -moz-perspective-origin: 50% 50%; - -ms-perspective-origin: 50% 50%; - perspective-origin: 50% 50%; -} - -.reveal .slides section { - page-break-after: always !important; - - visibility: visible !important; - position: relative !important; - display: block !important; - position: relative !important; - - margin: 0 !important; - padding: 0 !important; - box-sizing: border-box !important; - min-height: 1px; - - opacity: 1 !important; - - -webkit-transform-style: flat !important; - -moz-transform-style: flat !important; - -ms-transform-style: flat !important; - transform-style: flat !important; - - -webkit-transform: none !important; - -moz-transform: none !important; - -ms-transform: none !important; - transform: none !important; -} - -.reveal section.stack { - margin: 0 !important; - padding: 0 !important; - page-break-after: avoid !important; - height: auto !important; - min-height: auto !important; -} - -.reveal img { - box-shadow: none; -} - -.reveal .roll { - overflow: visible; - line-height: 1em; -} - -/* Slide backgrounds are placed inside of their slide when exporting to PDF */ -.reveal section .slide-background { - display: block !important; - position: absolute; - top: 0; - left: 0; - width: 100%; - z-index: -1; -} - -/* All elements should be above the slide-background */ -.reveal section>* { - position: relative; - z-index: 1; -} - -/* Display slide speaker notes when 'showNotes' is enabled */ -.reveal .speaker-notes-pdf { - display: block; - width: 100%; - max-height: none; - left: auto; - top: auto; - z-index: 100; -} - -/* Display slide numbers when 'slideNumber' is enabled */ -.reveal .slide-number-pdf { - display: block; - position: absolute; - font-size: 14px; -} - diff --git a/theme/css/reveal.css b/theme/css/reveal.css deleted file mode 100644 index 9739291..0000000 --- a/theme/css/reveal.css +++ /dev/null @@ -1,1338 +0,0 @@ -/*! - * reveal.js - * http://lab.hakim.se/reveal-js - * MIT licensed - * - * Copyright (C) 2016 Hakim El Hattab, http://hakim.se - */ -/********************************************* - * RESET STYLES - *********************************************/ -html, body, .reveal div, .reveal span, .reveal applet, .reveal object, .reveal iframe, -.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6, .reveal p, .reveal blockquote, .reveal pre, -.reveal a, .reveal abbr, .reveal acronym, .reveal address, .reveal big, .reveal cite, .reveal code, -.reveal del, .reveal dfn, .reveal em, .reveal img, .reveal ins, .reveal kbd, .reveal q, .reveal s, .reveal samp, -.reveal small, .reveal strike, .reveal strong, .reveal sub, .reveal sup, .reveal tt, .reveal var, -.reveal b, .reveal u, .reveal center, -.reveal dl, .reveal dt, .reveal dd, .reveal ol, .reveal ul, .reveal li, -.reveal fieldset, .reveal form, .reveal label, .reveal legend, -.reveal table, .reveal caption, .reveal tbody, .reveal tfoot, .reveal thead, .reveal tr, .reveal th, .reveal td, -.reveal article, .reveal aside, .reveal canvas, .reveal details, .reveal embed, -.reveal figure, .reveal figcaption, .reveal footer, .reveal header, .reveal hgroup, -.reveal menu, .reveal nav, .reveal output, .reveal ruby, .reveal section, .reveal summary, -.reveal time, .reveal mark, .reveal audio, video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; } - -.reveal article, .reveal aside, .reveal details, .reveal figcaption, .reveal figure, -.reveal footer, .reveal header, .reveal hgroup, .reveal menu, .reveal nav, .reveal section { - display: block; } - -/********************************************* - * GLOBAL STYLES - *********************************************/ -html, -body { - width: 100%; - height: 100%; - overflow: hidden; } - -body { - position: relative; - line-height: 1; - background-color: #fff; - color: #000; } - -html:-webkit-full-screen-ancestor { - background-color: inherit; } - -html:-moz-full-screen-ancestor { - background-color: inherit; } - -/********************************************* - * VIEW FRAGMENTS - *********************************************/ -.reveal .slides section .fragment { - opacity: 0; - visibility: hidden; - -webkit-transition: all 0.2s ease; - transition: all 0.2s ease; } - .reveal .slides section .fragment.visible { - opacity: 1; - visibility: visible; } - -.reveal .slides section .fragment.grow { - opacity: 1; - visibility: visible; } - .reveal .slides section .fragment.grow.visible { - -webkit-transform: scale(1.3); - -ms-transform: scale(1.3); - transform: scale(1.3); } - -.reveal .slides section .fragment.shrink { - opacity: 1; - visibility: visible; } - .reveal .slides section .fragment.shrink.visible { - -webkit-transform: scale(0.7); - -ms-transform: scale(0.7); - transform: scale(0.7); } - -.reveal .slides section .fragment.zoom-in { - -webkit-transform: scale(0.1); - -ms-transform: scale(0.1); - transform: scale(0.1); } - .reveal .slides section .fragment.zoom-in.visible { - -webkit-transform: none; - -ms-transform: none; - transform: none; } - -.reveal .slides section .fragment.fade-out { - opacity: 1; - visibility: visible; } - .reveal .slides section .fragment.fade-out.visible { - opacity: 0; - visibility: hidden; } - -.reveal .slides section .fragment.semi-fade-out { - opacity: 1; - visibility: visible; } - .reveal .slides section .fragment.semi-fade-out.visible { - opacity: 0.5; - visibility: visible; } - -.reveal .slides section .fragment.strike { - opacity: 1; - visibility: visible; } - .reveal .slides section .fragment.strike.visible { - text-decoration: line-through; } - -.reveal .slides section .fragment.current-visible { - opacity: 0; - visibility: hidden; } - .reveal .slides section .fragment.current-visible.current-fragment { - opacity: 1; - visibility: visible; } - -.reveal .slides section .fragment.highlight-red, -.reveal .slides section .fragment.highlight-current-red, -.reveal .slides section .fragment.highlight-green, -.reveal .slides section .fragment.highlight-current-green, -.reveal .slides section .fragment.highlight-blue, -.reveal .slides section .fragment.highlight-current-blue { - opacity: 1; - visibility: visible; } - -.reveal .slides section .fragment.highlight-red.visible { - color: #ff2c2d; } - -.reveal .slides section .fragment.highlight-green.visible { - color: #17ff2e; } - -.reveal .slides section .fragment.highlight-blue.visible { - color: #1b91ff; } - -.reveal .slides section .fragment.highlight-current-red.current-fragment { - color: #ff2c2d; } - -.reveal .slides section .fragment.highlight-current-green.current-fragment { - color: #17ff2e; } - -.reveal .slides section .fragment.highlight-current-blue.current-fragment { - color: #1b91ff; } - -/********************************************* - * DEFAULT ELEMENT STYLES - *********************************************/ -/* Fixes issue in Chrome where italic fonts did not appear when printing to PDF */ -.reveal:after { - content: ''; - font-style: italic; } - -.reveal iframe { - z-index: 1; } - -/** Prevents layering issues in certain browser/transition combinations */ -.reveal a { - position: relative; } - -.reveal .stretch { - max-width: none; - max-height: none; } - -.reveal pre.stretch code { - height: 100%; - max-height: 100%; - box-sizing: border-box; } - -/********************************************* - * CONTROLS - *********************************************/ -.reveal .controls { - display: none; - position: fixed; - width: 110px; - height: 110px; - z-index: 30; - right: 10px; - bottom: 10px; - -webkit-user-select: none; } - -.reveal .controls button { - padding: 0; - position: absolute; - opacity: 0.05; - width: 0; - height: 0; - background-color: transparent; - border: 12px solid transparent; - -webkit-transform: scale(0.9999); - -ms-transform: scale(0.9999); - transform: scale(0.9999); - -webkit-transition: all 0.2s ease; - transition: all 0.2s ease; - -webkit-appearance: none; - -webkit-tap-highlight-color: transparent; } - -.reveal .controls .enabled { - opacity: 0.7; - cursor: pointer; } - -.reveal .controls .enabled:active { - margin-top: 1px; } - -.reveal .controls .navigate-left { - top: 42px; - border-right-width: 22px; - border-right-color: #000; } - -.reveal .controls .navigate-left.fragmented { - opacity: 0.3; } - -.reveal .controls .navigate-right { - left: 74px; - top: 42px; - border-left-width: 22px; - border-left-color: #000; } - -.reveal .controls .navigate-right.fragmented { - opacity: 0.3; } - -.reveal .controls .navigate-up { - left: 42px; - border-bottom-width: 22px; - border-bottom-color: #000; } - -.reveal .controls .navigate-up.fragmented { - opacity: 0.3; } - -.reveal .controls .navigate-down { - left: 42px; - top: 74px; - border-top-width: 22px; - border-top-color: #000; } - -.reveal .controls .navigate-down.fragmented { - opacity: 0.3; } - -/********************************************* - * PROGRESS BAR - *********************************************/ -.reveal .progress { - position: fixed; - display: none; - height: 3px; - width: 100%; - bottom: 0; - left: 0; - z-index: 10; - background-color: rgba(0, 0, 0, 0.2); } - -.reveal .progress:after { - content: ''; - display: block; - position: absolute; - height: 20px; - width: 100%; - top: -20px; } - -.reveal .progress span { - display: block; - height: 100%; - width: 0px; - background-color: #000; - -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } - -/********************************************* - * SLIDE NUMBER - *********************************************/ -.reveal .slide-number { - position: fixed; - display: block; - right: 8px; - bottom: 8px; - z-index: 31; - font-family: Helvetica, sans-serif; - font-size: 12px; - line-height: 1; - color: #fff; - background-color: rgba(0, 0, 0, 0.4); - padding: 5px; } - -.reveal .slide-number-delimiter { - margin: 0 3px; } - -/********************************************* - * SLIDES - *********************************************/ -.reveal { - position: relative; - width: 100%; - height: 100%; - overflow: hidden; - -ms-touch-action: none; - touch-action: none; } - -.reveal .slides { - position: absolute; - width: 100%; - height: 100%; - top: 0; - right: 0; - bottom: 0; - left: 0; - margin: auto; - overflow: visible; - z-index: 1; - text-align: center; - -webkit-perspective: 600px; - perspective: 600px; - -webkit-perspective-origin: 50% 40%; - perspective-origin: 50% 40%; } - -.reveal .slides > section { - -ms-perspective: 600px; } - -.reveal .slides > section, -.reveal .slides > section > section { - display: none; - position: absolute; - width: 100%; - padding: 20px 0px; - z-index: 10; - -webkit-transform-style: preserve-3d; - transform-style: preserve-3d; - -webkit-transition: -webkit-transform-origin 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), -webkit-transform 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), visibility 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), opacity 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - transition: -ms-transform-origin 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), transform 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), visibility 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), opacity 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - transition: transform-origin 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), transform 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), visibility 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985), opacity 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } - -/* Global transition speed settings */ -.reveal[data-transition-speed="fast"] .slides section { - -webkit-transition-duration: 400ms; - transition-duration: 400ms; } - -.reveal[data-transition-speed="slow"] .slides section { - -webkit-transition-duration: 1200ms; - transition-duration: 1200ms; } - -/* Slide-specific transition speed overrides */ -.reveal .slides section[data-transition-speed="fast"] { - -webkit-transition-duration: 400ms; - transition-duration: 400ms; } - -.reveal .slides section[data-transition-speed="slow"] { - -webkit-transition-duration: 1200ms; - transition-duration: 1200ms; } - -.reveal .slides > section.stack { - padding-top: 0; - padding-bottom: 0; } - -.reveal .slides > section.present, -.reveal .slides > section > section.present { - display: block; - z-index: 11; - opacity: 1; } - -.reveal.center, -.reveal.center .slides, -.reveal.center .slides section { - min-height: 0 !important; } - -/* Don't allow interaction with invisible slides */ -.reveal .slides > section.future, -.reveal .slides > section > section.future, -.reveal .slides > section.past, -.reveal .slides > section > section.past { - pointer-events: none; } - -.reveal.overview .slides > section, -.reveal.overview .slides > section > section { - pointer-events: auto; } - -.reveal .slides > section.past, -.reveal .slides > section.future, -.reveal .slides > section > section.past, -.reveal .slides > section > section.future { - opacity: 0; } - -/********************************************* - * Mixins for readability of transitions - *********************************************/ -/********************************************* - * SLIDE TRANSITION - * Aliased 'linear' for backwards compatibility - *********************************************/ -.reveal.slide section { - -webkit-backface-visibility: hidden; - backface-visibility: hidden; } - -.reveal .slides > section[data-transition=slide].past, -.reveal .slides > section[data-transition~=slide-out].past, -.reveal.slide .slides > section:not([data-transition]).past { - -webkit-transform: translate(-150%, 0); - -ms-transform: translate(-150%, 0); - transform: translate(-150%, 0); } - -.reveal .slides > section[data-transition=slide].future, -.reveal .slides > section[data-transition~=slide-in].future, -.reveal.slide .slides > section:not([data-transition]).future { - -webkit-transform: translate(150%, 0); - -ms-transform: translate(150%, 0); - transform: translate(150%, 0); } - -.reveal .slides > section > section[data-transition=slide].past, -.reveal .slides > section > section[data-transition~=slide-out].past, -.reveal.slide .slides > section > section:not([data-transition]).past { - -webkit-transform: translate(0, -150%); - -ms-transform: translate(0, -150%); - transform: translate(0, -150%); } - -.reveal .slides > section > section[data-transition=slide].future, -.reveal .slides > section > section[data-transition~=slide-in].future, -.reveal.slide .slides > section > section:not([data-transition]).future { - -webkit-transform: translate(0, 150%); - -ms-transform: translate(0, 150%); - transform: translate(0, 150%); } - -.reveal.linear section { - -webkit-backface-visibility: hidden; - backface-visibility: hidden; } - -.reveal .slides > section[data-transition=linear].past, -.reveal .slides > section[data-transition~=linear-out].past, -.reveal.linear .slides > section:not([data-transition]).past { - -webkit-transform: translate(-150%, 0); - -ms-transform: translate(-150%, 0); - transform: translate(-150%, 0); } - -.reveal .slides > section[data-transition=linear].future, -.reveal .slides > section[data-transition~=linear-in].future, -.reveal.linear .slides > section:not([data-transition]).future { - -webkit-transform: translate(150%, 0); - -ms-transform: translate(150%, 0); - transform: translate(150%, 0); } - -.reveal .slides > section > section[data-transition=linear].past, -.reveal .slides > section > section[data-transition~=linear-out].past, -.reveal.linear .slides > section > section:not([data-transition]).past { - -webkit-transform: translate(0, -150%); - -ms-transform: translate(0, -150%); - transform: translate(0, -150%); } - -.reveal .slides > section > section[data-transition=linear].future, -.reveal .slides > section > section[data-transition~=linear-in].future, -.reveal.linear .slides > section > section:not([data-transition]).future { - -webkit-transform: translate(0, 150%); - -ms-transform: translate(0, 150%); - transform: translate(0, 150%); } - -/********************************************* - * CONVEX TRANSITION - * Aliased 'default' for backwards compatibility - *********************************************/ -.reveal .slides > section[data-transition=default].past, -.reveal .slides > section[data-transition~=default-out].past, -.reveal.default .slides > section:not([data-transition]).past { - -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); } - -.reveal .slides > section[data-transition=default].future, -.reveal .slides > section[data-transition~=default-in].future, -.reveal.default .slides > section:not([data-transition]).future { - -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); } - -.reveal .slides > section > section[data-transition=default].past, -.reveal .slides > section > section[data-transition~=default-out].past, -.reveal.default .slides > section > section:not([data-transition]).past { - -webkit-transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); - transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); } - -.reveal .slides > section > section[data-transition=default].future, -.reveal .slides > section > section[data-transition~=default-in].future, -.reveal.default .slides > section > section:not([data-transition]).future { - -webkit-transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); - transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); } - -.reveal .slides > section[data-transition=convex].past, -.reveal .slides > section[data-transition~=convex-out].past, -.reveal.convex .slides > section:not([data-transition]).past { - -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); } - -.reveal .slides > section[data-transition=convex].future, -.reveal .slides > section[data-transition~=convex-in].future, -.reveal.convex .slides > section:not([data-transition]).future { - -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); } - -.reveal .slides > section > section[data-transition=convex].past, -.reveal .slides > section > section[data-transition~=convex-out].past, -.reveal.convex .slides > section > section:not([data-transition]).past { - -webkit-transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); - transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); } - -.reveal .slides > section > section[data-transition=convex].future, -.reveal .slides > section > section[data-transition~=convex-in].future, -.reveal.convex .slides > section > section:not([data-transition]).future { - -webkit-transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); - transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); } - -/********************************************* - * CONCAVE TRANSITION - *********************************************/ -.reveal .slides > section[data-transition=concave].past, -.reveal .slides > section[data-transition~=concave-out].past, -.reveal.concave .slides > section:not([data-transition]).past { - -webkit-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); } - -.reveal .slides > section[data-transition=concave].future, -.reveal .slides > section[data-transition~=concave-in].future, -.reveal.concave .slides > section:not([data-transition]).future { - -webkit-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); } - -.reveal .slides > section > section[data-transition=concave].past, -.reveal .slides > section > section[data-transition~=concave-out].past, -.reveal.concave .slides > section > section:not([data-transition]).past { - -webkit-transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); - transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); } - -.reveal .slides > section > section[data-transition=concave].future, -.reveal .slides > section > section[data-transition~=concave-in].future, -.reveal.concave .slides > section > section:not([data-transition]).future { - -webkit-transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); - transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); } - -/********************************************* - * ZOOM TRANSITION - *********************************************/ -.reveal .slides section[data-transition=zoom], -.reveal.zoom .slides section:not([data-transition]) { - -webkit-transition-timing-function: ease; - transition-timing-function: ease; } - -.reveal .slides > section[data-transition=zoom].past, -.reveal .slides > section[data-transition~=zoom-out].past, -.reveal.zoom .slides > section:not([data-transition]).past { - visibility: hidden; - -webkit-transform: scale(16); - -ms-transform: scale(16); - transform: scale(16); } - -.reveal .slides > section[data-transition=zoom].future, -.reveal .slides > section[data-transition~=zoom-in].future, -.reveal.zoom .slides > section:not([data-transition]).future { - visibility: hidden; - -webkit-transform: scale(0.2); - -ms-transform: scale(0.2); - transform: scale(0.2); } - -.reveal .slides > section > section[data-transition=zoom].past, -.reveal .slides > section > section[data-transition~=zoom-out].past, -.reveal.zoom .slides > section > section:not([data-transition]).past { - -webkit-transform: translate(0, -150%); - -ms-transform: translate(0, -150%); - transform: translate(0, -150%); } - -.reveal .slides > section > section[data-transition=zoom].future, -.reveal .slides > section > section[data-transition~=zoom-in].future, -.reveal.zoom .slides > section > section:not([data-transition]).future { - -webkit-transform: translate(0, 150%); - -ms-transform: translate(0, 150%); - transform: translate(0, 150%); } - -/********************************************* - * CUBE TRANSITION - *********************************************/ -.reveal.cube .slides { - -webkit-perspective: 1300px; - perspective: 1300px; } - -.reveal.cube .slides section { - padding: 30px; - min-height: 700px; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - box-sizing: border-box; } - -.reveal.center.cube .slides section { - min-height: 0; } - -.reveal.cube .slides section:not(.stack):before { - content: ''; - position: absolute; - display: block; - width: 100%; - height: 100%; - left: 0; - top: 0; - background: rgba(0, 0, 0, 0.1); - border-radius: 4px; - -webkit-transform: translateZ(-20px); - transform: translateZ(-20px); } - -.reveal.cube .slides section:not(.stack):after { - content: ''; - position: absolute; - display: block; - width: 90%; - height: 30px; - left: 5%; - bottom: 0; - background: none; - z-index: 1; - border-radius: 4px; - box-shadow: 0px 95px 25px rgba(0, 0, 0, 0.2); - -webkit-transform: translateZ(-90px) rotateX(65deg); - transform: translateZ(-90px) rotateX(65deg); } - -.reveal.cube .slides > section.stack { - padding: 0; - background: none; } - -.reveal.cube .slides > section.past { - -webkit-transform-origin: 100% 0%; - -ms-transform-origin: 100% 0%; - transform-origin: 100% 0%; - -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg); - transform: translate3d(-100%, 0, 0) rotateY(-90deg); } - -.reveal.cube .slides > section.future { - -webkit-transform-origin: 0% 0%; - -ms-transform-origin: 0% 0%; - transform-origin: 0% 0%; - -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg); - transform: translate3d(100%, 0, 0) rotateY(90deg); } - -.reveal.cube .slides > section > section.past { - -webkit-transform-origin: 0% 100%; - -ms-transform-origin: 0% 100%; - transform-origin: 0% 100%; - -webkit-transform: translate3d(0, -100%, 0) rotateX(90deg); - transform: translate3d(0, -100%, 0) rotateX(90deg); } - -.reveal.cube .slides > section > section.future { - -webkit-transform-origin: 0% 0%; - -ms-transform-origin: 0% 0%; - transform-origin: 0% 0%; - -webkit-transform: translate3d(0, 100%, 0) rotateX(-90deg); - transform: translate3d(0, 100%, 0) rotateX(-90deg); } - -/********************************************* - * PAGE TRANSITION - *********************************************/ -.reveal.page .slides { - -webkit-perspective-origin: 0% 50%; - perspective-origin: 0% 50%; - -webkit-perspective: 3000px; - perspective: 3000px; } - -.reveal.page .slides section { - padding: 30px; - min-height: 700px; - box-sizing: border-box; } - -.reveal.page .slides section.past { - z-index: 12; } - -.reveal.page .slides section:not(.stack):before { - content: ''; - position: absolute; - display: block; - width: 100%; - height: 100%; - left: 0; - top: 0; - background: rgba(0, 0, 0, 0.1); - -webkit-transform: translateZ(-20px); - transform: translateZ(-20px); } - -.reveal.page .slides section:not(.stack):after { - content: ''; - position: absolute; - display: block; - width: 90%; - height: 30px; - left: 5%; - bottom: 0; - background: none; - z-index: 1; - border-radius: 4px; - box-shadow: 0px 95px 25px rgba(0, 0, 0, 0.2); - -webkit-transform: translateZ(-90px) rotateX(65deg); } - -.reveal.page .slides > section.stack { - padding: 0; - background: none; } - -.reveal.page .slides > section.past { - -webkit-transform-origin: 0% 0%; - -ms-transform-origin: 0% 0%; - transform-origin: 0% 0%; - -webkit-transform: translate3d(-40%, 0, 0) rotateY(-80deg); - transform: translate3d(-40%, 0, 0) rotateY(-80deg); } - -.reveal.page .slides > section.future { - -webkit-transform-origin: 100% 0%; - -ms-transform-origin: 100% 0%; - transform-origin: 100% 0%; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); } - -.reveal.page .slides > section > section.past { - -webkit-transform-origin: 0% 0%; - -ms-transform-origin: 0% 0%; - transform-origin: 0% 0%; - -webkit-transform: translate3d(0, -40%, 0) rotateX(80deg); - transform: translate3d(0, -40%, 0) rotateX(80deg); } - -.reveal.page .slides > section > section.future { - -webkit-transform-origin: 0% 100%; - -ms-transform-origin: 0% 100%; - transform-origin: 0% 100%; - -webkit-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); } - -/********************************************* - * FADE TRANSITION - *********************************************/ -.reveal .slides section[data-transition=fade], -.reveal.fade .slides section:not([data-transition]), -.reveal.fade .slides > section > section:not([data-transition]) { - -webkit-transform: none; - -ms-transform: none; - transform: none; - -webkit-transition: opacity 0.5s; - transition: opacity 0.5s; } - -.reveal.fade.overview .slides section, -.reveal.fade.overview .slides > section > section { - -webkit-transition: none; - transition: none; } - -/********************************************* - * NO TRANSITION - *********************************************/ -.reveal .slides section[data-transition=none], -.reveal.none .slides section:not([data-transition]) { - -webkit-transform: none; - -ms-transform: none; - transform: none; - -webkit-transition: none; - transition: none; } - -/********************************************* - * PAUSED MODE - *********************************************/ -.reveal .pause-overlay { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: black; - visibility: hidden; - opacity: 0; - z-index: 100; - -webkit-transition: all 1s ease; - transition: all 1s ease; } - -.reveal.paused .pause-overlay { - visibility: visible; - opacity: 1; } - -/********************************************* - * FALLBACK - *********************************************/ -.no-transforms { - overflow-y: auto; } - -.no-transforms .reveal .slides { - position: relative; - width: 80%; - height: auto !important; - top: 0; - left: 50%; - margin: 0; - text-align: center; } - -.no-transforms .reveal .controls, -.no-transforms .reveal .progress { - display: none !important; } - -.no-transforms .reveal .slides section { - display: block !important; - opacity: 1 !important; - position: relative !important; - height: auto; - min-height: 0; - top: 0; - left: -50%; - margin: 70px 0; - -webkit-transform: none; - -ms-transform: none; - transform: none; } - -.no-transforms .reveal .slides section section { - left: 0; } - -.reveal .no-transition, -.reveal .no-transition * { - -webkit-transition: none !important; - transition: none !important; } - -/********************************************* - * PER-SLIDE BACKGROUNDS - *********************************************/ -.reveal .backgrounds { - position: absolute; - width: 100%; - height: 100%; - top: 0; - left: 0; - -webkit-perspective: 600px; - perspective: 600px; } - -.reveal .slide-background { - display: none; - position: absolute; - width: 100%; - height: 100%; - opacity: 0; - visibility: hidden; - background-color: transparent; - background-position: 50% 50%; - background-repeat: no-repeat; - background-size: cover; - -webkit-transition: all 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - transition: all 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } - -.reveal .slide-background.stack { - display: block; } - -.reveal .slide-background.present { - opacity: 1; - visibility: visible; } - -.print-pdf .reveal .slide-background { - opacity: 1 !important; - visibility: visible !important; } - -/* Video backgrounds */ -.reveal .slide-background video { - position: absolute; - width: 100%; - height: 100%; - max-width: none; - max-height: none; - top: 0; - left: 0; } - -/* Immediate transition style */ -.reveal[data-background-transition=none] > .backgrounds .slide-background, -.reveal > .backgrounds .slide-background[data-background-transition=none] { - -webkit-transition: none; - transition: none; } - -/* Slide */ -.reveal[data-background-transition=slide] > .backgrounds .slide-background, -.reveal > .backgrounds .slide-background[data-background-transition=slide] { - opacity: 1; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; } - -.reveal[data-background-transition=slide] > .backgrounds .slide-background.past, -.reveal > .backgrounds .slide-background.past[data-background-transition=slide] { - -webkit-transform: translate(-100%, 0); - -ms-transform: translate(-100%, 0); - transform: translate(-100%, 0); } - -.reveal[data-background-transition=slide] > .backgrounds .slide-background.future, -.reveal > .backgrounds .slide-background.future[data-background-transition=slide] { - -webkit-transform: translate(100%, 0); - -ms-transform: translate(100%, 0); - transform: translate(100%, 0); } - -.reveal[data-background-transition=slide] > .backgrounds .slide-background > .slide-background.past, -.reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=slide] { - -webkit-transform: translate(0, -100%); - -ms-transform: translate(0, -100%); - transform: translate(0, -100%); } - -.reveal[data-background-transition=slide] > .backgrounds .slide-background > .slide-background.future, -.reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=slide] { - -webkit-transform: translate(0, 100%); - -ms-transform: translate(0, 100%); - transform: translate(0, 100%); } - -/* Convex */ -.reveal[data-background-transition=convex] > .backgrounds .slide-background.past, -.reveal > .backgrounds .slide-background.past[data-background-transition=convex] { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); } - -.reveal[data-background-transition=convex] > .backgrounds .slide-background.future, -.reveal > .backgrounds .slide-background.future[data-background-transition=convex] { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); } - -.reveal[data-background-transition=convex] > .backgrounds .slide-background > .slide-background.past, -.reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=convex] { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0); } - -.reveal[data-background-transition=convex] > .backgrounds .slide-background > .slide-background.future, -.reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=convex] { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0); } - -/* Concave */ -.reveal[data-background-transition=concave] > .backgrounds .slide-background.past, -.reveal > .backgrounds .slide-background.past[data-background-transition=concave] { - opacity: 0; - -webkit-transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); - transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); } - -.reveal[data-background-transition=concave] > .backgrounds .slide-background.future, -.reveal > .backgrounds .slide-background.future[data-background-transition=concave] { - opacity: 0; - -webkit-transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); - transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); } - -.reveal[data-background-transition=concave] > .backgrounds .slide-background > .slide-background.past, -.reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=concave] { - opacity: 0; - -webkit-transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0); - transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0); } - -.reveal[data-background-transition=concave] > .backgrounds .slide-background > .slide-background.future, -.reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=concave] { - opacity: 0; - -webkit-transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0); - transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0); } - -/* Zoom */ -.reveal[data-background-transition=zoom] > .backgrounds .slide-background, -.reveal > .backgrounds .slide-background[data-background-transition=zoom] { - -webkit-transition-timing-function: ease; - transition-timing-function: ease; } - -.reveal[data-background-transition=zoom] > .backgrounds .slide-background.past, -.reveal > .backgrounds .slide-background.past[data-background-transition=zoom] { - opacity: 0; - visibility: hidden; - -webkit-transform: scale(16); - -ms-transform: scale(16); - transform: scale(16); } - -.reveal[data-background-transition=zoom] > .backgrounds .slide-background.future, -.reveal > .backgrounds .slide-background.future[data-background-transition=zoom] { - opacity: 0; - visibility: hidden; - -webkit-transform: scale(0.2); - -ms-transform: scale(0.2); - transform: scale(0.2); } - -.reveal[data-background-transition=zoom] > .backgrounds .slide-background > .slide-background.past, -.reveal > .backgrounds .slide-background > .slide-background.past[data-background-transition=zoom] { - opacity: 0; - visibility: hidden; - -webkit-transform: scale(16); - -ms-transform: scale(16); - transform: scale(16); } - -.reveal[data-background-transition=zoom] > .backgrounds .slide-background > .slide-background.future, -.reveal > .backgrounds .slide-background > .slide-background.future[data-background-transition=zoom] { - opacity: 0; - visibility: hidden; - -webkit-transform: scale(0.2); - -ms-transform: scale(0.2); - transform: scale(0.2); } - -/* Global transition speed settings */ -.reveal[data-transition-speed="fast"] > .backgrounds .slide-background { - -webkit-transition-duration: 400ms; - transition-duration: 400ms; } - -.reveal[data-transition-speed="slow"] > .backgrounds .slide-background { - -webkit-transition-duration: 1200ms; - transition-duration: 1200ms; } - -/********************************************* - * OVERVIEW - *********************************************/ -.reveal.overview { - -webkit-perspective-origin: 50% 50%; - perspective-origin: 50% 50%; - -webkit-perspective: 700px; - perspective: 700px; } - .reveal.overview .slides section { - height: 700px; - opacity: 1 !important; - overflow: hidden; - visibility: visible !important; - cursor: pointer; - box-sizing: border-box; } - .reveal.overview .slides section:hover, - .reveal.overview .slides section.present { - outline: 10px solid rgba(150, 150, 150, 0.4); - outline-offset: 10px; } - .reveal.overview .slides section .fragment { - opacity: 1; - -webkit-transition: none; - transition: none; } - .reveal.overview .slides section:after, - .reveal.overview .slides section:before { - display: none !important; } - .reveal.overview .slides > section.stack { - padding: 0; - top: 0 !important; - background: none; - outline: none; - overflow: visible; } - .reveal.overview .backgrounds { - -webkit-perspective: inherit; - perspective: inherit; } - .reveal.overview .backgrounds .slide-background { - opacity: 1; - visibility: visible; - outline: 10px solid rgba(150, 150, 150, 0.1); - outline-offset: 10px; } - -.reveal.overview .slides section, -.reveal.overview-deactivating .slides section { - -webkit-transition: none; - transition: none; } - -.reveal.overview .backgrounds .slide-background, -.reveal.overview-deactivating .backgrounds .slide-background { - -webkit-transition: none; - transition: none; } - -.reveal.overview-animated .slides { - -webkit-transition: -webkit-transform 0.4s ease; - transition: transform 0.4s ease; } - -/********************************************* - * RTL SUPPORT - *********************************************/ -.reveal.rtl .slides, -.reveal.rtl .slides h1, -.reveal.rtl .slides h2, -.reveal.rtl .slides h3, -.reveal.rtl .slides h4, -.reveal.rtl .slides h5, -.reveal.rtl .slides h6 { - direction: rtl; - font-family: sans-serif; } - -.reveal.rtl pre, -.reveal.rtl code { - direction: ltr; } - -.reveal.rtl ol, -.reveal.rtl ul { - text-align: right; } - -.reveal.rtl .progress span { - float: right; } - -/********************************************* - * PARALLAX BACKGROUND - *********************************************/ -.reveal.has-parallax-background .backgrounds { - -webkit-transition: all 0.8s ease; - transition: all 0.8s ease; } - -/* Global transition speed settings */ -.reveal.has-parallax-background[data-transition-speed="fast"] .backgrounds { - -webkit-transition-duration: 400ms; - transition-duration: 400ms; } - -.reveal.has-parallax-background[data-transition-speed="slow"] .backgrounds { - -webkit-transition-duration: 1200ms; - transition-duration: 1200ms; } - -/********************************************* - * LINK PREVIEW OVERLAY - *********************************************/ -.reveal .overlay { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 1000; - background: rgba(0, 0, 0, 0.9); - opacity: 0; - visibility: hidden; - -webkit-transition: all 0.3s ease; - transition: all 0.3s ease; } - -.reveal .overlay.visible { - opacity: 1; - visibility: visible; } - -.reveal .overlay .spinner { - position: absolute; - display: block; - top: 50%; - left: 50%; - width: 32px; - height: 32px; - margin: -16px 0 0 -16px; - z-index: 10; - background-image: url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D); - visibility: visible; - opacity: 0.6; - -webkit-transition: all 0.3s ease; - transition: all 0.3s ease; } - -.reveal .overlay header { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 40px; - z-index: 2; - border-bottom: 1px solid #222; } - -.reveal .overlay header a { - display: inline-block; - width: 40px; - height: 40px; - padding: 0 10px; - float: right; - opacity: 0.6; - box-sizing: border-box; } - -.reveal .overlay header a:hover { - opacity: 1; } - -.reveal .overlay header a .icon { - display: inline-block; - width: 20px; - height: 20px; - background-position: 50% 50%; - background-size: 100%; - background-repeat: no-repeat; } - -.reveal .overlay header a.close .icon { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC); } - -.reveal .overlay header a.external .icon { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==); } - -.reveal .overlay .viewport { - position: absolute; - top: 40px; - right: 0; - bottom: 0; - left: 0; } - -.reveal .overlay.overlay-preview .viewport iframe { - width: 100%; - height: 100%; - max-width: 100%; - max-height: 100%; - border: 0; - opacity: 0; - visibility: hidden; - -webkit-transition: all 0.3s ease; - transition: all 0.3s ease; } - -.reveal .overlay.overlay-preview.loaded .viewport iframe { - opacity: 1; - visibility: visible; } - -.reveal .overlay.overlay-preview.loaded .spinner { - opacity: 0; - visibility: hidden; - -webkit-transform: scale(0.2); - -ms-transform: scale(0.2); - transform: scale(0.2); } - -.reveal .overlay.overlay-help .viewport { - overflow: auto; - color: #fff; } - -.reveal .overlay.overlay-help .viewport .viewport-inner { - width: 600px; - margin: 0 auto; - padding: 60px; - text-align: center; - letter-spacing: normal; } - -.reveal .overlay.overlay-help .viewport .viewport-inner .title { - font-size: 20px; } - -.reveal .overlay.overlay-help .viewport .viewport-inner table { - border: 1px solid #fff; - border-collapse: collapse; - font-size: 14px; } - -.reveal .overlay.overlay-help .viewport .viewport-inner table th, -.reveal .overlay.overlay-help .viewport .viewport-inner table td { - width: 200px; - padding: 10px; - border: 1px solid #fff; - vertical-align: middle; } - -.reveal .overlay.overlay-help .viewport .viewport-inner table th { - padding-top: 20px; - padding-bottom: 20px; } - -/********************************************* - * PLAYBACK COMPONENT - *********************************************/ -.reveal .playback { - position: fixed; - left: 15px; - bottom: 20px; - z-index: 30; - cursor: pointer; - -webkit-transition: all 400ms ease; - transition: all 400ms ease; } - -.reveal.overview .playback { - opacity: 0; - visibility: hidden; } - -/********************************************* - * ROLLING LINKS - *********************************************/ -.reveal .roll { - display: inline-block; - line-height: 1.2; - overflow: hidden; - vertical-align: top; - -webkit-perspective: 400px; - perspective: 400px; - -webkit-perspective-origin: 50% 50%; - perspective-origin: 50% 50%; } - -.reveal .roll:hover { - background: none; - text-shadow: none; } - -.reveal .roll span { - display: block; - position: relative; - padding: 0 2px; - pointer-events: none; - -webkit-transition: all 400ms ease; - transition: all 400ms ease; - -webkit-transform-origin: 50% 0%; - -ms-transform-origin: 50% 0%; - transform-origin: 50% 0%; - -webkit-transform-style: preserve-3d; - transform-style: preserve-3d; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; } - -.reveal .roll:hover span { - background: rgba(0, 0, 0, 0.5); - -webkit-transform: translate3d(0px, 0px, -45px) rotateX(90deg); - transform: translate3d(0px, 0px, -45px) rotateX(90deg); } - -.reveal .roll span:after { - content: attr(data-title); - display: block; - position: absolute; - left: 0; - top: 0; - padding: 0 2px; - -webkit-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-transform-origin: 50% 0%; - -ms-transform-origin: 50% 0%; - transform-origin: 50% 0%; - -webkit-transform: translate3d(0px, 110%, 0px) rotateX(-90deg); - transform: translate3d(0px, 110%, 0px) rotateX(-90deg); } - -/********************************************* - * SPEAKER NOTES - *********************************************/ -.reveal aside.notes { - display: none; } - -.reveal .speaker-notes { - display: none; - position: absolute; - width: 70%; - max-height: 15%; - left: 15%; - bottom: 26px; - padding: 10px; - z-index: 1; - font-size: 18px; - line-height: 1.4; - color: #fff; - background-color: rgba(0, 0, 0, 0.5); - overflow: auto; - box-sizing: border-box; - text-align: left; - font-family: Helvetica, sans-serif; - -webkit-overflow-scrolling: touch; } - -.reveal .speaker-notes.visible:not(:empty) { - display: block; } - -@media screen and (max-width: 1024px) { - .reveal .speaker-notes { - font-size: 14px; } } - -@media screen and (max-width: 600px) { - .reveal .speaker-notes { - width: 90%; - left: 5%; } } - -/********************************************* - * ZOOM PLUGIN - *********************************************/ -.zoomed .reveal *, -.zoomed .reveal *:before, -.zoomed .reveal *:after { - -webkit-backface-visibility: visible !important; - backface-visibility: visible !important; } - -.zoomed .reveal .progress, -.zoomed .reveal .controls { - opacity: 0; } - -.zoomed .reveal .roll span { - background: none; } - -.zoomed .reveal .roll span:after { - visibility: hidden; } diff --git a/theme/css/reveal.scss b/theme/css/reveal.scss deleted file mode 100644 index eb600ac..0000000 --- a/theme/css/reveal.scss +++ /dev/null @@ -1,1379 +0,0 @@ -/*! - * reveal.js - * http://lab.hakim.se/reveal-js - * MIT licensed - * - * Copyright (C) 2016 Hakim El Hattab, http://hakim.se - */ - - -/********************************************* - * RESET STYLES - *********************************************/ - -html, body, .reveal div, .reveal span, .reveal applet, .reveal object, .reveal iframe, -.reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6, .reveal p, .reveal blockquote, .reveal pre, -.reveal a, .reveal abbr, .reveal acronym, .reveal address, .reveal big, .reveal cite, .reveal code, -.reveal del, .reveal dfn, .reveal em, .reveal img, .reveal ins, .reveal kbd, .reveal q, .reveal s, .reveal samp, -.reveal small, .reveal strike, .reveal strong, .reveal sub, .reveal sup, .reveal tt, .reveal var, -.reveal b, .reveal u, .reveal center, -.reveal dl, .reveal dt, .reveal dd, .reveal ol, .reveal ul, .reveal li, -.reveal fieldset, .reveal form, .reveal label, .reveal legend, -.reveal table, .reveal caption, .reveal tbody, .reveal tfoot, .reveal thead, .reveal tr, .reveal th, .reveal td, -.reveal article, .reveal aside, .reveal canvas, .reveal details, .reveal embed, -.reveal figure, .reveal figcaption, .reveal footer, .reveal header, .reveal hgroup, -.reveal menu, .reveal nav, .reveal output, .reveal ruby, .reveal section, .reveal summary, -.reveal time, .reveal mark, .reveal audio, video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; -} - -.reveal article, .reveal aside, .reveal details, .reveal figcaption, .reveal figure, -.reveal footer, .reveal header, .reveal hgroup, .reveal menu, .reveal nav, .reveal section { - display: block; -} - - -/********************************************* - * GLOBAL STYLES - *********************************************/ - -html, -body { - width: 100%; - height: 100%; - overflow: hidden; -} - -body { - position: relative; - line-height: 1; - - background-color: #fff; - color: #000; -} - -// Ensures that the main background color matches the -// theme in fullscreen mode -html:-webkit-full-screen-ancestor { - background-color: inherit; -} -html:-moz-full-screen-ancestor { - background-color: inherit; -} - - -/********************************************* - * VIEW FRAGMENTS - *********************************************/ - -.reveal .slides section .fragment { - opacity: 0; - visibility: hidden; - transition: all .2s ease; - - &.visible { - opacity: 1; - visibility: visible; - } -} - -.reveal .slides section .fragment.grow { - opacity: 1; - visibility: visible; - - &.visible { - transform: scale( 1.3 ); - } -} - -.reveal .slides section .fragment.shrink { - opacity: 1; - visibility: visible; - - &.visible { - transform: scale( 0.7 ); - } -} - -.reveal .slides section .fragment.zoom-in { - transform: scale( 0.1 ); - - &.visible { - transform: none; - } -} - -.reveal .slides section .fragment.fade-out { - opacity: 1; - visibility: visible; - - &.visible { - opacity: 0; - visibility: hidden; - } -} - -.reveal .slides section .fragment.semi-fade-out { - opacity: 1; - visibility: visible; - - &.visible { - opacity: 0.5; - visibility: visible; - } -} - -.reveal .slides section .fragment.strike { - opacity: 1; - visibility: visible; - - &.visible { - text-decoration: line-through; - } -} - -.reveal .slides section .fragment.current-visible { - opacity: 0; - visibility: hidden; - - &.current-fragment { - opacity: 1; - visibility: visible; - } -} - -.reveal .slides section .fragment.highlight-red, -.reveal .slides section .fragment.highlight-current-red, -.reveal .slides section .fragment.highlight-green, -.reveal .slides section .fragment.highlight-current-green, -.reveal .slides section .fragment.highlight-blue, -.reveal .slides section .fragment.highlight-current-blue { - opacity: 1; - visibility: visible; -} - .reveal .slides section .fragment.highlight-red.visible { - color: #ff2c2d - } - .reveal .slides section .fragment.highlight-green.visible { - color: #17ff2e; - } - .reveal .slides section .fragment.highlight-blue.visible { - color: #1b91ff; - } - -.reveal .slides section .fragment.highlight-current-red.current-fragment { - color: #ff2c2d -} -.reveal .slides section .fragment.highlight-current-green.current-fragment { - color: #17ff2e; -} -.reveal .slides section .fragment.highlight-current-blue.current-fragment { - color: #1b91ff; -} - - -/********************************************* - * DEFAULT ELEMENT STYLES - *********************************************/ - -/* Fixes issue in Chrome where italic fonts did not appear when printing to PDF */ -.reveal:after { - content: ''; - font-style: italic; -} - -.reveal iframe { - z-index: 1; -} - -/** Prevents layering issues in certain browser/transition combinations */ -.reveal a { - position: relative; -} - -.reveal .stretch { - max-width: none; - max-height: none; -} - -.reveal pre.stretch code { - height: 100%; - max-height: 100%; - box-sizing: border-box; -} - - -/********************************************* - * CONTROLS - *********************************************/ - -.reveal .controls { - display: none; - position: fixed; - width: 110px; - height: 110px; - z-index: 30; - right: 10px; - bottom: 10px; - - -webkit-user-select: none; -} - -.reveal .controls button { - padding: 0; - position: absolute; - opacity: 0.05; - width: 0; - height: 0; - background-color: transparent; - border: 12px solid transparent; - transform: scale(.9999); - transition: all 0.2s ease; - -webkit-appearance: none; - -webkit-tap-highlight-color: rgba( 0, 0, 0, 0 ); -} - -.reveal .controls .enabled { - opacity: 0.7; - cursor: pointer; -} - -.reveal .controls .enabled:active { - margin-top: 1px; -} - - .reveal .controls .navigate-left { - top: 42px; - - border-right-width: 22px; - border-right-color: #000; - } - .reveal .controls .navigate-left.fragmented { - opacity: 0.3; - } - - .reveal .controls .navigate-right { - left: 74px; - top: 42px; - - border-left-width: 22px; - border-left-color: #000; - } - .reveal .controls .navigate-right.fragmented { - opacity: 0.3; - } - - .reveal .controls .navigate-up { - left: 42px; - - border-bottom-width: 22px; - border-bottom-color: #000; - } - .reveal .controls .navigate-up.fragmented { - opacity: 0.3; - } - - .reveal .controls .navigate-down { - left: 42px; - top: 74px; - - border-top-width: 22px; - border-top-color: #000; - } - .reveal .controls .navigate-down.fragmented { - opacity: 0.3; - } - - -/********************************************* - * PROGRESS BAR - *********************************************/ - -.reveal .progress { - position: fixed; - display: none; - height: 3px; - width: 100%; - bottom: 0; - left: 0; - z-index: 10; - - background-color: rgba( 0, 0, 0, 0.2 ); -} - .reveal .progress:after { - content: ''; - display: block; - position: absolute; - height: 20px; - width: 100%; - top: -20px; - } - .reveal .progress span { - display: block; - height: 100%; - width: 0px; - - background-color: #000; - transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); - } - -/********************************************* - * SLIDE NUMBER - *********************************************/ - -.reveal .slide-number { - position: fixed; - display: block; - right: 8px; - bottom: 8px; - z-index: 31; - font-family: Helvetica, sans-serif; - font-size: 12px; - line-height: 1; - color: #fff; - background-color: rgba( 0, 0, 0, 0.4 ); - padding: 5px; -} - -.reveal .slide-number-delimiter { - margin: 0 3px; -} - -/********************************************* - * SLIDES - *********************************************/ - -.reveal { - position: relative; - width: 100%; - height: 100%; - overflow: hidden; - touch-action: none; -} - -.reveal .slides { - position: absolute; - width: 100%; - height: 100%; - top: 0; - right: 0; - bottom: 0; - left: 0; - margin: auto; - - overflow: visible; - z-index: 1; - text-align: center; - perspective: 600px; - perspective-origin: 50% 40%; -} - -.reveal .slides>section { - -ms-perspective: 600px; -} - -.reveal .slides>section, -.reveal .slides>section>section { - display: none; - position: absolute; - width: 100%; - padding: 20px 0px; - - z-index: 10; - transform-style: preserve-3d; - transition: transform-origin 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), - transform 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), - visibility 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985), - opacity 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); -} - -/* Global transition speed settings */ -.reveal[data-transition-speed="fast"] .slides section { - transition-duration: 400ms; -} -.reveal[data-transition-speed="slow"] .slides section { - transition-duration: 1200ms; -} - -/* Slide-specific transition speed overrides */ -.reveal .slides section[data-transition-speed="fast"] { - transition-duration: 400ms; -} -.reveal .slides section[data-transition-speed="slow"] { - transition-duration: 1200ms; -} - -.reveal .slides>section.stack { - padding-top: 0; - padding-bottom: 0; -} - -.reveal .slides>section.present, -.reveal .slides>section>section.present { - display: block; - z-index: 11; - opacity: 1; -} - -.reveal.center, -.reveal.center .slides, -.reveal.center .slides section { - min-height: 0 !important; -} - -/* Don't allow interaction with invisible slides */ -.reveal .slides>section.future, -.reveal .slides>section>section.future, -.reveal .slides>section.past, -.reveal .slides>section>section.past { - pointer-events: none; -} - -.reveal.overview .slides>section, -.reveal.overview .slides>section>section { - pointer-events: auto; -} - -.reveal .slides>section.past, -.reveal .slides>section.future, -.reveal .slides>section>section.past, -.reveal .slides>section>section.future { - opacity: 0; -} - - -/********************************************* - * Mixins for readability of transitions - *********************************************/ - -@mixin transition-global($style) { - .reveal .slides section[data-transition=#{$style}], - .reveal.#{$style} .slides section:not([data-transition]) { - @content; - } -} -@mixin transition-horizontal-past($style) { - .reveal .slides>section[data-transition=#{$style}].past, - .reveal .slides>section[data-transition~=#{$style}-out].past, - .reveal.#{$style} .slides>section:not([data-transition]).past { - @content; - } -} -@mixin transition-horizontal-future($style) { - .reveal .slides>section[data-transition=#{$style}].future, - .reveal .slides>section[data-transition~=#{$style}-in].future, - .reveal.#{$style} .slides>section:not([data-transition]).future { - @content; - } -} - -@mixin transition-vertical-past($style) { - .reveal .slides>section>section[data-transition=#{$style}].past, - .reveal .slides>section>section[data-transition~=#{$style}-out].past, - .reveal.#{$style} .slides>section>section:not([data-transition]).past { - @content; - } -} -@mixin transition-vertical-future($style) { - .reveal .slides>section>section[data-transition=#{$style}].future, - .reveal .slides>section>section[data-transition~=#{$style}-in].future, - .reveal.#{$style} .slides>section>section:not([data-transition]).future { - @content; - } -} - -/********************************************* - * SLIDE TRANSITION - * Aliased 'linear' for backwards compatibility - *********************************************/ - -@each $stylename in slide, linear { - .reveal.#{$stylename} section { - backface-visibility: hidden; - } - @include transition-horizontal-past(#{$stylename}) { - transform: translate(-150%, 0); - } - @include transition-horizontal-future(#{$stylename}) { - transform: translate(150%, 0); - } - @include transition-vertical-past(#{$stylename}) { - transform: translate(0, -150%); - } - @include transition-vertical-future(#{$stylename}) { - transform: translate(0, 150%); - } -} - -/********************************************* - * CONVEX TRANSITION - * Aliased 'default' for backwards compatibility - *********************************************/ - -@each $stylename in default, convex { - @include transition-horizontal-past(#{$stylename}) { - transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); - } - @include transition-horizontal-future(#{$stylename}) { - transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); - } - @include transition-vertical-past(#{$stylename}) { - transform: translate3d(0, -300px, 0) rotateX(70deg) translate3d(0, -300px, 0); - } - @include transition-vertical-future(#{$stylename}) { - transform: translate3d(0, 300px, 0) rotateX(-70deg) translate3d(0, 300px, 0); - } -} - -/********************************************* - * CONCAVE TRANSITION - *********************************************/ - -@include transition-horizontal-past(concave) { - transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); -} -@include transition-horizontal-future(concave) { - transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); -} -@include transition-vertical-past(concave) { - transform: translate3d(0, -80%, 0) rotateX(-70deg) translate3d(0, -80%, 0); -} -@include transition-vertical-future(concave) { - transform: translate3d(0, 80%, 0) rotateX(70deg) translate3d(0, 80%, 0); -} - - -/********************************************* - * ZOOM TRANSITION - *********************************************/ - -@include transition-global(zoom) { - transition-timing-function: ease; -} -@include transition-horizontal-past(zoom) { - visibility: hidden; - transform: scale(16); -} -@include transition-horizontal-future(zoom) { - visibility: hidden; - transform: scale(0.2); -} -@include transition-vertical-past(zoom) { - transform: translate(0, -150%); -} -@include transition-vertical-future(zoom) { - transform: translate(0, 150%); -} - - -/********************************************* - * CUBE TRANSITION - *********************************************/ - -.reveal.cube .slides { - perspective: 1300px; -} - -.reveal.cube .slides section { - padding: 30px; - min-height: 700px; - backface-visibility: hidden; - box-sizing: border-box; -} - .reveal.center.cube .slides section { - min-height: 0; - } - .reveal.cube .slides section:not(.stack):before { - content: ''; - position: absolute; - display: block; - width: 100%; - height: 100%; - left: 0; - top: 0; - background: rgba(0,0,0,0.1); - border-radius: 4px; - transform: translateZ( -20px ); - } - .reveal.cube .slides section:not(.stack):after { - content: ''; - position: absolute; - display: block; - width: 90%; - height: 30px; - left: 5%; - bottom: 0; - background: none; - z-index: 1; - - border-radius: 4px; - box-shadow: 0px 95px 25px rgba(0,0,0,0.2); - transform: translateZ(-90px) rotateX( 65deg ); - } - -.reveal.cube .slides>section.stack { - padding: 0; - background: none; -} - -.reveal.cube .slides>section.past { - transform-origin: 100% 0%; - transform: translate3d(-100%, 0, 0) rotateY(-90deg); -} - -.reveal.cube .slides>section.future { - transform-origin: 0% 0%; - transform: translate3d(100%, 0, 0) rotateY(90deg); -} - -.reveal.cube .slides>section>section.past { - transform-origin: 0% 100%; - transform: translate3d(0, -100%, 0) rotateX(90deg); -} - -.reveal.cube .slides>section>section.future { - transform-origin: 0% 0%; - transform: translate3d(0, 100%, 0) rotateX(-90deg); -} - - -/********************************************* - * PAGE TRANSITION - *********************************************/ - -.reveal.page .slides { - perspective-origin: 0% 50%; - perspective: 3000px; -} - -.reveal.page .slides section { - padding: 30px; - min-height: 700px; - box-sizing: border-box; -} - .reveal.page .slides section.past { - z-index: 12; - } - .reveal.page .slides section:not(.stack):before { - content: ''; - position: absolute; - display: block; - width: 100%; - height: 100%; - left: 0; - top: 0; - background: rgba(0,0,0,0.1); - transform: translateZ( -20px ); - } - .reveal.page .slides section:not(.stack):after { - content: ''; - position: absolute; - display: block; - width: 90%; - height: 30px; - left: 5%; - bottom: 0; - background: none; - z-index: 1; - - border-radius: 4px; - box-shadow: 0px 95px 25px rgba(0,0,0,0.2); - - -webkit-transform: translateZ(-90px) rotateX( 65deg ); - } - -.reveal.page .slides>section.stack { - padding: 0; - background: none; -} - -.reveal.page .slides>section.past { - transform-origin: 0% 0%; - transform: translate3d(-40%, 0, 0) rotateY(-80deg); -} - -.reveal.page .slides>section.future { - transform-origin: 100% 0%; - transform: translate3d(0, 0, 0); -} - -.reveal.page .slides>section>section.past { - transform-origin: 0% 0%; - transform: translate3d(0, -40%, 0) rotateX(80deg); -} - -.reveal.page .slides>section>section.future { - transform-origin: 0% 100%; - transform: translate3d(0, 0, 0); -} - - -/********************************************* - * FADE TRANSITION - *********************************************/ - -.reveal .slides section[data-transition=fade], -.reveal.fade .slides section:not([data-transition]), -.reveal.fade .slides>section>section:not([data-transition]) { - transform: none; - transition: opacity 0.5s; -} - - -.reveal.fade.overview .slides section, -.reveal.fade.overview .slides>section>section { - transition: none; -} - - -/********************************************* - * NO TRANSITION - *********************************************/ - -@include transition-global(none) { - transform: none; - transition: none; -} - - -/********************************************* - * PAUSED MODE - *********************************************/ - -.reveal .pause-overlay { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: black; - visibility: hidden; - opacity: 0; - z-index: 100; - transition: all 1s ease; -} -.reveal.paused .pause-overlay { - visibility: visible; - opacity: 1; -} - - -/********************************************* - * FALLBACK - *********************************************/ - -.no-transforms { - overflow-y: auto; -} - -.no-transforms .reveal .slides { - position: relative; - width: 80%; - height: auto !important; - top: 0; - left: 50%; - margin: 0; - text-align: center; -} - -.no-transforms .reveal .controls, -.no-transforms .reveal .progress { - display: none !important; -} - -.no-transforms .reveal .slides section { - display: block !important; - opacity: 1 !important; - position: relative !important; - height: auto; - min-height: 0; - top: 0; - left: -50%; - margin: 70px 0; - transform: none; -} - -.no-transforms .reveal .slides section section { - left: 0; -} - -.reveal .no-transition, -.reveal .no-transition * { - transition: none !important; -} - - -/********************************************* - * PER-SLIDE BACKGROUNDS - *********************************************/ - -.reveal .backgrounds { - position: absolute; - width: 100%; - height: 100%; - top: 0; - left: 0; - perspective: 600px; -} - .reveal .slide-background { - display: none; - position: absolute; - width: 100%; - height: 100%; - opacity: 0; - visibility: hidden; - - background-color: rgba( 0, 0, 0, 0 ); - background-position: 50% 50%; - background-repeat: no-repeat; - background-size: cover; - - transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); - } - - .reveal .slide-background.stack { - display: block; - } - - .reveal .slide-background.present { - opacity: 1; - visibility: visible; - } - - .print-pdf .reveal .slide-background { - opacity: 1 !important; - visibility: visible !important; - } - -/* Video backgrounds */ -.reveal .slide-background video { - position: absolute; - width: 100%; - height: 100%; - max-width: none; - max-height: none; - top: 0; - left: 0; -} - -/* Immediate transition style */ -.reveal[data-background-transition=none]>.backgrounds .slide-background, -.reveal>.backgrounds .slide-background[data-background-transition=none] { - transition: none; -} - -/* Slide */ -.reveal[data-background-transition=slide]>.backgrounds .slide-background, -.reveal>.backgrounds .slide-background[data-background-transition=slide] { - opacity: 1; - backface-visibility: hidden; -} - .reveal[data-background-transition=slide]>.backgrounds .slide-background.past, - .reveal>.backgrounds .slide-background.past[data-background-transition=slide] { - transform: translate(-100%, 0); - } - .reveal[data-background-transition=slide]>.backgrounds .slide-background.future, - .reveal>.backgrounds .slide-background.future[data-background-transition=slide] { - transform: translate(100%, 0); - } - - .reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.past, - .reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=slide] { - transform: translate(0, -100%); - } - .reveal[data-background-transition=slide]>.backgrounds .slide-background>.slide-background.future, - .reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=slide] { - transform: translate(0, 100%); - } - - -/* Convex */ -.reveal[data-background-transition=convex]>.backgrounds .slide-background.past, -.reveal>.backgrounds .slide-background.past[data-background-transition=convex] { - opacity: 0; - transform: translate3d(-100%, 0, 0) rotateY(-90deg) translate3d(-100%, 0, 0); -} -.reveal[data-background-transition=convex]>.backgrounds .slide-background.future, -.reveal>.backgrounds .slide-background.future[data-background-transition=convex] { - opacity: 0; - transform: translate3d(100%, 0, 0) rotateY(90deg) translate3d(100%, 0, 0); -} - -.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.past, -.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=convex] { - opacity: 0; - transform: translate3d(0, -100%, 0) rotateX(90deg) translate3d(0, -100%, 0); -} -.reveal[data-background-transition=convex]>.backgrounds .slide-background>.slide-background.future, -.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=convex] { - opacity: 0; - transform: translate3d(0, 100%, 0) rotateX(-90deg) translate3d(0, 100%, 0); -} - - -/* Concave */ -.reveal[data-background-transition=concave]>.backgrounds .slide-background.past, -.reveal>.backgrounds .slide-background.past[data-background-transition=concave] { - opacity: 0; - transform: translate3d(-100%, 0, 0) rotateY(90deg) translate3d(-100%, 0, 0); -} -.reveal[data-background-transition=concave]>.backgrounds .slide-background.future, -.reveal>.backgrounds .slide-background.future[data-background-transition=concave] { - opacity: 0; - transform: translate3d(100%, 0, 0) rotateY(-90deg) translate3d(100%, 0, 0); -} - -.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.past, -.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=concave] { - opacity: 0; - transform: translate3d(0, -100%, 0) rotateX(-90deg) translate3d(0, -100%, 0); -} -.reveal[data-background-transition=concave]>.backgrounds .slide-background>.slide-background.future, -.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=concave] { - opacity: 0; - transform: translate3d(0, 100%, 0) rotateX(90deg) translate3d(0, 100%, 0); -} - -/* Zoom */ -.reveal[data-background-transition=zoom]>.backgrounds .slide-background, -.reveal>.backgrounds .slide-background[data-background-transition=zoom] { - transition-timing-function: ease; -} - -.reveal[data-background-transition=zoom]>.backgrounds .slide-background.past, -.reveal>.backgrounds .slide-background.past[data-background-transition=zoom] { - opacity: 0; - visibility: hidden; - transform: scale(16); -} -.reveal[data-background-transition=zoom]>.backgrounds .slide-background.future, -.reveal>.backgrounds .slide-background.future[data-background-transition=zoom] { - opacity: 0; - visibility: hidden; - transform: scale(0.2); -} - -.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.past, -.reveal>.backgrounds .slide-background>.slide-background.past[data-background-transition=zoom] { - opacity: 0; - visibility: hidden; - transform: scale(16); -} -.reveal[data-background-transition=zoom]>.backgrounds .slide-background>.slide-background.future, -.reveal>.backgrounds .slide-background>.slide-background.future[data-background-transition=zoom] { - opacity: 0; - visibility: hidden; - transform: scale(0.2); -} - - -/* Global transition speed settings */ -.reveal[data-transition-speed="fast"]>.backgrounds .slide-background { - transition-duration: 400ms; -} -.reveal[data-transition-speed="slow"]>.backgrounds .slide-background { - transition-duration: 1200ms; -} - - -/********************************************* - * OVERVIEW - *********************************************/ - -.reveal.overview { - perspective-origin: 50% 50%; - perspective: 700px; - - .slides section { - height: 700px; - opacity: 1 !important; - overflow: hidden; - visibility: visible !important; - cursor: pointer; - box-sizing: border-box; - } - .slides section:hover, - .slides section.present { - outline: 10px solid rgba(150,150,150,0.4); - outline-offset: 10px; - } - .slides section .fragment { - opacity: 1; - transition: none; - } - .slides section:after, - .slides section:before { - display: none !important; - } - .slides>section.stack { - padding: 0; - top: 0 !important; - background: none; - outline: none; - overflow: visible; - } - - .backgrounds { - perspective: inherit; - } - - .backgrounds .slide-background { - opacity: 1; - visibility: visible; - - // This can't be applied to the slide itself in Safari - outline: 10px solid rgba(150,150,150,0.1); - outline-offset: 10px; - } -} - -// Disable transitions transitions while we're activating -// or deactivating the overview mode. -.reveal.overview .slides section, -.reveal.overview-deactivating .slides section { - transition: none; -} - -.reveal.overview .backgrounds .slide-background, -.reveal.overview-deactivating .backgrounds .slide-background { - transition: none; -} - -.reveal.overview-animated .slides { - transition: transform 0.4s ease; -} - - -/********************************************* - * RTL SUPPORT - *********************************************/ - -.reveal.rtl .slides, -.reveal.rtl .slides h1, -.reveal.rtl .slides h2, -.reveal.rtl .slides h3, -.reveal.rtl .slides h4, -.reveal.rtl .slides h5, -.reveal.rtl .slides h6 { - direction: rtl; - font-family: sans-serif; -} - -.reveal.rtl pre, -.reveal.rtl code { - direction: ltr; -} - -.reveal.rtl ol, -.reveal.rtl ul { - text-align: right; -} - -.reveal.rtl .progress span { - float: right -} - -/********************************************* - * PARALLAX BACKGROUND - *********************************************/ - -.reveal.has-parallax-background .backgrounds { - transition: all 0.8s ease; -} - -/* Global transition speed settings */ -.reveal.has-parallax-background[data-transition-speed="fast"] .backgrounds { - transition-duration: 400ms; -} -.reveal.has-parallax-background[data-transition-speed="slow"] .backgrounds { - transition-duration: 1200ms; -} - - -/********************************************* - * LINK PREVIEW OVERLAY - *********************************************/ - -.reveal .overlay { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 1000; - background: rgba( 0, 0, 0, 0.9 ); - opacity: 0; - visibility: hidden; - transition: all 0.3s ease; -} - .reveal .overlay.visible { - opacity: 1; - visibility: visible; - } - - .reveal .overlay .spinner { - position: absolute; - display: block; - top: 50%; - left: 50%; - width: 32px; - height: 32px; - margin: -16px 0 0 -16px; - z-index: 10; - background-image: url(data:image/gif;base64,R0lGODlhIAAgAPMAAJmZmf%2F%2F%2F6%2Bvr8nJybW1tcDAwOjo6Nvb26ioqKOjo7Ozs%2FLy8vz8%2FAAAAAAAAAAAACH%2FC05FVFNDQVBFMi4wAwEAAAAh%2FhpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh%2BQQJCgAAACwAAAAAIAAgAAAE5xDISWlhperN52JLhSSdRgwVo1ICQZRUsiwHpTJT4iowNS8vyW2icCF6k8HMMBkCEDskxTBDAZwuAkkqIfxIQyhBQBFvAQSDITM5VDW6XNE4KagNh6Bgwe60smQUB3d4Rz1ZBApnFASDd0hihh12BkE9kjAJVlycXIg7CQIFA6SlnJ87paqbSKiKoqusnbMdmDC2tXQlkUhziYtyWTxIfy6BE8WJt5YJvpJivxNaGmLHT0VnOgSYf0dZXS7APdpB309RnHOG5gDqXGLDaC457D1zZ%2FV%2FnmOM82XiHRLYKhKP1oZmADdEAAAh%2BQQJCgAAACwAAAAAIAAgAAAE6hDISWlZpOrNp1lGNRSdRpDUolIGw5RUYhhHukqFu8DsrEyqnWThGvAmhVlteBvojpTDDBUEIFwMFBRAmBkSgOrBFZogCASwBDEY%2FCZSg7GSE0gSCjQBMVG023xWBhklAnoEdhQEfyNqMIcKjhRsjEdnezB%2BA4k8gTwJhFuiW4dokXiloUepBAp5qaKpp6%2BHo7aWW54wl7obvEe0kRuoplCGepwSx2jJvqHEmGt6whJpGpfJCHmOoNHKaHx61WiSR92E4lbFoq%2BB6QDtuetcaBPnW6%2BO7wDHpIiK9SaVK5GgV543tzjgGcghAgAh%2BQQJCgAAACwAAAAAIAAgAAAE7hDISSkxpOrN5zFHNWRdhSiVoVLHspRUMoyUakyEe8PTPCATW9A14E0UvuAKMNAZKYUZCiBMuBakSQKG8G2FzUWox2AUtAQFcBKlVQoLgQReZhQlCIJesQXI5B0CBnUMOxMCenoCfTCEWBsJColTMANldx15BGs8B5wlCZ9Po6OJkwmRpnqkqnuSrayqfKmqpLajoiW5HJq7FL1Gr2mMMcKUMIiJgIemy7xZtJsTmsM4xHiKv5KMCXqfyUCJEonXPN2rAOIAmsfB3uPoAK%2B%2BG%2Bw48edZPK%2BM6hLJpQg484enXIdQFSS1u6UhksENEQAAIfkECQoAAAAsAAAAACAAIAAABOcQyEmpGKLqzWcZRVUQnZYg1aBSh2GUVEIQ2aQOE%2BG%2BcD4ntpWkZQj1JIiZIogDFFyHI0UxQwFugMSOFIPJftfVAEoZLBbcLEFhlQiqGp1Vd140AUklUN3eCA51C1EWMzMCezCBBmkxVIVHBWd3HHl9JQOIJSdSnJ0TDKChCwUJjoWMPaGqDKannasMo6WnM562R5YluZRwur0wpgqZE7NKUm%2BFNRPIhjBJxKZteWuIBMN4zRMIVIhffcgojwCF117i4nlLnY5ztRLsnOk%2BaV%2BoJY7V7m76PdkS4trKcdg0Zc0tTcKkRAAAIfkECQoAAAAsAAAAACAAIAAABO4QyEkpKqjqzScpRaVkXZWQEximw1BSCUEIlDohrft6cpKCk5xid5MNJTaAIkekKGQkWyKHkvhKsR7ARmitkAYDYRIbUQRQjWBwJRzChi9CRlBcY1UN4g0%2FVNB0AlcvcAYHRyZPdEQFYV8ccwR5HWxEJ02YmRMLnJ1xCYp0Y5idpQuhopmmC2KgojKasUQDk5BNAwwMOh2RtRq5uQuPZKGIJQIGwAwGf6I0JXMpC8C7kXWDBINFMxS4DKMAWVWAGYsAdNqW5uaRxkSKJOZKaU3tPOBZ4DuK2LATgJhkPJMgTwKCdFjyPHEnKxFCDhEAACH5BAkKAAAALAAAAAAgACAAAATzEMhJaVKp6s2nIkolIJ2WkBShpkVRWqqQrhLSEu9MZJKK9y1ZrqYK9WiClmvoUaF8gIQSNeF1Er4MNFn4SRSDARWroAIETg1iVwuHjYB1kYc1mwruwXKC9gmsJXliGxc%2BXiUCby9ydh1sOSdMkpMTBpaXBzsfhoc5l58Gm5yToAaZhaOUqjkDgCWNHAULCwOLaTmzswadEqggQwgHuQsHIoZCHQMMQgQGubVEcxOPFAcMDAYUA85eWARmfSRQCdcMe0zeP1AAygwLlJtPNAAL19DARdPzBOWSm1brJBi45soRAWQAAkrQIykShQ9wVhHCwCQCACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiRMDjI0Fd30%2FiI2UA5GSS5UDj2l6NoqgOgN4gksEBgYFf0FDqKgHnyZ9OX8HrgYHdHpcHQULXAS2qKpENRg7eAMLC7kTBaixUYFkKAzWAAnLC7FLVxLWDBLKCwaKTULgEwbLA4hJtOkSBNqITT3xEgfLpBtzE%2FjiuL04RGEBgwWhShRgQExHBAAh%2BQQJCgAAACwAAAAAIAAgAAAE7xDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfZiCqGk5dTESJeaOAlClzsJsqwiJwiqnFrb2nS9kmIcgEsjQydLiIlHehhpejaIjzh9eomSjZR%2BipslWIRLAgMDOR2DOqKogTB9pCUJBagDBXR6XB0EBkIIsaRsGGMMAxoDBgYHTKJiUYEGDAzHC9EACcUGkIgFzgwZ0QsSBcXHiQvOwgDdEwfFs0sDzt4S6BK4xYjkDOzn0unFeBzOBijIm1Dgmg5YFQwsCMjp1oJ8LyIAACH5BAkKAAAALAAAAAAgACAAAATwEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GGl6NoiPOH16iZKNlH6KmyWFOggHhEEvAwwMA0N9GBsEC6amhnVcEwavDAazGwIDaH1ipaYLBUTCGgQDA8NdHz0FpqgTBwsLqAbWAAnIA4FWKdMLGdYGEgraigbT0OITBcg5QwPT4xLrROZL6AuQAPUS7bxLpoWidY0JtxLHKhwwMJBTHgPKdEQAACH5BAkKAAAALAAAAAAgACAAAATrEMhJaVKp6s2nIkqFZF2VIBWhUsJaTokqUCoBq%2BE71SRQeyqUToLA7VxF0JDyIQh%2FMVVPMt1ECZlfcjZJ9mIKoaTl1MRIl5o4CUKXOwmyrCInCKqcWtvadL2SYhyASyNDJ0uIiUd6GAULDJCRiXo1CpGXDJOUjY%2BYip9DhToJA4RBLwMLCwVDfRgbBAaqqoZ1XBMHswsHtxtFaH1iqaoGNgAIxRpbFAgfPQSqpbgGBqUD1wBXeCYp1AYZ19JJOYgH1KwA4UBvQwXUBxPqVD9L3sbp2BNk2xvvFPJd%2BMFCN6HAAIKgNggY0KtEBAAh%2BQQJCgAAACwAAAAAIAAgAAAE6BDISWlSqerNpyJKhWRdlSAVoVLCWk6JKlAqAavhO9UkUHsqlE6CwO1cRdCQ8iEIfzFVTzLdRAmZX3I2SfYIDMaAFdTESJeaEDAIMxYFqrOUaNW4E4ObYcCXaiBVEgULe0NJaxxtYksjh2NLkZISgDgJhHthkpU4mW6blRiYmZOlh4JWkDqILwUGBnE6TYEbCgevr0N1gH4At7gHiRpFaLNrrq8HNgAJA70AWxQIH1%2BvsYMDAzZQPC9VCNkDWUhGkuE5PxJNwiUK4UfLzOlD4WvzAHaoG9nxPi5d%2BjYUqfAhhykOFwJWiAAAIfkECQoAAAAsAAAAACAAIAAABPAQyElpUqnqzaciSoVkXVUMFaFSwlpOCcMYlErAavhOMnNLNo8KsZsMZItJEIDIFSkLGQoQTNhIsFehRww2CQLKF0tYGKYSg%2BygsZIuNqJksKgbfgIGepNo2cIUB3V1B3IvNiBYNQaDSTtfhhx0CwVPI0UJe0%2Bbm4g5VgcGoqOcnjmjqDSdnhgEoamcsZuXO1aWQy8KAwOAuTYYGwi7w5h%2BKr0SJ8MFihpNbx%2B4Erq7BYBuzsdiH1jCAzoSfl0rVirNbRXlBBlLX%2BBP0XJLAPGzTkAuAOqb0WT5AH7OcdCm5B8TgRwSRKIHQtaLCwg1RAAAOwAAAAAAAAAAAA%3D%3D); - - visibility: visible; - opacity: 0.6; - transition: all 0.3s ease; - } - - .reveal .overlay header { - position: absolute; - left: 0; - top: 0; - width: 100%; - height: 40px; - z-index: 2; - border-bottom: 1px solid #222; - } - .reveal .overlay header a { - display: inline-block; - width: 40px; - height: 40px; - padding: 0 10px; - float: right; - opacity: 0.6; - - box-sizing: border-box; - } - .reveal .overlay header a:hover { - opacity: 1; - } - .reveal .overlay header a .icon { - display: inline-block; - width: 20px; - height: 20px; - - background-position: 50% 50%; - background-size: 100%; - background-repeat: no-repeat; - } - .reveal .overlay header a.close .icon { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABkklEQVRYR8WX4VHDMAxG6wnoJrABZQPYBCaBTWAD2g1gE5gg6OOsXuxIlr40d81dfrSJ9V4c2VLK7spHuTJ/5wpM07QXuXc5X0opX2tEJcadjHuV80li/FgxTIEK/5QBCICBD6xEhSMGHgQPgBgLiYVAB1dpSqKDawxTohFw4JSEA3clzgIBPCURwE2JucBR7rhPJJv5OpJwDX+SfDjgx1wACQeJG1aChP9K/IMmdZ8DtESV1WyP3Bt4MwM6sj4NMxMYiqUWHQu4KYA/SYkIjOsm3BXYWMKFDwU2khjCQ4ELJUJ4SmClRArOCmSXGuKma0fYD5CbzHxFpCSGAhfAVSSUGDUk2BWZaff2g6GE15BsBQ9nwmpIGDiyHQddwNTMKkbZaf9fajXQca1EX44puJZUsnY0ObGmITE3GVLCbEhQUjGVt146j6oasWN+49Vph2w1pZ5EansNZqKBm1txbU57iRRcZ86RWMDdWtBJUHBHwoQPi1GV+JCbntmvok7iTX4/Up9mgyTc/FJYDTcndgH/AA5A/CHsyEkVAAAAAElFTkSuQmCC); - } - .reveal .overlay header a.external .icon { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAcElEQVRYR+2WSQoAIQwEzf8f7XiOMkUQxUPlGkM3hVmiQfQR9GYnH1SsAQlI4DiBqkCMoNb9y2e90IAEJPAcgdznU9+engMaeJ7Azh5Y1U67gAho4DqBqmB1buAf0MB1AlVBek83ZPkmJMGc1wAR+AAqod/B97TRpQAAAABJRU5ErkJggg==); - } - - .reveal .overlay .viewport { - position: absolute; - top: 40px; - right: 0; - bottom: 0; - left: 0; - } - - .reveal .overlay.overlay-preview .viewport iframe { - width: 100%; - height: 100%; - max-width: 100%; - max-height: 100%; - border: 0; - - opacity: 0; - visibility: hidden; - transition: all 0.3s ease; - } - - .reveal .overlay.overlay-preview.loaded .viewport iframe { - opacity: 1; - visibility: visible; - } - - .reveal .overlay.overlay-preview.loaded .spinner { - opacity: 0; - visibility: hidden; - transform: scale(0.2); - } - - .reveal .overlay.overlay-help .viewport { - overflow: auto; - color: #fff; - } - - .reveal .overlay.overlay-help .viewport .viewport-inner { - width: 600px; - margin: 0 auto; - padding: 60px; - text-align: center; - letter-spacing: normal; - } - - .reveal .overlay.overlay-help .viewport .viewport-inner .title { - font-size: 20px; - } - - .reveal .overlay.overlay-help .viewport .viewport-inner table { - border: 1px solid #fff; - border-collapse: collapse; - font-size: 14px; - } - - .reveal .overlay.overlay-help .viewport .viewport-inner table th, - .reveal .overlay.overlay-help .viewport .viewport-inner table td { - width: 200px; - padding: 10px; - border: 1px solid #fff; - vertical-align: middle; - } - - .reveal .overlay.overlay-help .viewport .viewport-inner table th { - padding-top: 20px; - padding-bottom: 20px; - } - - - -/********************************************* - * PLAYBACK COMPONENT - *********************************************/ - -.reveal .playback { - position: fixed; - left: 15px; - bottom: 20px; - z-index: 30; - cursor: pointer; - transition: all 400ms ease; -} - -.reveal.overview .playback { - opacity: 0; - visibility: hidden; -} - - -/********************************************* - * ROLLING LINKS - *********************************************/ - -.reveal .roll { - display: inline-block; - line-height: 1.2; - overflow: hidden; - - vertical-align: top; - perspective: 400px; - perspective-origin: 50% 50%; -} - .reveal .roll:hover { - background: none; - text-shadow: none; - } -.reveal .roll span { - display: block; - position: relative; - padding: 0 2px; - - pointer-events: none; - transition: all 400ms ease; - transform-origin: 50% 0%; - transform-style: preserve-3d; - backface-visibility: hidden; -} - .reveal .roll:hover span { - background: rgba(0,0,0,0.5); - transform: translate3d( 0px, 0px, -45px ) rotateX( 90deg ); - } -.reveal .roll span:after { - content: attr(data-title); - - display: block; - position: absolute; - left: 0; - top: 0; - padding: 0 2px; - backface-visibility: hidden; - transform-origin: 50% 0%; - transform: translate3d( 0px, 110%, 0px ) rotateX( -90deg ); -} - - -/********************************************* - * SPEAKER NOTES - *********************************************/ - -// Hide on-page notes -.reveal aside.notes { - display: none; -} - -// An interface element that can optionally be used to show the -// speaker notes to all viewers, on top of the presentation -.reveal .speaker-notes { - display: none; - position: absolute; - width: 70%; - max-height: 15%; - left: 15%; - bottom: 26px; - padding: 10px; - z-index: 1; - font-size: 18px; - line-height: 1.4; - color: #fff; - background-color: rgba(0,0,0,0.5); - overflow: auto; - box-sizing: border-box; - text-align: left; - font-family: Helvetica, sans-serif; - -webkit-overflow-scrolling: touch; -} - -.reveal .speaker-notes.visible:not(:empty) { - display: block; -} - -@media screen and (max-width: 1024px) { - .reveal .speaker-notes { - font-size: 14px; - } -} - -@media screen and (max-width: 600px) { - .reveal .speaker-notes { - width: 90%; - left: 5%; - } -} - - -/********************************************* - * ZOOM PLUGIN - *********************************************/ - -.zoomed .reveal *, -.zoomed .reveal *:before, -.zoomed .reveal *:after { - backface-visibility: visible !important; -} - -.zoomed .reveal .progress, -.zoomed .reveal .controls { - opacity: 0; -} - -.zoomed .reveal .roll span { - background: none; -} - -.zoomed .reveal .roll span:after { - visibility: hidden; -} - - diff --git a/theme/css/theme/README.md b/theme/css/theme/README.md deleted file mode 100644 index 5a6c8fa..0000000 --- a/theme/css/theme/README.md +++ /dev/null @@ -1,21 +0,0 @@ -## Dependencies - -Themes are written using Sass to keep things modular and reduce the need for repeated selectors across files. Make sure that you have the reveal.js development environment including the Grunt dependencies installed before proceding: https://github.com/hakimel/reveal.js#full-setup - -## Creating a Theme - -To create your own theme, start by duplicating a ```.scss``` file in [/css/theme/source](https://github.com/hakimel/reveal.js/blob/master/css/theme/source). It will be automatically compiled by Grunt from Sass to CSS (see the [Gruntfile](https://github.com/hakimel/reveal.js/blob/master/Gruntfile.js)) when you run `grunt css-themes`. - -Each theme file does four things in the following order: - -1. **Include [/css/theme/template/mixins.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/mixins.scss)** -Shared utility functions. - -2. **Include [/css/theme/template/settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss)** -Declares a set of custom variables that the template file (step 4) expects. Can be overridden in step 3. - -3. **Override** -This is where you override the default theme. Either by specifying variables (see [settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss) for reference) or by adding any selectors and styles you please. - -4. **Include [/css/theme/template/theme.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/theme.scss)** -The template theme file which will generate final CSS output based on the currently defined variables. diff --git a/theme/css/theme/beige.css b/theme/css/theme/beige.css deleted file mode 100644 index be18733..0000000 --- a/theme/css/theme/beige.css +++ /dev/null @@ -1,290 +0,0 @@ -/** - * Beige theme for reveal.js. - * - * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se - */ -@import url(../../lib/font/league-gothic/league-gothic.css); -@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); -/********************************************* - * GLOBAL STYLES - *********************************************/ -body { - background: #f7f2d3; - background: -moz-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%); - background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, white), color-stop(100%, #f7f2d3)); - background: -webkit-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%); - background: -o-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%); - background: -ms-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%); - background: radial-gradient(center, circle cover, white 0%, #f7f2d3 100%); - background-color: #f7f3de; } - -.reveal { - font-family: "Lato", sans-serif; - font-size: 36px; - font-weight: normal; - color: #333; } - -::selection { - color: #fff; - background: rgba(79, 64, 28, 0.99); - text-shadow: none; } - -.reveal .slides > section, -.reveal .slides > section > section { - line-height: 1.3; - font-weight: inherit; } - -/********************************************* - * HEADERS - *********************************************/ -.reveal h1, -.reveal h2, -.reveal h3, -.reveal h4, -.reveal h5, -.reveal h6 { - margin: 0 0 20px 0; - color: #333; - font-family: "League Gothic", Impact, sans-serif; - font-weight: normal; - line-height: 1.2; - letter-spacing: normal; - text-transform: uppercase; - text-shadow: none; - word-wrap: break-word; } - -.reveal h1 { - font-size: 3.77em; } - -.reveal h2 { - font-size: 2.11em; } - -.reveal h3 { - font-size: 1.55em; } - -.reveal h4 { - font-size: 1em; } - -.reveal h1 { - text-shadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); } - -/********************************************* - * OTHER - *********************************************/ -.reveal p { - margin: 20px 0; - line-height: 1.3; } - -/* Ensure certain elements are never larger than the slide itself */ -.reveal img, -.reveal video, -.reveal iframe { - max-width: 95%; - max-height: 95%; } - -.reveal strong, -.reveal b { - font-weight: bold; } - -.reveal em { - font-style: italic; } - -.reveal ol, -.reveal dl, -.reveal ul { - display: inline-block; - text-align: left; - margin: 0 0 0 1em; } - -.reveal ol { - list-style-type: decimal; } - -.reveal ul { - list-style-type: disc; } - -.reveal ul ul { - list-style-type: square; } - -.reveal ul ul ul { - list-style-type: circle; } - -.reveal ul ul, -.reveal ul ol, -.reveal ol ol, -.reveal ol ul { - display: block; - margin-left: 40px; } - -.reveal dt { - font-weight: bold; } - -.reveal dd { - margin-left: 40px; } - -.reveal q, -.reveal blockquote { - quotes: none; } - -.reveal blockquote { - display: block; - position: relative; - width: 70%; - margin: 20px auto; - padding: 5px; - font-style: italic; - background: rgba(255, 255, 255, 0.05); - box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } - -.reveal blockquote p:first-child, -.reveal blockquote p:last-child { - display: inline-block; } - -.reveal q { - font-style: italic; } - -.reveal pre { - display: block; - position: relative; - width: 90%; - margin: 20px auto; - text-align: left; - font-size: 0.55em; - font-family: monospace; - line-height: 1.2em; - word-wrap: break-word; - box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } - -.reveal code { - font-family: monospace; } - -.reveal pre code { - display: block; - padding: 5px; - overflow: auto; - max-height: 400px; - word-wrap: normal; } - -.reveal table { - margin: auto; - border-collapse: collapse; - border-spacing: 0; } - -.reveal table th { - font-weight: bold; } - -.reveal table th, -.reveal table td { - text-align: left; - padding: 0.2em 0.5em 0.2em 0.5em; - border-bottom: 1px solid; } - -.reveal table th[align="center"], -.reveal table td[align="center"] { - text-align: center; } - -.reveal table th[align="right"], -.reveal table td[align="right"] { - text-align: right; } - -.reveal table tr:last-child td { - border-bottom: none; } - -.reveal sup { - vertical-align: super; } - -.reveal sub { - vertical-align: sub; } - -.reveal small { - display: inline-block; - font-size: 0.6em; - line-height: 1.2em; - vertical-align: top; } - -.reveal small * { - vertical-align: top; } - -/********************************************* - * LINKS - *********************************************/ -.reveal a { - color: #8b743d; - text-decoration: none; - -webkit-transition: color 0.15s ease; - -moz-transition: color 0.15s ease; - transition: color 0.15s ease; } - -.reveal a:hover { - color: #c0a86e; - text-shadow: none; - border: none; } - -.reveal .roll span:after { - color: #fff; - background: #564826; } - -/********************************************* - * IMAGES - *********************************************/ -.reveal section img { - margin: 15px 0px; - background: rgba(255, 255, 255, 0.12); - border: 4px solid #333; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } - -.reveal section img.plain { - border: 0; - box-shadow: none; } - -.reveal a img { - -webkit-transition: all 0.15s linear; - -moz-transition: all 0.15s linear; - transition: all 0.15s linear; } - -.reveal a:hover img { - background: rgba(255, 255, 255, 0.2); - border-color: #8b743d; - box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } - -/********************************************* - * NAVIGATION CONTROLS - *********************************************/ -.reveal .controls .navigate-left, -.reveal .controls .navigate-left.enabled { - border-right-color: #8b743d; } - -.reveal .controls .navigate-right, -.reveal .controls .navigate-right.enabled { - border-left-color: #8b743d; } - -.reveal .controls .navigate-up, -.reveal .controls .navigate-up.enabled { - border-bottom-color: #8b743d; } - -.reveal .controls .navigate-down, -.reveal .controls .navigate-down.enabled { - border-top-color: #8b743d; } - -.reveal .controls .navigate-left.enabled:hover { - border-right-color: #c0a86e; } - -.reveal .controls .navigate-right.enabled:hover { - border-left-color: #c0a86e; } - -.reveal .controls .navigate-up.enabled:hover { - border-bottom-color: #c0a86e; } - -.reveal .controls .navigate-down.enabled:hover { - border-top-color: #c0a86e; } - -/********************************************* - * PROGRESS BAR - *********************************************/ -.reveal .progress { - background: rgba(0, 0, 0, 0.2); } - -.reveal .progress span { - background: #8b743d; - -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/theme/css/theme/black.css b/theme/css/theme/black.css deleted file mode 100644 index deccc46..0000000 --- a/theme/css/theme/black.css +++ /dev/null @@ -1,286 +0,0 @@ -/** - * Black theme for reveal.js. This is the opposite of the 'white' theme. - * - * By Hakim El Hattab, http://hakim.se - */ -@import url(../../lib/font/source-sans-pro/source-sans-pro.css); -section.has-light-background, section.has-light-background h1, section.has-light-background h2, section.has-light-background h3, section.has-light-background h4, section.has-light-background h5, section.has-light-background h6 { - color: #222; } - -/********************************************* - * GLOBAL STYLES - *********************************************/ -body { - background: #222; - background-color: #222; } - -.reveal { - font-family: "Source Sans Pro", Helvetica, sans-serif; - font-size: 38px; - font-weight: normal; - color: #fff; } - -::selection { - color: #fff; - background: #bee4fd; - text-shadow: none; } - -.reveal .slides > section, -.reveal .slides > section > section { - line-height: 1.3; - font-weight: inherit; } - -/********************************************* - * HEADERS - *********************************************/ -.reveal h1, -.reveal h2, -.reveal h3, -.reveal h4, -.reveal h5, -.reveal h6 { - margin: 0 0 20px 0; - color: #fff; - font-family: "Source Sans Pro", Helvetica, sans-serif; - font-weight: 600; - line-height: 1.2; - letter-spacing: normal; - text-transform: uppercase; - text-shadow: none; - word-wrap: break-word; } - -.reveal h1 { - font-size: 2.5em; } - -.reveal h2 { - font-size: 1.6em; } - -.reveal h3 { - font-size: 1.3em; } - -.reveal h4 { - font-size: 1em; } - -.reveal h1 { - text-shadow: none; } - -/********************************************* - * OTHER - *********************************************/ -.reveal p { - margin: 20px 0; - line-height: 1.3; } - -/* Ensure certain elements are never larger than the slide itself */ -.reveal img, -.reveal video, -.reveal iframe { - max-width: 95%; - max-height: 95%; } - -.reveal strong, -.reveal b { - font-weight: bold; } - -.reveal em { - font-style: italic; } - -.reveal ol, -.reveal dl, -.reveal ul { - display: inline-block; - text-align: left; - margin: 0 0 0 1em; } - -.reveal ol { - list-style-type: decimal; } - -.reveal ul { - list-style-type: disc; } - -.reveal ul ul { - list-style-type: square; } - -.reveal ul ul ul { - list-style-type: circle; } - -.reveal ul ul, -.reveal ul ol, -.reveal ol ol, -.reveal ol ul { - display: block; - margin-left: 40px; } - -.reveal dt { - font-weight: bold; } - -.reveal dd { - margin-left: 40px; } - -.reveal q, -.reveal blockquote { - quotes: none; } - -.reveal blockquote { - display: block; - position: relative; - width: 70%; - margin: 20px auto; - padding: 5px; - font-style: italic; - background: rgba(255, 255, 255, 0.05); - box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } - -.reveal blockquote p:first-child, -.reveal blockquote p:last-child { - display: inline-block; } - -.reveal q { - font-style: italic; } - -.reveal pre { - display: block; - position: relative; - width: 90%; - margin: 20px auto; - text-align: left; - font-size: 0.55em; - font-family: monospace; - line-height: 1.2em; - word-wrap: break-word; - box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } - -.reveal code { - font-family: monospace; } - -.reveal pre code { - display: block; - padding: 5px; - overflow: auto; - max-height: 400px; - word-wrap: normal; } - -.reveal table { - margin: auto; - border-collapse: collapse; - border-spacing: 0; } - -.reveal table th { - font-weight: bold; } - -.reveal table th, -.reveal table td { - text-align: left; - padding: 0.2em 0.5em 0.2em 0.5em; - border-bottom: 1px solid; } - -.reveal table th[align="center"], -.reveal table td[align="center"] { - text-align: center; } - -.reveal table th[align="right"], -.reveal table td[align="right"] { - text-align: right; } - -.reveal table tr:last-child td { - border-bottom: none; } - -.reveal sup { - vertical-align: super; } - -.reveal sub { - vertical-align: sub; } - -.reveal small { - display: inline-block; - font-size: 0.6em; - line-height: 1.2em; - vertical-align: top; } - -.reveal small * { - vertical-align: top; } - -/********************************************* - * LINKS - *********************************************/ -.reveal a { - color: #42affa; - text-decoration: none; - -webkit-transition: color 0.15s ease; - -moz-transition: color 0.15s ease; - transition: color 0.15s ease; } - -.reveal a:hover { - color: #8dcffc; - text-shadow: none; - border: none; } - -.reveal .roll span:after { - color: #fff; - background: #068de9; } - -/********************************************* - * IMAGES - *********************************************/ -.reveal section img { - margin: 15px 0px; - background: rgba(255, 255, 255, 0.12); - border: 4px solid #fff; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } - -.reveal section img.plain { - border: 0; - box-shadow: none; } - -.reveal a img { - -webkit-transition: all 0.15s linear; - -moz-transition: all 0.15s linear; - transition: all 0.15s linear; } - -.reveal a:hover img { - background: rgba(255, 255, 255, 0.2); - border-color: #42affa; - box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } - -/********************************************* - * NAVIGATION CONTROLS - *********************************************/ -.reveal .controls .navigate-left, -.reveal .controls .navigate-left.enabled { - border-right-color: #42affa; } - -.reveal .controls .navigate-right, -.reveal .controls .navigate-right.enabled { - border-left-color: #42affa; } - -.reveal .controls .navigate-up, -.reveal .controls .navigate-up.enabled { - border-bottom-color: #42affa; } - -.reveal .controls .navigate-down, -.reveal .controls .navigate-down.enabled { - border-top-color: #42affa; } - -.reveal .controls .navigate-left.enabled:hover { - border-right-color: #8dcffc; } - -.reveal .controls .navigate-right.enabled:hover { - border-left-color: #8dcffc; } - -.reveal .controls .navigate-up.enabled:hover { - border-bottom-color: #8dcffc; } - -.reveal .controls .navigate-down.enabled:hover { - border-top-color: #8dcffc; } - -/********************************************* - * PROGRESS BAR - *********************************************/ -.reveal .progress { - background: rgba(0, 0, 0, 0.2); } - -.reveal .progress span { - background: #42affa; - -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/theme/css/theme/blood.css b/theme/css/theme/blood.css deleted file mode 100644 index e035ab6..0000000 --- a/theme/css/theme/blood.css +++ /dev/null @@ -1,309 +0,0 @@ -/** - * Blood theme for reveal.js - * Author: Walther http://github.com/Walther - * - * Designed to be used with highlight.js theme - * "monokai_sublime.css" available from - * https://github.com/isagalaev/highlight.js/ - * - * For other themes, change $codeBackground accordingly. - * - */ -@import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic); -/********************************************* - * GLOBAL STYLES - *********************************************/ -body { - background: #222; - background-color: #222; } - -.reveal { - font-family: Ubuntu, "sans-serif"; - font-size: 36px; - font-weight: normal; - color: #eee; } - -::selection { - color: #fff; - background: #a23; - text-shadow: none; } - -.reveal .slides > section, -.reveal .slides > section > section { - line-height: 1.3; - font-weight: inherit; } - -/********************************************* - * HEADERS - *********************************************/ -.reveal h1, -.reveal h2, -.reveal h3, -.reveal h4, -.reveal h5, -.reveal h6 { - margin: 0 0 20px 0; - color: #eee; - font-family: Ubuntu, "sans-serif"; - font-weight: normal; - line-height: 1.2; - letter-spacing: normal; - text-transform: uppercase; - text-shadow: 2px 2px 2px #222; - word-wrap: break-word; } - -.reveal h1 { - font-size: 3.77em; } - -.reveal h2 { - font-size: 2.11em; } - -.reveal h3 { - font-size: 1.55em; } - -.reveal h4 { - font-size: 1em; } - -.reveal h1 { - text-shadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); } - -/********************************************* - * OTHER - *********************************************/ -.reveal p { - margin: 20px 0; - line-height: 1.3; } - -/* Ensure certain elements are never larger than the slide itself */ -.reveal img, -.reveal video, -.reveal iframe { - max-width: 95%; - max-height: 95%; } - -.reveal strong, -.reveal b { - font-weight: bold; } - -.reveal em { - font-style: italic; } - -.reveal ol, -.reveal dl, -.reveal ul { - display: inline-block; - text-align: left; - margin: 0 0 0 1em; } - -.reveal ol { - list-style-type: decimal; } - -.reveal ul { - list-style-type: disc; } - -.reveal ul ul { - list-style-type: square; } - -.reveal ul ul ul { - list-style-type: circle; } - -.reveal ul ul, -.reveal ul ol, -.reveal ol ol, -.reveal ol ul { - display: block; - margin-left: 40px; } - -.reveal dt { - font-weight: bold; } - -.reveal dd { - margin-left: 40px; } - -.reveal q, -.reveal blockquote { - quotes: none; } - -.reveal blockquote { - display: block; - position: relative; - width: 70%; - margin: 20px auto; - padding: 5px; - font-style: italic; - background: rgba(255, 255, 255, 0.05); - box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } - -.reveal blockquote p:first-child, -.reveal blockquote p:last-child { - display: inline-block; } - -.reveal q { - font-style: italic; } - -.reveal pre { - display: block; - position: relative; - width: 90%; - margin: 20px auto; - text-align: left; - font-size: 0.55em; - font-family: monospace; - line-height: 1.2em; - word-wrap: break-word; - box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } - -.reveal code { - font-family: monospace; } - -.reveal pre code { - display: block; - padding: 5px; - overflow: auto; - max-height: 400px; - word-wrap: normal; } - -.reveal table { - margin: auto; - border-collapse: collapse; - border-spacing: 0; } - -.reveal table th { - font-weight: bold; } - -.reveal table th, -.reveal table td { - text-align: left; - padding: 0.2em 0.5em 0.2em 0.5em; - border-bottom: 1px solid; } - -.reveal table th[align="center"], -.reveal table td[align="center"] { - text-align: center; } - -.reveal table th[align="right"], -.reveal table td[align="right"] { - text-align: right; } - -.reveal table tr:last-child td { - border-bottom: none; } - -.reveal sup { - vertical-align: super; } - -.reveal sub { - vertical-align: sub; } - -.reveal small { - display: inline-block; - font-size: 0.6em; - line-height: 1.2em; - vertical-align: top; } - -.reveal small * { - vertical-align: top; } - -/********************************************* - * LINKS - *********************************************/ -.reveal a { - color: #a23; - text-decoration: none; - -webkit-transition: color 0.15s ease; - -moz-transition: color 0.15s ease; - transition: color 0.15s ease; } - -.reveal a:hover { - color: #dd5566; - text-shadow: none; - border: none; } - -.reveal .roll span:after { - color: #fff; - background: #6a1520; } - -/********************************************* - * IMAGES - *********************************************/ -.reveal section img { - margin: 15px 0px; - background: rgba(255, 255, 255, 0.12); - border: 4px solid #eee; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } - -.reveal section img.plain { - border: 0; - box-shadow: none; } - -.reveal a img { - -webkit-transition: all 0.15s linear; - -moz-transition: all 0.15s linear; - transition: all 0.15s linear; } - -.reveal a:hover img { - background: rgba(255, 255, 255, 0.2); - border-color: #a23; - box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } - -/********************************************* - * NAVIGATION CONTROLS - *********************************************/ -.reveal .controls .navigate-left, -.reveal .controls .navigate-left.enabled { - border-right-color: #a23; } - -.reveal .controls .navigate-right, -.reveal .controls .navigate-right.enabled { - border-left-color: #a23; } - -.reveal .controls .navigate-up, -.reveal .controls .navigate-up.enabled { - border-bottom-color: #a23; } - -.reveal .controls .navigate-down, -.reveal .controls .navigate-down.enabled { - border-top-color: #a23; } - -.reveal .controls .navigate-left.enabled:hover { - border-right-color: #dd5566; } - -.reveal .controls .navigate-right.enabled:hover { - border-left-color: #dd5566; } - -.reveal .controls .navigate-up.enabled:hover { - border-bottom-color: #dd5566; } - -.reveal .controls .navigate-down.enabled:hover { - border-top-color: #dd5566; } - -/********************************************* - * PROGRESS BAR - *********************************************/ -.reveal .progress { - background: rgba(0, 0, 0, 0.2); } - -.reveal .progress span { - background: #a23; - -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } - -.reveal p { - font-weight: 300; - text-shadow: 1px 1px #222; } - -.reveal h1, -.reveal h2, -.reveal h3, -.reveal h4, -.reveal h5, -.reveal h6 { - font-weight: 700; } - -.reveal p code { - background-color: #23241f; - display: inline-block; - border-radius: 7px; } - -.reveal small code { - vertical-align: baseline; } diff --git a/theme/css/theme/league.css b/theme/css/theme/league.css deleted file mode 100644 index fa9f53c..0000000 --- a/theme/css/theme/league.css +++ /dev/null @@ -1,292 +0,0 @@ -/** - * League theme for reveal.js. - * - * This was the default theme pre-3.0.0. - * - * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se - */ -@import url(../../lib/font/league-gothic/league-gothic.css); -@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); -/********************************************* - * GLOBAL STYLES - *********************************************/ -body { - background: #1c1e20; - background: -moz-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); - background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #555a5f), color-stop(100%, #1c1e20)); - background: -webkit-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); - background: -o-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); - background: -ms-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); - background: radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); - background-color: #2b2b2b; } - -.reveal { - font-family: "Lato", sans-serif; - font-size: 36px; - font-weight: normal; - color: #eee; } - -::selection { - color: #fff; - background: #FF5E99; - text-shadow: none; } - -.reveal .slides > section, -.reveal .slides > section > section { - line-height: 1.3; - font-weight: inherit; } - -/********************************************* - * HEADERS - *********************************************/ -.reveal h1, -.reveal h2, -.reveal h3, -.reveal h4, -.reveal h5, -.reveal h6 { - margin: 0 0 20px 0; - color: #eee; - font-family: "League Gothic", Impact, sans-serif; - font-weight: normal; - line-height: 1.2; - letter-spacing: normal; - text-transform: uppercase; - text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); - word-wrap: break-word; } - -.reveal h1 { - font-size: 3.77em; } - -.reveal h2 { - font-size: 2.11em; } - -.reveal h3 { - font-size: 1.55em; } - -.reveal h4 { - font-size: 1em; } - -.reveal h1 { - text-shadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); } - -/********************************************* - * OTHER - *********************************************/ -.reveal p { - margin: 20px 0; - line-height: 1.3; } - -/* Ensure certain elements are never larger than the slide itself */ -.reveal img, -.reveal video, -.reveal iframe { - max-width: 95%; - max-height: 95%; } - -.reveal strong, -.reveal b { - font-weight: bold; } - -.reveal em { - font-style: italic; } - -.reveal ol, -.reveal dl, -.reveal ul { - display: inline-block; - text-align: left; - margin: 0 0 0 1em; } - -.reveal ol { - list-style-type: decimal; } - -.reveal ul { - list-style-type: disc; } - -.reveal ul ul { - list-style-type: square; } - -.reveal ul ul ul { - list-style-type: circle; } - -.reveal ul ul, -.reveal ul ol, -.reveal ol ol, -.reveal ol ul { - display: block; - margin-left: 40px; } - -.reveal dt { - font-weight: bold; } - -.reveal dd { - margin-left: 40px; } - -.reveal q, -.reveal blockquote { - quotes: none; } - -.reveal blockquote { - display: block; - position: relative; - width: 70%; - margin: 20px auto; - padding: 5px; - font-style: italic; - background: rgba(255, 255, 255, 0.05); - box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } - -.reveal blockquote p:first-child, -.reveal blockquote p:last-child { - display: inline-block; } - -.reveal q { - font-style: italic; } - -.reveal pre { - display: block; - position: relative; - width: 90%; - margin: 20px auto; - text-align: left; - font-size: 0.55em; - font-family: monospace; - line-height: 1.2em; - word-wrap: break-word; - box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } - -.reveal code { - font-family: monospace; } - -.reveal pre code { - display: block; - padding: 5px; - overflow: auto; - max-height: 400px; - word-wrap: normal; } - -.reveal table { - margin: auto; - border-collapse: collapse; - border-spacing: 0; } - -.reveal table th { - font-weight: bold; } - -.reveal table th, -.reveal table td { - text-align: left; - padding: 0.2em 0.5em 0.2em 0.5em; - border-bottom: 1px solid; } - -.reveal table th[align="center"], -.reveal table td[align="center"] { - text-align: center; } - -.reveal table th[align="right"], -.reveal table td[align="right"] { - text-align: right; } - -.reveal table tr:last-child td { - border-bottom: none; } - -.reveal sup { - vertical-align: super; } - -.reveal sub { - vertical-align: sub; } - -.reveal small { - display: inline-block; - font-size: 0.6em; - line-height: 1.2em; - vertical-align: top; } - -.reveal small * { - vertical-align: top; } - -/********************************************* - * LINKS - *********************************************/ -.reveal a { - color: #13DAEC; - text-decoration: none; - -webkit-transition: color 0.15s ease; - -moz-transition: color 0.15s ease; - transition: color 0.15s ease; } - -.reveal a:hover { - color: #71e9f4; - text-shadow: none; - border: none; } - -.reveal .roll span:after { - color: #fff; - background: #0d99a5; } - -/********************************************* - * IMAGES - *********************************************/ -.reveal section img { - margin: 15px 0px; - background: rgba(255, 255, 255, 0.12); - border: 4px solid #eee; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } - -.reveal section img.plain { - border: 0; - box-shadow: none; } - -.reveal a img { - -webkit-transition: all 0.15s linear; - -moz-transition: all 0.15s linear; - transition: all 0.15s linear; } - -.reveal a:hover img { - background: rgba(255, 255, 255, 0.2); - border-color: #13DAEC; - box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } - -/********************************************* - * NAVIGATION CONTROLS - *********************************************/ -.reveal .controls .navigate-left, -.reveal .controls .navigate-left.enabled { - border-right-color: #13DAEC; } - -.reveal .controls .navigate-right, -.reveal .controls .navigate-right.enabled { - border-left-color: #13DAEC; } - -.reveal .controls .navigate-up, -.reveal .controls .navigate-up.enabled { - border-bottom-color: #13DAEC; } - -.reveal .controls .navigate-down, -.reveal .controls .navigate-down.enabled { - border-top-color: #13DAEC; } - -.reveal .controls .navigate-left.enabled:hover { - border-right-color: #71e9f4; } - -.reveal .controls .navigate-right.enabled:hover { - border-left-color: #71e9f4; } - -.reveal .controls .navigate-up.enabled:hover { - border-bottom-color: #71e9f4; } - -.reveal .controls .navigate-down.enabled:hover { - border-top-color: #71e9f4; } - -/********************************************* - * PROGRESS BAR - *********************************************/ -.reveal .progress { - background: rgba(0, 0, 0, 0.2); } - -.reveal .progress span { - background: #13DAEC; - -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/theme/css/theme/moon.css b/theme/css/theme/moon.css deleted file mode 100644 index b119576..0000000 --- a/theme/css/theme/moon.css +++ /dev/null @@ -1,290 +0,0 @@ -/** - * Solarized Dark theme for reveal.js. - * Author: Achim Staebler - */ -@import url(../../lib/font/league-gothic/league-gothic.css); -@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); -/** - * Solarized colors by Ethan Schoonover - */ -html * { - color-profile: sRGB; - rendering-intent: auto; } - -/********************************************* - * GLOBAL STYLES - *********************************************/ -body { - background: #002b36; - background-color: #002b36; } - -.reveal { - font-family: "Lato", sans-serif; - font-size: 36px; - font-weight: normal; - color: #93a1a1; } - -::selection { - color: #fff; - background: #d33682; - text-shadow: none; } - -.reveal .slides > section, -.reveal .slides > section > section { - line-height: 1.3; - font-weight: inherit; } - -/********************************************* - * HEADERS - *********************************************/ -.reveal h1, -.reveal h2, -.reveal h3, -.reveal h4, -.reveal h5, -.reveal h6 { - margin: 0 0 20px 0; - color: #eee8d5; - font-family: "League Gothic", Impact, sans-serif; - font-weight: normal; - line-height: 1.2; - letter-spacing: normal; - text-transform: uppercase; - text-shadow: none; - word-wrap: break-word; } - -.reveal h1 { - font-size: 3.77em; } - -.reveal h2 { - font-size: 2.11em; } - -.reveal h3 { - font-size: 1.55em; } - -.reveal h4 { - font-size: 1em; } - -.reveal h1 { - text-shadow: none; } - -/********************************************* - * OTHER - *********************************************/ -.reveal p { - margin: 20px 0; - line-height: 1.3; } - -/* Ensure certain elements are never larger than the slide itself */ -.reveal img, -.reveal video, -.reveal iframe { - max-width: 95%; - max-height: 95%; } - -.reveal strong, -.reveal b { - font-weight: bold; } - -.reveal em { - font-style: italic; } - -.reveal ol, -.reveal dl, -.reveal ul { - display: inline-block; - text-align: left; - margin: 0 0 0 1em; } - -.reveal ol { - list-style-type: decimal; } - -.reveal ul { - list-style-type: disc; } - -.reveal ul ul { - list-style-type: square; } - -.reveal ul ul ul { - list-style-type: circle; } - -.reveal ul ul, -.reveal ul ol, -.reveal ol ol, -.reveal ol ul { - display: block; - margin-left: 40px; } - -.reveal dt { - font-weight: bold; } - -.reveal dd { - margin-left: 40px; } - -.reveal q, -.reveal blockquote { - quotes: none; } - -.reveal blockquote { - display: block; - position: relative; - width: 70%; - margin: 20px auto; - padding: 5px; - font-style: italic; - background: rgba(255, 255, 255, 0.05); - box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } - -.reveal blockquote p:first-child, -.reveal blockquote p:last-child { - display: inline-block; } - -.reveal q { - font-style: italic; } - -.reveal pre { - display: block; - position: relative; - width: 90%; - margin: 20px auto; - text-align: left; - font-size: 0.55em; - font-family: monospace; - line-height: 1.2em; - word-wrap: break-word; - box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } - -.reveal code { - font-family: monospace; } - -.reveal pre code { - display: block; - padding: 5px; - overflow: auto; - max-height: 400px; - word-wrap: normal; } - -.reveal table { - margin: auto; - border-collapse: collapse; - border-spacing: 0; } - -.reveal table th { - font-weight: bold; } - -.reveal table th, -.reveal table td { - text-align: left; - padding: 0.2em 0.5em 0.2em 0.5em; - border-bottom: 1px solid; } - -.reveal table th[align="center"], -.reveal table td[align="center"] { - text-align: center; } - -.reveal table th[align="right"], -.reveal table td[align="right"] { - text-align: right; } - -.reveal table tr:last-child td { - border-bottom: none; } - -.reveal sup { - vertical-align: super; } - -.reveal sub { - vertical-align: sub; } - -.reveal small { - display: inline-block; - font-size: 0.6em; - line-height: 1.2em; - vertical-align: top; } - -.reveal small * { - vertical-align: top; } - -/********************************************* - * LINKS - *********************************************/ -.reveal a { - color: #268bd2; - text-decoration: none; - -webkit-transition: color 0.15s ease; - -moz-transition: color 0.15s ease; - transition: color 0.15s ease; } - -.reveal a:hover { - color: #78b9e6; - text-shadow: none; - border: none; } - -.reveal .roll span:after { - color: #fff; - background: #1a6091; } - -/********************************************* - * IMAGES - *********************************************/ -.reveal section img { - margin: 15px 0px; - background: rgba(255, 255, 255, 0.12); - border: 4px solid #93a1a1; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } - -.reveal section img.plain { - border: 0; - box-shadow: none; } - -.reveal a img { - -webkit-transition: all 0.15s linear; - -moz-transition: all 0.15s linear; - transition: all 0.15s linear; } - -.reveal a:hover img { - background: rgba(255, 255, 255, 0.2); - border-color: #268bd2; - box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } - -/********************************************* - * NAVIGATION CONTROLS - *********************************************/ -.reveal .controls .navigate-left, -.reveal .controls .navigate-left.enabled { - border-right-color: #268bd2; } - -.reveal .controls .navigate-right, -.reveal .controls .navigate-right.enabled { - border-left-color: #268bd2; } - -.reveal .controls .navigate-up, -.reveal .controls .navigate-up.enabled { - border-bottom-color: #268bd2; } - -.reveal .controls .navigate-down, -.reveal .controls .navigate-down.enabled { - border-top-color: #268bd2; } - -.reveal .controls .navigate-left.enabled:hover { - border-right-color: #78b9e6; } - -.reveal .controls .navigate-right.enabled:hover { - border-left-color: #78b9e6; } - -.reveal .controls .navigate-up.enabled:hover { - border-bottom-color: #78b9e6; } - -.reveal .controls .navigate-down.enabled:hover { - border-top-color: #78b9e6; } - -/********************************************* - * PROGRESS BAR - *********************************************/ -.reveal .progress { - background: rgba(0, 0, 0, 0.2); } - -.reveal .progress span { - background: #268bd2; - -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/theme/css/theme/night.css b/theme/css/theme/night.css deleted file mode 100644 index 3d0e3c5..0000000 --- a/theme/css/theme/night.css +++ /dev/null @@ -1,284 +0,0 @@ -/** - * Black theme for reveal.js. - * - * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se - */ -@import url(https://fonts.googleapis.com/css?family=Montserrat:700); -@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic); -/********************************************* - * GLOBAL STYLES - *********************************************/ -body { - background: #111; - background-color: #111; } - -.reveal { - font-family: "Open Sans", sans-serif; - font-size: 30px; - font-weight: normal; - color: #eee; } - -::selection { - color: #fff; - background: #e7ad52; - text-shadow: none; } - -.reveal .slides > section, -.reveal .slides > section > section { - line-height: 1.3; - font-weight: inherit; } - -/********************************************* - * HEADERS - *********************************************/ -.reveal h1, -.reveal h2, -.reveal h3, -.reveal h4, -.reveal h5, -.reveal h6 { - margin: 0 0 20px 0; - color: #eee; - font-family: "Montserrat", Impact, sans-serif; - font-weight: normal; - line-height: 1.2; - letter-spacing: -0.03em; - text-transform: none; - text-shadow: none; - word-wrap: break-word; } - -.reveal h1 { - font-size: 3.77em; } - -.reveal h2 { - font-size: 2.11em; } - -.reveal h3 { - font-size: 1.55em; } - -.reveal h4 { - font-size: 1em; } - -.reveal h1 { - text-shadow: none; } - -/********************************************* - * OTHER - *********************************************/ -.reveal p { - margin: 20px 0; - line-height: 1.3; } - -/* Ensure certain elements are never larger than the slide itself */ -.reveal img, -.reveal video, -.reveal iframe { - max-width: 95%; - max-height: 95%; } - -.reveal strong, -.reveal b { - font-weight: bold; } - -.reveal em { - font-style: italic; } - -.reveal ol, -.reveal dl, -.reveal ul { - display: inline-block; - text-align: left; - margin: 0 0 0 1em; } - -.reveal ol { - list-style-type: decimal; } - -.reveal ul { - list-style-type: disc; } - -.reveal ul ul { - list-style-type: square; } - -.reveal ul ul ul { - list-style-type: circle; } - -.reveal ul ul, -.reveal ul ol, -.reveal ol ol, -.reveal ol ul { - display: block; - margin-left: 40px; } - -.reveal dt { - font-weight: bold; } - -.reveal dd { - margin-left: 40px; } - -.reveal q, -.reveal blockquote { - quotes: none; } - -.reveal blockquote { - display: block; - position: relative; - width: 70%; - margin: 20px auto; - padding: 5px; - font-style: italic; - background: rgba(255, 255, 255, 0.05); - box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } - -.reveal blockquote p:first-child, -.reveal blockquote p:last-child { - display: inline-block; } - -.reveal q { - font-style: italic; } - -.reveal pre { - display: block; - position: relative; - width: 90%; - margin: 20px auto; - text-align: left; - font-size: 0.55em; - font-family: monospace; - line-height: 1.2em; - word-wrap: break-word; - box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } - -.reveal code { - font-family: monospace; } - -.reveal pre code { - display: block; - padding: 5px; - overflow: auto; - max-height: 400px; - word-wrap: normal; } - -.reveal table { - margin: auto; - border-collapse: collapse; - border-spacing: 0; } - -.reveal table th { - font-weight: bold; } - -.reveal table th, -.reveal table td { - text-align: left; - padding: 0.2em 0.5em 0.2em 0.5em; - border-bottom: 1px solid; } - -.reveal table th[align="center"], -.reveal table td[align="center"] { - text-align: center; } - -.reveal table th[align="right"], -.reveal table td[align="right"] { - text-align: right; } - -.reveal table tr:last-child td { - border-bottom: none; } - -.reveal sup { - vertical-align: super; } - -.reveal sub { - vertical-align: sub; } - -.reveal small { - display: inline-block; - font-size: 0.6em; - line-height: 1.2em; - vertical-align: top; } - -.reveal small * { - vertical-align: top; } - -/********************************************* - * LINKS - *********************************************/ -.reveal a { - color: #e7ad52; - text-decoration: none; - -webkit-transition: color 0.15s ease; - -moz-transition: color 0.15s ease; - transition: color 0.15s ease; } - -.reveal a:hover { - color: #f3d7ac; - text-shadow: none; - border: none; } - -.reveal .roll span:after { - color: #fff; - background: #d08a1d; } - -/********************************************* - * IMAGES - *********************************************/ -.reveal section img { - margin: 15px 0px; - background: rgba(255, 255, 255, 0.12); - border: 4px solid #eee; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } - -.reveal section img.plain { - border: 0; - box-shadow: none; } - -.reveal a img { - -webkit-transition: all 0.15s linear; - -moz-transition: all 0.15s linear; - transition: all 0.15s linear; } - -.reveal a:hover img { - background: rgba(255, 255, 255, 0.2); - border-color: #e7ad52; - box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } - -/********************************************* - * NAVIGATION CONTROLS - *********************************************/ -.reveal .controls .navigate-left, -.reveal .controls .navigate-left.enabled { - border-right-color: #e7ad52; } - -.reveal .controls .navigate-right, -.reveal .controls .navigate-right.enabled { - border-left-color: #e7ad52; } - -.reveal .controls .navigate-up, -.reveal .controls .navigate-up.enabled { - border-bottom-color: #e7ad52; } - -.reveal .controls .navigate-down, -.reveal .controls .navigate-down.enabled { - border-top-color: #e7ad52; } - -.reveal .controls .navigate-left.enabled:hover { - border-right-color: #f3d7ac; } - -.reveal .controls .navigate-right.enabled:hover { - border-left-color: #f3d7ac; } - -.reveal .controls .navigate-up.enabled:hover { - border-bottom-color: #f3d7ac; } - -.reveal .controls .navigate-down.enabled:hover { - border-top-color: #f3d7ac; } - -/********************************************* - * PROGRESS BAR - *********************************************/ -.reveal .progress { - background: rgba(0, 0, 0, 0.2); } - -.reveal .progress span { - background: #e7ad52; - -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/theme/css/theme/serif.css b/theme/css/theme/serif.css deleted file mode 100644 index 736c0b5..0000000 --- a/theme/css/theme/serif.css +++ /dev/null @@ -1,286 +0,0 @@ -/** - * A simple theme for reveal.js presentations, similar - * to the default theme. The accent color is brown. - * - * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed. - */ -.reveal a { - line-height: 1.3em; } - -/********************************************* - * GLOBAL STYLES - *********************************************/ -body { - background: #F0F1EB; - background-color: #F0F1EB; } - -.reveal { - font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif; - font-size: 36px; - font-weight: normal; - color: #000; } - -::selection { - color: #fff; - background: #26351C; - text-shadow: none; } - -.reveal .slides > section, -.reveal .slides > section > section { - line-height: 1.3; - font-weight: inherit; } - -/********************************************* - * HEADERS - *********************************************/ -.reveal h1, -.reveal h2, -.reveal h3, -.reveal h4, -.reveal h5, -.reveal h6 { - margin: 0 0 20px 0; - color: #383D3D; - font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif; - font-weight: normal; - line-height: 1.2; - letter-spacing: normal; - text-transform: none; - text-shadow: none; - word-wrap: break-word; } - -.reveal h1 { - font-size: 3.77em; } - -.reveal h2 { - font-size: 2.11em; } - -.reveal h3 { - font-size: 1.55em; } - -.reveal h4 { - font-size: 1em; } - -.reveal h1 { - text-shadow: none; } - -/********************************************* - * OTHER - *********************************************/ -.reveal p { - margin: 20px 0; - line-height: 1.3; } - -/* Ensure certain elements are never larger than the slide itself */ -.reveal img, -.reveal video, -.reveal iframe { - max-width: 95%; - max-height: 95%; } - -.reveal strong, -.reveal b { - font-weight: bold; } - -.reveal em { - font-style: italic; } - -.reveal ol, -.reveal dl, -.reveal ul { - display: inline-block; - text-align: left; - margin: 0 0 0 1em; } - -.reveal ol { - list-style-type: decimal; } - -.reveal ul { - list-style-type: disc; } - -.reveal ul ul { - list-style-type: square; } - -.reveal ul ul ul { - list-style-type: circle; } - -.reveal ul ul, -.reveal ul ol, -.reveal ol ol, -.reveal ol ul { - display: block; - margin-left: 40px; } - -.reveal dt { - font-weight: bold; } - -.reveal dd { - margin-left: 40px; } - -.reveal q, -.reveal blockquote { - quotes: none; } - -.reveal blockquote { - display: block; - position: relative; - width: 70%; - margin: 20px auto; - padding: 5px; - font-style: italic; - background: rgba(255, 255, 255, 0.05); - box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } - -.reveal blockquote p:first-child, -.reveal blockquote p:last-child { - display: inline-block; } - -.reveal q { - font-style: italic; } - -.reveal pre { - display: block; - position: relative; - width: 90%; - margin: 20px auto; - text-align: left; - font-size: 0.55em; - font-family: monospace; - line-height: 1.2em; - word-wrap: break-word; - box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } - -.reveal code { - font-family: monospace; } - -.reveal pre code { - display: block; - padding: 5px; - overflow: auto; - max-height: 400px; - word-wrap: normal; } - -.reveal table { - margin: auto; - border-collapse: collapse; - border-spacing: 0; } - -.reveal table th { - font-weight: bold; } - -.reveal table th, -.reveal table td { - text-align: left; - padding: 0.2em 0.5em 0.2em 0.5em; - border-bottom: 1px solid; } - -.reveal table th[align="center"], -.reveal table td[align="center"] { - text-align: center; } - -.reveal table th[align="right"], -.reveal table td[align="right"] { - text-align: right; } - -.reveal table tr:last-child td { - border-bottom: none; } - -.reveal sup { - vertical-align: super; } - -.reveal sub { - vertical-align: sub; } - -.reveal small { - display: inline-block; - font-size: 0.6em; - line-height: 1.2em; - vertical-align: top; } - -.reveal small * { - vertical-align: top; } - -/********************************************* - * LINKS - *********************************************/ -.reveal a { - color: #51483D; - text-decoration: none; - -webkit-transition: color 0.15s ease; - -moz-transition: color 0.15s ease; - transition: color 0.15s ease; } - -.reveal a:hover { - color: #8b7c69; - text-shadow: none; - border: none; } - -.reveal .roll span:after { - color: #fff; - background: #25211c; } - -/********************************************* - * IMAGES - *********************************************/ -.reveal section img { - margin: 15px 0px; - background: rgba(255, 255, 255, 0.12); - border: 4px solid #000; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } - -.reveal section img.plain { - border: 0; - box-shadow: none; } - -.reveal a img { - -webkit-transition: all 0.15s linear; - -moz-transition: all 0.15s linear; - transition: all 0.15s linear; } - -.reveal a:hover img { - background: rgba(255, 255, 255, 0.2); - border-color: #51483D; - box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } - -/********************************************* - * NAVIGATION CONTROLS - *********************************************/ -.reveal .controls .navigate-left, -.reveal .controls .navigate-left.enabled { - border-right-color: #51483D; } - -.reveal .controls .navigate-right, -.reveal .controls .navigate-right.enabled { - border-left-color: #51483D; } - -.reveal .controls .navigate-up, -.reveal .controls .navigate-up.enabled { - border-bottom-color: #51483D; } - -.reveal .controls .navigate-down, -.reveal .controls .navigate-down.enabled { - border-top-color: #51483D; } - -.reveal .controls .navigate-left.enabled:hover { - border-right-color: #8b7c69; } - -.reveal .controls .navigate-right.enabled:hover { - border-left-color: #8b7c69; } - -.reveal .controls .navigate-up.enabled:hover { - border-bottom-color: #8b7c69; } - -.reveal .controls .navigate-down.enabled:hover { - border-top-color: #8b7c69; } - -/********************************************* - * PROGRESS BAR - *********************************************/ -.reveal .progress { - background: rgba(0, 0, 0, 0.2); } - -.reveal .progress span { - background: #51483D; - -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/theme/css/theme/simple.css b/theme/css/theme/simple.css deleted file mode 100644 index 20d919d..0000000 --- a/theme/css/theme/simple.css +++ /dev/null @@ -1,286 +0,0 @@ -/** - * A simple theme for reveal.js presentations, similar - * to the default theme. The accent color is darkblue. - * - * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed. - * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se - */ -@import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700); -@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); -/********************************************* - * GLOBAL STYLES - *********************************************/ -body { - background: #fff; - background-color: #fff; } - -.reveal { - font-family: "Lato", sans-serif; - font-size: 36px; - font-weight: normal; - color: #000; } - -::selection { - color: #fff; - background: rgba(0, 0, 0, 0.99); - text-shadow: none; } - -.reveal .slides > section, -.reveal .slides > section > section { - line-height: 1.3; - font-weight: inherit; } - -/********************************************* - * HEADERS - *********************************************/ -.reveal h1, -.reveal h2, -.reveal h3, -.reveal h4, -.reveal h5, -.reveal h6 { - margin: 0 0 20px 0; - color: #000; - font-family: "News Cycle", Impact, sans-serif; - font-weight: normal; - line-height: 1.2; - letter-spacing: normal; - text-transform: none; - text-shadow: none; - word-wrap: break-word; } - -.reveal h1 { - font-size: 3.77em; } - -.reveal h2 { - font-size: 2.11em; } - -.reveal h3 { - font-size: 1.55em; } - -.reveal h4 { - font-size: 1em; } - -.reveal h1 { - text-shadow: none; } - -/********************************************* - * OTHER - *********************************************/ -.reveal p { - margin: 20px 0; - line-height: 1.3; } - -/* Ensure certain elements are never larger than the slide itself */ -.reveal img, -.reveal video, -.reveal iframe { - max-width: 95%; - max-height: 95%; } - -.reveal strong, -.reveal b { - font-weight: bold; } - -.reveal em { - font-style: italic; } - -.reveal ol, -.reveal dl, -.reveal ul { - display: inline-block; - text-align: left; - margin: 0 0 0 1em; } - -.reveal ol { - list-style-type: decimal; } - -.reveal ul { - list-style-type: disc; } - -.reveal ul ul { - list-style-type: square; } - -.reveal ul ul ul { - list-style-type: circle; } - -.reveal ul ul, -.reveal ul ol, -.reveal ol ol, -.reveal ol ul { - display: block; - margin-left: 40px; } - -.reveal dt { - font-weight: bold; } - -.reveal dd { - margin-left: 40px; } - -.reveal q, -.reveal blockquote { - quotes: none; } - -.reveal blockquote { - display: block; - position: relative; - width: 70%; - margin: 20px auto; - padding: 5px; - font-style: italic; - background: rgba(255, 255, 255, 0.05); - box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } - -.reveal blockquote p:first-child, -.reveal blockquote p:last-child { - display: inline-block; } - -.reveal q { - font-style: italic; } - -.reveal pre { - display: block; - position: relative; - width: 90%; - margin: 20px auto; - text-align: left; - font-size: 0.55em; - font-family: monospace; - line-height: 1.2em; - word-wrap: break-word; - box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } - -.reveal code { - font-family: monospace; } - -.reveal pre code { - display: block; - padding: 5px; - overflow: auto; - max-height: 400px; - word-wrap: normal; } - -.reveal table { - margin: auto; - border-collapse: collapse; - border-spacing: 0; } - -.reveal table th { - font-weight: bold; } - -.reveal table th, -.reveal table td { - text-align: left; - padding: 0.2em 0.5em 0.2em 0.5em; - border-bottom: 1px solid; } - -.reveal table th[align="center"], -.reveal table td[align="center"] { - text-align: center; } - -.reveal table th[align="right"], -.reveal table td[align="right"] { - text-align: right; } - -.reveal table tr:last-child td { - border-bottom: none; } - -.reveal sup { - vertical-align: super; } - -.reveal sub { - vertical-align: sub; } - -.reveal small { - display: inline-block; - font-size: 0.6em; - line-height: 1.2em; - vertical-align: top; } - -.reveal small * { - vertical-align: top; } - -/********************************************* - * LINKS - *********************************************/ -.reveal a { - color: #00008B; - text-decoration: none; - -webkit-transition: color 0.15s ease; - -moz-transition: color 0.15s ease; - transition: color 0.15s ease; } - -.reveal a:hover { - color: #0000f1; - text-shadow: none; - border: none; } - -.reveal .roll span:after { - color: #fff; - background: #00003f; } - -/********************************************* - * IMAGES - *********************************************/ -.reveal section img { - margin: 15px 0px; - background: rgba(255, 255, 255, 0.12); - border: 4px solid #000; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } - -.reveal section img.plain { - border: 0; - box-shadow: none; } - -.reveal a img { - -webkit-transition: all 0.15s linear; - -moz-transition: all 0.15s linear; - transition: all 0.15s linear; } - -.reveal a:hover img { - background: rgba(255, 255, 255, 0.2); - border-color: #00008B; - box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } - -/********************************************* - * NAVIGATION CONTROLS - *********************************************/ -.reveal .controls .navigate-left, -.reveal .controls .navigate-left.enabled { - border-right-color: #00008B; } - -.reveal .controls .navigate-right, -.reveal .controls .navigate-right.enabled { - border-left-color: #00008B; } - -.reveal .controls .navigate-up, -.reveal .controls .navigate-up.enabled { - border-bottom-color: #00008B; } - -.reveal .controls .navigate-down, -.reveal .controls .navigate-down.enabled { - border-top-color: #00008B; } - -.reveal .controls .navigate-left.enabled:hover { - border-right-color: #0000f1; } - -.reveal .controls .navigate-right.enabled:hover { - border-left-color: #0000f1; } - -.reveal .controls .navigate-up.enabled:hover { - border-bottom-color: #0000f1; } - -.reveal .controls .navigate-down.enabled:hover { - border-top-color: #0000f1; } - -/********************************************* - * PROGRESS BAR - *********************************************/ -.reveal .progress { - background: rgba(0, 0, 0, 0.2); } - -.reveal .progress span { - background: #00008B; - -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/theme/css/theme/sky.css b/theme/css/theme/sky.css deleted file mode 100644 index e762a50..0000000 --- a/theme/css/theme/sky.css +++ /dev/null @@ -1,293 +0,0 @@ -/** - * Sky theme for reveal.js. - * - * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se - */ -@import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic); -@import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700); -.reveal a { - line-height: 1.3em; } - -/********************************************* - * GLOBAL STYLES - *********************************************/ -body { - background: #add9e4; - background: -moz-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); - background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #f7fbfc), color-stop(100%, #add9e4)); - background: -webkit-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); - background: -o-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); - background: -ms-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); - background: radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%); - background-color: #f7fbfc; } - -.reveal { - font-family: "Open Sans", sans-serif; - font-size: 36px; - font-weight: normal; - color: #333; } - -::selection { - color: #fff; - background: #134674; - text-shadow: none; } - -.reveal .slides > section, -.reveal .slides > section > section { - line-height: 1.3; - font-weight: inherit; } - -/********************************************* - * HEADERS - *********************************************/ -.reveal h1, -.reveal h2, -.reveal h3, -.reveal h4, -.reveal h5, -.reveal h6 { - margin: 0 0 20px 0; - color: #333; - font-family: "Quicksand", sans-serif; - font-weight: normal; - line-height: 1.2; - letter-spacing: -0.08em; - text-transform: uppercase; - text-shadow: none; - word-wrap: break-word; } - -.reveal h1 { - font-size: 3.77em; } - -.reveal h2 { - font-size: 2.11em; } - -.reveal h3 { - font-size: 1.55em; } - -.reveal h4 { - font-size: 1em; } - -.reveal h1 { - text-shadow: none; } - -/********************************************* - * OTHER - *********************************************/ -.reveal p { - margin: 20px 0; - line-height: 1.3; } - -/* Ensure certain elements are never larger than the slide itself */ -.reveal img, -.reveal video, -.reveal iframe { - max-width: 95%; - max-height: 95%; } - -.reveal strong, -.reveal b { - font-weight: bold; } - -.reveal em { - font-style: italic; } - -.reveal ol, -.reveal dl, -.reveal ul { - display: inline-block; - text-align: left; - margin: 0 0 0 1em; } - -.reveal ol { - list-style-type: decimal; } - -.reveal ul { - list-style-type: disc; } - -.reveal ul ul { - list-style-type: square; } - -.reveal ul ul ul { - list-style-type: circle; } - -.reveal ul ul, -.reveal ul ol, -.reveal ol ol, -.reveal ol ul { - display: block; - margin-left: 40px; } - -.reveal dt { - font-weight: bold; } - -.reveal dd { - margin-left: 40px; } - -.reveal q, -.reveal blockquote { - quotes: none; } - -.reveal blockquote { - display: block; - position: relative; - width: 70%; - margin: 20px auto; - padding: 5px; - font-style: italic; - background: rgba(255, 255, 255, 0.05); - box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } - -.reveal blockquote p:first-child, -.reveal blockquote p:last-child { - display: inline-block; } - -.reveal q { - font-style: italic; } - -.reveal pre { - display: block; - position: relative; - width: 90%; - margin: 20px auto; - text-align: left; - font-size: 0.55em; - font-family: monospace; - line-height: 1.2em; - word-wrap: break-word; - box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } - -.reveal code { - font-family: monospace; } - -.reveal pre code { - display: block; - padding: 5px; - overflow: auto; - max-height: 400px; - word-wrap: normal; } - -.reveal table { - margin: auto; - border-collapse: collapse; - border-spacing: 0; } - -.reveal table th { - font-weight: bold; } - -.reveal table th, -.reveal table td { - text-align: left; - padding: 0.2em 0.5em 0.2em 0.5em; - border-bottom: 1px solid; } - -.reveal table th[align="center"], -.reveal table td[align="center"] { - text-align: center; } - -.reveal table th[align="right"], -.reveal table td[align="right"] { - text-align: right; } - -.reveal table tr:last-child td { - border-bottom: none; } - -.reveal sup { - vertical-align: super; } - -.reveal sub { - vertical-align: sub; } - -.reveal small { - display: inline-block; - font-size: 0.6em; - line-height: 1.2em; - vertical-align: top; } - -.reveal small * { - vertical-align: top; } - -/********************************************* - * LINKS - *********************************************/ -.reveal a { - color: #3b759e; - text-decoration: none; - -webkit-transition: color 0.15s ease; - -moz-transition: color 0.15s ease; - transition: color 0.15s ease; } - -.reveal a:hover { - color: #74a7cb; - text-shadow: none; - border: none; } - -.reveal .roll span:after { - color: #fff; - background: #264c66; } - -/********************************************* - * IMAGES - *********************************************/ -.reveal section img { - margin: 15px 0px; - background: rgba(255, 255, 255, 0.12); - border: 4px solid #333; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } - -.reveal section img.plain { - border: 0; - box-shadow: none; } - -.reveal a img { - -webkit-transition: all 0.15s linear; - -moz-transition: all 0.15s linear; - transition: all 0.15s linear; } - -.reveal a:hover img { - background: rgba(255, 255, 255, 0.2); - border-color: #3b759e; - box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } - -/********************************************* - * NAVIGATION CONTROLS - *********************************************/ -.reveal .controls .navigate-left, -.reveal .controls .navigate-left.enabled { - border-right-color: #3b759e; } - -.reveal .controls .navigate-right, -.reveal .controls .navigate-right.enabled { - border-left-color: #3b759e; } - -.reveal .controls .navigate-up, -.reveal .controls .navigate-up.enabled { - border-bottom-color: #3b759e; } - -.reveal .controls .navigate-down, -.reveal .controls .navigate-down.enabled { - border-top-color: #3b759e; } - -.reveal .controls .navigate-left.enabled:hover { - border-right-color: #74a7cb; } - -.reveal .controls .navigate-right.enabled:hover { - border-left-color: #74a7cb; } - -.reveal .controls .navigate-up.enabled:hover { - border-bottom-color: #74a7cb; } - -.reveal .controls .navigate-down.enabled:hover { - border-top-color: #74a7cb; } - -/********************************************* - * PROGRESS BAR - *********************************************/ -.reveal .progress { - background: rgba(0, 0, 0, 0.2); } - -.reveal .progress span { - background: #3b759e; - -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/theme/css/theme/solarized.css b/theme/css/theme/solarized.css deleted file mode 100644 index 32273ba..0000000 --- a/theme/css/theme/solarized.css +++ /dev/null @@ -1,289 +0,0 @@ -/** - * Solarized Light theme for reveal.js. - * Author: Achim Staebler - */ -@import url(../../lib/font/league-gothic/league-gothic.css); -@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); -/** - * Solarized colors by Ethan Schoonover - */ -html * { - color-profile: sRGB; - rendering-intent: auto; } - -/********************************************* - * GLOBAL STYLES - *********************************************/ -body { - background: #fdf6e3; - background-color: #fdf6e3; } - -.reveal { - font-family: "Lato", sans-serif; - font-size: 36px; - font-weight: normal; - color: #657b83; } - -::selection { - color: #fff; - background: #d33682; - text-shadow: none; } - -.reveal .slides > section, -.reveal .slides > section > section { - line-height: 1.3; - font-weight: inherit; } - -/********************************************* - * HEADERS - *********************************************/ -.reveal h1, -.reveal h2, -.reveal h3, -.reveal h4, -.reveal h5, -.reveal h6 { - margin: 0 0 20px 0; - color: #586e75; - font-family: "League Gothic", Impact, sans-serif; - font-weight: normal; - line-height: 1.2; - letter-spacing: normal; - text-transform: uppercase; - text-shadow: none; - word-wrap: break-word; } - -.reveal h1 { - font-size: 3.77em; } - -.reveal h2 { - font-size: 2.11em; } - -.reveal h3 { - font-size: 1.55em; } - -.reveal h4 { - font-size: 1em; } - -.reveal h1 { - text-shadow: none; } - -/********************************************* - * OTHER - *********************************************/ -.reveal p { - margin: 20px 0; - line-height: 1.3; } - -/* Ensure certain elements are never larger than the slide itself */ -.reveal img, -.reveal video, -.reveal iframe { - max-width: 95%; - max-height: 95%; } - -.reveal strong, -.reveal b { - font-weight: bold; } - -.reveal em { - font-style: italic; } - -.reveal ol, -.reveal dl, -.reveal ul { - display: inline-block; - text-align: left; - margin: 0 0 0 1em; } - -.reveal ol { - list-style-type: decimal; } - -.reveal ul { - list-style-type: disc; } - -.reveal ul ul { - list-style-type: square; } - -.reveal ul ul ul { - list-style-type: circle; } - -.reveal ul ul, -.reveal ul ol, -.reveal ol ol, -.reveal ol ul { - display: block; - margin-left: 40px; } - -.reveal dt { - font-weight: bold; } - -.reveal dd { - margin-left: 40px; } - -.reveal q, -.reveal blockquote { - quotes: none; } - -.reveal blockquote { - display: block; - position: relative; - width: 70%; - margin: 20px auto; - padding: 5px; - font-style: italic; - background: rgba(255, 255, 255, 0.05); - box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } - -.reveal blockquote p:first-child, -.reveal blockquote p:last-child { - display: inline-block; } - -.reveal q { - font-style: italic; } - -.reveal pre { - display: block; - position: relative; - width: 90%; - margin: 20px auto; - text-align: left; - font-size: 0.55em; - font-family: monospace; - line-height: 1.2em; - word-wrap: break-word; - box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } - -.reveal code { - font-family: monospace; } - -.reveal pre code { - display: block; - padding: 5px; - overflow: auto; - max-height: 400px; - word-wrap: normal; } - -.reveal table { - margin: auto; - border-collapse: collapse; - border-spacing: 0; } - -.reveal table th { - font-weight: bold; } - -.reveal table th, -.reveal table td { - text-align: left; - padding: 0.2em 0.5em 0.2em 0.5em; - border-bottom: 1px solid; } - -.reveal table th[align="center"], -.reveal table td[align="center"] { - text-align: center; } - -.reveal table th[align="right"], -.reveal table td[align="right"] { - text-align: right; } - -.reveal table tr:last-child td { - border-bottom: none; } - -.reveal sup { - vertical-align: super; } - -.reveal sub { - vertical-align: sub; } - -.reveal small { - display: inline-block; - font-size: 0.6em; - line-height: 1.2em; - vertical-align: top; } - -.reveal small * { - vertical-align: top; } - -/********************************************* - * LINKS - *********************************************/ -.reveal a { - color: #268bd2; - text-decoration: none; - -webkit-transition: color 0.15s ease; - -moz-transition: color 0.15s ease; - transition: color 0.15s ease; } - -.reveal a:hover { - color: #78b9e6; - text-shadow: none; - border: none; } - -.reveal .roll span:after { - color: #fff; - background: #1a6091; } - -/********************************************* - * IMAGES - *********************************************/ -.reveal section img { - margin: 15px 0px; - background: rgba(255, 255, 255, 0.12); - box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } - -.reveal section img.plain { - border: 0; - box-shadow: none; } - -.reveal a img { - -webkit-transition: all 0.15s linear; - -moz-transition: all 0.15s linear; - transition: all 0.15s linear; } - -.reveal a:hover img { - background: rgba(255, 255, 255, 0.2); - border-color: #268bd2; - box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } - -/********************************************* - * NAVIGATION CONTROLS - *********************************************/ -.reveal .controls .navigate-left, -.reveal .controls .navigate-left.enabled { - border-right-color: #268bd2; } - -.reveal .controls .navigate-right, -.reveal .controls .navigate-right.enabled { - border-left-color: #268bd2; } - -.reveal .controls .navigate-up, -.reveal .controls .navigate-up.enabled { - border-bottom-color: #268bd2; } - -.reveal .controls .navigate-down, -.reveal .controls .navigate-down.enabled { - border-top-color: #268bd2; } - -.reveal .controls .navigate-left.enabled:hover { - border-right-color: #78b9e6; } - -.reveal .controls .navigate-right.enabled:hover { - border-left-color: #78b9e6; } - -.reveal .controls .navigate-up.enabled:hover { - border-bottom-color: #78b9e6; } - -.reveal .controls .navigate-down.enabled:hover { - border-top-color: #78b9e6; } - -/********************************************* - * PROGRESS BAR - *********************************************/ -.reveal .progress { - background: rgba(0, 0, 0, 0.2); } - -.reveal .progress span { - background: #268bd2; - -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/theme/css/theme/source/beige.scss b/theme/css/theme/source/beige.scss deleted file mode 100644 index 5564f53..0000000 --- a/theme/css/theme/source/beige.scss +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Beige theme for reveal.js. - * - * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se - */ - - -// Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - - - -// Include theme-specific fonts -@import url(../../lib/font/league-gothic/league-gothic.css); -@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); - - -// Override theme settings (see ../template/settings.scss) -$mainColor: #333; -$headingColor: #333; -$headingTextShadow: none; -$backgroundColor: #f7f3de; -$linkColor: #8b743d; -$linkColorHover: lighten( $linkColor, 20% ); -$selectionBackgroundColor: rgba(79, 64, 28, 0.99); -$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15); - -// Background generator -@mixin bodyBackground() { - @include radial-gradient( rgba(247,242,211,1), rgba(255,255,255,1) ); -} - - - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- \ No newline at end of file diff --git a/theme/css/theme/source/black.scss b/theme/css/theme/source/black.scss deleted file mode 100644 index 5f7f601..0000000 --- a/theme/css/theme/source/black.scss +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Black theme for reveal.js. This is the opposite of the 'white' theme. - * - * By Hakim El Hattab, http://hakim.se - */ - - -// Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - - -// Include theme-specific fonts -@import url(../../lib/font/source-sans-pro/source-sans-pro.css); - - -// Override theme settings (see ../template/settings.scss) -$backgroundColor: #222; - -$mainColor: #fff; -$headingColor: #fff; - -$mainFontSize: 38px; -$mainFont: 'Source Sans Pro', Helvetica, sans-serif; -$headingFont: 'Source Sans Pro', Helvetica, sans-serif; -$headingTextShadow: none; -$headingLetterSpacing: normal; -$headingTextTransform: uppercase; -$headingFontWeight: 600; -$linkColor: #42affa; -$linkColorHover: lighten( $linkColor, 15% ); -$selectionBackgroundColor: lighten( $linkColor, 25% ); - -$heading1Size: 2.5em; -$heading2Size: 1.6em; -$heading3Size: 1.3em; -$heading4Size: 1.0em; - -section.has-light-background { - &, h1, h2, h3, h4, h5, h6 { - color: #222; - } -} - - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- \ No newline at end of file diff --git a/theme/css/theme/source/blood.scss b/theme/css/theme/source/blood.scss deleted file mode 100644 index d22b53d..0000000 --- a/theme/css/theme/source/blood.scss +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Blood theme for reveal.js - * Author: Walther http://github.com/Walther - * - * Designed to be used with highlight.js theme - * "monokai_sublime.css" available from - * https://github.com/isagalaev/highlight.js/ - * - * For other themes, change $codeBackground accordingly. - * - */ - - // Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - -// Include theme-specific fonts - -@import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic); - -// Colors used in the theme -$blood: #a23; -$coal: #222; -$codeBackground: #23241f; - -$backgroundColor: $coal; - -// Main text -$mainFont: Ubuntu, 'sans-serif'; -$mainFontSize: 36px; -$mainColor: #eee; - -// Headings -$headingFont: Ubuntu, 'sans-serif'; -$headingTextShadow: 2px 2px 2px $coal; - -// h1 shadow, borrowed humbly from -// (c) Default theme by Hakim El Hattab -$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15); - -// Links -$linkColor: $blood; -$linkColorHover: lighten( $linkColor, 20% ); - -// Text selection -$selectionBackgroundColor: $blood; -$selectionColor: #fff; - - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- - -// some overrides after theme template import - -.reveal p { - font-weight: 300; - text-shadow: 1px 1px $coal; -} - -.reveal h1, -.reveal h2, -.reveal h3, -.reveal h4, -.reveal h5, -.reveal h6 { - font-weight: 700; -} - -.reveal p code { - background-color: $codeBackground; - display: inline-block; - border-radius: 7px; -} - -.reveal small code { - vertical-align: baseline; -} \ No newline at end of file diff --git a/theme/css/theme/source/league.scss b/theme/css/theme/source/league.scss deleted file mode 100644 index 46ea04a..0000000 --- a/theme/css/theme/source/league.scss +++ /dev/null @@ -1,34 +0,0 @@ -/** - * League theme for reveal.js. - * - * This was the default theme pre-3.0.0. - * - * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se - */ - - -// Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - - - -// Include theme-specific fonts -@import url(../../lib/font/league-gothic/league-gothic.css); -@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); - -// Override theme settings (see ../template/settings.scss) -$headingTextShadow: 0px 0px 6px rgba(0,0,0,0.2); -$heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15); - -// Background generator -@mixin bodyBackground() { - @include radial-gradient( rgba(28,30,32,1), rgba(85,90,95,1) ); -} - - - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- \ No newline at end of file diff --git a/theme/css/theme/source/moon.scss b/theme/css/theme/source/moon.scss deleted file mode 100644 index e47e5b5..0000000 --- a/theme/css/theme/source/moon.scss +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Solarized Dark theme for reveal.js. - * Author: Achim Staebler - */ - - -// Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - - - -// Include theme-specific fonts -@import url(../../lib/font/league-gothic/league-gothic.css); -@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); - -/** - * Solarized colors by Ethan Schoonover - */ -html * { - color-profile: sRGB; - rendering-intent: auto; -} - -// Solarized colors -$base03: #002b36; -$base02: #073642; -$base01: #586e75; -$base00: #657b83; -$base0: #839496; -$base1: #93a1a1; -$base2: #eee8d5; -$base3: #fdf6e3; -$yellow: #b58900; -$orange: #cb4b16; -$red: #dc322f; -$magenta: #d33682; -$violet: #6c71c4; -$blue: #268bd2; -$cyan: #2aa198; -$green: #859900; - -// Override theme settings (see ../template/settings.scss) -$mainColor: $base1; -$headingColor: $base2; -$headingTextShadow: none; -$backgroundColor: $base03; -$linkColor: $blue; -$linkColorHover: lighten( $linkColor, 20% ); -$selectionBackgroundColor: $magenta; - - - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- diff --git a/theme/css/theme/source/night.scss b/theme/css/theme/source/night.scss deleted file mode 100644 index b0cb57f..0000000 --- a/theme/css/theme/source/night.scss +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Black theme for reveal.js. - * - * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se - */ - - -// Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - - -// Include theme-specific fonts -@import url(https://fonts.googleapis.com/css?family=Montserrat:700); -@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic); - - -// Override theme settings (see ../template/settings.scss) -$backgroundColor: #111; - -$mainFont: 'Open Sans', sans-serif; -$linkColor: #e7ad52; -$linkColorHover: lighten( $linkColor, 20% ); -$headingFont: 'Montserrat', Impact, sans-serif; -$headingTextShadow: none; -$headingLetterSpacing: -0.03em; -$headingTextTransform: none; -$selectionBackgroundColor: #e7ad52; -$mainFontSize: 30px; - - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- \ No newline at end of file diff --git a/theme/css/theme/source/serif.scss b/theme/css/theme/source/serif.scss deleted file mode 100644 index ec3fcb3..0000000 --- a/theme/css/theme/source/serif.scss +++ /dev/null @@ -1,35 +0,0 @@ -/** - * A simple theme for reveal.js presentations, similar - * to the default theme. The accent color is brown. - * - * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed. - */ - - -// Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - - - -// Override theme settings (see ../template/settings.scss) -$mainFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; -$mainColor: #000; -$headingFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; -$headingColor: #383D3D; -$headingTextShadow: none; -$headingTextTransform: none; -$backgroundColor: #F0F1EB; -$linkColor: #51483D; -$linkColorHover: lighten( $linkColor, 20% ); -$selectionBackgroundColor: #26351C; - -.reveal a { - line-height: 1.3em; -} - - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- diff --git a/theme/css/theme/source/simple.scss b/theme/css/theme/source/simple.scss deleted file mode 100644 index 84c7d9b..0000000 --- a/theme/css/theme/source/simple.scss +++ /dev/null @@ -1,38 +0,0 @@ -/** - * A simple theme for reveal.js presentations, similar - * to the default theme. The accent color is darkblue. - * - * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed. - * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se - */ - - -// Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - - - -// Include theme-specific fonts -@import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700); -@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); - - -// Override theme settings (see ../template/settings.scss) -$mainFont: 'Lato', sans-serif; -$mainColor: #000; -$headingFont: 'News Cycle', Impact, sans-serif; -$headingColor: #000; -$headingTextShadow: none; -$headingTextTransform: none; -$backgroundColor: #fff; -$linkColor: #00008B; -$linkColorHover: lighten( $linkColor, 20% ); -$selectionBackgroundColor: rgba(0, 0, 0, 0.99); - - - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- \ No newline at end of file diff --git a/theme/css/theme/source/sky.scss b/theme/css/theme/source/sky.scss deleted file mode 100644 index 3fee67c..0000000 --- a/theme/css/theme/source/sky.scss +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Sky theme for reveal.js. - * - * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se - */ - - -// Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - - - -// Include theme-specific fonts -@import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic); -@import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700); - - -// Override theme settings (see ../template/settings.scss) -$mainFont: 'Open Sans', sans-serif; -$mainColor: #333; -$headingFont: 'Quicksand', sans-serif; -$headingColor: #333; -$headingLetterSpacing: -0.08em; -$headingTextShadow: none; -$backgroundColor: #f7fbfc; -$linkColor: #3b759e; -$linkColorHover: lighten( $linkColor, 20% ); -$selectionBackgroundColor: #134674; - -// Fix links so they are not cut off -.reveal a { - line-height: 1.3em; -} - -// Background generator -@mixin bodyBackground() { - @include radial-gradient( #add9e4, #f7fbfc ); -} - - - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- diff --git a/theme/css/theme/source/solarized.scss b/theme/css/theme/source/solarized.scss deleted file mode 100644 index 912be56..0000000 --- a/theme/css/theme/source/solarized.scss +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Solarized Light theme for reveal.js. - * Author: Achim Staebler - */ - - -// Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - - - -// Include theme-specific fonts -@import url(../../lib/font/league-gothic/league-gothic.css); -@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); - - -/** - * Solarized colors by Ethan Schoonover - */ -html * { - color-profile: sRGB; - rendering-intent: auto; -} - -// Solarized colors -$base03: #002b36; -$base02: #073642; -$base01: #586e75; -$base00: #657b83; -$base0: #839496; -$base1: #93a1a1; -$base2: #eee8d5; -$base3: #fdf6e3; -$yellow: #b58900; -$orange: #cb4b16; -$red: #dc322f; -$magenta: #d33682; -$violet: #6c71c4; -$blue: #268bd2; -$cyan: #2aa198; -$green: #859900; - -// Override theme settings (see ../template/settings.scss) -$mainColor: $base00; -$headingColor: $base01; -$headingTextShadow: none; -$backgroundColor: $base3; -$linkColor: $blue; -$linkColorHover: lighten( $linkColor, 20% ); -$selectionBackgroundColor: $magenta; - -// Background generator -// @mixin bodyBackground() { -// @include radial-gradient( rgba($base3,1), rgba(lighten($base3, 20%),1) ); -// } - - - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- diff --git a/theme/css/theme/source/white.scss b/theme/css/theme/source/white.scss deleted file mode 100644 index 6758ce0..0000000 --- a/theme/css/theme/source/white.scss +++ /dev/null @@ -1,49 +0,0 @@ -/** - * White theme for reveal.js. This is the opposite of the 'black' theme. - * - * By Hakim El Hattab, http://hakim.se - */ - - -// Default mixins and settings ----------------- -@import "../template/mixins"; -@import "../template/settings"; -// --------------------------------------------- - - -// Include theme-specific fonts -@import url(../../lib/font/source-sans-pro/source-sans-pro.css); - - -// Override theme settings (see ../template/settings.scss) -$backgroundColor: #fff; - -$mainColor: #222; -$headingColor: #222; - -$mainFontSize: 38px; -$mainFont: 'Source Sans Pro', Helvetica, sans-serif; -$headingFont: 'Source Sans Pro', Helvetica, sans-serif; -$headingTextShadow: none; -$headingLetterSpacing: normal; -$headingTextTransform: uppercase; -$headingFontWeight: 600; -$linkColor: #2a76dd; -$linkColorHover: lighten( $linkColor, 15% ); -$selectionBackgroundColor: lighten( $linkColor, 25% ); - -$heading1Size: 2.5em; -$heading2Size: 1.6em; -$heading3Size: 1.3em; -$heading4Size: 1.0em; - -section.has-dark-background { - &, h1, h2, h3, h4, h5, h6 { - color: #fff; - } -} - - -// Theme template ------------------------------ -@import "../template/theme"; -// --------------------------------------------- \ No newline at end of file diff --git a/theme/css/theme/template/mixins.scss b/theme/css/theme/template/mixins.scss deleted file mode 100644 index e0c5606..0000000 --- a/theme/css/theme/template/mixins.scss +++ /dev/null @@ -1,29 +0,0 @@ -@mixin vertical-gradient( $top, $bottom ) { - background: $top; - background: -moz-linear-gradient( top, $top 0%, $bottom 100% ); - background: -webkit-gradient( linear, left top, left bottom, color-stop(0%,$top), color-stop(100%,$bottom) ); - background: -webkit-linear-gradient( top, $top 0%, $bottom 100% ); - background: -o-linear-gradient( top, $top 0%, $bottom 100% ); - background: -ms-linear-gradient( top, $top 0%, $bottom 100% ); - background: linear-gradient( top, $top 0%, $bottom 100% ); -} - -@mixin horizontal-gradient( $top, $bottom ) { - background: $top; - background: -moz-linear-gradient( left, $top 0%, $bottom 100% ); - background: -webkit-gradient( linear, left top, right top, color-stop(0%,$top), color-stop(100%,$bottom) ); - background: -webkit-linear-gradient( left, $top 0%, $bottom 100% ); - background: -o-linear-gradient( left, $top 0%, $bottom 100% ); - background: -ms-linear-gradient( left, $top 0%, $bottom 100% ); - background: linear-gradient( left, $top 0%, $bottom 100% ); -} - -@mixin radial-gradient( $outer, $inner, $type: circle ) { - background: $outer; - background: -moz-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); - background: -webkit-gradient( radial, center center, 0px, center center, 100%, color-stop(0%,$inner), color-stop(100%,$outer) ); - background: -webkit-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); - background: -o-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); - background: -ms-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); - background: radial-gradient( center, $type cover, $inner 0%, $outer 100% ); -} \ No newline at end of file diff --git a/theme/css/theme/template/settings.scss b/theme/css/theme/template/settings.scss deleted file mode 100644 index ffaac23..0000000 --- a/theme/css/theme/template/settings.scss +++ /dev/null @@ -1,43 +0,0 @@ -// Base settings for all themes that can optionally be -// overridden by the super-theme - -// Background of the presentation -$backgroundColor: #2b2b2b; - -// Primary/body text -$mainFont: 'Lato', sans-serif; -$mainFontSize: 36px; -$mainColor: #eee; - -// Vertical spacing between blocks of text -$blockMargin: 20px; - -// Headings -$headingMargin: 0 0 $blockMargin 0; -$headingFont: 'League Gothic', Impact, sans-serif; -$headingColor: #eee; -$headingLineHeight: 1.2; -$headingLetterSpacing: normal; -$headingTextTransform: uppercase; -$headingTextShadow: none; -$headingFontWeight: normal; -$heading1TextShadow: $headingTextShadow; - -$heading1Size: 3.77em; -$heading2Size: 2.11em; -$heading3Size: 1.55em; -$heading4Size: 1.00em; - -// Links and actions -$linkColor: #13DAEC; -$linkColorHover: lighten( $linkColor, 20% ); - -// Text selection -$selectionBackgroundColor: #FF5E99; -$selectionColor: #fff; - -// Generates the presentation background, can be overridden -// to return a background image or gradient -@mixin bodyBackground() { - background: $backgroundColor; -} \ No newline at end of file diff --git a/theme/css/theme/template/theme.scss b/theme/css/theme/template/theme.scss deleted file mode 100644 index 9bb416a..0000000 --- a/theme/css/theme/template/theme.scss +++ /dev/null @@ -1,345 +0,0 @@ -// Base theme template for reveal.js - -/********************************************* - * GLOBAL STYLES - *********************************************/ - -body { - @include bodyBackground(); - background-color: $backgroundColor; -} - -.reveal { - font-family: $mainFont; - font-size: $mainFontSize; - font-weight: normal; - color: $mainColor; -} - -::selection { - color: $selectionColor; - background: $selectionBackgroundColor; - text-shadow: none; -} - -.reveal .slides>section, -.reveal .slides>section>section { - line-height: 1.3; - font-weight: inherit; -} - -/********************************************* - * HEADERS - *********************************************/ - -.reveal h1, -.reveal h2, -.reveal h3, -.reveal h4, -.reveal h5, -.reveal h6 { - margin: $headingMargin; - color: $headingColor; - - font-family: $headingFont; - font-weight: $headingFontWeight; - line-height: $headingLineHeight; - letter-spacing: $headingLetterSpacing; - - text-transform: $headingTextTransform; - text-shadow: $headingTextShadow; - - word-wrap: break-word; -} - -.reveal h1 {font-size: $heading1Size; } -.reveal h2 {font-size: $heading2Size; } -.reveal h3 {font-size: $heading3Size; } -.reveal h4 {font-size: $heading4Size; } - -.reveal h1 { - text-shadow: $heading1TextShadow; -} - - -/********************************************* - * OTHER - *********************************************/ - -.reveal p { - margin: $blockMargin 0; - line-height: 1.3; -} - -/* Ensure certain elements are never larger than the slide itself */ -.reveal img, -.reveal video, -.reveal iframe { - max-width: 95%; - max-height: 95%; -} -.reveal strong, -.reveal b { - font-weight: bold; -} - -.reveal em { - font-style: italic; -} - -.reveal ol, -.reveal dl, -.reveal ul { - display: inline-block; - - text-align: left; - margin: 0 0 0 1em; -} - -.reveal ol { - list-style-type: decimal; -} - -.reveal ul { - list-style-type: disc; -} - -.reveal ul ul { - list-style-type: square; -} - -.reveal ul ul ul { - list-style-type: circle; -} - -.reveal ul ul, -.reveal ul ol, -.reveal ol ol, -.reveal ol ul { - display: block; - margin-left: 40px; -} - -.reveal dt { - font-weight: bold; -} - -.reveal dd { - margin-left: 40px; -} - -.reveal q, -.reveal blockquote { - quotes: none; -} - -.reveal blockquote { - display: block; - position: relative; - width: 70%; - margin: $blockMargin auto; - padding: 5px; - - font-style: italic; - background: rgba(255, 255, 255, 0.05); - box-shadow: 0px 0px 2px rgba(0,0,0,0.2); -} - .reveal blockquote p:first-child, - .reveal blockquote p:last-child { - display: inline-block; - } - -.reveal q { - font-style: italic; -} - -.reveal pre { - display: block; - position: relative; - width: 90%; - margin: $blockMargin auto; - - text-align: left; - font-size: 0.55em; - font-family: monospace; - line-height: 1.2em; - - word-wrap: break-word; - - box-shadow: 0px 0px 6px rgba(0,0,0,0.3); -} -.reveal code { - font-family: monospace; -} - -.reveal pre code { - display: block; - padding: 5px; - overflow: auto; - max-height: 400px; - word-wrap: normal; -} - -.reveal table { - margin: auto; - border-collapse: collapse; - border-spacing: 0; -} - -.reveal table th { - font-weight: bold; -} - -.reveal table th, -.reveal table td { - text-align: left; - padding: 0.2em 0.5em 0.2em 0.5em; - border-bottom: 1px solid; -} - -.reveal table th[align="center"], -.reveal table td[align="center"] { - text-align: center; -} - -.reveal table th[align="right"], -.reveal table td[align="right"] { - text-align: right; -} - -.reveal table tr:last-child td { - border-bottom: none; -} - -.reveal sup { - vertical-align: super; -} -.reveal sub { - vertical-align: sub; -} - -.reveal small { - display: inline-block; - font-size: 0.6em; - line-height: 1.2em; - vertical-align: top; -} - -.reveal small * { - vertical-align: top; -} - - -/********************************************* - * LINKS - *********************************************/ - -.reveal a { - color: $linkColor; - text-decoration: none; - - -webkit-transition: color .15s ease; - -moz-transition: color .15s ease; - transition: color .15s ease; -} - .reveal a:hover { - color: $linkColorHover; - - text-shadow: none; - border: none; - } - -.reveal .roll span:after { - color: #fff; - background: darken( $linkColor, 15% ); -} - - -/********************************************* - * IMAGES - *********************************************/ - -.reveal section img { - margin: 15px 0px; - background: rgba(255,255,255,0.12); - border: 4px solid $mainColor; - - box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); -} - - .reveal section img.plain { - border: 0; - box-shadow: none; - } - - .reveal a img { - -webkit-transition: all .15s linear; - -moz-transition: all .15s linear; - transition: all .15s linear; - } - - .reveal a:hover img { - background: rgba(255,255,255,0.2); - border-color: $linkColor; - - box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); - } - - -/********************************************* - * NAVIGATION CONTROLS - *********************************************/ - -.reveal .controls .navigate-left, -.reveal .controls .navigate-left.enabled { - border-right-color: $linkColor; -} - -.reveal .controls .navigate-right, -.reveal .controls .navigate-right.enabled { - border-left-color: $linkColor; -} - -.reveal .controls .navigate-up, -.reveal .controls .navigate-up.enabled { - border-bottom-color: $linkColor; -} - -.reveal .controls .navigate-down, -.reveal .controls .navigate-down.enabled { - border-top-color: $linkColor; -} - -.reveal .controls .navigate-left.enabled:hover { - border-right-color: $linkColorHover; -} - -.reveal .controls .navigate-right.enabled:hover { - border-left-color: $linkColorHover; -} - -.reveal .controls .navigate-up.enabled:hover { - border-bottom-color: $linkColorHover; -} - -.reveal .controls .navigate-down.enabled:hover { - border-top-color: $linkColorHover; -} - - -/********************************************* - * PROGRESS BAR - *********************************************/ - -.reveal .progress { - background: rgba(0,0,0,0.2); -} - .reveal .progress span { - background: $linkColor; - - -webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); - -moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); - transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); - } - - diff --git a/theme/css/theme/white.css b/theme/css/theme/white.css deleted file mode 100644 index 14e1703..0000000 --- a/theme/css/theme/white.css +++ /dev/null @@ -1,286 +0,0 @@ -/** - * White theme for reveal.js. This is the opposite of the 'black' theme. - * - * By Hakim El Hattab, http://hakim.se - */ -@import url(../../lib/font/source-sans-pro/source-sans-pro.css); -section.has-dark-background, section.has-dark-background h1, section.has-dark-background h2, section.has-dark-background h3, section.has-dark-background h4, section.has-dark-background h5, section.has-dark-background h6 { - color: #fff; } - -/********************************************* - * GLOBAL STYLES - *********************************************/ -body { - background: #fff; - background-color: #fff; } - -.reveal { - font-family: "Source Sans Pro", Helvetica, sans-serif; - font-size: 38px; - font-weight: normal; - color: #222; } - -::selection { - color: #fff; - background: #98bdef; - text-shadow: none; } - -.reveal .slides > section, -.reveal .slides > section > section { - line-height: 1.3; - font-weight: inherit; } - -/********************************************* - * HEADERS - *********************************************/ -.reveal h1, -.reveal h2, -.reveal h3, -.reveal h4, -.reveal h5, -.reveal h6 { - margin: 0 0 20px 0; - color: #222; - font-family: "Source Sans Pro", Helvetica, sans-serif; - font-weight: 600; - line-height: 1.2; - letter-spacing: normal; - text-transform: uppercase; - text-shadow: none; - word-wrap: break-word; } - -.reveal h1 { - font-size: 2.5em; } - -.reveal h2 { - font-size: 1.6em; } - -.reveal h3 { - font-size: 1.3em; } - -.reveal h4 { - font-size: 1em; } - -.reveal h1 { - text-shadow: none; } - -/********************************************* - * OTHER - *********************************************/ -.reveal p { - margin: 20px 0; - line-height: 1.3; } - -/* Ensure certain elements are never larger than the slide itself */ -.reveal img, -.reveal video, -.reveal iframe { - max-width: 95%; - max-height: 95%; } - -.reveal strong, -.reveal b { - font-weight: bold; } - -.reveal em { - font-style: italic; } - -.reveal ol, -.reveal dl, -.reveal ul { - display: inline-block; - text-align: left; - margin: 0 0 0 1em; } - -.reveal ol { - list-style-type: decimal; } - -.reveal ul { - list-style-type: disc; } - -.reveal ul ul { - list-style-type: square; } - -.reveal ul ul ul { - list-style-type: circle; } - -.reveal ul ul, -.reveal ul ol, -.reveal ol ol, -.reveal ol ul { - display: block; - margin-left: 40px; } - -.reveal dt { - font-weight: bold; } - -.reveal dd { - margin-left: 40px; } - -.reveal q, -.reveal blockquote { - quotes: none; } - -.reveal blockquote { - display: block; - position: relative; - width: 70%; - margin: 20px auto; - padding: 5px; - font-style: italic; - background: rgba(255, 255, 255, 0.05); - box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2); } - -.reveal blockquote p:first-child, -.reveal blockquote p:last-child { - display: inline-block; } - -.reveal q { - font-style: italic; } - -.reveal pre { - display: block; - position: relative; - width: 90%; - margin: 20px auto; - text-align: left; - font-size: 0.55em; - font-family: monospace; - line-height: 1.2em; - word-wrap: break-word; - box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); } - -.reveal code { - font-family: monospace; } - -.reveal pre code { - display: block; - padding: 5px; - overflow: auto; - max-height: 400px; - word-wrap: normal; } - -.reveal table { - margin: auto; - border-collapse: collapse; - border-spacing: 0; } - -.reveal table th { - font-weight: bold; } - -.reveal table th, -.reveal table td { - text-align: left; - padding: 0.2em 0.5em 0.2em 0.5em; - border-bottom: 1px solid; } - -.reveal table th[align="center"], -.reveal table td[align="center"] { - text-align: center; } - -.reveal table th[align="right"], -.reveal table td[align="right"] { - text-align: right; } - -.reveal table tr:last-child td { - border-bottom: none; } - -.reveal sup { - vertical-align: super; } - -.reveal sub { - vertical-align: sub; } - -.reveal small { - display: inline-block; - font-size: 0.6em; - line-height: 1.2em; - vertical-align: top; } - -.reveal small * { - vertical-align: top; } - -/********************************************* - * LINKS - *********************************************/ -.reveal a { - color: #2a76dd; - text-decoration: none; - -webkit-transition: color 0.15s ease; - -moz-transition: color 0.15s ease; - transition: color 0.15s ease; } - -.reveal a:hover { - color: #6ca0e8; - text-shadow: none; - border: none; } - -.reveal .roll span:after { - color: #fff; - background: #1a53a1; } - -/********************************************* - * IMAGES - *********************************************/ -.reveal section img { - margin: 15px 0px; - background: rgba(255, 255, 255, 0.12); - border: 4px solid #222; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } - -.reveal section img.plain { - border: 0; - box-shadow: none; } - -.reveal a img { - -webkit-transition: all 0.15s linear; - -moz-transition: all 0.15s linear; - transition: all 0.15s linear; } - -.reveal a:hover img { - background: rgba(255, 255, 255, 0.2); - border-color: #2a76dd; - box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); } - -/********************************************* - * NAVIGATION CONTROLS - *********************************************/ -.reveal .controls .navigate-left, -.reveal .controls .navigate-left.enabled { - border-right-color: #2a76dd; } - -.reveal .controls .navigate-right, -.reveal .controls .navigate-right.enabled { - border-left-color: #2a76dd; } - -.reveal .controls .navigate-up, -.reveal .controls .navigate-up.enabled { - border-bottom-color: #2a76dd; } - -.reveal .controls .navigate-down, -.reveal .controls .navigate-down.enabled { - border-top-color: #2a76dd; } - -.reveal .controls .navigate-left.enabled:hover { - border-right-color: #6ca0e8; } - -.reveal .controls .navigate-right.enabled:hover { - border-left-color: #6ca0e8; } - -.reveal .controls .navigate-up.enabled:hover { - border-bottom-color: #6ca0e8; } - -.reveal .controls .navigate-down.enabled:hover { - border-top-color: #6ca0e8; } - -/********************************************* - * PROGRESS BAR - *********************************************/ -.reveal .progress { - background: rgba(0, 0, 0, 0.2); } - -.reveal .progress span { - background: #2a76dd; - -webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - -moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); - transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); } diff --git a/theme/js/reveal.js b/theme/js/reveal.js deleted file mode 100644 index 2c92954..0000000 --- a/theme/js/reveal.js +++ /dev/null @@ -1,4677 +0,0 @@ -/*! - * reveal.js - * http://lab.hakim.se/reveal-js - * MIT licensed - * - * Copyright (C) 2016 Hakim El Hattab, http://hakim.se - */ -(function( root, factory ) { - if( typeof define === 'function' && define.amd ) { - // AMD. Register as an anonymous module. - define( function() { - root.Reveal = factory(); - return root.Reveal; - } ); - } else if( typeof exports === 'object' ) { - // Node. Does not work with strict CommonJS. - module.exports = factory(); - } else { - // Browser globals. - root.Reveal = factory(); - } -}( this, function() { - - 'use strict'; - - var Reveal; - - var SLIDES_SELECTOR = '.slides section', - HORIZONTAL_SLIDES_SELECTOR = '.slides>section', - VERTICAL_SLIDES_SELECTOR = '.slides>section.present>section', - HOME_SLIDE_SELECTOR = '.slides>section:first-of-type', - - // Configuration defaults, can be overridden at initialization time - config = { - - // The "normal" size of the presentation, aspect ratio will be preserved - // when the presentation is scaled to fit different resolutions - width: 960, - height: 700, - - // Factor of the display size that should remain empty around the content - margin: 0.1, - - // Bounds for smallest/largest possible scale to apply to content - minScale: 0.2, - maxScale: 1.5, - - // Display controls in the bottom right corner - controls: true, - - // Display a presentation progress bar - progress: true, - - // Display the page number of the current slide - slideNumber: false, - - // Push each slide change to the browser history - history: false, - - // Enable keyboard shortcuts for navigation - keyboard: true, - - // Optional function that blocks keyboard events when retuning false - keyboardCondition: null, - - // Enable the slide overview mode - overview: true, - - // Vertical centering of slides - center: true, - - // Enables touch navigation on devices with touch input - touch: true, - - // Loop the presentation - loop: false, - - // Change the presentation direction to be RTL - rtl: false, - - // Turns fragments on and off globally - fragments: true, - - // Flags if the presentation is running in an embedded mode, - // i.e. contained within a limited portion of the screen - embedded: false, - - // Flags if we should show a help overlay when the questionmark - // key is pressed - help: true, - - // Flags if it should be possible to pause the presentation (blackout) - pause: true, - - // Flags if speaker notes should be visible to all viewers - showNotes: false, - - // Number of milliseconds between automatically proceeding to the - // next slide, disabled when set to 0, this value can be overwritten - // by using a data-autoslide attribute on your slides - autoSlide: 0, - - // Stop auto-sliding after user input - autoSlideStoppable: true, - - // Enable slide navigation via mouse wheel - mouseWheel: false, - - // Apply a 3D roll to links on hover - rollingLinks: false, - - // Hides the address bar on mobile devices - hideAddressBar: true, - - // Opens links in an iframe preview overlay - previewLinks: false, - - // Exposes the reveal.js API through window.postMessage - postMessage: true, - - // Dispatches all reveal.js events to the parent window through postMessage - postMessageEvents: false, - - // Focuses body when page changes visiblity to ensure keyboard shortcuts work - focusBodyOnPageVisibilityChange: true, - - // Transition style - transition: 'slide', // none/fade/slide/convex/concave/zoom - - // Transition speed - transitionSpeed: 'default', // default/fast/slow - - // Transition style for full page slide backgrounds - backgroundTransition: 'fade', // none/fade/slide/convex/concave/zoom - - // Parallax background image - parallaxBackgroundImage: '', // CSS syntax, e.g. "a.jpg" - - // Parallax background size - parallaxBackgroundSize: '', // CSS syntax, e.g. "3000px 2000px" - - // Amount of pixels to move the parallax background per slide step - parallaxBackgroundHorizontal: null, - parallaxBackgroundVertical: null, - - // Number of slides away from the current that are visible - viewDistance: 3, - - // Script dependencies to load - dependencies: [] - - }, - - // Flags if reveal.js is loaded (has dispatched the 'ready' event) - loaded = false, - - // Flags if the overview mode is currently active - overview = false, - - // The horizontal and vertical index of the currently active slide - indexh, - indexv, - - // The previous and current slide HTML elements - previousSlide, - currentSlide, - - previousBackground, - - // Slides may hold a data-state attribute which we pick up and apply - // as a class to the body. This list contains the combined state of - // all current slides. - state = [], - - // The current scale of the presentation (see width/height config) - scale = 1, - - // CSS transform that is currently applied to the slides container, - // split into two groups - slidesTransform = { layout: '', overview: '' }, - - // Cached references to DOM elements - dom = {}, - - // Features supported by the browser, see #checkCapabilities() - features = {}, - - // Client is a mobile device, see #checkCapabilities() - isMobileDevice, - - // Throttles mouse wheel navigation - lastMouseWheelStep = 0, - - // Delays updates to the URL due to a Chrome thumbnailer bug - writeURLTimeout = 0, - - // Flags if the interaction event listeners are bound - eventsAreBound = false, - - // The current auto-slide duration - autoSlide = 0, - - // Auto slide properties - autoSlidePlayer, - autoSlideTimeout = 0, - autoSlideStartTime = -1, - autoSlidePaused = false, - - // Holds information about the currently ongoing touch input - touch = { - startX: 0, - startY: 0, - startSpan: 0, - startCount: 0, - captured: false, - threshold: 40 - }, - - // Holds information about the keyboard shortcuts - keyboardShortcuts = { - 'N , SPACE': 'Next slide', - 'P': 'Previous slide', - '← , H': 'Navigate left', - '→ , L': 'Navigate right', - '↑ , K': 'Navigate up', - '↓ , J': 'Navigate down', - 'Home': 'First slide', - 'End': 'Last slide', - 'B , .': 'Pause', - 'F': 'Fullscreen', - 'ESC, O': 'Slide overview' - }; - - /** - * Starts up the presentation if the client is capable. - */ - function initialize( options ) { - - checkCapabilities(); - - if( !features.transforms2d && !features.transforms3d ) { - document.body.setAttribute( 'class', 'no-transforms' ); - - // Since JS won't be running any further, we load all lazy - // loading elements upfront - var images = toArray( document.getElementsByTagName( 'img' ) ), - iframes = toArray( document.getElementsByTagName( 'iframe' ) ); - - var lazyLoadable = images.concat( iframes ); - - for( var i = 0, len = lazyLoadable.length; i < len; i++ ) { - var element = lazyLoadable[i]; - if( element.getAttribute( 'data-src' ) ) { - element.setAttribute( 'src', element.getAttribute( 'data-src' ) ); - element.removeAttribute( 'data-src' ); - } - } - - // If the browser doesn't support core features we won't be - // using JavaScript to control the presentation - return; - } - - // Cache references to key DOM elements - dom.wrapper = document.querySelector( '.reveal' ); - dom.slides = document.querySelector( '.reveal .slides' ); - - // Force a layout when the whole page, incl fonts, has loaded - window.addEventListener( 'load', layout, false ); - - var query = Reveal.getQueryHash(); - - // Do not accept new dependencies via query config to avoid - // the potential of malicious script injection - if( typeof query['dependencies'] !== 'undefined' ) delete query['dependencies']; - - // Copy options over to our config object - extend( config, options ); - extend( config, query ); - - // Hide the address bar in mobile browsers - hideAddressBar(); - - // Loads the dependencies and continues to #start() once done - load(); - - } - - /** - * Inspect the client to see what it's capable of, this - * should only happens once per runtime. - */ - function checkCapabilities() { - - features.transforms3d = 'WebkitPerspective' in document.body.style || - 'MozPerspective' in document.body.style || - 'msPerspective' in document.body.style || - 'OPerspective' in document.body.style || - 'perspective' in document.body.style; - - features.transforms2d = 'WebkitTransform' in document.body.style || - 'MozTransform' in document.body.style || - 'msTransform' in document.body.style || - 'OTransform' in document.body.style || - 'transform' in document.body.style; - - features.requestAnimationFrameMethod = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame; - features.requestAnimationFrame = typeof features.requestAnimationFrameMethod === 'function'; - - features.canvas = !!document.createElement( 'canvas' ).getContext; - - features.touch = !!( 'ontouchstart' in window ); - - // Transitions in the overview are disabled in desktop and - // mobile Safari due to lag - features.overviewTransitions = !/Version\/[\d\.]+.*Safari/.test( navigator.userAgent ); - - isMobileDevice = /(iphone|ipod|ipad|android)/gi.test( navigator.userAgent ); - - } - - /** - * Loads the dependencies of reveal.js. Dependencies are - * defined via the configuration option 'dependencies' - * and will be loaded prior to starting/binding reveal.js. - * Some dependencies may have an 'async' flag, if so they - * will load after reveal.js has been started up. - */ - function load() { - - var scripts = [], - scriptsAsync = [], - scriptsToPreload = 0; - - // Called once synchronous scripts finish loading - function proceed() { - if( scriptsAsync.length ) { - // Load asynchronous scripts - head.js.apply( null, scriptsAsync ); - } - - start(); - } - - function loadScript( s ) { - head.ready( s.src.match( /([\w\d_\-]*)\.?js$|[^\\\/]*$/i )[0], function() { - // Extension may contain callback functions - if( typeof s.callback === 'function' ) { - s.callback.apply( this ); - } - - if( --scriptsToPreload === 0 ) { - proceed(); - } - }); - } - - for( var i = 0, len = config.dependencies.length; i < len; i++ ) { - var s = config.dependencies[i]; - - // Load if there's no condition or the condition is truthy - if( !s.condition || s.condition() ) { - if( s.async ) { - scriptsAsync.push( s.src ); - } - else { - scripts.push( s.src ); - } - - loadScript( s ); - } - } - - if( scripts.length ) { - scriptsToPreload = scripts.length; - - // Load synchronous scripts - head.js.apply( null, scripts ); - } - else { - proceed(); - } - - } - - /** - * Starts up reveal.js by binding input events and navigating - * to the current URL deeplink if there is one. - */ - function start() { - - // Make sure we've got all the DOM elements we need - setupDOM(); - - // Listen to messages posted to this window - setupPostMessage(); - - // Prevent iframes from scrolling the slides out of view - setupIframeScrollPrevention(); - - // Resets all vertical slides so that only the first is visible - resetVerticalSlides(); - - // Updates the presentation to match the current configuration values - configure(); - - // Read the initial hash - readURL(); - - // Update all backgrounds - updateBackground( true ); - - // Notify listeners that the presentation is ready but use a 1ms - // timeout to ensure it's not fired synchronously after #initialize() - setTimeout( function() { - // Enable transitions now that we're loaded - dom.slides.classList.remove( 'no-transition' ); - - loaded = true; - - dispatchEvent( 'ready', { - 'indexh': indexh, - 'indexv': indexv, - 'currentSlide': currentSlide - } ); - }, 1 ); - - // Special setup and config is required when printing to PDF - if( isPrintingPDF() ) { - removeEventListeners(); - - // The document needs to have loaded for the PDF layout - // measurements to be accurate - if( document.readyState === 'complete' ) { - setupPDF(); - } - else { - window.addEventListener( 'load', setupPDF ); - } - } - - } - - /** - * Finds and stores references to DOM elements which are - * required by the presentation. If a required element is - * not found, it is created. - */ - function setupDOM() { - - // Prevent transitions while we're loading - dom.slides.classList.add( 'no-transition' ); - - // Background element - dom.background = createSingletonNode( dom.wrapper, 'div', 'backgrounds', null ); - - // Progress bar - dom.progress = createSingletonNode( dom.wrapper, 'div', 'progress', '' ); - dom.progressbar = dom.progress.querySelector( 'span' ); - - // Arrow controls - createSingletonNode( dom.wrapper, 'aside', 'controls', - '' + - '' + - '' + - '' ); - - // Slide number - dom.slideNumber = createSingletonNode( dom.wrapper, 'div', 'slide-number', '' ); - - // Element containing notes that are visible to the audience - dom.speakerNotes = createSingletonNode( dom.wrapper, 'div', 'speaker-notes', null ); - dom.speakerNotes.setAttribute( 'data-prevent-swipe', '' ); - - // Overlay graphic which is displayed during the paused mode - createSingletonNode( dom.wrapper, 'div', 'pause-overlay', null ); - - // Cache references to elements - dom.controls = document.querySelector( '.reveal .controls' ); - dom.theme = document.querySelector( '#theme' ); - - dom.wrapper.setAttribute( 'role', 'application' ); - - // There can be multiple instances of controls throughout the page - dom.controlsLeft = toArray( document.querySelectorAll( '.navigate-left' ) ); - dom.controlsRight = toArray( document.querySelectorAll( '.navigate-right' ) ); - dom.controlsUp = toArray( document.querySelectorAll( '.navigate-up' ) ); - dom.controlsDown = toArray( document.querySelectorAll( '.navigate-down' ) ); - dom.controlsPrev = toArray( document.querySelectorAll( '.navigate-prev' ) ); - dom.controlsNext = toArray( document.querySelectorAll( '.navigate-next' ) ); - - dom.statusDiv = createStatusDiv(); - } - - /** - * Creates a hidden div with role aria-live to announce the - * current slide content. Hide the div off-screen to make it - * available only to Assistive Technologies. - */ - function createStatusDiv() { - - var statusDiv = document.getElementById( 'aria-status-div' ); - if( !statusDiv ) { - statusDiv = document.createElement( 'div' ); - statusDiv.style.position = 'absolute'; - statusDiv.style.height = '1px'; - statusDiv.style.width = '1px'; - statusDiv.style.overflow ='hidden'; - statusDiv.style.clip = 'rect( 1px, 1px, 1px, 1px )'; - statusDiv.setAttribute( 'id', 'aria-status-div' ); - statusDiv.setAttribute( 'aria-live', 'polite' ); - statusDiv.setAttribute( 'aria-atomic','true' ); - dom.wrapper.appendChild( statusDiv ); - } - return statusDiv; - - } - - /** - * Configures the presentation for printing to a static - * PDF. - */ - function setupPDF() { - - var slideSize = getComputedSlideSize( window.innerWidth, window.innerHeight ); - - // Dimensions of the PDF pages - var pageWidth = Math.floor( slideSize.width * ( 1 + config.margin ) ), - pageHeight = Math.floor( slideSize.height * ( 1 + config.margin ) ); - - // Dimensions of slides within the pages - var slideWidth = slideSize.width, - slideHeight = slideSize.height; - - // Let the browser know what page size we want to print - injectStyleSheet( '@page{size:'+ pageWidth +'px '+ pageHeight +'px; margin: 0;}' ); - - // Limit the size of certain elements to the dimensions of the slide - injectStyleSheet( '.reveal section>img, .reveal section>video, .reveal section>iframe{max-width: '+ slideWidth +'px; max-height:'+ slideHeight +'px}' ); - - document.body.classList.add( 'print-pdf' ); - document.body.style.width = pageWidth + 'px'; - document.body.style.height = pageHeight + 'px'; - - // Add each slide's index as attributes on itself, we need these - // indices to generate slide numbers below - toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).forEach( function( hslide, h ) { - hslide.setAttribute( 'data-index-h', h ); - - if( hslide.classList.contains( 'stack' ) ) { - toArray( hslide.querySelectorAll( 'section' ) ).forEach( function( vslide, v ) { - vslide.setAttribute( 'data-index-h', h ); - vslide.setAttribute( 'data-index-v', v ); - } ); - } - } ); - - // Slide and slide background layout - toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ).forEach( function( slide ) { - - // Vertical stacks are not centred since their section - // children will be - if( slide.classList.contains( 'stack' ) === false ) { - // Center the slide inside of the page, giving the slide some margin - var left = ( pageWidth - slideWidth ) / 2, - top = ( pageHeight - slideHeight ) / 2; - - var contentHeight = getAbsoluteHeight( slide ); - var numberOfPages = Math.max( Math.ceil( contentHeight / pageHeight ), 1 ); - - // Center slides vertically - if( numberOfPages === 1 && config.center || slide.classList.contains( 'center' ) ) { - top = Math.max( ( pageHeight - contentHeight ) / 2, 0 ); - } - - // Position the slide inside of the page - slide.style.left = left + 'px'; - slide.style.top = top + 'px'; - slide.style.width = slideWidth + 'px'; - - // TODO Backgrounds need to be multiplied when the slide - // stretches over multiple pages - var background = slide.querySelector( '.slide-background' ); - if( background ) { - background.style.width = pageWidth + 'px'; - background.style.height = ( pageHeight * numberOfPages ) + 'px'; - background.style.top = -top + 'px'; - background.style.left = -left + 'px'; - } - - // Inject notes if `showNotes` is enabled - if( config.showNotes ) { - var notes = getSlideNotes( slide ); - if( notes ) { - var notesSpacing = 8; - var notesElement = document.createElement( 'div' ); - notesElement.classList.add( 'speaker-notes' ); - notesElement.classList.add( 'speaker-notes-pdf' ); - notesElement.innerHTML = notes; - notesElement.style.left = ( notesSpacing - left ) + 'px'; - notesElement.style.bottom = ( notesSpacing - top ) + 'px'; - notesElement.style.width = ( pageWidth - notesSpacing*2 ) + 'px'; - slide.appendChild( notesElement ); - } - } - - // Inject slide numbers if `slideNumbers` are enabled - if( config.slideNumber ) { - var slideNumberH = parseInt( slide.getAttribute( 'data-index-h' ), 10 ) + 1, - slideNumberV = parseInt( slide.getAttribute( 'data-index-v' ), 10 ) + 1; - - var numberElement = document.createElement( 'div' ); - numberElement.classList.add( 'slide-number' ); - numberElement.classList.add( 'slide-number-pdf' ); - numberElement.innerHTML = formatSlideNumber( slideNumberH, '.', slideNumberV ); - background.appendChild( numberElement ); - } - } - - } ); - - // Show all fragments - toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR + ' .fragment' ) ).forEach( function( fragment ) { - fragment.classList.add( 'visible' ); - } ); - - } - - /** - * This is an unfortunate necessity. Iframes can trigger the - * parent window to scroll, for example by focusing an input. - * This scrolling can not be prevented by hiding overflow in - * CSS so we have to resort to repeatedly checking if the - * browser has decided to offset our slides :( - */ - function setupIframeScrollPrevention() { - - if( dom.slides.querySelector( 'iframe' ) ) { - setInterval( function() { - if( dom.wrapper.scrollTop !== 0 || dom.wrapper.scrollLeft !== 0 ) { - dom.wrapper.scrollTop = 0; - dom.wrapper.scrollLeft = 0; - } - }, 500 ); - } - - } - - /** - * Creates an HTML element and returns a reference to it. - * If the element already exists the existing instance will - * be returned. - */ - function createSingletonNode( container, tagname, classname, innerHTML ) { - - // Find all nodes matching the description - var nodes = container.querySelectorAll( '.' + classname ); - - // Check all matches to find one which is a direct child of - // the specified container - for( var i = 0; i < nodes.length; i++ ) { - var testNode = nodes[i]; - if( testNode.parentNode === container ) { - return testNode; - } - } - - // If no node was found, create it now - var node = document.createElement( tagname ); - node.classList.add( classname ); - if( typeof innerHTML === 'string' ) { - node.innerHTML = innerHTML; - } - container.appendChild( node ); - - return node; - - } - - /** - * Creates the slide background elements and appends them - * to the background container. One element is created per - * slide no matter if the given slide has visible background. - */ - function createBackgrounds() { - - var printMode = isPrintingPDF(); - - // Clear prior backgrounds - dom.background.innerHTML = ''; - dom.background.classList.add( 'no-transition' ); - - // Iterate over all horizontal slides - toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).forEach( function( slideh ) { - - var backgroundStack; - - if( printMode ) { - backgroundStack = createBackground( slideh, slideh ); - } - else { - backgroundStack = createBackground( slideh, dom.background ); - } - - // Iterate over all vertical slides - toArray( slideh.querySelectorAll( 'section' ) ).forEach( function( slidev ) { - - if( printMode ) { - createBackground( slidev, slidev ); - } - else { - createBackground( slidev, backgroundStack ); - } - - backgroundStack.classList.add( 'stack' ); - - } ); - - } ); - - // Add parallax background if specified - if( config.parallaxBackgroundImage ) { - - dom.background.style.backgroundImage = 'url("' + config.parallaxBackgroundImage + '")'; - dom.background.style.backgroundSize = config.parallaxBackgroundSize; - - // Make sure the below properties are set on the element - these properties are - // needed for proper transitions to be set on the element via CSS. To remove - // annoying background slide-in effect when the presentation starts, apply - // these properties after short time delay - setTimeout( function() { - dom.wrapper.classList.add( 'has-parallax-background' ); - }, 1 ); - - } - else { - - dom.background.style.backgroundImage = ''; - dom.wrapper.classList.remove( 'has-parallax-background' ); - - } - - } - - /** - * Creates a background for the given slide. - * - * @param {HTMLElement} slide - * @param {HTMLElement} container The element that the background - * should be appended to - */ - function createBackground( slide, container ) { - - var data = { - background: slide.getAttribute( 'data-background' ), - backgroundSize: slide.getAttribute( 'data-background-size' ), - backgroundImage: slide.getAttribute( 'data-background-image' ), - backgroundVideo: slide.getAttribute( 'data-background-video' ), - backgroundIframe: slide.getAttribute( 'data-background-iframe' ), - backgroundColor: slide.getAttribute( 'data-background-color' ), - backgroundRepeat: slide.getAttribute( 'data-background-repeat' ), - backgroundPosition: slide.getAttribute( 'data-background-position' ), - backgroundTransition: slide.getAttribute( 'data-background-transition' ) - }; - - var element = document.createElement( 'div' ); - - // Carry over custom classes from the slide to the background - element.className = 'slide-background ' + slide.className.replace( /present|past|future/, '' ); - - if( data.background ) { - // Auto-wrap image urls in url(...) - if( /^(http|file|\/\/)/gi.test( data.background ) || /\.(svg|png|jpg|jpeg|gif|bmp)$/gi.test( data.background ) ) { - slide.setAttribute( 'data-background-image', data.background ); - } - else { - element.style.background = data.background; - } - } - - // Create a hash for this combination of background settings. - // This is used to determine when two slide backgrounds are - // the same. - if( data.background || data.backgroundColor || data.backgroundImage || data.backgroundVideo || data.backgroundIframe ) { - element.setAttribute( 'data-background-hash', data.background + - data.backgroundSize + - data.backgroundImage + - data.backgroundVideo + - data.backgroundIframe + - data.backgroundColor + - data.backgroundRepeat + - data.backgroundPosition + - data.backgroundTransition ); - } - - // Additional and optional background properties - if( data.backgroundSize ) element.style.backgroundSize = data.backgroundSize; - if( data.backgroundColor ) element.style.backgroundColor = data.backgroundColor; - if( data.backgroundRepeat ) element.style.backgroundRepeat = data.backgroundRepeat; - if( data.backgroundPosition ) element.style.backgroundPosition = data.backgroundPosition; - if( data.backgroundTransition ) element.setAttribute( 'data-background-transition', data.backgroundTransition ); - - container.appendChild( element ); - - // If backgrounds are being recreated, clear old classes - slide.classList.remove( 'has-dark-background' ); - slide.classList.remove( 'has-light-background' ); - - // If this slide has a background color, add a class that - // signals if it is light or dark. If the slide has no background - // color, no class will be set - var computedBackgroundColor = window.getComputedStyle( element ).backgroundColor; - if( computedBackgroundColor ) { - var rgb = colorToRgb( computedBackgroundColor ); - - // Ignore fully transparent backgrounds. Some browsers return - // rgba(0,0,0,0) when reading the computed background color of - // an element with no background - if( rgb && rgb.a !== 0 ) { - if( colorBrightness( computedBackgroundColor ) < 128 ) { - slide.classList.add( 'has-dark-background' ); - } - else { - slide.classList.add( 'has-light-background' ); - } - } - } - - return element; - - } - - /** - * Registers a listener to postMessage events, this makes it - * possible to call all reveal.js API methods from another - * window. For example: - * - * revealWindow.postMessage( JSON.stringify({ - * method: 'slide', - * args: [ 2 ] - * }), '*' ); - */ - function setupPostMessage() { - - if( config.postMessage ) { - window.addEventListener( 'message', function ( event ) { - var data = event.data; - - // Make sure we're dealing with JSON - if( typeof data === 'string' && data.charAt( 0 ) === '{' && data.charAt( data.length - 1 ) === '}' ) { - data = JSON.parse( data ); - - // Check if the requested method can be found - if( data.method && typeof Reveal[data.method] === 'function' ) { - Reveal[data.method].apply( Reveal, data.args ); - } - } - }, false ); - } - - } - - /** - * Applies the configuration settings from the config - * object. May be called multiple times. - */ - function configure( options ) { - - var numberOfSlides = dom.wrapper.querySelectorAll( SLIDES_SELECTOR ).length; - - dom.wrapper.classList.remove( config.transition ); - - // New config options may be passed when this method - // is invoked through the API after initialization - if( typeof options === 'object' ) extend( config, options ); - - // Force linear transition based on browser capabilities - if( features.transforms3d === false ) config.transition = 'linear'; - - dom.wrapper.classList.add( config.transition ); - - dom.wrapper.setAttribute( 'data-transition-speed', config.transitionSpeed ); - dom.wrapper.setAttribute( 'data-background-transition', config.backgroundTransition ); - - dom.controls.style.display = config.controls ? 'block' : 'none'; - dom.progress.style.display = config.progress ? 'block' : 'none'; - dom.slideNumber.style.display = config.slideNumber && !isPrintingPDF() ? 'block' : 'none'; - - if( config.rtl ) { - dom.wrapper.classList.add( 'rtl' ); - } - else { - dom.wrapper.classList.remove( 'rtl' ); - } - - if( config.center ) { - dom.wrapper.classList.add( 'center' ); - } - else { - dom.wrapper.classList.remove( 'center' ); - } - - // Exit the paused mode if it was configured off - if( config.pause === false ) { - resume(); - } - - if( config.showNotes ) { - dom.speakerNotes.classList.add( 'visible' ); - } - else { - dom.speakerNotes.classList.remove( 'visible' ); - } - - if( config.mouseWheel ) { - document.addEventListener( 'DOMMouseScroll', onDocumentMouseScroll, false ); // FF - document.addEventListener( 'mousewheel', onDocumentMouseScroll, false ); - } - else { - document.removeEventListener( 'DOMMouseScroll', onDocumentMouseScroll, false ); // FF - document.removeEventListener( 'mousewheel', onDocumentMouseScroll, false ); - } - - // Rolling 3D links - if( config.rollingLinks ) { - enableRollingLinks(); - } - else { - disableRollingLinks(); - } - - // Iframe link previews - if( config.previewLinks ) { - enablePreviewLinks(); - } - else { - disablePreviewLinks(); - enablePreviewLinks( '[data-preview-link]' ); - } - - // Remove existing auto-slide controls - if( autoSlidePlayer ) { - autoSlidePlayer.destroy(); - autoSlidePlayer = null; - } - - // Generate auto-slide controls if needed - if( numberOfSlides > 1 && config.autoSlide && config.autoSlideStoppable && features.canvas && features.requestAnimationFrame ) { - autoSlidePlayer = new Playback( dom.wrapper, function() { - return Math.min( Math.max( ( Date.now() - autoSlideStartTime ) / autoSlide, 0 ), 1 ); - } ); - - autoSlidePlayer.on( 'click', onAutoSlidePlayerClick ); - autoSlidePaused = false; - } - - // When fragments are turned off they should be visible - if( config.fragments === false ) { - toArray( dom.slides.querySelectorAll( '.fragment' ) ).forEach( function( element ) { - element.classList.add( 'visible' ); - element.classList.remove( 'current-fragment' ); - } ); - } - - sync(); - - } - - /** - * Binds all event listeners. - */ - function addEventListeners() { - - eventsAreBound = true; - - window.addEventListener( 'hashchange', onWindowHashChange, false ); - window.addEventListener( 'resize', onWindowResize, false ); - - if( config.touch ) { - dom.wrapper.addEventListener( 'touchstart', onTouchStart, false ); - dom.wrapper.addEventListener( 'touchmove', onTouchMove, false ); - dom.wrapper.addEventListener( 'touchend', onTouchEnd, false ); - - // Support pointer-style touch interaction as well - if( window.navigator.pointerEnabled ) { - // IE 11 uses un-prefixed version of pointer events - dom.wrapper.addEventListener( 'pointerdown', onPointerDown, false ); - dom.wrapper.addEventListener( 'pointermove', onPointerMove, false ); - dom.wrapper.addEventListener( 'pointerup', onPointerUp, false ); - } - else if( window.navigator.msPointerEnabled ) { - // IE 10 uses prefixed version of pointer events - dom.wrapper.addEventListener( 'MSPointerDown', onPointerDown, false ); - dom.wrapper.addEventListener( 'MSPointerMove', onPointerMove, false ); - dom.wrapper.addEventListener( 'MSPointerUp', onPointerUp, false ); - } - } - - if( config.keyboard ) { - document.addEventListener( 'keydown', onDocumentKeyDown, false ); - document.addEventListener( 'keypress', onDocumentKeyPress, false ); - } - - if( config.progress && dom.progress ) { - dom.progress.addEventListener( 'click', onProgressClicked, false ); - } - - if( config.focusBodyOnPageVisibilityChange ) { - var visibilityChange; - - if( 'hidden' in document ) { - visibilityChange = 'visibilitychange'; - } - else if( 'msHidden' in document ) { - visibilityChange = 'msvisibilitychange'; - } - else if( 'webkitHidden' in document ) { - visibilityChange = 'webkitvisibilitychange'; - } - - if( visibilityChange ) { - document.addEventListener( visibilityChange, onPageVisibilityChange, false ); - } - } - - // Listen to both touch and click events, in case the device - // supports both - var pointerEvents = [ 'touchstart', 'click' ]; - - // Only support touch for Android, fixes double navigations in - // stock browser - if( navigator.userAgent.match( /android/gi ) ) { - pointerEvents = [ 'touchstart' ]; - } - - pointerEvents.forEach( function( eventName ) { - dom.controlsLeft.forEach( function( el ) { el.addEventListener( eventName, onNavigateLeftClicked, false ); } ); - dom.controlsRight.forEach( function( el ) { el.addEventListener( eventName, onNavigateRightClicked, false ); } ); - dom.controlsUp.forEach( function( el ) { el.addEventListener( eventName, onNavigateUpClicked, false ); } ); - dom.controlsDown.forEach( function( el ) { el.addEventListener( eventName, onNavigateDownClicked, false ); } ); - dom.controlsPrev.forEach( function( el ) { el.addEventListener( eventName, onNavigatePrevClicked, false ); } ); - dom.controlsNext.forEach( function( el ) { el.addEventListener( eventName, onNavigateNextClicked, false ); } ); - } ); - - } - - /** - * Unbinds all event listeners. - */ - function removeEventListeners() { - - eventsAreBound = false; - - document.removeEventListener( 'keydown', onDocumentKeyDown, false ); - document.removeEventListener( 'keypress', onDocumentKeyPress, false ); - window.removeEventListener( 'hashchange', onWindowHashChange, false ); - window.removeEventListener( 'resize', onWindowResize, false ); - - dom.wrapper.removeEventListener( 'touchstart', onTouchStart, false ); - dom.wrapper.removeEventListener( 'touchmove', onTouchMove, false ); - dom.wrapper.removeEventListener( 'touchend', onTouchEnd, false ); - - // IE11 - if( window.navigator.pointerEnabled ) { - dom.wrapper.removeEventListener( 'pointerdown', onPointerDown, false ); - dom.wrapper.removeEventListener( 'pointermove', onPointerMove, false ); - dom.wrapper.removeEventListener( 'pointerup', onPointerUp, false ); - } - // IE10 - else if( window.navigator.msPointerEnabled ) { - dom.wrapper.removeEventListener( 'MSPointerDown', onPointerDown, false ); - dom.wrapper.removeEventListener( 'MSPointerMove', onPointerMove, false ); - dom.wrapper.removeEventListener( 'MSPointerUp', onPointerUp, false ); - } - - if ( config.progress && dom.progress ) { - dom.progress.removeEventListener( 'click', onProgressClicked, false ); - } - - [ 'touchstart', 'click' ].forEach( function( eventName ) { - dom.controlsLeft.forEach( function( el ) { el.removeEventListener( eventName, onNavigateLeftClicked, false ); } ); - dom.controlsRight.forEach( function( el ) { el.removeEventListener( eventName, onNavigateRightClicked, false ); } ); - dom.controlsUp.forEach( function( el ) { el.removeEventListener( eventName, onNavigateUpClicked, false ); } ); - dom.controlsDown.forEach( function( el ) { el.removeEventListener( eventName, onNavigateDownClicked, false ); } ); - dom.controlsPrev.forEach( function( el ) { el.removeEventListener( eventName, onNavigatePrevClicked, false ); } ); - dom.controlsNext.forEach( function( el ) { el.removeEventListener( eventName, onNavigateNextClicked, false ); } ); - } ); - - } - - /** - * Extend object a with the properties of object b. - * If there's a conflict, object b takes precedence. - */ - function extend( a, b ) { - - for( var i in b ) { - a[ i ] = b[ i ]; - } - - } - - /** - * Converts the target object to an array. - */ - function toArray( o ) { - - return Array.prototype.slice.call( o ); - - } - - /** - * Utility for deserializing a value. - */ - function deserialize( value ) { - - if( typeof value === 'string' ) { - if( value === 'null' ) return null; - else if( value === 'true' ) return true; - else if( value === 'false' ) return false; - else if( value.match( /^\d+$/ ) ) return parseFloat( value ); - } - - return value; - - } - - /** - * Measures the distance in pixels between point a - * and point b. - * - * @param {Object} a point with x/y properties - * @param {Object} b point with x/y properties - */ - function distanceBetween( a, b ) { - - var dx = a.x - b.x, - dy = a.y - b.y; - - return Math.sqrt( dx*dx + dy*dy ); - - } - - /** - * Applies a CSS transform to the target element. - */ - function transformElement( element, transform ) { - - element.style.WebkitTransform = transform; - element.style.MozTransform = transform; - element.style.msTransform = transform; - element.style.transform = transform; - - } - - /** - * Applies CSS transforms to the slides container. The container - * is transformed from two separate sources: layout and the overview - * mode. - */ - function transformSlides( transforms ) { - - // Pick up new transforms from arguments - if( typeof transforms.layout === 'string' ) slidesTransform.layout = transforms.layout; - if( typeof transforms.overview === 'string' ) slidesTransform.overview = transforms.overview; - - // Apply the transforms to the slides container - if( slidesTransform.layout ) { - transformElement( dom.slides, slidesTransform.layout + ' ' + slidesTransform.overview ); - } - else { - transformElement( dom.slides, slidesTransform.overview ); - } - - } - - /** - * Injects the given CSS styles into the DOM. - */ - function injectStyleSheet( value ) { - - var tag = document.createElement( 'style' ); - tag.type = 'text/css'; - if( tag.styleSheet ) { - tag.styleSheet.cssText = value; - } - else { - tag.appendChild( document.createTextNode( value ) ); - } - document.getElementsByTagName( 'head' )[0].appendChild( tag ); - - } - - /** - * Converts various color input formats to an {r:0,g:0,b:0} object. - * - * @param {String} color The string representation of a color, - * the following formats are supported: - * - #000 - * - #000000 - * - rgb(0,0,0) - */ - function colorToRgb( color ) { - - var hex3 = color.match( /^#([0-9a-f]{3})$/i ); - if( hex3 && hex3[1] ) { - hex3 = hex3[1]; - return { - r: parseInt( hex3.charAt( 0 ), 16 ) * 0x11, - g: parseInt( hex3.charAt( 1 ), 16 ) * 0x11, - b: parseInt( hex3.charAt( 2 ), 16 ) * 0x11 - }; - } - - var hex6 = color.match( /^#([0-9a-f]{6})$/i ); - if( hex6 && hex6[1] ) { - hex6 = hex6[1]; - return { - r: parseInt( hex6.substr( 0, 2 ), 16 ), - g: parseInt( hex6.substr( 2, 2 ), 16 ), - b: parseInt( hex6.substr( 4, 2 ), 16 ) - }; - } - - var rgb = color.match( /^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i ); - if( rgb ) { - return { - r: parseInt( rgb[1], 10 ), - g: parseInt( rgb[2], 10 ), - b: parseInt( rgb[3], 10 ) - }; - } - - var rgba = color.match( /^rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\,\s*([\d]+|[\d]*.[\d]+)\s*\)$/i ); - if( rgba ) { - return { - r: parseInt( rgba[1], 10 ), - g: parseInt( rgba[2], 10 ), - b: parseInt( rgba[3], 10 ), - a: parseFloat( rgba[4] ) - }; - } - - return null; - - } - - /** - * Calculates brightness on a scale of 0-255. - * - * @param color See colorStringToRgb for supported formats. - */ - function colorBrightness( color ) { - - if( typeof color === 'string' ) color = colorToRgb( color ); - - if( color ) { - return ( color.r * 299 + color.g * 587 + color.b * 114 ) / 1000; - } - - return null; - - } - - /** - * Retrieves the height of the given element by looking - * at the position and height of its immediate children. - */ - function getAbsoluteHeight( element ) { - - var height = 0; - - if( element ) { - var absoluteChildren = 0; - - toArray( element.childNodes ).forEach( function( child ) { - - if( typeof child.offsetTop === 'number' && child.style ) { - // Count # of abs children - if( window.getComputedStyle( child ).position === 'absolute' ) { - absoluteChildren += 1; - } - - height = Math.max( height, child.offsetTop + child.offsetHeight ); - } - - } ); - - // If there are no absolute children, use offsetHeight - if( absoluteChildren === 0 ) { - height = element.offsetHeight; - } - - } - - return height; - - } - - /** - * Returns the remaining height within the parent of the - * target element. - * - * remaining height = [ configured parent height ] - [ current parent height ] - */ - function getRemainingHeight( element, height ) { - - height = height || 0; - - if( element ) { - var newHeight, oldHeight = element.style.height; - - // Change the .stretch element height to 0 in order find the height of all - // the other elements - element.style.height = '0px'; - newHeight = height - element.parentNode.offsetHeight; - - // Restore the old height, just in case - element.style.height = oldHeight + 'px'; - - return newHeight; - } - - return height; - - } - - /** - * Checks if this instance is being used to print a PDF. - */ - function isPrintingPDF() { - - return ( /print-pdf/gi ).test( window.location.search ); - - } - - /** - * Hides the address bar if we're on a mobile device. - */ - function hideAddressBar() { - - if( config.hideAddressBar && isMobileDevice ) { - // Events that should trigger the address bar to hide - window.addEventListener( 'load', removeAddressBar, false ); - window.addEventListener( 'orientationchange', removeAddressBar, false ); - } - - } - - /** - * Causes the address bar to hide on mobile devices, - * more vertical space ftw. - */ - function removeAddressBar() { - - setTimeout( function() { - window.scrollTo( 0, 1 ); - }, 10 ); - - } - - /** - * Dispatches an event of the specified type from the - * reveal DOM element. - */ - function dispatchEvent( type, args ) { - - var event = document.createEvent( 'HTMLEvents', 1, 2 ); - event.initEvent( type, true, true ); - extend( event, args ); - dom.wrapper.dispatchEvent( event ); - - // If we're in an iframe, post each reveal.js event to the - // parent window. Used by the notes plugin - if( config.postMessageEvents && window.parent !== window.self ) { - window.parent.postMessage( JSON.stringify({ namespace: 'reveal', eventName: type, state: getState() }), '*' ); - } - - } - - /** - * Wrap all links in 3D goodness. - */ - function enableRollingLinks() { - - if( features.transforms3d && !( 'msPerspective' in document.body.style ) ) { - var anchors = dom.wrapper.querySelectorAll( SLIDES_SELECTOR + ' a' ); - - for( var i = 0, len = anchors.length; i < len; i++ ) { - var anchor = anchors[i]; - - if( anchor.textContent && !anchor.querySelector( '*' ) && ( !anchor.className || !anchor.classList.contains( anchor, 'roll' ) ) ) { - var span = document.createElement('span'); - span.setAttribute('data-title', anchor.text); - span.innerHTML = anchor.innerHTML; - - anchor.classList.add( 'roll' ); - anchor.innerHTML = ''; - anchor.appendChild(span); - } - } - } - - } - - /** - * Unwrap all 3D links. - */ - function disableRollingLinks() { - - var anchors = dom.wrapper.querySelectorAll( SLIDES_SELECTOR + ' a.roll' ); - - for( var i = 0, len = anchors.length; i < len; i++ ) { - var anchor = anchors[i]; - var span = anchor.querySelector( 'span' ); - - if( span ) { - anchor.classList.remove( 'roll' ); - anchor.innerHTML = span.innerHTML; - } - } - - } - - /** - * Bind preview frame links. - */ - function enablePreviewLinks( selector ) { - - var anchors = toArray( document.querySelectorAll( selector ? selector : 'a' ) ); - - anchors.forEach( function( element ) { - if( /^(http|www)/gi.test( element.getAttribute( 'href' ) ) ) { - element.addEventListener( 'click', onPreviewLinkClicked, false ); - } - } ); - - } - - /** - * Unbind preview frame links. - */ - function disablePreviewLinks() { - - var anchors = toArray( document.querySelectorAll( 'a' ) ); - - anchors.forEach( function( element ) { - if( /^(http|www)/gi.test( element.getAttribute( 'href' ) ) ) { - element.removeEventListener( 'click', onPreviewLinkClicked, false ); - } - } ); - - } - - /** - * Opens a preview window for the target URL. - */ - function showPreview( url ) { - - closeOverlay(); - - dom.overlay = document.createElement( 'div' ); - dom.overlay.classList.add( 'overlay' ); - dom.overlay.classList.add( 'overlay-preview' ); - dom.wrapper.appendChild( dom.overlay ); - - dom.overlay.innerHTML = [ - '
', - '', - '', - '
', - '
', - '
', - '', - '
' - ].join(''); - - dom.overlay.querySelector( 'iframe' ).addEventListener( 'load', function( event ) { - dom.overlay.classList.add( 'loaded' ); - }, false ); - - dom.overlay.querySelector( '.close' ).addEventListener( 'click', function( event ) { - closeOverlay(); - event.preventDefault(); - }, false ); - - dom.overlay.querySelector( '.external' ).addEventListener( 'click', function( event ) { - closeOverlay(); - }, false ); - - setTimeout( function() { - dom.overlay.classList.add( 'visible' ); - }, 1 ); - - } - - /** - * Opens a overlay window with help material. - */ - function showHelp() { - - if( config.help ) { - - closeOverlay(); - - dom.overlay = document.createElement( 'div' ); - dom.overlay.classList.add( 'overlay' ); - dom.overlay.classList.add( 'overlay-help' ); - dom.wrapper.appendChild( dom.overlay ); - - var html = '

Keyboard Shortcuts


'; - - html += ''; - for( var key in keyboardShortcuts ) { - html += ''; - } - - html += '
KEYACTION
' + key + '' + keyboardShortcuts[ key ] + '
'; - - dom.overlay.innerHTML = [ - '
', - '', - '
', - '
', - '
'+ html +'
', - '
' - ].join(''); - - dom.overlay.querySelector( '.close' ).addEventListener( 'click', function( event ) { - closeOverlay(); - event.preventDefault(); - }, false ); - - setTimeout( function() { - dom.overlay.classList.add( 'visible' ); - }, 1 ); - - } - - } - - /** - * Closes any currently open overlay. - */ - function closeOverlay() { - - if( dom.overlay ) { - dom.overlay.parentNode.removeChild( dom.overlay ); - dom.overlay = null; - } - - } - - /** - * Applies JavaScript-controlled layout rules to the - * presentation. - */ - function layout() { - - if( dom.wrapper && !isPrintingPDF() ) { - - var size = getComputedSlideSize(); - - var slidePadding = 20; // TODO Dig this out of DOM - - // Layout the contents of the slides - layoutSlideContents( config.width, config.height, slidePadding ); - - dom.slides.style.width = size.width + 'px'; - dom.slides.style.height = size.height + 'px'; - - // Determine scale of content to fit within available space - scale = Math.min( size.presentationWidth / size.width, size.presentationHeight / size.height ); - - // Respect max/min scale settings - scale = Math.max( scale, config.minScale ); - scale = Math.min( scale, config.maxScale ); - - // Don't apply any scaling styles if scale is 1 - if( scale === 1 ) { - dom.slides.style.zoom = ''; - dom.slides.style.left = ''; - dom.slides.style.top = ''; - dom.slides.style.bottom = ''; - dom.slides.style.right = ''; - transformSlides( { layout: '' } ); - } - else { - // Use zoom to scale up in desktop Chrome so that content - // remains crisp. We don't use zoom to scale down since that - // can lead to shifts in text layout/line breaks. - if( scale > 1 && !isMobileDevice && /chrome/i.test( navigator.userAgent ) && typeof dom.slides.style.zoom !== 'undefined' ) { - dom.slides.style.zoom = scale; - dom.slides.style.left = ''; - dom.slides.style.top = ''; - dom.slides.style.bottom = ''; - dom.slides.style.right = ''; - transformSlides( { layout: '' } ); - } - // Apply scale transform as a fallback - else { - dom.slides.style.zoom = ''; - dom.slides.style.left = '50%'; - dom.slides.style.top = '50%'; - dom.slides.style.bottom = 'auto'; - dom.slides.style.right = 'auto'; - transformSlides( { layout: 'translate(-50%, -50%) scale('+ scale +')' } ); - } - } - - // Select all slides, vertical and horizontal - var slides = toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ); - - for( var i = 0, len = slides.length; i < len; i++ ) { - var slide = slides[ i ]; - - // Don't bother updating invisible slides - if( slide.style.display === 'none' ) { - continue; - } - - if( config.center || slide.classList.contains( 'center' ) ) { - // Vertical stacks are not centred since their section - // children will be - if( slide.classList.contains( 'stack' ) ) { - slide.style.top = 0; - } - else { - slide.style.top = Math.max( ( ( size.height - getAbsoluteHeight( slide ) ) / 2 ) - slidePadding, 0 ) + 'px'; - } - } - else { - slide.style.top = ''; - } - - } - - updateProgress(); - updateParallax(); - - } - - } - - /** - * Applies layout logic to the contents of all slides in - * the presentation. - */ - function layoutSlideContents( width, height, padding ) { - - // Handle sizing of elements with the 'stretch' class - toArray( dom.slides.querySelectorAll( 'section > .stretch' ) ).forEach( function( element ) { - - // Determine how much vertical space we can use - var remainingHeight = getRemainingHeight( element, height ); - - // Consider the aspect ratio of media elements - if( /(img|video)/gi.test( element.nodeName ) ) { - var nw = element.naturalWidth || element.videoWidth, - nh = element.naturalHeight || element.videoHeight; - - var es = Math.min( width / nw, remainingHeight / nh ); - - element.style.width = ( nw * es ) + 'px'; - element.style.height = ( nh * es ) + 'px'; - - } - else { - element.style.width = width + 'px'; - element.style.height = remainingHeight + 'px'; - } - - } ); - - } - - /** - * Calculates the computed pixel size of our slides. These - * values are based on the width and height configuration - * options. - */ - function getComputedSlideSize( presentationWidth, presentationHeight ) { - - var size = { - // Slide size - width: config.width, - height: config.height, - - // Presentation size - presentationWidth: presentationWidth || dom.wrapper.offsetWidth, - presentationHeight: presentationHeight || dom.wrapper.offsetHeight - }; - - // Reduce available space by margin - size.presentationWidth -= ( size.presentationWidth * config.margin ); - size.presentationHeight -= ( size.presentationHeight * config.margin ); - - // Slide width may be a percentage of available width - if( typeof size.width === 'string' && /%$/.test( size.width ) ) { - size.width = parseInt( size.width, 10 ) / 100 * size.presentationWidth; - } - - // Slide height may be a percentage of available height - if( typeof size.height === 'string' && /%$/.test( size.height ) ) { - size.height = parseInt( size.height, 10 ) / 100 * size.presentationHeight; - } - - return size; - - } - - /** - * Stores the vertical index of a stack so that the same - * vertical slide can be selected when navigating to and - * from the stack. - * - * @param {HTMLElement} stack The vertical stack element - * @param {int} v Index to memorize - */ - function setPreviousVerticalIndex( stack, v ) { - - if( typeof stack === 'object' && typeof stack.setAttribute === 'function' ) { - stack.setAttribute( 'data-previous-indexv', v || 0 ); - } - - } - - /** - * Retrieves the vertical index which was stored using - * #setPreviousVerticalIndex() or 0 if no previous index - * exists. - * - * @param {HTMLElement} stack The vertical stack element - */ - function getPreviousVerticalIndex( stack ) { - - if( typeof stack === 'object' && typeof stack.setAttribute === 'function' && stack.classList.contains( 'stack' ) ) { - // Prefer manually defined start-indexv - var attributeName = stack.hasAttribute( 'data-start-indexv' ) ? 'data-start-indexv' : 'data-previous-indexv'; - - return parseInt( stack.getAttribute( attributeName ) || 0, 10 ); - } - - return 0; - - } - - /** - * Displays the overview of slides (quick nav) by scaling - * down and arranging all slide elements. - */ - function activateOverview() { - - // Only proceed if enabled in config - if( config.overview && !isOverview() ) { - - overview = true; - - dom.wrapper.classList.add( 'overview' ); - dom.wrapper.classList.remove( 'overview-deactivating' ); - - if( features.overviewTransitions ) { - setTimeout( function() { - dom.wrapper.classList.add( 'overview-animated' ); - }, 1 ); - } - - // Don't auto-slide while in overview mode - cancelAutoSlide(); - - // Move the backgrounds element into the slide container to - // that the same scaling is applied - dom.slides.appendChild( dom.background ); - - // Clicking on an overview slide navigates to it - toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ).forEach( function( slide ) { - if( !slide.classList.contains( 'stack' ) ) { - slide.addEventListener( 'click', onOverviewSlideClicked, true ); - } - } ); - - updateSlidesVisibility(); - layoutOverview(); - updateOverview(); - - layout(); - - // Notify observers of the overview showing - dispatchEvent( 'overviewshown', { - 'indexh': indexh, - 'indexv': indexv, - 'currentSlide': currentSlide - } ); - - } - - } - - /** - * Uses CSS transforms to position all slides in a grid for - * display inside of the overview mode. - */ - function layoutOverview() { - - var margin = 70; - var slideWidth = config.width + margin, - slideHeight = config.height + margin; - - // Reverse in RTL mode - if( config.rtl ) { - slideWidth = -slideWidth; - } - - // Layout slides - toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).forEach( function( hslide, h ) { - hslide.setAttribute( 'data-index-h', h ); - transformElement( hslide, 'translate3d(' + ( h * slideWidth ) + 'px, 0, 0)' ); - - if( hslide.classList.contains( 'stack' ) ) { - - toArray( hslide.querySelectorAll( 'section' ) ).forEach( function( vslide, v ) { - vslide.setAttribute( 'data-index-h', h ); - vslide.setAttribute( 'data-index-v', v ); - - transformElement( vslide, 'translate3d(0, ' + ( v * slideHeight ) + 'px, 0)' ); - } ); - - } - } ); - - // Layout slide backgrounds - toArray( dom.background.childNodes ).forEach( function( hbackground, h ) { - transformElement( hbackground, 'translate3d(' + ( h * slideWidth ) + 'px, 0, 0)' ); - - toArray( hbackground.querySelectorAll( '.slide-background' ) ).forEach( function( vbackground, v ) { - transformElement( vbackground, 'translate3d(0, ' + ( v * slideHeight ) + 'px, 0)' ); - } ); - } ); - - } - - /** - * Moves the overview viewport to the current slides. - * Called each time the current slide changes. - */ - function updateOverview() { - - var margin = 70; - var slideWidth = config.width + margin, - slideHeight = config.height + margin; - - // Reverse in RTL mode - if( config.rtl ) { - slideWidth = -slideWidth; - } - - transformSlides( { - overview: [ - 'translateX('+ ( -indexh * slideWidth ) +'px)', - 'translateY('+ ( -indexv * slideHeight ) +'px)', - 'translateZ('+ ( window.innerWidth < 400 ? -1000 : -2500 ) +'px)' - ].join( ' ' ) - } ); - - } - - /** - * Exits the slide overview and enters the currently - * active slide. - */ - function deactivateOverview() { - - // Only proceed if enabled in config - if( config.overview ) { - - overview = false; - - dom.wrapper.classList.remove( 'overview' ); - dom.wrapper.classList.remove( 'overview-animated' ); - - // Temporarily add a class so that transitions can do different things - // depending on whether they are exiting/entering overview, or just - // moving from slide to slide - dom.wrapper.classList.add( 'overview-deactivating' ); - - setTimeout( function () { - dom.wrapper.classList.remove( 'overview-deactivating' ); - }, 1 ); - - // Move the background element back out - dom.wrapper.appendChild( dom.background ); - - // Clean up changes made to slides - toArray( dom.wrapper.querySelectorAll( SLIDES_SELECTOR ) ).forEach( function( slide ) { - transformElement( slide, '' ); - - slide.removeEventListener( 'click', onOverviewSlideClicked, true ); - } ); - - // Clean up changes made to backgrounds - toArray( dom.background.querySelectorAll( '.slide-background' ) ).forEach( function( background ) { - transformElement( background, '' ); - } ); - - transformSlides( { overview: '' } ); - - slide( indexh, indexv ); - - layout(); - - cueAutoSlide(); - - // Notify observers of the overview hiding - dispatchEvent( 'overviewhidden', { - 'indexh': indexh, - 'indexv': indexv, - 'currentSlide': currentSlide - } ); - - } - } - - /** - * Toggles the slide overview mode on and off. - * - * @param {Boolean} override Optional flag which overrides the - * toggle logic and forcibly sets the desired state. True means - * overview is open, false means it's closed. - */ - function toggleOverview( override ) { - - if( typeof override === 'boolean' ) { - override ? activateOverview() : deactivateOverview(); - } - else { - isOverview() ? deactivateOverview() : activateOverview(); - } - - } - - /** - * Checks if the overview is currently active. - * - * @return {Boolean} true if the overview is active, - * false otherwise - */ - function isOverview() { - - return overview; - - } - - /** - * Checks if the current or specified slide is vertical - * (nested within another slide). - * - * @param {HTMLElement} slide [optional] The slide to check - * orientation of - */ - function isVerticalSlide( slide ) { - - // Prefer slide argument, otherwise use current slide - slide = slide ? slide : currentSlide; - - return slide && slide.parentNode && !!slide.parentNode.nodeName.match( /section/i ); - - } - - /** - * Handling the fullscreen functionality via the fullscreen API - * - * @see http://fullscreen.spec.whatwg.org/ - * @see https://developer.mozilla.org/en-US/docs/DOM/Using_fullscreen_mode - */ - function enterFullscreen() { - - var element = document.body; - - // Check which implementation is available - var requestMethod = element.requestFullScreen || - element.webkitRequestFullscreen || - element.webkitRequestFullScreen || - element.mozRequestFullScreen || - element.msRequestFullscreen; - - if( requestMethod ) { - requestMethod.apply( element ); - } - - } - - /** - * Enters the paused mode which fades everything on screen to - * black. - */ - function pause() { - - if( config.pause ) { - var wasPaused = dom.wrapper.classList.contains( 'paused' ); - - cancelAutoSlide(); - dom.wrapper.classList.add( 'paused' ); - - if( wasPaused === false ) { - dispatchEvent( 'paused' ); - } - } - - } - - /** - * Exits from the paused mode. - */ - function resume() { - - var wasPaused = dom.wrapper.classList.contains( 'paused' ); - dom.wrapper.classList.remove( 'paused' ); - - cueAutoSlide(); - - if( wasPaused ) { - dispatchEvent( 'resumed' ); - } - - } - - /** - * Toggles the paused mode on and off. - */ - function togglePause( override ) { - - if( typeof override === 'boolean' ) { - override ? pause() : resume(); - } - else { - isPaused() ? resume() : pause(); - } - - } - - /** - * Checks if we are currently in the paused mode. - */ - function isPaused() { - - return dom.wrapper.classList.contains( 'paused' ); - - } - - /** - * Toggles the auto slide mode on and off. - * - * @param {Boolean} override Optional flag which sets the desired state. - * True means autoplay starts, false means it stops. - */ - - function toggleAutoSlide( override ) { - - if( typeof override === 'boolean' ) { - override ? resumeAutoSlide() : pauseAutoSlide(); - } - - else { - autoSlidePaused ? resumeAutoSlide() : pauseAutoSlide(); - } - - } - - /** - * Checks if the auto slide mode is currently on. - */ - function isAutoSliding() { - - return !!( autoSlide && !autoSlidePaused ); - - } - - /** - * Steps from the current point in the presentation to the - * slide which matches the specified horizontal and vertical - * indices. - * - * @param {int} h Horizontal index of the target slide - * @param {int} v Vertical index of the target slide - * @param {int} f Optional index of a fragment within the - * target slide to activate - * @param {int} o Optional origin for use in multimaster environments - */ - function slide( h, v, f, o ) { - - // Remember where we were at before - previousSlide = currentSlide; - - // Query all horizontal slides in the deck - var horizontalSlides = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ); - - // If no vertical index is specified and the upcoming slide is a - // stack, resume at its previous vertical index - if( v === undefined && !isOverview() ) { - v = getPreviousVerticalIndex( horizontalSlides[ h ] ); - } - - // If we were on a vertical stack, remember what vertical index - // it was on so we can resume at the same position when returning - if( previousSlide && previousSlide.parentNode && previousSlide.parentNode.classList.contains( 'stack' ) ) { - setPreviousVerticalIndex( previousSlide.parentNode, indexv ); - } - - // Remember the state before this slide - var stateBefore = state.concat(); - - // Reset the state array - state.length = 0; - - var indexhBefore = indexh || 0, - indexvBefore = indexv || 0; - - // Activate and transition to the new slide - indexh = updateSlides( HORIZONTAL_SLIDES_SELECTOR, h === undefined ? indexh : h ); - indexv = updateSlides( VERTICAL_SLIDES_SELECTOR, v === undefined ? indexv : v ); - - // Update the visibility of slides now that the indices have changed - updateSlidesVisibility(); - - layout(); - - // Apply the new state - stateLoop: for( var i = 0, len = state.length; i < len; i++ ) { - // Check if this state existed on the previous slide. If it - // did, we will avoid adding it repeatedly - for( var j = 0; j < stateBefore.length; j++ ) { - if( stateBefore[j] === state[i] ) { - stateBefore.splice( j, 1 ); - continue stateLoop; - } - } - - document.documentElement.classList.add( state[i] ); - - // Dispatch custom event matching the state's name - dispatchEvent( state[i] ); - } - - // Clean up the remains of the previous state - while( stateBefore.length ) { - document.documentElement.classList.remove( stateBefore.pop() ); - } - - // Update the overview if it's currently active - if( isOverview() ) { - updateOverview(); - } - - // Find the current horizontal slide and any possible vertical slides - // within it - var currentHorizontalSlide = horizontalSlides[ indexh ], - currentVerticalSlides = currentHorizontalSlide.querySelectorAll( 'section' ); - - // Store references to the previous and current slides - currentSlide = currentVerticalSlides[ indexv ] || currentHorizontalSlide; - - // Show fragment, if specified - if( typeof f !== 'undefined' ) { - navigateFragment( f ); - } - - // Dispatch an event if the slide changed - var slideChanged = ( indexh !== indexhBefore || indexv !== indexvBefore ); - if( slideChanged ) { - dispatchEvent( 'slidechanged', { - 'indexh': indexh, - 'indexv': indexv, - 'previousSlide': previousSlide, - 'currentSlide': currentSlide, - 'origin': o - } ); - } - else { - // Ensure that the previous slide is never the same as the current - previousSlide = null; - } - - // Solves an edge case where the previous slide maintains the - // 'present' class when navigating between adjacent vertical - // stacks - if( previousSlide ) { - previousSlide.classList.remove( 'present' ); - previousSlide.setAttribute( 'aria-hidden', 'true' ); - - // Reset all slides upon navigate to home - // Issue: #285 - if ( dom.wrapper.querySelector( HOME_SLIDE_SELECTOR ).classList.contains( 'present' ) ) { - // Launch async task - setTimeout( function () { - var slides = toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.stack') ), i; - for( i in slides ) { - if( slides[i] ) { - // Reset stack - setPreviousVerticalIndex( slides[i], 0 ); - } - } - }, 0 ); - } - } - - // Handle embedded content - if( slideChanged || !previousSlide ) { - stopEmbeddedContent( previousSlide ); - startEmbeddedContent( currentSlide ); - } - - // Announce the current slide contents, for screen readers - dom.statusDiv.textContent = currentSlide.textContent; - - updateControls(); - updateProgress(); - updateBackground(); - updateParallax(); - updateSlideNumber(); - updateNotes(); - - // Update the URL hash - writeURL(); - - cueAutoSlide(); - - } - - /** - * Syncs the presentation with the current DOM. Useful - * when new slides or control elements are added or when - * the configuration has changed. - */ - function sync() { - - // Subscribe to input - removeEventListeners(); - addEventListeners(); - - // Force a layout to make sure the current config is accounted for - layout(); - - // Reflect the current autoSlide value - autoSlide = config.autoSlide; - - // Start auto-sliding if it's enabled - cueAutoSlide(); - - // Re-create the slide backgrounds - createBackgrounds(); - - // Write the current hash to the URL - writeURL(); - - sortAllFragments(); - - updateControls(); - updateProgress(); - updateBackground( true ); - updateSlideNumber(); - updateSlidesVisibility(); - updateNotes(); - - formatEmbeddedContent(); - startEmbeddedContent( currentSlide ); - - if( isOverview() ) { - layoutOverview(); - } - - } - - /** - * Resets all vertical slides so that only the first - * is visible. - */ - function resetVerticalSlides() { - - var horizontalSlides = toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ); - horizontalSlides.forEach( function( horizontalSlide ) { - - var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ); - verticalSlides.forEach( function( verticalSlide, y ) { - - if( y > 0 ) { - verticalSlide.classList.remove( 'present' ); - verticalSlide.classList.remove( 'past' ); - verticalSlide.classList.add( 'future' ); - verticalSlide.setAttribute( 'aria-hidden', 'true' ); - } - - } ); - - } ); - - } - - /** - * Sorts and formats all of fragments in the - * presentation. - */ - function sortAllFragments() { - - var horizontalSlides = toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ); - horizontalSlides.forEach( function( horizontalSlide ) { - - var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ); - verticalSlides.forEach( function( verticalSlide, y ) { - - sortFragments( verticalSlide.querySelectorAll( '.fragment' ) ); - - } ); - - if( verticalSlides.length === 0 ) sortFragments( horizontalSlide.querySelectorAll( '.fragment' ) ); - - } ); - - } - - /** - * Updates one dimension of slides by showing the slide - * with the specified index. - * - * @param {String} selector A CSS selector that will fetch - * the group of slides we are working with - * @param {Number} index The index of the slide that should be - * shown - * - * @return {Number} The index of the slide that is now shown, - * might differ from the passed in index if it was out of - * bounds. - */ - function updateSlides( selector, index ) { - - // Select all slides and convert the NodeList result to - // an array - var slides = toArray( dom.wrapper.querySelectorAll( selector ) ), - slidesLength = slides.length; - - var printMode = isPrintingPDF(); - - if( slidesLength ) { - - // Should the index loop? - if( config.loop ) { - index %= slidesLength; - - if( index < 0 ) { - index = slidesLength + index; - } - } - - // Enforce max and minimum index bounds - index = Math.max( Math.min( index, slidesLength - 1 ), 0 ); - - for( var i = 0; i < slidesLength; i++ ) { - var element = slides[i]; - - var reverse = config.rtl && !isVerticalSlide( element ); - - element.classList.remove( 'past' ); - element.classList.remove( 'present' ); - element.classList.remove( 'future' ); - - // http://www.w3.org/html/wg/drafts/html/master/editing.html#the-hidden-attribute - element.setAttribute( 'hidden', '' ); - element.setAttribute( 'aria-hidden', 'true' ); - - // If this element contains vertical slides - if( element.querySelector( 'section' ) ) { - element.classList.add( 'stack' ); - } - - // If we're printing static slides, all slides are "present" - if( printMode ) { - element.classList.add( 'present' ); - continue; - } - - if( i < index ) { - // Any element previous to index is given the 'past' class - element.classList.add( reverse ? 'future' : 'past' ); - - if( config.fragments ) { - var pastFragments = toArray( element.querySelectorAll( '.fragment' ) ); - - // Show all fragments on prior slides - while( pastFragments.length ) { - var pastFragment = pastFragments.pop(); - pastFragment.classList.add( 'visible' ); - pastFragment.classList.remove( 'current-fragment' ); - } - } - } - else if( i > index ) { - // Any element subsequent to index is given the 'future' class - element.classList.add( reverse ? 'past' : 'future' ); - - if( config.fragments ) { - var futureFragments = toArray( element.querySelectorAll( '.fragment.visible' ) ); - - // No fragments in future slides should be visible ahead of time - while( futureFragments.length ) { - var futureFragment = futureFragments.pop(); - futureFragment.classList.remove( 'visible' ); - futureFragment.classList.remove( 'current-fragment' ); - } - } - } - } - - // Mark the current slide as present - slides[index].classList.add( 'present' ); - slides[index].removeAttribute( 'hidden' ); - slides[index].removeAttribute( 'aria-hidden' ); - - // If this slide has a state associated with it, add it - // onto the current state of the deck - var slideState = slides[index].getAttribute( 'data-state' ); - if( slideState ) { - state = state.concat( slideState.split( ' ' ) ); - } - - } - else { - // Since there are no slides we can't be anywhere beyond the - // zeroth index - index = 0; - } - - return index; - - } - - /** - * Optimization method; hide all slides that are far away - * from the present slide. - */ - function updateSlidesVisibility() { - - // Select all slides and convert the NodeList result to - // an array - var horizontalSlides = toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ), - horizontalSlidesLength = horizontalSlides.length, - distanceX, - distanceY; - - if( horizontalSlidesLength && typeof indexh !== 'undefined' ) { - - // The number of steps away from the present slide that will - // be visible - var viewDistance = isOverview() ? 10 : config.viewDistance; - - // Limit view distance on weaker devices - if( isMobileDevice ) { - viewDistance = isOverview() ? 6 : 2; - } - - // All slides need to be visible when exporting to PDF - if( isPrintingPDF() ) { - viewDistance = Number.MAX_VALUE; - } - - for( var x = 0; x < horizontalSlidesLength; x++ ) { - var horizontalSlide = horizontalSlides[x]; - - var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ), - verticalSlidesLength = verticalSlides.length; - - // Determine how far away this slide is from the present - distanceX = Math.abs( ( indexh || 0 ) - x ) || 0; - - // If the presentation is looped, distance should measure - // 1 between the first and last slides - if( config.loop ) { - distanceX = Math.abs( ( ( indexh || 0 ) - x ) % ( horizontalSlidesLength - viewDistance ) ) || 0; - } - - // Show the horizontal slide if it's within the view distance - if( distanceX < viewDistance ) { - showSlide( horizontalSlide ); - } - else { - hideSlide( horizontalSlide ); - } - - if( verticalSlidesLength ) { - - var oy = getPreviousVerticalIndex( horizontalSlide ); - - for( var y = 0; y < verticalSlidesLength; y++ ) { - var verticalSlide = verticalSlides[y]; - - distanceY = x === ( indexh || 0 ) ? Math.abs( ( indexv || 0 ) - y ) : Math.abs( y - oy ); - - if( distanceX + distanceY < viewDistance ) { - showSlide( verticalSlide ); - } - else { - hideSlide( verticalSlide ); - } - } - - } - } - - } - - } - - /** - * Pick up notes from the current slide and display tham - * to the viewer. - * - * @see `showNotes` config value - */ - function updateNotes() { - - if( config.showNotes && dom.speakerNotes && currentSlide && !isPrintingPDF() ) { - - dom.speakerNotes.innerHTML = getSlideNotes() || ''; - - } - - } - - /** - * Updates the progress bar to reflect the current slide. - */ - function updateProgress() { - - // Update progress if enabled - if( config.progress && dom.progressbar ) { - - dom.progressbar.style.width = getProgress() * dom.wrapper.offsetWidth + 'px'; - - } - - } - - /** - * Updates the slide number div to reflect the current slide. - * - * The following slide number formats are available: - * "h.v": horizontal . vertical slide number (default) - * "h/v": horizontal / vertical slide number - * "c": flattened slide number - * "c/t": flattened slide number / total slides - */ - function updateSlideNumber() { - - // Update slide number if enabled - if( config.slideNumber && dom.slideNumber ) { - - var value = []; - var format = 'h.v'; - - // Check if a custom number format is available - if( typeof config.slideNumber === 'string' ) { - format = config.slideNumber; - } - - switch( format ) { - case 'c': - value.push( getSlidePastCount() + 1 ); - break; - case 'c/t': - value.push( getSlidePastCount() + 1, '/', getTotalSlides() ); - break; - case 'h/v': - value.push( indexh + 1 ); - if( isVerticalSlide() ) value.push( '/', indexv + 1 ); - break; - default: - value.push( indexh + 1 ); - if( isVerticalSlide() ) value.push( '.', indexv + 1 ); - } - - dom.slideNumber.innerHTML = formatSlideNumber( value[0], value[1], value[2] ); - } - - } - - /** - * Applies HTML formatting to a slide number before it's - * written to the DOM. - */ - function formatSlideNumber( a, delimiter, b ) { - - if( typeof b === 'number' && !isNaN( b ) ) { - return ''+ a +'' + - ''+ delimiter +'' + - ''+ b +''; - } - else { - return ''+ a +''; - } - - } - - /** - * Updates the state of all control/navigation arrows. - */ - function updateControls() { - - var routes = availableRoutes(); - var fragments = availableFragments(); - - // Remove the 'enabled' class from all directions - dom.controlsLeft.concat( dom.controlsRight ) - .concat( dom.controlsUp ) - .concat( dom.controlsDown ) - .concat( dom.controlsPrev ) - .concat( dom.controlsNext ).forEach( function( node ) { - node.classList.remove( 'enabled' ); - node.classList.remove( 'fragmented' ); - } ); - - // Add the 'enabled' class to the available routes - if( routes.left ) dom.controlsLeft.forEach( function( el ) { el.classList.add( 'enabled' ); } ); - if( routes.right ) dom.controlsRight.forEach( function( el ) { el.classList.add( 'enabled' ); } ); - if( routes.up ) dom.controlsUp.forEach( function( el ) { el.classList.add( 'enabled' ); } ); - if( routes.down ) dom.controlsDown.forEach( function( el ) { el.classList.add( 'enabled' ); } ); - - // Prev/next buttons - if( routes.left || routes.up ) dom.controlsPrev.forEach( function( el ) { el.classList.add( 'enabled' ); } ); - if( routes.right || routes.down ) dom.controlsNext.forEach( function( el ) { el.classList.add( 'enabled' ); } ); - - // Highlight fragment directions - if( currentSlide ) { - - // Always apply fragment decorator to prev/next buttons - if( fragments.prev ) dom.controlsPrev.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); - if( fragments.next ) dom.controlsNext.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); - - // Apply fragment decorators to directional buttons based on - // what slide axis they are in - if( isVerticalSlide( currentSlide ) ) { - if( fragments.prev ) dom.controlsUp.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); - if( fragments.next ) dom.controlsDown.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); - } - else { - if( fragments.prev ) dom.controlsLeft.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); - if( fragments.next ) dom.controlsRight.forEach( function( el ) { el.classList.add( 'fragmented', 'enabled' ); } ); - } - - } - - } - - /** - * Updates the background elements to reflect the current - * slide. - * - * @param {Boolean} includeAll If true, the backgrounds of - * all vertical slides (not just the present) will be updated. - */ - function updateBackground( includeAll ) { - - var currentBackground = null; - - // Reverse past/future classes when in RTL mode - var horizontalPast = config.rtl ? 'future' : 'past', - horizontalFuture = config.rtl ? 'past' : 'future'; - - // Update the classes of all backgrounds to match the - // states of their slides (past/present/future) - toArray( dom.background.childNodes ).forEach( function( backgroundh, h ) { - - backgroundh.classList.remove( 'past' ); - backgroundh.classList.remove( 'present' ); - backgroundh.classList.remove( 'future' ); - - if( h < indexh ) { - backgroundh.classList.add( horizontalPast ); - } - else if ( h > indexh ) { - backgroundh.classList.add( horizontalFuture ); - } - else { - backgroundh.classList.add( 'present' ); - - // Store a reference to the current background element - currentBackground = backgroundh; - } - - if( includeAll || h === indexh ) { - toArray( backgroundh.querySelectorAll( '.slide-background' ) ).forEach( function( backgroundv, v ) { - - backgroundv.classList.remove( 'past' ); - backgroundv.classList.remove( 'present' ); - backgroundv.classList.remove( 'future' ); - - if( v < indexv ) { - backgroundv.classList.add( 'past' ); - } - else if ( v > indexv ) { - backgroundv.classList.add( 'future' ); - } - else { - backgroundv.classList.add( 'present' ); - - // Only if this is the present horizontal and vertical slide - if( h === indexh ) currentBackground = backgroundv; - } - - } ); - } - - } ); - - // Stop any currently playing video background - if( previousBackground ) { - - var previousVideo = previousBackground.querySelector( 'video' ); - if( previousVideo ) previousVideo.pause(); - - } - - if( currentBackground ) { - - // Start video playback - var currentVideo = currentBackground.querySelector( 'video' ); - if( currentVideo ) { - if( currentVideo.currentTime > 0 ) currentVideo.currentTime = 0; - currentVideo.play(); - } - - var backgroundImageURL = currentBackground.style.backgroundImage || ''; - - // Restart GIFs (doesn't work in Firefox) - if( /\.gif/i.test( backgroundImageURL ) ) { - currentBackground.style.backgroundImage = ''; - window.getComputedStyle( currentBackground ).opacity; - currentBackground.style.backgroundImage = backgroundImageURL; - } - - // Don't transition between identical backgrounds. This - // prevents unwanted flicker. - var previousBackgroundHash = previousBackground ? previousBackground.getAttribute( 'data-background-hash' ) : null; - var currentBackgroundHash = currentBackground.getAttribute( 'data-background-hash' ); - if( currentBackgroundHash && currentBackgroundHash === previousBackgroundHash && currentBackground !== previousBackground ) { - dom.background.classList.add( 'no-transition' ); - } - - previousBackground = currentBackground; - - } - - // If there's a background brightness flag for this slide, - // bubble it to the .reveal container - if( currentSlide ) { - [ 'has-light-background', 'has-dark-background' ].forEach( function( classToBubble ) { - if( currentSlide.classList.contains( classToBubble ) ) { - dom.wrapper.classList.add( classToBubble ); - } - else { - dom.wrapper.classList.remove( classToBubble ); - } - } ); - } - - // Allow the first background to apply without transition - setTimeout( function() { - dom.background.classList.remove( 'no-transition' ); - }, 1 ); - - } - - /** - * Updates the position of the parallax background based - * on the current slide index. - */ - function updateParallax() { - - if( config.parallaxBackgroundImage ) { - - var horizontalSlides = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ), - verticalSlides = dom.wrapper.querySelectorAll( VERTICAL_SLIDES_SELECTOR ); - - var backgroundSize = dom.background.style.backgroundSize.split( ' ' ), - backgroundWidth, backgroundHeight; - - if( backgroundSize.length === 1 ) { - backgroundWidth = backgroundHeight = parseInt( backgroundSize[0], 10 ); - } - else { - backgroundWidth = parseInt( backgroundSize[0], 10 ); - backgroundHeight = parseInt( backgroundSize[1], 10 ); - } - - var slideWidth = dom.background.offsetWidth, - horizontalSlideCount = horizontalSlides.length, - horizontalOffsetMultiplier, - horizontalOffset; - - if( typeof config.parallaxBackgroundHorizontal === 'number' ) { - horizontalOffsetMultiplier = config.parallaxBackgroundHorizontal; - } - else { - horizontalOffsetMultiplier = horizontalSlideCount > 1 ? ( backgroundWidth - slideWidth ) / ( horizontalSlideCount-1 ) : 0; - } - - horizontalOffset = horizontalOffsetMultiplier * indexh * -1; - - var slideHeight = dom.background.offsetHeight, - verticalSlideCount = verticalSlides.length, - verticalOffsetMultiplier, - verticalOffset; - - if( typeof config.parallaxBackgroundVertical === 'number' ) { - verticalOffsetMultiplier = config.parallaxBackgroundVertical; - } - else { - verticalOffsetMultiplier = ( backgroundHeight - slideHeight ) / ( verticalSlideCount-1 ); - } - - verticalOffset = verticalSlideCount > 0 ? verticalOffsetMultiplier * indexv * 1 : 0; - - dom.background.style.backgroundPosition = horizontalOffset + 'px ' + -verticalOffset + 'px'; - - } - - } - - /** - * Called when the given slide is within the configured view - * distance. Shows the slide element and loads any content - * that is set to load lazily (data-src). - */ - function showSlide( slide ) { - - // Show the slide element - slide.style.display = 'block'; - - // Media elements with data-src attributes - toArray( slide.querySelectorAll( 'img[data-src], video[data-src], audio[data-src]' ) ).forEach( function( element ) { - element.setAttribute( 'src', element.getAttribute( 'data-src' ) ); - element.removeAttribute( 'data-src' ); - } ); - - // Media elements with children - toArray( slide.querySelectorAll( 'video, audio' ) ).forEach( function( media ) { - var sources = 0; - - toArray( media.querySelectorAll( 'source[data-src]' ) ).forEach( function( source ) { - source.setAttribute( 'src', source.getAttribute( 'data-src' ) ); - source.removeAttribute( 'data-src' ); - sources += 1; - } ); - - // If we rewrote sources for this video/audio element, we need - // to manually tell it to load from its new origin - if( sources > 0 ) { - media.load(); - } - } ); - - - // Show the corresponding background element - var indices = getIndices( slide ); - var background = getSlideBackground( indices.h, indices.v ); - if( background ) { - background.style.display = 'block'; - - // If the background contains media, load it - if( background.hasAttribute( 'data-loaded' ) === false ) { - background.setAttribute( 'data-loaded', 'true' ); - - var backgroundImage = slide.getAttribute( 'data-background-image' ), - backgroundVideo = slide.getAttribute( 'data-background-video' ), - backgroundVideoLoop = slide.hasAttribute( 'data-background-video-loop' ), - backgroundIframe = slide.getAttribute( 'data-background-iframe' ); - - // Images - if( backgroundImage ) { - background.style.backgroundImage = 'url('+ backgroundImage +')'; - } - // Videos - else if ( backgroundVideo && !isSpeakerNotes() ) { - var video = document.createElement( 'video' ); - - if( backgroundVideoLoop ) { - video.setAttribute( 'loop', '' ); - } - - // Support comma separated lists of video sources - backgroundVideo.split( ',' ).forEach( function( source ) { - video.innerHTML += ''; - } ); - - background.appendChild( video ); - } - // Iframes - else if( backgroundIframe ) { - var iframe = document.createElement( 'iframe' ); - iframe.setAttribute( 'src', backgroundIframe ); - iframe.style.width = '100%'; - iframe.style.height = '100%'; - iframe.style.maxHeight = '100%'; - iframe.style.maxWidth = '100%'; - - background.appendChild( iframe ); - } - } - } - - } - - /** - * Called when the given slide is moved outside of the - * configured view distance. - */ - function hideSlide( slide ) { - - // Hide the slide element - slide.style.display = 'none'; - - // Hide the corresponding background element - var indices = getIndices( slide ); - var background = getSlideBackground( indices.h, indices.v ); - if( background ) { - background.style.display = 'none'; - } - - } - - /** - * Determine what available routes there are for navigation. - * - * @return {Object} containing four booleans: left/right/up/down - */ - function availableRoutes() { - - var horizontalSlides = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ), - verticalSlides = dom.wrapper.querySelectorAll( VERTICAL_SLIDES_SELECTOR ); - - var routes = { - left: indexh > 0 || config.loop, - right: indexh < horizontalSlides.length - 1 || config.loop, - up: indexv > 0, - down: indexv < verticalSlides.length - 1 - }; - - // reverse horizontal controls for rtl - if( config.rtl ) { - var left = routes.left; - routes.left = routes.right; - routes.right = left; - } - - return routes; - - } - - /** - * Returns an object describing the available fragment - * directions. - * - * @return {Object} two boolean properties: prev/next - */ - function availableFragments() { - - if( currentSlide && config.fragments ) { - var fragments = currentSlide.querySelectorAll( '.fragment' ); - var hiddenFragments = currentSlide.querySelectorAll( '.fragment:not(.visible)' ); - - return { - prev: fragments.length - hiddenFragments.length > 0, - next: !!hiddenFragments.length - }; - } - else { - return { prev: false, next: false }; - } - - } - - /** - * Enforces origin-specific format rules for embedded media. - */ - function formatEmbeddedContent() { - - var _appendParamToIframeSource = function( sourceAttribute, sourceURL, param ) { - toArray( dom.slides.querySelectorAll( 'iframe['+ sourceAttribute +'*="'+ sourceURL +'"]' ) ).forEach( function( el ) { - var src = el.getAttribute( sourceAttribute ); - if( src && src.indexOf( param ) === -1 ) { - el.setAttribute( sourceAttribute, src + ( !/\?/.test( src ) ? '?' : '&' ) + param ); - } - }); - }; - - // YouTube frames must include "?enablejsapi=1" - _appendParamToIframeSource( 'src', 'youtube.com/embed/', 'enablejsapi=1' ); - _appendParamToIframeSource( 'data-src', 'youtube.com/embed/', 'enablejsapi=1' ); - - // Vimeo frames must include "?api=1" - _appendParamToIframeSource( 'src', 'player.vimeo.com/', 'api=1' ); - _appendParamToIframeSource( 'data-src', 'player.vimeo.com/', 'api=1' ); - - } - - /** - * Start playback of any embedded content inside of - * the targeted slide. - */ - function startEmbeddedContent( slide ) { - - if( slide && !isSpeakerNotes() ) { - // Restart GIFs - toArray( slide.querySelectorAll( 'img[src$=".gif"]' ) ).forEach( function( el ) { - // Setting the same unchanged source like this was confirmed - // to work in Chrome, FF & Safari - el.setAttribute( 'src', el.getAttribute( 'src' ) ); - } ); - - // HTML5 media elements - toArray( slide.querySelectorAll( 'video, audio' ) ).forEach( function( el ) { - if( el.hasAttribute( 'data-autoplay' ) && typeof el.play === 'function' ) { - el.play(); - } - } ); - - // Normal iframes - toArray( slide.querySelectorAll( 'iframe[src]' ) ).forEach( function( el ) { - startEmbeddedIframe( { target: el } ); - } ); - - // Lazy loading iframes - toArray( slide.querySelectorAll( 'iframe[data-src]' ) ).forEach( function( el ) { - if( el.getAttribute( 'src' ) !== el.getAttribute( 'data-src' ) ) { - el.removeEventListener( 'load', startEmbeddedIframe ); // remove first to avoid dupes - el.addEventListener( 'load', startEmbeddedIframe ); - el.setAttribute( 'src', el.getAttribute( 'data-src' ) ); - } - } ); - } - - } - - /** - * "Starts" the content of an embedded iframe using the - * postmessage API. - */ - function startEmbeddedIframe( event ) { - - var iframe = event.target; - - // YouTube postMessage API - if( /youtube\.com\/embed\//.test( iframe.getAttribute( 'src' ) ) && iframe.hasAttribute( 'data-autoplay' ) ) { - iframe.contentWindow.postMessage( '{"event":"command","func":"playVideo","args":""}', '*' ); - } - // Vimeo postMessage API - else if( /player\.vimeo\.com\//.test( iframe.getAttribute( 'src' ) ) && iframe.hasAttribute( 'data-autoplay' ) ) { - iframe.contentWindow.postMessage( '{"method":"play"}', '*' ); - } - // Generic postMessage API - else { - iframe.contentWindow.postMessage( 'slide:start', '*' ); - } - - } - - /** - * Stop playback of any embedded content inside of - * the targeted slide. - */ - function stopEmbeddedContent( slide ) { - - if( slide && slide.parentNode ) { - // HTML5 media elements - toArray( slide.querySelectorAll( 'video, audio' ) ).forEach( function( el ) { - if( !el.hasAttribute( 'data-ignore' ) && typeof el.pause === 'function' ) { - el.pause(); - } - } ); - - // Generic postMessage API for non-lazy loaded iframes - toArray( slide.querySelectorAll( 'iframe' ) ).forEach( function( el ) { - el.contentWindow.postMessage( 'slide:stop', '*' ); - el.removeEventListener( 'load', startEmbeddedIframe ); - }); - - // YouTube postMessage API - toArray( slide.querySelectorAll( 'iframe[src*="youtube.com/embed/"]' ) ).forEach( function( el ) { - if( !el.hasAttribute( 'data-ignore' ) && typeof el.contentWindow.postMessage === 'function' ) { - el.contentWindow.postMessage( '{"event":"command","func":"pauseVideo","args":""}', '*' ); - } - }); - - // Vimeo postMessage API - toArray( slide.querySelectorAll( 'iframe[src*="player.vimeo.com/"]' ) ).forEach( function( el ) { - if( !el.hasAttribute( 'data-ignore' ) && typeof el.contentWindow.postMessage === 'function' ) { - el.contentWindow.postMessage( '{"method":"pause"}', '*' ); - } - }); - - // Lazy loading iframes - toArray( slide.querySelectorAll( 'iframe[data-src]' ) ).forEach( function( el ) { - // Only removing the src doesn't actually unload the frame - // in all browsers (Firefox) so we set it to blank first - el.setAttribute( 'src', 'about:blank' ); - el.removeAttribute( 'src' ); - } ); - } - - } - - /** - * Returns the number of past slides. This can be used as a global - * flattened index for slides. - */ - function getSlidePastCount() { - - var horizontalSlides = toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ); - - // The number of past slides - var pastCount = 0; - - // Step through all slides and count the past ones - mainLoop: for( var i = 0; i < horizontalSlides.length; i++ ) { - - var horizontalSlide = horizontalSlides[i]; - var verticalSlides = toArray( horizontalSlide.querySelectorAll( 'section' ) ); - - for( var j = 0; j < verticalSlides.length; j++ ) { - - // Stop as soon as we arrive at the present - if( verticalSlides[j].classList.contains( 'present' ) ) { - break mainLoop; - } - - pastCount++; - - } - - // Stop as soon as we arrive at the present - if( horizontalSlide.classList.contains( 'present' ) ) { - break; - } - - // Don't count the wrapping section for vertical slides - if( horizontalSlide.classList.contains( 'stack' ) === false ) { - pastCount++; - } - - } - - return pastCount; - - } - - /** - * Returns a value ranging from 0-1 that represents - * how far into the presentation we have navigated. - */ - function getProgress() { - - // The number of past and total slides - var totalCount = getTotalSlides(); - var pastCount = getSlidePastCount(); - - if( currentSlide ) { - - var allFragments = currentSlide.querySelectorAll( '.fragment' ); - - // If there are fragments in the current slide those should be - // accounted for in the progress. - if( allFragments.length > 0 ) { - var visibleFragments = currentSlide.querySelectorAll( '.fragment.visible' ); - - // This value represents how big a portion of the slide progress - // that is made up by its fragments (0-1) - var fragmentWeight = 0.9; - - // Add fragment progress to the past slide count - pastCount += ( visibleFragments.length / allFragments.length ) * fragmentWeight; - } - - } - - return pastCount / ( totalCount - 1 ); - - } - - /** - * Checks if this presentation is running inside of the - * speaker notes window. - */ - function isSpeakerNotes() { - - return !!window.location.search.match( /receiver/gi ); - - } - - /** - * Reads the current URL (hash) and navigates accordingly. - */ - function readURL() { - - var hash = window.location.hash; - - // Attempt to parse the hash as either an index or name - var bits = hash.slice( 2 ).split( '/' ), - name = hash.replace( /#|\//gi, '' ); - - // If the first bit is invalid and there is a name we can - // assume that this is a named link - if( isNaN( parseInt( bits[0], 10 ) ) && name.length ) { - var element; - - // Ensure the named link is a valid HTML ID attribute - if( /^[a-zA-Z][\w:.-]*$/.test( name ) ) { - // Find the slide with the specified ID - element = document.getElementById( name ); - } - - if( element ) { - // Find the position of the named slide and navigate to it - var indices = Reveal.getIndices( element ); - slide( indices.h, indices.v ); - } - // If the slide doesn't exist, navigate to the current slide - else { - slide( indexh || 0, indexv || 0 ); - } - } - else { - // Read the index components of the hash - var h = parseInt( bits[0], 10 ) || 0, - v = parseInt( bits[1], 10 ) || 0; - - if( h !== indexh || v !== indexv ) { - slide( h, v ); - } - } - - } - - /** - * Updates the page URL (hash) to reflect the current - * state. - * - * @param {Number} delay The time in ms to wait before - * writing the hash - */ - function writeURL( delay ) { - - if( config.history ) { - - // Make sure there's never more than one timeout running - clearTimeout( writeURLTimeout ); - - // If a delay is specified, timeout this call - if( typeof delay === 'number' ) { - writeURLTimeout = setTimeout( writeURL, delay ); - } - else if( currentSlide ) { - var url = '/'; - - // Attempt to create a named link based on the slide's ID - var id = currentSlide.getAttribute( 'id' ); - if( id ) { - id = id.replace( /[^a-zA-Z0-9\-\_\:\.]/g, '' ); - } - - // If the current slide has an ID, use that as a named link - if( typeof id === 'string' && id.length ) { - url = '/' + id; - } - // Otherwise use the /h/v index - else { - if( indexh > 0 || indexv > 0 ) url += indexh; - if( indexv > 0 ) url += '/' + indexv; - } - - window.location.hash = url; - } - } - - } - - /** - * Retrieves the h/v location of the current, or specified, - * slide. - * - * @param {HTMLElement} slide If specified, the returned - * index will be for this slide rather than the currently - * active one - * - * @return {Object} { h: , v: , f: } - */ - function getIndices( slide ) { - - // By default, return the current indices - var h = indexh, - v = indexv, - f; - - // If a slide is specified, return the indices of that slide - if( slide ) { - var isVertical = isVerticalSlide( slide ); - var slideh = isVertical ? slide.parentNode : slide; - - // Select all horizontal slides - var horizontalSlides = toArray( dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ); - - // Now that we know which the horizontal slide is, get its index - h = Math.max( horizontalSlides.indexOf( slideh ), 0 ); - - // Assume we're not vertical - v = undefined; - - // If this is a vertical slide, grab the vertical index - if( isVertical ) { - v = Math.max( toArray( slide.parentNode.querySelectorAll( 'section' ) ).indexOf( slide ), 0 ); - } - } - - if( !slide && currentSlide ) { - var hasFragments = currentSlide.querySelectorAll( '.fragment' ).length > 0; - if( hasFragments ) { - var currentFragment = currentSlide.querySelector( '.current-fragment' ); - if( currentFragment && currentFragment.hasAttribute( 'data-fragment-index' ) ) { - f = parseInt( currentFragment.getAttribute( 'data-fragment-index' ), 10 ); - } - else { - f = currentSlide.querySelectorAll( '.fragment.visible' ).length - 1; - } - } - } - - return { h: h, v: v, f: f }; - - } - - /** - * Retrieves the total number of slides in this presentation. - */ - function getTotalSlides() { - - return dom.wrapper.querySelectorAll( SLIDES_SELECTOR + ':not(.stack)' ).length; - - } - - /** - * Returns the slide element matching the specified index. - */ - function getSlide( x, y ) { - - var horizontalSlide = dom.wrapper.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR )[ x ]; - var verticalSlides = horizontalSlide && horizontalSlide.querySelectorAll( 'section' ); - - if( verticalSlides && verticalSlides.length && typeof y === 'number' ) { - return verticalSlides ? verticalSlides[ y ] : undefined; - } - - return horizontalSlide; - - } - - /** - * Returns the background element for the given slide. - * All slides, even the ones with no background properties - * defined, have a background element so as long as the - * index is valid an element will be returned. - */ - function getSlideBackground( x, y ) { - - // When printing to PDF the slide backgrounds are nested - // inside of the slides - if( isPrintingPDF() ) { - var slide = getSlide( x, y ); - if( slide ) { - var background = slide.querySelector( '.slide-background' ); - if( background && background.parentNode === slide ) { - return background; - } - } - - return undefined; - } - - var horizontalBackground = dom.wrapper.querySelectorAll( '.backgrounds>.slide-background' )[ x ]; - var verticalBackgrounds = horizontalBackground && horizontalBackground.querySelectorAll( '.slide-background' ); - - if( verticalBackgrounds && verticalBackgrounds.length && typeof y === 'number' ) { - return verticalBackgrounds ? verticalBackgrounds[ y ] : undefined; - } - - return horizontalBackground; - - } - - /** - * Retrieves the speaker notes from a slide. Notes can be - * defined in two ways: - * 1. As a data-notes attribute on the slide
- * 2. As an