flag if one is not present.
+ *
+ * The recommended mode is "-bs" since it is interactive and failure notifications
+ * are hence possible.
+ *
+ * @param string $command
+ *
+ * @return Swift_Transport_SendmailTransport
+ */
+ public function setCommand($command)
+ {
+ $this->_params['command'] = $command;
+
+ return $this;
+ }
+
+ /**
+ * Get the sendmail command which will be invoked.
+ *
+ * @return string
+ */
+ public function getCommand()
+ {
+ return $this->_params['command'];
+ }
+
+ /**
+ * Send the given Message.
+ *
+ * Recipient/sender data will be retrieved from the Message API.
+ *
+ * The return value is the number of recipients who were accepted for delivery.
+ * NOTE: If using 'sendmail -t' you will not be aware of any failures until
+ * they bounce (i.e. send() will always return 100% success).
+ *
+ * @param Swift_Mime_Message $message
+ * @param string[] $failedRecipients An array of failures by-reference
+ *
+ * @return int
+ */
+ public function send(Swift_Mime_Message $message, &$failedRecipients = null)
+ {
+ $failedRecipients = (array) $failedRecipients;
+ $command = $this->getCommand();
+ $buffer = $this->getBuffer();
+
+ if (false !== strpos($command, ' -t')) {
+ if ($evt = $this->_eventDispatcher->createSendEvent($this, $message)) {
+ $this->_eventDispatcher->dispatchEvent($evt, 'beforeSendPerformed');
+ if ($evt->bubbleCancelled()) {
+ return 0;
+ }
+ }
+
+ if (false === strpos($command, ' -f')) {
+ $command .= ' -f' . $this->_getReversePath($message);
+ }
+
+ $buffer->initialize(array_merge($this->_params, array('command' => $command)));
+
+ if (false === strpos($command, ' -i') && false === strpos($command, ' -oi')) {
+ $buffer->setWriteTranslations(array("\r\n" => "\n", "\n." => "\n.."));
+ } else {
+ $buffer->setWriteTranslations(array("\r\n"=>"\n"));
+ }
+
+ $count = count((array) $message->getTo())
+ + count((array) $message->getCc())
+ + count((array) $message->getBcc())
+ ;
+ $message->toByteStream($buffer);
+ $buffer->flushBuffers();
+ $buffer->setWriteTranslations(array());
+ $buffer->terminate();
+
+ if ($evt) {
+ $evt->setResult(Swift_Events_SendEvent::RESULT_SUCCESS);
+ $evt->setFailedRecipients($failedRecipients);
+ $this->_eventDispatcher->dispatchEvent($evt, 'sendPerformed');
+ }
+
+ $message->generateId();
+ } elseif (false !== strpos($command, ' -bs')) {
+ $count = parent::send($message, $failedRecipients);
+ } else {
+ $this->_throwException(new Swift_TransportException(
+ 'Unsupported sendmail command flags [' . $command . ']. ' .
+ 'Must be one of "-bs" or "-t" but can include additional flags.'
+ ));
+ }
+
+ return $count;
+ }
+
+ // -- Protected methods
+
+ /** Get the params to initialize the buffer */
+ protected function _getBufferParams()
+ {
+ return $this->_params;
+ }
+}
diff --git a/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/SimpleMailInvoker.php b/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/SimpleMailInvoker.php
new file mode 100644
index 0000000..91157e5
--- /dev/null
+++ b/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/SimpleMailInvoker.php
@@ -0,0 +1,41 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Stores Messages in a queue.
+ *
+ * @package Swift
+ * @author Fabien Potencier
+ */
+class Swift_Transport_SpoolTransport implements Swift_Transport
+{
+ /** The spool instance */
+ private $_spool;
+
+ /** The event dispatcher from the plugin API */
+ private $_eventDispatcher;
+
+ /**
+ * Constructor.
+ */
+ public function __construct(Swift_Events_EventDispatcher $eventDispatcher, Swift_Spool $spool = null)
+ {
+ $this->_eventDispatcher = $eventDispatcher;
+ $this->_spool = $spool;
+ }
+
+ /**
+ * Sets the spool object.
+ *
+ * @param Swift_Spool $spool
+ *
+ * @return Swift_Transport_SpoolTransport
+ */
+ public function setSpool(Swift_Spool $spool)
+ {
+ $this->_spool = $spool;
+
+ return $this;
+ }
+
+ /**
+ * Get the spool object.
+ *
+ * @return Swift_Spool
+ */
+ public function getSpool()
+ {
+ return $this->_spool;
+ }
+
+ /**
+ * Tests if this Transport mechanism has started.
+ *
+ * @return boolean
+ */
+ public function isStarted()
+ {
+ return true;
+ }
+
+ /**
+ * Starts this Transport mechanism.
+ */
+ public function start()
+ {
+ }
+
+ /**
+ * Stops this Transport mechanism.
+ */
+ public function stop()
+ {
+ }
+
+ /**
+ * Sends the given message.
+ *
+ * @param Swift_Mime_Message $message
+ * @param string[] $failedRecipients An array of failures by-reference
+ *
+ * @return integer The number of sent e-mail's
+ */
+ public function send(Swift_Mime_Message $message, &$failedRecipients = null)
+ {
+ if ($evt = $this->_eventDispatcher->createSendEvent($this, $message)) {
+ $this->_eventDispatcher->dispatchEvent($evt, 'beforeSendPerformed');
+ if ($evt->bubbleCancelled()) {
+ return 0;
+ }
+ }
+
+ $success = $this->_spool->queueMessage($message);
+
+ if ($evt) {
+ $evt->setResult($success ? Swift_Events_SendEvent::RESULT_SUCCESS : Swift_Events_SendEvent::RESULT_FAILED);
+ $this->_eventDispatcher->dispatchEvent($evt, 'sendPerformed');
+ }
+
+ return 1;
+ }
+
+ /**
+ * Register a plugin.
+ *
+ * @param Swift_Events_EventListener $plugin
+ */
+ public function registerPlugin(Swift_Events_EventListener $plugin)
+ {
+ $this->_eventDispatcher->bindEventListener($plugin);
+ }
+}
diff --git a/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/StreamBuffer.php b/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/StreamBuffer.php
new file mode 100644
index 0000000..0818d85
--- /dev/null
+++ b/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/StreamBuffer.php
@@ -0,0 +1,322 @@
+_replacementFactory = $replacementFactory;
+ }
+
+ /**
+ * Perform any initialization needed, using the given $params.
+ *
+ * Parameters will vary depending upon the type of IoBuffer used.
+ *
+ * @param array $params
+ */
+ public function initialize(array $params)
+ {
+ $this->_params = $params;
+ switch ($params['type']) {
+ case self::TYPE_PROCESS:
+ $this->_establishProcessConnection();
+ break;
+ case self::TYPE_SOCKET:
+ default:
+ $this->_establishSocketConnection();
+ break;
+ }
+ }
+
+ /**
+ * Set an individual param on the buffer (e.g. switching to SSL).
+ *
+ * @param string $param
+ * @param mixed $value
+ */
+ public function setParam($param, $value)
+ {
+ if (isset($this->_stream)) {
+ switch ($param) {
+ case 'timeout':
+ if ($this->_stream) {
+ stream_set_timeout($this->_stream, $value);
+ }
+ break;
+
+ case 'blocking':
+ if ($this->_stream) {
+ stream_set_blocking($this->_stream, 1);
+ }
+
+ }
+ }
+ $this->_params[$param] = $value;
+ }
+
+ public function startTLS()
+ {
+ return stream_socket_enable_crypto($this->_stream, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
+ }
+
+ /**
+ * Perform any shutdown logic needed.
+ */
+ public function terminate()
+ {
+ if (isset($this->_stream)) {
+ switch ($this->_params['type']) {
+ case self::TYPE_PROCESS:
+ fclose($this->_in);
+ fclose($this->_out);
+ proc_close($this->_stream);
+ break;
+ case self::TYPE_SOCKET:
+ default:
+ fclose($this->_stream);
+ break;
+ }
+ }
+ $this->_stream = null;
+ $this->_out = null;
+ $this->_in = null;
+ }
+
+ /**
+ * Set an array of string replacements which should be made on data written
+ * to the buffer.
+ *
+ * This could replace LF with CRLF for example.
+ *
+ * @param string[] $replacements
+ */
+ public function setWriteTranslations(array $replacements)
+ {
+ foreach ($this->_translations as $search => $replace) {
+ if (!isset($replacements[$search])) {
+ $this->removeFilter($search);
+ unset($this->_translations[$search]);
+ }
+ }
+
+ foreach ($replacements as $search => $replace) {
+ if (!isset($this->_translations[$search])) {
+ $this->addFilter(
+ $this->_replacementFactory->createFilter($search, $replace), $search
+ );
+ $this->_translations[$search] = true;
+ }
+ }
+ }
+
+ /**
+ * Get a line of output (including any CRLF).
+ *
+ * The $sequence number comes from any writes and may or may not be used
+ * depending upon the implementation.
+ *
+ * @param integer $sequence of last write to scan from
+ *
+ * @return string
+ *
+ * @throws Swift_IoException
+ */
+ public function readLine($sequence)
+ {
+ if (isset($this->_out) && !feof($this->_out)) {
+ $line = fgets($this->_out);
+ if (strlen($line)==0) {
+ $metas = stream_get_meta_data($this->_out);
+ if ($metas['timed_out']) {
+ throw new Swift_IoException(
+ 'Connection to ' .
+ $this->_getReadConnectionDescription() .
+ ' Timed Out'
+ );
+ }
+ }
+
+ return $line;
+ }
+ }
+
+ /**
+ * Reads $length bytes from the stream into a string and moves the pointer
+ * through the stream by $length.
+ *
+ * If less bytes exist than are requested the remaining bytes are given instead.
+ * If no bytes are remaining at all, boolean false is returned.
+ *
+ * @param integer $length
+ *
+ * @return string|boolean
+ *
+ * @throws Swift_IoException
+ */
+ public function read($length)
+ {
+ if (isset($this->_out) && !feof($this->_out)) {
+ $ret = fread($this->_out, $length);
+ if (strlen($ret)==0) {
+ $metas = stream_get_meta_data($this->_out);
+ if ($metas['timed_out']) {
+ throw new Swift_IoException(
+ 'Connection to ' .
+ $this->_getReadConnectionDescription() .
+ ' Timed Out'
+ );
+ }
+ }
+
+ return $ret;
+ }
+ }
+
+ /** Not implemented */
+ public function setReadPointer($byteOffset)
+ {
+ }
+
+ // -- Protected methods
+
+ /** Flush the stream contents */
+ protected function _flush()
+ {
+ if (isset($this->_in)) {
+ fflush($this->_in);
+ }
+ }
+
+ /** Write this bytes to the stream */
+ protected function _commit($bytes)
+ {
+ if (isset($this->_in)) {
+ $bytesToWrite = strlen($bytes);
+ $totalBytesWritten = 0;
+
+ while ($totalBytesWritten < $bytesToWrite) {
+ $bytesWriten = fwrite($this->_in, substr($bytes, $totalBytesWritten));
+ $totalBytesWritten += $bytesWriten;
+ }
+ if ($totalBytesWritten > 0) {
+ return ++$this->_sequence;
+ }
+ }
+ }
+
+ // -- Private methods
+
+ /**
+ * Establishes a connection to a remote server.
+ */
+ private function _establishSocketConnection()
+ {
+ $host = $this->_params['host'];
+ if (!empty($this->_params['protocol'])) {
+ $host = $this->_params['protocol'] . '://' . $host;
+ }
+ $timeout = 15;
+ if (!empty($this->_params['timeout'])) {
+ $timeout = $this->_params['timeout'];
+ }
+ $options = array();
+ if (!empty($this->_params['sourceIp'])) {
+ $options['socket']['bindto']=$this->_params['sourceIp'].':0';
+ }
+ $this->_stream = @stream_socket_client($host.':'.$this->_params['port'], $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, stream_context_create($options));
+ if (false === $this->_stream) {
+ throw new Swift_TransportException(
+ 'Connection could not be established with host ' . $this->_params['host'] .
+ ' [' . $errstr . ' #' . $errno . ']'
+ );
+ }
+ if (!empty($this->_params['blocking'])) {
+ stream_set_blocking($this->_stream, 1);
+ } else {
+ stream_set_blocking($this->_stream, 0);
+ }
+ stream_set_timeout($this->_stream, $timeout);
+ $this->_in =& $this->_stream;
+ $this->_out =& $this->_stream;
+ }
+
+ /**
+ * Opens a process for input/output.
+ */
+ private function _establishProcessConnection()
+ {
+ $command = $this->_params['command'];
+ $descriptorSpec = array(
+ 0 => array('pipe', 'r'),
+ 1 => array('pipe', 'w'),
+ 2 => array('pipe', 'w')
+ );
+ $this->_stream = proc_open($command, $descriptorSpec, $pipes);
+ stream_set_blocking($pipes[2], 0);
+ if ($err = stream_get_contents($pipes[2])) {
+ throw new Swift_TransportException(
+ 'Process could not be started [' . $err . ']'
+ );
+ }
+ $this->_in =& $pipes[0];
+ $this->_out =& $pipes[1];
+ }
+
+ private function _getReadConnectionDescription()
+ {
+ switch ($this->_params['type']) {
+ case self::TYPE_PROCESS:
+ return 'Process '.$this->_params['command'];
+ break;
+
+ case self::TYPE_SOCKET:
+ default:
+ $host = $this->_params['host'];
+ if (!empty($this->_params['protocol'])) {
+ $host = $this->_params['protocol'] . '://' . $host;
+ }
+ $host.=':'.$this->_params['port'];
+
+ return $host;
+ break;
+ }
+ }
+}
diff --git a/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/TransportException.php b/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/TransportException.php
new file mode 100644
index 0000000..48e41d1
--- /dev/null
+++ b/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/classes/Swift/TransportException.php
@@ -0,0 +1,29 @@
+
+ */
+class Swift_Validate
+{
+ /**
+ * Grammar Object
+ *
+ * @var Swift_Mime_Grammar
+ */
+ private static $grammar = null;
+
+ /**
+ * Checks if an e-mail address matches the current grammars.
+ *
+ * @param string $email
+ *
+ * @return boolean
+ */
+ public static function email($email)
+ {
+ if (self::$grammar===null) {
+ self::$grammar = Swift_DependencyContainer::getInstance()
+ ->lookup('mime.grammar');
+ }
+
+ return preg_match(
+ '/^' . self::$grammar->getDefinition('addr-spec') . '$/D',
+ $email
+ );
+ }
+}
diff --git a/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/dependency_maps/cache_deps.php b/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/dependency_maps/cache_deps.php
new file mode 100644
index 0000000..6023448
--- /dev/null
+++ b/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/dependency_maps/cache_deps.php
@@ -0,0 +1,23 @@
+register('cache')
+ ->asAliasOf('cache.array')
+
+ ->register('tempdir')
+ ->asValue('/tmp')
+
+ ->register('cache.null')
+ ->asSharedInstanceOf('Swift_KeyCache_NullKeyCache')
+
+ ->register('cache.array')
+ ->asSharedInstanceOf('Swift_KeyCache_ArrayKeyCache')
+ ->withDependencies(array('cache.inputstream'))
+
+ ->register('cache.disk')
+ ->asSharedInstanceOf('Swift_KeyCache_DiskKeyCache')
+ ->withDependencies(array('cache.inputstream', 'tempdir'))
+
+ ->register('cache.inputstream')
+ ->asNewInstanceOf('Swift_KeyCache_SimpleKeyCacheInputStream')
+;
diff --git a/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/dependency_maps/message_deps.php b/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/dependency_maps/message_deps.php
new file mode 100644
index 0000000..64d69d2
--- /dev/null
+++ b/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/dependency_maps/message_deps.php
@@ -0,0 +1,9 @@
+register('message.message')
+ ->asNewInstanceOf('Swift_Message')
+
+ ->register('message.mimepart')
+ ->asNewInstanceOf('Swift_MimePart')
+;
diff --git a/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/dependency_maps/mime_deps.php b/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/dependency_maps/mime_deps.php
new file mode 100644
index 0000000..a13472e
--- /dev/null
+++ b/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/dependency_maps/mime_deps.php
@@ -0,0 +1,123 @@
+register('properties.charset')
+ ->asValue('utf-8')
+
+ ->register('mime.grammar')
+ ->asSharedInstanceOf('Swift_Mime_Grammar')
+
+ ->register('mime.message')
+ ->asNewInstanceOf('Swift_Mime_SimpleMessage')
+ ->withDependencies(array(
+ 'mime.headerset',
+ 'mime.qpcontentencoder',
+ 'cache',
+ 'mime.grammar',
+ 'properties.charset'
+ ))
+
+ ->register('mime.part')
+ ->asNewInstanceOf('Swift_Mime_MimePart')
+ ->withDependencies(array(
+ 'mime.headerset',
+ 'mime.qpcontentencoder',
+ 'cache',
+ 'mime.grammar',
+ 'properties.charset'
+ ))
+
+ ->register('mime.attachment')
+ ->asNewInstanceOf('Swift_Mime_Attachment')
+ ->withDependencies(array(
+ 'mime.headerset',
+ 'mime.base64contentencoder',
+ 'cache',
+ 'mime.grammar'
+ ))
+ ->addConstructorValue($swift_mime_types)
+
+ ->register('mime.embeddedfile')
+ ->asNewInstanceOf('Swift_Mime_EmbeddedFile')
+ ->withDependencies(array(
+ 'mime.headerset',
+ 'mime.base64contentencoder',
+ 'cache',
+ 'mime.grammar'
+ ))
+ ->addConstructorValue($swift_mime_types)
+
+ ->register('mime.headerfactory')
+ ->asNewInstanceOf('Swift_Mime_SimpleHeaderFactory')
+ ->withDependencies(array(
+ 'mime.qpheaderencoder',
+ 'mime.rfc2231encoder',
+ 'mime.grammar',
+ 'properties.charset'
+ ))
+
+ ->register('mime.headerset')
+ ->asNewInstanceOf('Swift_Mime_SimpleHeaderSet')
+ ->withDependencies(array('mime.headerfactory', 'properties.charset'))
+
+ ->register('mime.qpheaderencoder')
+ ->asNewInstanceOf('Swift_Mime_HeaderEncoder_QpHeaderEncoder')
+ ->withDependencies(array('mime.charstream'))
+
+ ->register('mime.base64headerencoder')
+ ->asNewInstanceOf('Swift_Mime_HeaderEncoder_Base64HeaderEncoder')
+ ->withDependencies(array('mime.charstream'))
+
+ ->register('mime.charstream')
+ ->asNewInstanceOf('Swift_CharacterStream_NgCharacterStream')
+ ->withDependencies(array('mime.characterreaderfactory', 'properties.charset'))
+
+ ->register('mime.bytecanonicalizer')
+ ->asSharedInstanceOf('Swift_StreamFilters_ByteArrayReplacementFilter')
+ ->addConstructorValue(array(array(0x0D, 0x0A), array(0x0D), array(0x0A)))
+ ->addConstructorValue(array(array(0x0A), array(0x0A), array(0x0D, 0x0A)))
+
+ ->register('mime.characterreaderfactory')
+ ->asSharedInstanceOf('Swift_CharacterReaderFactory_SimpleCharacterReaderFactory')
+
+ ->register('mime.safeqpcontentencoder')
+ ->asNewInstanceOf('Swift_Mime_ContentEncoder_QpContentEncoder')
+ ->withDependencies(array('mime.charstream', 'mime.bytecanonicalizer'))
+
+ ->register('mime.rawcontentencoder')
+ ->asNewInstanceOf('Swift_Mime_ContentEncoder_RawContentEncoder')
+
+ ->register('mime.nativeqpcontentencoder')
+ ->withDependencies(array('properties.charset'))
+ ->asNewInstanceOf('Swift_Mime_ContentEncoder_NativeQpContentEncoder')
+
+ ->register('mime.qpcontentencoderproxy')
+ ->asNewInstanceOf('Swift_Mime_ContentEncoder_QpContentEncoderProxy')
+ ->withDependencies(array('mime.safeqpcontentencoder', 'mime.nativeqpcontentencoder', 'properties.charset'))
+
+ ->register('mime.7bitcontentencoder')
+ ->asNewInstanceOf('Swift_Mime_ContentEncoder_PlainContentEncoder')
+ ->addConstructorValue('7bit')
+ ->addConstructorValue(true)
+
+ ->register('mime.8bitcontentencoder')
+ ->asNewInstanceOf('Swift_Mime_ContentEncoder_PlainContentEncoder')
+ ->addConstructorValue('8bit')
+ ->addConstructorValue(true)
+
+ ->register('mime.base64contentencoder')
+ ->asSharedInstanceOf('Swift_Mime_ContentEncoder_Base64ContentEncoder')
+
+ ->register('mime.rfc2231encoder')
+ ->asNewInstanceOf('Swift_Encoder_Rfc2231Encoder')
+ ->withDependencies(array('mime.charstream'))
+
+ // As of PHP 5.4.7, the quoted_printable_encode() function behaves correctly.
+ // see https://github.com/php/php-src/commit/18bb426587d62f93c54c40bf8535eb8416603629
+ ->register('mime.qpcontentencoder')
+ ->asAliasOf(version_compare(phpversion(), '5.4.7', '>=') ? 'mime.qpcontentencoderproxy' : 'mime.safeqpcontentencoder')
+;
+
+unset($swift_mime_types);
diff --git a/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/dependency_maps/transport_deps.php b/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/dependency_maps/transport_deps.php
new file mode 100644
index 0000000..56ca059
--- /dev/null
+++ b/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/dependency_maps/transport_deps.php
@@ -0,0 +1,76 @@
+register('transport.smtp')
+ ->asNewInstanceOf('Swift_Transport_EsmtpTransport')
+ ->withDependencies(array(
+ 'transport.buffer',
+ array('transport.authhandler'),
+ 'transport.eventdispatcher'
+ ))
+
+ ->register('transport.sendmail')
+ ->asNewInstanceOf('Swift_Transport_SendmailTransport')
+ ->withDependencies(array(
+ 'transport.buffer',
+ 'transport.eventdispatcher'
+ ))
+
+ ->register('transport.mail')
+ ->asNewInstanceOf('Swift_Transport_MailTransport')
+ ->withDependencies(array('transport.mailinvoker', 'transport.eventdispatcher'))
+
+ ->register('transport.loadbalanced')
+ ->asNewInstanceOf('Swift_Transport_LoadBalancedTransport')
+
+ ->register('transport.failover')
+ ->asNewInstanceOf('Swift_Transport_FailoverTransport')
+
+ ->register('transport.spool')
+ ->asNewInstanceOf('Swift_Transport_SpoolTransport')
+ ->withDependencies(array('transport.eventdispatcher'))
+
+ ->register('transport.null')
+ ->asNewInstanceOf('Swift_Transport_NullTransport')
+ ->withDependencies(array('transport.eventdispatcher'))
+
+ ->register('transport.mailinvoker')
+ ->asSharedInstanceOf('Swift_Transport_SimpleMailInvoker')
+
+ ->register('transport.buffer')
+ ->asNewInstanceOf('Swift_Transport_StreamBuffer')
+ ->withDependencies(array('transport.replacementfactory'))
+
+ ->register('transport.authhandler')
+ ->asNewInstanceOf('Swift_Transport_Esmtp_AuthHandler')
+ ->withDependencies(array(
+ array(
+ 'transport.crammd5auth',
+ 'transport.loginauth',
+ 'transport.plainauth',
+ 'transport.ntlmauth',
+ 'transport.xoauth2auth',
+ )
+ ))
+
+ ->register('transport.crammd5auth')
+ ->asNewInstanceOf('Swift_Transport_Esmtp_Auth_CramMd5Authenticator')
+
+ ->register('transport.loginauth')
+ ->asNewInstanceOf('Swift_Transport_Esmtp_Auth_LoginAuthenticator')
+
+ ->register('transport.plainauth')
+ ->asNewInstanceOf('Swift_Transport_Esmtp_Auth_PlainAuthenticator')
+
+ ->register('transport.xoauth2auth')
+ ->asNewInstanceOf('Swift_Transport_Esmtp_Auth_XOAuth2Authenticator')
+
+ ->register('transport.ntlmauth')
+ ->asNewInstanceOf('Swift_Transport_Esmtp_Auth_NTLMAuthenticator')
+
+ ->register('transport.eventdispatcher')
+ ->asNewInstanceOf('Swift_Events_SimpleEventDispatcher')
+
+ ->register('transport.replacementfactory')
+ ->asSharedInstanceOf('Swift_StreamFilters_StringReplacementFilterFactory')
+;
diff --git a/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/mime_types.php b/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/mime_types.php
new file mode 100644
index 0000000..f31567d
--- /dev/null
+++ b/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/mime_types.php
@@ -0,0 +1,1007 @@
+ 'text/vnd.in3d.3dml',
+ '3ds' => 'image/x-3ds',
+ '3g2' => 'video/3gpp2',
+ '3gp' => 'video/3gpp',
+ '7z' => 'application/x-7z-compressed',
+ 'aab' => 'application/x-authorware-bin',
+ 'aac' => 'audio/x-aac',
+ 'aam' => 'application/x-authorware-map',
+ 'aas' => 'application/x-authorware-seg',
+ 'abw' => 'application/x-abiword',
+ 'ac' => 'application/pkix-attr-cert',
+ 'acc' => 'application/vnd.americandynamics.acc',
+ 'ace' => 'application/x-ace-compressed',
+ 'acu' => 'application/vnd.acucobol',
+ 'acutc' => 'application/vnd.acucorp',
+ 'adp' => 'audio/adpcm',
+ 'aep' => 'application/vnd.audiograph',
+ 'afm' => 'application/x-font-type1',
+ 'afp' => 'application/vnd.ibm.modcap',
+ 'ahead' => 'application/vnd.ahead.space',
+ 'ai' => 'application/postscript',
+ 'aif' => 'audio/x-aiff',
+ 'aifc' => 'audio/x-aiff',
+ 'aiff' => 'audio/x-aiff',
+ 'air' => 'application/vnd.adobe.air-application-installer-package+zip',
+ 'ait' => 'application/vnd.dvb.ait',
+ 'ami' => 'application/vnd.amiga.ami',
+ 'apk' => 'application/vnd.android.package-archive',
+ 'appcache' => 'text/cache-manifest',
+ 'apr' => 'application/vnd.lotus-approach',
+ 'aps' => 'application/postscript',
+ 'arc' => 'application/x-freearc',
+ 'asc' => 'application/pgp-signature',
+ 'asf' => 'video/x-ms-asf',
+ 'asm' => 'text/x-asm',
+ 'aso' => 'application/vnd.accpac.simply.aso',
+ 'asx' => 'video/x-ms-asf',
+ 'atc' => 'application/vnd.acucorp',
+ 'atom' => 'application/atom+xml',
+ 'atomcat' => 'application/atomcat+xml',
+ 'atomsvc' => 'application/atomsvc+xml',
+ 'atx' => 'application/vnd.antix.game-component',
+ 'au' => 'audio/basic',
+ 'avi' => 'video/x-msvideo',
+ 'aw' => 'application/applixware',
+ 'azf' => 'application/vnd.airzip.filesecure.azf',
+ 'azs' => 'application/vnd.airzip.filesecure.azs',
+ 'azw' => 'application/vnd.amazon.ebook',
+ 'bat' => 'application/x-msdownload',
+ 'bcpio' => 'application/x-bcpio',
+ 'bdf' => 'application/x-font-bdf',
+ 'bdm' => 'application/vnd.syncml.dm+wbxml',
+ 'bed' => 'application/vnd.realvnc.bed',
+ 'bh2' => 'application/vnd.fujitsu.oasysprs',
+ 'bin' => 'application/octet-stream',
+ 'blb' => 'application/x-blorb',
+ 'blorb' => 'application/x-blorb',
+ 'bmi' => 'application/vnd.bmi',
+ 'bmp' => 'image/bmp',
+ 'book' => 'application/vnd.framemaker',
+ 'box' => 'application/vnd.previewsystems.box',
+ 'boz' => 'application/x-bzip2',
+ 'bpk' => 'application/octet-stream',
+ 'btif' => 'image/prs.btif',
+ 'bz' => 'application/x-bzip',
+ 'bz2' => 'application/x-bzip2',
+ 'c' => 'text/x-c',
+ 'c11amc' => 'application/vnd.cluetrust.cartomobile-config',
+ 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg',
+ 'c4d' => 'application/vnd.clonk.c4group',
+ 'c4f' => 'application/vnd.clonk.c4group',
+ 'c4g' => 'application/vnd.clonk.c4group',
+ 'c4p' => 'application/vnd.clonk.c4group',
+ 'c4u' => 'application/vnd.clonk.c4group',
+ 'cab' => 'application/vnd.ms-cab-compressed',
+ 'caf' => 'audio/x-caf',
+ 'cap' => 'application/vnd.tcpdump.pcap',
+ 'car' => 'application/vnd.curl.car',
+ 'cat' => 'application/vnd.ms-pki.seccat',
+ 'cb7' => 'application/x-cbr',
+ 'cba' => 'application/x-cbr',
+ 'cbr' => 'application/x-cbr',
+ 'cbt' => 'application/x-cbr',
+ 'cbz' => 'application/x-cbr',
+ 'cc' => 'text/x-c',
+ 'cct' => 'application/x-director',
+ 'ccxml' => 'application/ccxml+xml',
+ 'cdbcmsg' => 'application/vnd.contact.cmsg',
+ 'cdf' => 'application/x-netcdf',
+ 'cdkey' => 'application/vnd.mediastation.cdkey',
+ 'cdmia' => 'application/cdmi-capability',
+ 'cdmic' => 'application/cdmi-container',
+ 'cdmid' => 'application/cdmi-domain',
+ 'cdmio' => 'application/cdmi-object',
+ 'cdmiq' => 'application/cdmi-queue',
+ 'cdx' => 'chemical/x-cdx',
+ 'cdxml' => 'application/vnd.chemdraw+xml',
+ 'cdy' => 'application/vnd.cinderella',
+ 'cer' => 'application/pkix-cert',
+ 'cfs' => 'application/x-cfs-compressed',
+ 'cgm' => 'image/cgm',
+ 'chat' => 'application/x-chat',
+ 'chm' => 'application/vnd.ms-htmlhelp',
+ 'chrt' => 'application/vnd.kde.kchart',
+ 'cif' => 'chemical/x-cif',
+ 'cii' => 'application/vnd.anser-web-certificate-issue-initiation',
+ 'cil' => 'application/vnd.ms-artgalry',
+ 'cla' => 'application/vnd.claymore',
+ 'class' => 'application/java-vm',
+ 'clkk' => 'application/vnd.crick.clicker.keyboard',
+ 'clkp' => 'application/vnd.crick.clicker.palette',
+ 'clkt' => 'application/vnd.crick.clicker.template',
+ 'clkw' => 'application/vnd.crick.clicker.wordbank',
+ 'clkx' => 'application/vnd.crick.clicker',
+ 'clp' => 'application/x-msclip',
+ 'cmc' => 'application/vnd.cosmocaller',
+ 'cmdf' => 'chemical/x-cmdf',
+ 'cml' => 'chemical/x-cml',
+ 'cmp' => 'application/vnd.yellowriver-custom-menu',
+ 'cmx' => 'image/x-cmx',
+ 'cod' => 'application/vnd.rim.cod',
+ 'com' => 'application/x-msdownload',
+ 'conf' => 'text/plain',
+ 'cpio' => 'application/x-cpio',
+ 'cpp' => 'text/x-c',
+ 'cpt' => 'application/mac-compactpro',
+ 'crd' => 'application/x-mscardfile',
+ 'crl' => 'application/pkix-crl',
+ 'crt' => 'application/x-x509-ca-cert',
+ 'csh' => 'application/x-csh',
+ 'csml' => 'chemical/x-csml',
+ 'csp' => 'application/vnd.commonspace',
+ 'css' => 'text/css',
+ 'cst' => 'application/x-director',
+ 'csv' => 'text/csv',
+ 'cu' => 'application/cu-seeme',
+ 'curl' => 'text/vnd.curl',
+ 'cww' => 'application/prs.cww',
+ 'cxt' => 'application/x-director',
+ 'cxx' => 'text/x-c',
+ 'dae' => 'model/vnd.collada+xml',
+ 'daf' => 'application/vnd.mobius.daf',
+ 'dart' => 'application/vnd.dart',
+ 'dataless' => 'application/vnd.fdsn.seed',
+ 'davmount' => 'application/davmount+xml',
+ 'dbk' => 'application/docbook+xml',
+ 'dcr' => 'application/x-director',
+ 'dcurl' => 'text/vnd.curl.dcurl',
+ 'dd2' => 'application/vnd.oma.dd2+xml',
+ 'ddd' => 'application/vnd.fujixerox.ddd',
+ 'deb' => 'application/x-debian-package',
+ 'def' => 'text/plain',
+ 'deploy' => 'application/octet-stream',
+ 'der' => 'application/x-x509-ca-cert',
+ 'dfac' => 'application/vnd.dreamfactory',
+ 'dgc' => 'application/x-dgc-compressed',
+ 'dic' => 'text/x-c',
+ 'dir' => 'application/x-director',
+ 'dis' => 'application/vnd.mobius.dis',
+ 'dist' => 'application/octet-stream',
+ 'distz' => 'application/octet-stream',
+ 'djv' => 'image/vnd.djvu',
+ 'djvu' => 'image/vnd.djvu',
+ 'dll' => 'application/x-msdownload',
+ 'dmg' => 'application/x-apple-diskimage',
+ 'dmp' => 'application/vnd.tcpdump.pcap',
+ 'dms' => 'application/octet-stream',
+ 'dna' => 'application/vnd.dna',
+ 'doc' => 'application/msword',
+ 'docm' => 'application/vnd.ms-word.document.macroenabled.12',
+ 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+ 'dot' => 'application/msword',
+ 'dotm' => 'application/vnd.ms-word.template.macroenabled.12',
+ 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
+ 'dp' => 'application/vnd.osgi.dp',
+ 'dpg' => 'application/vnd.dpgraph',
+ 'dra' => 'audio/vnd.dra',
+ 'dsc' => 'text/prs.lines.tag',
+ 'dssc' => 'application/dssc+der',
+ 'dtb' => 'application/x-dtbook+xml',
+ 'dtd' => 'application/xml-dtd',
+ 'dts' => 'audio/vnd.dts',
+ 'dtshd' => 'audio/vnd.dts.hd',
+ 'dump' => 'application/octet-stream',
+ 'dvb' => 'video/vnd.dvb.file',
+ 'dvi' => 'application/x-dvi',
+ 'dwf' => 'model/vnd.dwf',
+ 'dwg' => 'image/vnd.dwg',
+ 'dxf' => 'image/vnd.dxf',
+ 'dxp' => 'application/vnd.spotfire.dxp',
+ 'dxr' => 'application/x-director',
+ 'ecelp4800' => 'audio/vnd.nuera.ecelp4800',
+ 'ecelp7470' => 'audio/vnd.nuera.ecelp7470',
+ 'ecelp9600' => 'audio/vnd.nuera.ecelp9600',
+ 'ecma' => 'application/ecmascript',
+ 'edm' => 'application/vnd.novadigm.edm',
+ 'edx' => 'application/vnd.novadigm.edx',
+ 'efif' => 'application/vnd.picsel',
+ 'ei6' => 'application/vnd.pg.osasli',
+ 'elc' => 'application/octet-stream',
+ 'emf' => 'application/x-msmetafile',
+ 'eml' => 'message/rfc822',
+ 'emma' => 'application/emma+xml',
+ 'emz' => 'application/x-msmetafile',
+ 'eol' => 'audio/vnd.digital-winds',
+ 'eot' => 'application/vnd.ms-fontobject',
+ 'eps' => 'application/postscript',
+ 'epub' => 'application/epub+zip',
+ 'es3' => 'application/vnd.eszigno3+xml',
+ 'esa' => 'application/vnd.osgi.subsystem',
+ 'esf' => 'application/vnd.epson.esf',
+ 'et3' => 'application/vnd.eszigno3+xml',
+ 'etx' => 'text/x-setext',
+ 'eva' => 'application/x-eva',
+ 'evy' => 'application/x-envoy',
+ 'exe' => 'application/x-msdownload',
+ 'exi' => 'application/exi',
+ 'ext' => 'application/vnd.novadigm.ext',
+ 'ez' => 'application/andrew-inset',
+ 'ez2' => 'application/vnd.ezpix-album',
+ 'ez3' => 'application/vnd.ezpix-package',
+ 'f' => 'text/x-fortran',
+ 'f4v' => 'video/x-f4v',
+ 'f77' => 'text/x-fortran',
+ 'f90' => 'text/x-fortran',
+ 'fbs' => 'image/vnd.fastbidsheet',
+ 'fcdt' => 'application/vnd.adobe.formscentral.fcdt',
+ 'fcs' => 'application/vnd.isac.fcs',
+ 'fdf' => 'application/vnd.fdf',
+ 'fe_launch' => 'application/vnd.denovo.fcselayout-link',
+ 'fg5' => 'application/vnd.fujitsu.oasysgp',
+ 'fgd' => 'application/x-director',
+ 'fh' => 'image/x-freehand',
+ 'fh4' => 'image/x-freehand',
+ 'fh5' => 'image/x-freehand',
+ 'fh7' => 'image/x-freehand',
+ 'fhc' => 'image/x-freehand',
+ 'fig' => 'application/x-xfig',
+ 'flac' => 'audio/x-flac',
+ 'fli' => 'video/x-fli',
+ 'flo' => 'application/vnd.micrografx.flo',
+ 'flv' => 'video/x-flv',
+ 'flw' => 'application/vnd.kde.kivio',
+ 'flx' => 'text/vnd.fmi.flexstor',
+ 'fly' => 'text/vnd.fly',
+ 'fm' => 'application/vnd.framemaker',
+ 'fnc' => 'application/vnd.frogans.fnc',
+ 'for' => 'text/x-fortran',
+ 'fpx' => 'image/vnd.fpx',
+ 'frame' => 'application/vnd.framemaker',
+ 'fsc' => 'application/vnd.fsc.weblaunch',
+ 'fst' => 'image/vnd.fst',
+ 'ftc' => 'application/vnd.fluxtime.clip',
+ 'fti' => 'application/vnd.anser-web-funds-transfer-initiation',
+ 'fvt' => 'video/vnd.fvt',
+ 'fxp' => 'application/vnd.adobe.fxp',
+ 'fxpl' => 'application/vnd.adobe.fxp',
+ 'fzs' => 'application/vnd.fuzzysheet',
+ 'g2w' => 'application/vnd.geoplan',
+ 'g3' => 'image/g3fax',
+ 'g3w' => 'application/vnd.geospace',
+ 'gac' => 'application/vnd.groove-account',
+ 'gam' => 'application/x-tads',
+ 'gbr' => 'application/rpki-ghostbusters',
+ 'gca' => 'application/x-gca-compressed',
+ 'gdl' => 'model/vnd.gdl',
+ 'geo' => 'application/vnd.dynageo',
+ 'gex' => 'application/vnd.geometry-explorer',
+ 'ggb' => 'application/vnd.geogebra.file',
+ 'ggt' => 'application/vnd.geogebra.tool',
+ 'ghf' => 'application/vnd.groove-help',
+ 'gif' => 'image/gif',
+ 'gim' => 'application/vnd.groove-identity-message',
+ 'gml' => 'application/gml+xml',
+ 'gmx' => 'application/vnd.gmx',
+ 'gnumeric' => 'application/x-gnumeric',
+ 'gph' => 'application/vnd.flographit',
+ 'gpx' => 'application/gpx+xml',
+ 'gqf' => 'application/vnd.grafeq',
+ 'gqs' => 'application/vnd.grafeq',
+ 'gram' => 'application/srgs',
+ 'gramps' => 'application/x-gramps-xml',
+ 'gre' => 'application/vnd.geometry-explorer',
+ 'grv' => 'application/vnd.groove-injector',
+ 'grxml' => 'application/srgs+xml',
+ 'gsf' => 'application/x-font-ghostscript',
+ 'gtar' => 'application/x-gtar',
+ 'gtm' => 'application/vnd.groove-tool-message',
+ 'gtw' => 'model/vnd.gtw',
+ 'gv' => 'text/vnd.graphviz',
+ 'gxf' => 'application/gxf',
+ 'gxt' => 'application/vnd.geonext',
+ 'gz' => 'application/x-gzip',
+ 'h' => 'text/x-c',
+ 'h261' => 'video/h261',
+ 'h263' => 'video/h263',
+ 'h264' => 'video/h264',
+ 'hal' => 'application/vnd.hal+xml',
+ 'hbci' => 'application/vnd.hbci',
+ 'hdf' => 'application/x-hdf',
+ 'hh' => 'text/x-c',
+ 'hlp' => 'application/winhlp',
+ 'hpgl' => 'application/vnd.hp-hpgl',
+ 'hpid' => 'application/vnd.hp-hpid',
+ 'hps' => 'application/vnd.hp-hps',
+ 'hqx' => 'application/mac-binhex40',
+ 'htke' => 'application/vnd.kenameaapp',
+ 'htm' => 'text/html',
+ 'html' => 'text/html',
+ 'hvd' => 'application/vnd.yamaha.hv-dic',
+ 'hvp' => 'application/vnd.yamaha.hv-voice',
+ 'hvs' => 'application/vnd.yamaha.hv-script',
+ 'i2g' => 'application/vnd.intergeo',
+ 'icc' => 'application/vnd.iccprofile',
+ 'ice' => 'x-conference/x-cooltalk',
+ 'icm' => 'application/vnd.iccprofile',
+ 'ico' => 'image/x-icon',
+ 'ics' => 'text/calendar',
+ 'ief' => 'image/ief',
+ 'ifb' => 'text/calendar',
+ 'ifm' => 'application/vnd.shana.informed.formdata',
+ 'iges' => 'model/iges',
+ 'igl' => 'application/vnd.igloader',
+ 'igm' => 'application/vnd.insors.igm',
+ 'igs' => 'model/iges',
+ 'igx' => 'application/vnd.micrografx.igx',
+ 'iif' => 'application/vnd.shana.informed.interchange',
+ 'imp' => 'application/vnd.accpac.simply.imp',
+ 'ims' => 'application/vnd.ms-ims',
+ 'in' => 'text/plain',
+ 'ink' => 'application/inkml+xml',
+ 'inkml' => 'application/inkml+xml',
+ 'install' => 'application/x-install-instructions',
+ 'iota' => 'application/vnd.astraea-software.iota',
+ 'ipfix' => 'application/ipfix',
+ 'ipk' => 'application/vnd.shana.informed.package',
+ 'irm' => 'application/vnd.ibm.rights-management',
+ 'irp' => 'application/vnd.irepository.package+xml',
+ 'iso' => 'application/x-iso9660-image',
+ 'itp' => 'application/vnd.shana.informed.formtemplate',
+ 'ivp' => 'application/vnd.immervision-ivp',
+ 'ivu' => 'application/vnd.immervision-ivu',
+ 'jad' => 'text/vnd.sun.j2me.app-descriptor',
+ 'jam' => 'application/vnd.jam',
+ 'jar' => 'application/java-archive',
+ 'java' => 'text/x-java-source',
+ 'jisp' => 'application/vnd.jisp',
+ 'jlt' => 'application/vnd.hp-jlyt',
+ 'jnlp' => 'application/x-java-jnlp-file',
+ 'joda' => 'application/vnd.joost.joda-archive',
+ 'jpe' => 'image/jpeg',
+ 'jpeg' => 'image/jpeg',
+ 'jpg' => 'image/jpeg',
+ 'jpgm' => 'video/jpm',
+ 'jpgv' => 'video/jpeg',
+ 'jpm' => 'video/jpm',
+ 'js' => 'application/javascript',
+ 'json' => 'application/json',
+ 'jsonml' => 'application/jsonml+json',
+ 'kar' => 'audio/midi',
+ 'karbon' => 'application/vnd.kde.karbon',
+ 'kfo' => 'application/vnd.kde.kformula',
+ 'kia' => 'application/vnd.kidspiration',
+ 'kml' => 'application/vnd.google-earth.kml+xml',
+ 'kmz' => 'application/vnd.google-earth.kmz',
+ 'kne' => 'application/vnd.kinar',
+ 'knp' => 'application/vnd.kinar',
+ 'kon' => 'application/vnd.kde.kontour',
+ 'kpr' => 'application/vnd.kde.kpresenter',
+ 'kpt' => 'application/vnd.kde.kpresenter',
+ 'kpxx' => 'application/vnd.ds-keypoint',
+ 'ksp' => 'application/vnd.kde.kspread',
+ 'ktr' => 'application/vnd.kahootz',
+ 'ktx' => 'image/ktx',
+ 'ktz' => 'application/vnd.kahootz',
+ 'kwd' => 'application/vnd.kde.kword',
+ 'kwt' => 'application/vnd.kde.kword',
+ 'lasxml' => 'application/vnd.las.las+xml',
+ 'latex' => 'application/x-latex',
+ 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop',
+ 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml',
+ 'les' => 'application/vnd.hhe.lesson-player',
+ 'lha' => 'application/x-lzh-compressed',
+ 'link66' => 'application/vnd.route66.link66+xml',
+ 'list' => 'text/plain',
+ 'list3820' => 'application/vnd.ibm.modcap',
+ 'listafp' => 'application/vnd.ibm.modcap',
+ 'lnk' => 'application/x-ms-shortcut',
+ 'log' => 'text/plain',
+ 'lostxml' => 'application/lost+xml',
+ 'lrf' => 'application/octet-stream',
+ 'lrm' => 'application/vnd.ms-lrm',
+ 'ltf' => 'application/vnd.frogans.ltf',
+ 'lvp' => 'audio/vnd.lucent.voice',
+ 'lwp' => 'application/vnd.lotus-wordpro',
+ 'lzh' => 'application/x-lzh-compressed',
+ 'm13' => 'application/x-msmediaview',
+ 'm14' => 'application/x-msmediaview',
+ 'm1v' => 'video/mpeg',
+ 'm21' => 'application/mp21',
+ 'm2a' => 'audio/mpeg',
+ 'm2v' => 'video/mpeg',
+ 'm3a' => 'audio/mpeg',
+ 'm3u' => 'audio/x-mpegurl',
+ 'm3u8' => 'application/vnd.apple.mpegurl',
+ 'm4a' => 'audio/mp4',
+ 'm4u' => 'video/vnd.mpegurl',
+ 'm4v' => 'video/x-m4v',
+ 'ma' => 'application/mathematica',
+ 'mads' => 'application/mads+xml',
+ 'mag' => 'application/vnd.ecowin.chart',
+ 'maker' => 'application/vnd.framemaker',
+ 'man' => 'text/troff',
+ 'mar' => 'application/octet-stream',
+ 'mathml' => 'application/mathml+xml',
+ 'mb' => 'application/mathematica',
+ 'mbk' => 'application/vnd.mobius.mbk',
+ 'mbox' => 'application/mbox',
+ 'mc1' => 'application/vnd.medcalcdata',
+ 'mcd' => 'application/vnd.mcd',
+ 'mcurl' => 'text/vnd.curl.mcurl',
+ 'mdb' => 'application/x-msaccess',
+ 'mdi' => 'image/vnd.ms-modi',
+ 'me' => 'text/troff',
+ 'mesh' => 'model/mesh',
+ 'meta4' => 'application/metalink4+xml',
+ 'metalink' => 'application/metalink+xml',
+ 'mets' => 'application/mets+xml',
+ 'mfm' => 'application/vnd.mfmp',
+ 'mft' => 'application/rpki-manifest',
+ 'mgp' => 'application/vnd.osgeo.mapguide.package',
+ 'mgz' => 'application/vnd.proteus.magazine',
+ 'mid' => 'audio/midi',
+ 'midi' => 'audio/midi',
+ 'mie' => 'application/x-mie',
+ 'mif' => 'application/vnd.mif',
+ 'mime' => 'message/rfc822',
+ 'mj2' => 'video/mj2',
+ 'mjp2' => 'video/mj2',
+ 'mk3d' => 'video/x-matroska',
+ 'mka' => 'audio/x-matroska',
+ 'mks' => 'video/x-matroska',
+ 'mkv' => 'video/x-matroska',
+ 'mlp' => 'application/vnd.dolby.mlp',
+ 'mmd' => 'application/vnd.chipnuts.karaoke-mmd',
+ 'mmf' => 'application/vnd.smaf',
+ 'mmr' => 'image/vnd.fujixerox.edmics-mmr',
+ 'mng' => 'video/x-mng',
+ 'mny' => 'application/x-msmoney',
+ 'mobi' => 'application/x-mobipocket-ebook',
+ 'mods' => 'application/mods+xml',
+ 'mov' => 'video/quicktime',
+ 'movie' => 'video/x-sgi-movie',
+ 'mp2' => 'audio/mpeg',
+ 'mp21' => 'application/mp21',
+ 'mp2a' => 'audio/mpeg',
+ 'mp3' => 'audio/mpeg',
+ 'mp4' => 'video/mp4',
+ 'mp4a' => 'audio/mp4',
+ 'mp4s' => 'application/mp4',
+ 'mp4v' => 'video/mp4',
+ 'mpc' => 'application/vnd.mophun.certificate',
+ 'mpe' => 'video/mpeg',
+ 'mpeg' => 'video/mpeg',
+ 'mpg' => 'video/mpeg',
+ 'mpg4' => 'video/mp4',
+ 'mpga' => 'audio/mpeg',
+ 'mpkg' => 'application/vnd.apple.installer+xml',
+ 'mpm' => 'application/vnd.blueice.multipass',
+ 'mpn' => 'application/vnd.mophun.application',
+ 'mpp' => 'application/vnd.ms-project',
+ 'mpt' => 'application/vnd.ms-project',
+ 'mpy' => 'application/vnd.ibm.minipay',
+ 'mqy' => 'application/vnd.mobius.mqy',
+ 'mrc' => 'application/marc',
+ 'mrcx' => 'application/marcxml+xml',
+ 'ms' => 'text/troff',
+ 'mscml' => 'application/mediaservercontrol+xml',
+ 'mseed' => 'application/vnd.fdsn.mseed',
+ 'mseq' => 'application/vnd.mseq',
+ 'msf' => 'application/vnd.epson.msf',
+ 'msh' => 'model/mesh',
+ 'msi' => 'application/x-msdownload',
+ 'msl' => 'application/vnd.mobius.msl',
+ 'msty' => 'application/vnd.muvee.style',
+ 'mts' => 'model/vnd.mts',
+ 'mus' => 'application/vnd.musician',
+ 'musicxml' => 'application/vnd.recordare.musicxml+xml',
+ 'mvb' => 'application/x-msmediaview',
+ 'mwf' => 'application/vnd.mfer',
+ 'mxf' => 'application/mxf',
+ 'mxl' => 'application/vnd.recordare.musicxml',
+ 'mxml' => 'application/xv+xml',
+ 'mxs' => 'application/vnd.triscape.mxs',
+ 'mxu' => 'video/vnd.mpegurl',
+ 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install',
+ 'n3' => 'text/n3',
+ 'nb' => 'application/mathematica',
+ 'nbp' => 'application/vnd.wolfram.player',
+ 'nc' => 'application/x-netcdf',
+ 'ncx' => 'application/x-dtbncx+xml',
+ 'nfo' => 'text/x-nfo',
+ 'ngdat' => 'application/vnd.nokia.n-gage.data',
+ 'nitf' => 'application/vnd.nitf',
+ 'nlu' => 'application/vnd.neurolanguage.nlu',
+ 'nml' => 'application/vnd.enliven',
+ 'nnd' => 'application/vnd.noblenet-directory',
+ 'nns' => 'application/vnd.noblenet-sealer',
+ 'nnw' => 'application/vnd.noblenet-web',
+ 'npx' => 'image/vnd.net-fpx',
+ 'nsc' => 'application/x-conference',
+ 'nsf' => 'application/vnd.lotus-notes',
+ 'ntf' => 'application/vnd.nitf',
+ 'nzb' => 'application/x-nzb',
+ 'oa2' => 'application/vnd.fujitsu.oasys2',
+ 'oa3' => 'application/vnd.fujitsu.oasys3',
+ 'oas' => 'application/vnd.fujitsu.oasys',
+ 'obd' => 'application/x-msbinder',
+ 'obj' => 'application/x-tgif',
+ 'oda' => 'application/oda',
+ 'odb' => 'application/vnd.oasis.opendocument.database',
+ 'odc' => 'application/vnd.oasis.opendocument.chart',
+ 'odf' => 'application/vnd.oasis.opendocument.formula',
+ 'odft' => 'application/vnd.oasis.opendocument.formula-template',
+ 'odg' => 'application/vnd.oasis.opendocument.graphics',
+ 'odi' => 'application/vnd.oasis.opendocument.image',
+ 'odm' => 'application/vnd.oasis.opendocument.text-master',
+ 'odp' => 'application/vnd.oasis.opendocument.presentation',
+ 'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
+ 'odt' => 'application/vnd.oasis.opendocument.text',
+ 'oga' => 'audio/ogg',
+ 'ogg' => 'audio/ogg',
+ 'ogv' => 'video/ogg',
+ 'ogx' => 'application/ogg',
+ 'omdoc' => 'application/omdoc+xml',
+ 'onepkg' => 'application/onenote',
+ 'onetmp' => 'application/onenote',
+ 'onetoc' => 'application/onenote',
+ 'onetoc2' => 'application/onenote',
+ 'opf' => 'application/oebps-package+xml',
+ 'opml' => 'text/x-opml',
+ 'oprc' => 'application/vnd.palm',
+ 'org' => 'application/vnd.lotus-organizer',
+ 'osf' => 'application/vnd.yamaha.openscoreformat',
+ 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml',
+ 'otc' => 'application/vnd.oasis.opendocument.chart-template',
+ 'otf' => 'application/x-font-otf',
+ 'otg' => 'application/vnd.oasis.opendocument.graphics-template',
+ 'oth' => 'application/vnd.oasis.opendocument.text-web',
+ 'oti' => 'application/vnd.oasis.opendocument.image-template',
+ 'otp' => 'application/vnd.oasis.opendocument.presentation-template',
+ 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template',
+ 'ott' => 'application/vnd.oasis.opendocument.text-template',
+ 'oxps' => 'application/oxps',
+ 'oxt' => 'application/vnd.openofficeorg.extension',
+ 'p' => 'text/x-pascal',
+ 'p10' => 'application/pkcs10',
+ 'p12' => 'application/x-pkcs12',
+ 'p7b' => 'application/x-pkcs7-certificates',
+ 'p7c' => 'application/pkcs7-mime',
+ 'p7m' => 'application/pkcs7-mime',
+ 'p7r' => 'application/x-pkcs7-certreqresp',
+ 'p7s' => 'application/pkcs7-signature',
+ 'p8' => 'application/pkcs8',
+ 'pas' => 'text/x-pascal',
+ 'paw' => 'application/vnd.pawaafile',
+ 'pbd' => 'application/vnd.powerbuilder6',
+ 'pbm' => 'image/x-portable-bitmap',
+ 'pcap' => 'application/vnd.tcpdump.pcap',
+ 'pcf' => 'application/x-font-pcf',
+ 'pcl' => 'application/vnd.hp-pcl',
+ 'pclxl' => 'application/vnd.hp-pclxl',
+ 'pct' => 'image/x-pict',
+ 'pcurl' => 'application/vnd.curl.pcurl',
+ 'pcx' => 'image/x-pcx',
+ 'pdb' => 'application/vnd.palm',
+ 'pdf' => 'application/pdf',
+ 'pfa' => 'application/x-font-type1',
+ 'pfb' => 'application/x-font-type1',
+ 'pfm' => 'application/x-font-type1',
+ 'pfr' => 'application/font-tdpfr',
+ 'pfx' => 'application/x-pkcs12',
+ 'pgm' => 'image/x-portable-graymap',
+ 'pgn' => 'application/x-chess-pgn',
+ 'pgp' => 'application/pgp-encrypted',
+ 'php' => 'application/x-php',
+ 'php3' => 'application/x-php',
+ 'php4' => 'application/x-php',
+ 'php5' => 'application/x-php',
+ 'pic' => 'image/x-pict',
+ 'pkg' => 'application/octet-stream',
+ 'pki' => 'application/pkixcmp',
+ 'pkipath' => 'application/pkix-pkipath',
+ 'plb' => 'application/vnd.3gpp.pic-bw-large',
+ 'plc' => 'application/vnd.mobius.plc',
+ 'plf' => 'application/vnd.pocketlearn',
+ 'pls' => 'application/pls+xml',
+ 'pml' => 'application/vnd.ctc-posml',
+ 'png' => 'image/png',
+ 'pnm' => 'image/x-portable-anymap',
+ 'portpkg' => 'application/vnd.macports.portpkg',
+ 'pot' => 'application/vnd.ms-powerpoint',
+ 'potm' => 'application/vnd.ms-powerpoint.template.macroenabled.12',
+ 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template',
+ 'ppam' => 'application/vnd.ms-powerpoint.addin.macroenabled.12',
+ 'ppd' => 'application/vnd.cups-ppd',
+ 'ppm' => 'image/x-portable-pixmap',
+ 'pps' => 'application/vnd.ms-powerpoint',
+ 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroenabled.12',
+ 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
+ 'ppt' => 'application/vnd.ms-powerpoint',
+ 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroenabled.12',
+ 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
+ 'pqa' => 'application/vnd.palm',
+ 'prc' => 'application/x-mobipocket-ebook',
+ 'pre' => 'application/vnd.lotus-freelance',
+ 'prf' => 'application/pics-rules',
+ 'ps' => 'application/postscript',
+ 'psb' => 'application/vnd.3gpp.pic-bw-small',
+ 'psd' => 'image/vnd.adobe.photoshop',
+ 'psf' => 'application/x-font-linux-psf',
+ 'pskcxml' => 'application/pskc+xml',
+ 'ptid' => 'application/vnd.pvi.ptid1',
+ 'pub' => 'application/x-mspublisher',
+ 'pvb' => 'application/vnd.3gpp.pic-bw-var',
+ 'pwn' => 'application/vnd.3m.post-it-notes',
+ 'pya' => 'audio/vnd.ms-playready.media.pya',
+ 'pyv' => 'video/vnd.ms-playready.media.pyv',
+ 'qam' => 'application/vnd.epson.quickanime',
+ 'qbo' => 'application/vnd.intu.qbo',
+ 'qfx' => 'application/vnd.intu.qfx',
+ 'qps' => 'application/vnd.publishare-delta-tree',
+ 'qt' => 'video/quicktime',
+ 'qwd' => 'application/vnd.quark.quarkxpress',
+ 'qwt' => 'application/vnd.quark.quarkxpress',
+ 'qxb' => 'application/vnd.quark.quarkxpress',
+ 'qxd' => 'application/vnd.quark.quarkxpress',
+ 'qxl' => 'application/vnd.quark.quarkxpress',
+ 'qxt' => 'application/vnd.quark.quarkxpress',
+ 'ra' => 'audio/x-pn-realaudio',
+ 'ram' => 'audio/x-pn-realaudio',
+ 'rar' => 'application/x-rar-compressed',
+ 'ras' => 'image/x-cmu-raster',
+ 'rcprofile' => 'application/vnd.ipunplugged.rcprofile',
+ 'rdf' => 'application/rdf+xml',
+ 'rdz' => 'application/vnd.data-vision.rdz',
+ 'rep' => 'application/vnd.businessobjects',
+ 'res' => 'application/x-dtbresource+xml',
+ 'rgb' => 'image/x-rgb',
+ 'rif' => 'application/reginfo+xml',
+ 'rip' => 'audio/vnd.rip',
+ 'ris' => 'application/x-research-info-systems',
+ 'rl' => 'application/resource-lists+xml',
+ 'rlc' => 'image/vnd.fujixerox.edmics-rlc',
+ 'rld' => 'application/resource-lists-diff+xml',
+ 'rm' => 'application/vnd.rn-realmedia',
+ 'rmi' => 'audio/midi',
+ 'rmp' => 'audio/x-pn-realaudio-plugin',
+ 'rms' => 'application/vnd.jcp.javame.midlet-rms',
+ 'rmvb' => 'application/vnd.rn-realmedia-vbr',
+ 'rnc' => 'application/relax-ng-compact-syntax',
+ 'roa' => 'application/rpki-roa',
+ 'roff' => 'text/troff',
+ 'rp9' => 'application/vnd.cloanto.rp9',
+ 'rpss' => 'application/vnd.nokia.radio-presets',
+ 'rpst' => 'application/vnd.nokia.radio-preset',
+ 'rq' => 'application/sparql-query',
+ 'rs' => 'application/rls-services+xml',
+ 'rsd' => 'application/rsd+xml',
+ 'rss' => 'application/rss+xml',
+ 'rtf' => 'application/rtf',
+ 'rtx' => 'text/richtext',
+ 's' => 'text/x-asm',
+ 's3m' => 'audio/s3m',
+ 'saf' => 'application/vnd.yamaha.smaf-audio',
+ 'sbml' => 'application/sbml+xml',
+ 'sc' => 'application/vnd.ibm.secure-container',
+ 'scd' => 'application/x-msschedule',
+ 'scm' => 'application/vnd.lotus-screencam',
+ 'scq' => 'application/scvp-cv-request',
+ 'scs' => 'application/scvp-cv-response',
+ 'scurl' => 'text/vnd.curl.scurl',
+ 'sda' => 'application/vnd.stardivision.draw',
+ 'sdc' => 'application/vnd.stardivision.calc',
+ 'sdd' => 'application/vnd.stardivision.impress',
+ 'sdkd' => 'application/vnd.solent.sdkm+xml',
+ 'sdkm' => 'application/vnd.solent.sdkm+xml',
+ 'sdp' => 'application/sdp',
+ 'sdw' => 'application/vnd.stardivision.writer',
+ 'see' => 'application/vnd.seemail',
+ 'seed' => 'application/vnd.fdsn.seed',
+ 'sema' => 'application/vnd.sema',
+ 'semd' => 'application/vnd.semd',
+ 'semf' => 'application/vnd.semf',
+ 'ser' => 'application/java-serialized-object',
+ 'setpay' => 'application/set-payment-initiation',
+ 'setreg' => 'application/set-registration-initiation',
+ 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data',
+ 'sfs' => 'application/vnd.spotfire.sfs',
+ 'sfv' => 'text/x-sfv',
+ 'sgi' => 'image/sgi',
+ 'sgl' => 'application/vnd.stardivision.writer-global',
+ 'sgm' => 'text/sgml',
+ 'sgml' => 'text/sgml',
+ 'sh' => 'application/x-sh',
+ 'shar' => 'application/x-shar',
+ 'shf' => 'application/shf+xml',
+ 'sid' => 'image/x-mrsid-image',
+ 'sig' => 'application/pgp-signature',
+ 'sil' => 'audio/silk',
+ 'silo' => 'model/mesh',
+ 'sis' => 'application/vnd.symbian.install',
+ 'sisx' => 'application/vnd.symbian.install',
+ 'sit' => 'application/x-stuffit',
+ 'sitx' => 'application/x-stuffitx',
+ 'skd' => 'application/vnd.koan',
+ 'skm' => 'application/vnd.koan',
+ 'skp' => 'application/vnd.koan',
+ 'skt' => 'application/vnd.koan',
+ 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12',
+ 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
+ 'slt' => 'application/vnd.epson.salt',
+ 'sm' => 'application/vnd.stepmania.stepchart',
+ 'smf' => 'application/vnd.stardivision.math',
+ 'smi' => 'application/smil+xml',
+ 'smil' => 'application/smil+xml',
+ 'smv' => 'video/x-smv',
+ 'smzip' => 'application/vnd.stepmania.package',
+ 'snd' => 'audio/basic',
+ 'snf' => 'application/x-font-snf',
+ 'so' => 'application/octet-stream',
+ 'spc' => 'application/x-pkcs7-certificates',
+ 'spf' => 'application/vnd.yamaha.smaf-phrase',
+ 'spl' => 'application/x-futuresplash',
+ 'spot' => 'text/vnd.in3d.spot',
+ 'spp' => 'application/scvp-vp-response',
+ 'spq' => 'application/scvp-vp-request',
+ 'spx' => 'audio/ogg',
+ 'sql' => 'application/x-sql',
+ 'src' => 'application/x-wais-source',
+ 'srt' => 'application/x-subrip',
+ 'sru' => 'application/sru+xml',
+ 'srx' => 'application/sparql-results+xml',
+ 'ssdl' => 'application/ssdl+xml',
+ 'sse' => 'application/vnd.kodak-descriptor',
+ 'ssf' => 'application/vnd.epson.ssf',
+ 'ssml' => 'application/ssml+xml',
+ 'st' => 'application/vnd.sailingtracker.track',
+ 'stc' => 'application/vnd.sun.xml.calc.template',
+ 'std' => 'application/vnd.sun.xml.draw.template',
+ 'stf' => 'application/vnd.wt.stf',
+ 'sti' => 'application/vnd.sun.xml.impress.template',
+ 'stk' => 'application/hyperstudio',
+ 'stl' => 'application/vnd.ms-pki.stl',
+ 'str' => 'application/vnd.pg.format',
+ 'stw' => 'application/vnd.sun.xml.writer.template',
+ 'sub' => 'text/vnd.dvb.subtitle',
+ 'sus' => 'application/vnd.sus-calendar',
+ 'susp' => 'application/vnd.sus-calendar',
+ 'sv4cpio' => 'application/x-sv4cpio',
+ 'sv4crc' => 'application/x-sv4crc',
+ 'svc' => 'application/vnd.dvb.service',
+ 'svd' => 'application/vnd.svd',
+ 'svg' => 'image/svg+xml',
+ 'svgz' => 'image/svg+xml',
+ 'swa' => 'application/x-director',
+ 'swf' => 'application/x-shockwave-flash',
+ 'swi' => 'application/vnd.aristanetworks.swi',
+ 'sxc' => 'application/vnd.sun.xml.calc',
+ 'sxd' => 'application/vnd.sun.xml.draw',
+ 'sxg' => 'application/vnd.sun.xml.writer.global',
+ 'sxi' => 'application/vnd.sun.xml.impress',
+ 'sxm' => 'application/vnd.sun.xml.math',
+ 'sxw' => 'application/vnd.sun.xml.writer',
+ 't' => 'text/troff',
+ 't3' => 'application/x-t3vm-image',
+ 'taglet' => 'application/vnd.mynfc',
+ 'tao' => 'application/vnd.tao.intent-module-archive',
+ 'tar' => 'application/x-tar',
+ 'tcap' => 'application/vnd.3gpp2.tcap',
+ 'tcl' => 'application/x-tcl',
+ 'teacher' => 'application/vnd.smart.teacher',
+ 'tei' => 'application/tei+xml',
+ 'teicorpus' => 'application/tei+xml',
+ 'tex' => 'application/x-tex',
+ 'texi' => 'application/x-texinfo',
+ 'texinfo' => 'application/x-texinfo',
+ 'text' => 'text/plain',
+ 'tfi' => 'application/thraud+xml',
+ 'tfm' => 'application/x-tex-tfm',
+ 'tga' => 'image/x-tga',
+ 'thmx' => 'application/vnd.ms-officetheme',
+ 'tif' => 'image/tiff',
+ 'tiff' => 'image/tiff',
+ 'tmo' => 'application/vnd.tmobile-livetv',
+ 'torrent' => 'application/x-bittorrent',
+ 'tpl' => 'application/vnd.groove-tool-template',
+ 'tpt' => 'application/vnd.trid.tpt',
+ 'tr' => 'text/troff',
+ 'tra' => 'application/vnd.trueapp',
+ 'trm' => 'application/x-msterminal',
+ 'tsd' => 'application/timestamped-data',
+ 'tsv' => 'text/tab-separated-values',
+ 'ttc' => 'application/x-font-ttf',
+ 'ttf' => 'application/x-font-ttf',
+ 'ttl' => 'text/turtle',
+ 'twd' => 'application/vnd.simtech-mindmapper',
+ 'twds' => 'application/vnd.simtech-mindmapper',
+ 'txd' => 'application/vnd.genomatix.tuxedo',
+ 'txf' => 'application/vnd.mobius.txf',
+ 'txt' => 'text/plain',
+ 'u32' => 'application/x-authorware-bin',
+ 'udeb' => 'application/x-debian-package',
+ 'ufd' => 'application/vnd.ufdl',
+ 'ufdl' => 'application/vnd.ufdl',
+ 'ulx' => 'application/x-glulx',
+ 'umj' => 'application/vnd.umajin',
+ 'unityweb' => 'application/vnd.unity',
+ 'uoml' => 'application/vnd.uoml+xml',
+ 'uri' => 'text/uri-list',
+ 'uris' => 'text/uri-list',
+ 'urls' => 'text/uri-list',
+ 'ustar' => 'application/x-ustar',
+ 'utz' => 'application/vnd.uiq.theme',
+ 'uu' => 'text/x-uuencode',
+ 'uva' => 'audio/vnd.dece.audio',
+ 'uvd' => 'application/vnd.dece.data',
+ 'uvf' => 'application/vnd.dece.data',
+ 'uvg' => 'image/vnd.dece.graphic',
+ 'uvh' => 'video/vnd.dece.hd',
+ 'uvi' => 'image/vnd.dece.graphic',
+ 'uvm' => 'video/vnd.dece.mobile',
+ 'uvp' => 'video/vnd.dece.pd',
+ 'uvs' => 'video/vnd.dece.sd',
+ 'uvt' => 'application/vnd.dece.ttml+xml',
+ 'uvu' => 'video/vnd.uvvu.mp4',
+ 'uvv' => 'video/vnd.dece.video',
+ 'uvva' => 'audio/vnd.dece.audio',
+ 'uvvd' => 'application/vnd.dece.data',
+ 'uvvf' => 'application/vnd.dece.data',
+ 'uvvg' => 'image/vnd.dece.graphic',
+ 'uvvh' => 'video/vnd.dece.hd',
+ 'uvvi' => 'image/vnd.dece.graphic',
+ 'uvvm' => 'video/vnd.dece.mobile',
+ 'uvvp' => 'video/vnd.dece.pd',
+ 'uvvs' => 'video/vnd.dece.sd',
+ 'uvvt' => 'application/vnd.dece.ttml+xml',
+ 'uvvu' => 'video/vnd.uvvu.mp4',
+ 'uvvv' => 'video/vnd.dece.video',
+ 'uvvx' => 'application/vnd.dece.unspecified',
+ 'uvvz' => 'application/vnd.dece.zip',
+ 'uvx' => 'application/vnd.dece.unspecified',
+ 'uvz' => 'application/vnd.dece.zip',
+ 'vcard' => 'text/vcard',
+ 'vcd' => 'application/x-cdlink',
+ 'vcf' => 'text/x-vcard',
+ 'vcg' => 'application/vnd.groove-vcard',
+ 'vcs' => 'text/x-vcalendar',
+ 'vcx' => 'application/vnd.vcx',
+ 'vis' => 'application/vnd.visionary',
+ 'viv' => 'video/vnd.vivo',
+ 'vob' => 'video/x-ms-vob',
+ 'vor' => 'application/vnd.stardivision.writer',
+ 'vox' => 'application/x-authorware-bin',
+ 'vrml' => 'model/vrml',
+ 'vsd' => 'application/vnd.visio',
+ 'vsf' => 'application/vnd.vsf',
+ 'vss' => 'application/vnd.visio',
+ 'vst' => 'application/vnd.visio',
+ 'vsw' => 'application/vnd.visio',
+ 'vtu' => 'model/vnd.vtu',
+ 'vxml' => 'application/voicexml+xml',
+ 'w3d' => 'application/x-director',
+ 'wad' => 'application/x-doom',
+ 'wav' => 'audio/x-wav',
+ 'wax' => 'audio/x-ms-wax',
+ 'wbmp' => 'image/vnd.wap.wbmp',
+ 'wbs' => 'application/vnd.criticaltools.wbs+xml',
+ 'wbxml' => 'application/vnd.wap.wbxml',
+ 'wcm' => 'application/vnd.ms-works',
+ 'wdb' => 'application/vnd.ms-works',
+ 'wdp' => 'image/vnd.ms-photo',
+ 'weba' => 'audio/webm',
+ 'webm' => 'video/webm',
+ 'webp' => 'image/webp',
+ 'wg' => 'application/vnd.pmi.widget',
+ 'wgt' => 'application/widget',
+ 'wks' => 'application/vnd.ms-works',
+ 'wm' => 'video/x-ms-wm',
+ 'wma' => 'audio/x-ms-wma',
+ 'wmd' => 'application/x-ms-wmd',
+ 'wmf' => 'application/x-msmetafile',
+ 'wml' => 'text/vnd.wap.wml',
+ 'wmlc' => 'application/vnd.wap.wmlc',
+ 'wmls' => 'text/vnd.wap.wmlscript',
+ 'wmlsc' => 'application/vnd.wap.wmlscriptc',
+ 'wmv' => 'video/x-ms-wmv',
+ 'wmx' => 'video/x-ms-wmx',
+ 'wmz' => 'application/x-msmetafile',
+ 'woff' => 'application/font-woff',
+ 'wpd' => 'application/vnd.wordperfect',
+ 'wpl' => 'application/vnd.ms-wpl',
+ 'wps' => 'application/vnd.ms-works',
+ 'wqd' => 'application/vnd.wqd',
+ 'wri' => 'application/x-mswrite',
+ 'wrl' => 'model/vrml',
+ 'wsdl' => 'application/wsdl+xml',
+ 'wspolicy' => 'application/wspolicy+xml',
+ 'wtb' => 'application/vnd.webturbo',
+ 'wvx' => 'video/x-ms-wvx',
+ 'x32' => 'application/x-authorware-bin',
+ 'x3d' => 'model/x3d+xml',
+ 'x3db' => 'model/x3d+binary',
+ 'x3dbz' => 'model/x3d+binary',
+ 'x3dv' => 'model/x3d+vrml',
+ 'x3dvz' => 'model/x3d+vrml',
+ 'x3dz' => 'model/x3d+xml',
+ 'xaml' => 'application/xaml+xml',
+ 'xap' => 'application/x-silverlight-app',
+ 'xar' => 'application/vnd.xara',
+ 'xbap' => 'application/x-ms-xbap',
+ 'xbd' => 'application/vnd.fujixerox.docuworks.binder',
+ 'xbm' => 'image/x-xbitmap',
+ 'xdf' => 'application/xcap-diff+xml',
+ 'xdm' => 'application/vnd.syncml.dm+xml',
+ 'xdp' => 'application/vnd.adobe.xdp+xml',
+ 'xdssc' => 'application/dssc+xml',
+ 'xdw' => 'application/vnd.fujixerox.docuworks',
+ 'xenc' => 'application/xenc+xml',
+ 'xer' => 'application/patch-ops-error+xml',
+ 'xfdf' => 'application/vnd.adobe.xfdf',
+ 'xfdl' => 'application/vnd.xfdl',
+ 'xht' => 'application/xhtml+xml',
+ 'xhtml' => 'application/xhtml+xml',
+ 'xhvml' => 'application/xv+xml',
+ 'xif' => 'image/vnd.xiff',
+ 'xla' => 'application/vnd.ms-excel',
+ 'xlam' => 'application/vnd.ms-excel.addin.macroenabled.12',
+ 'xlc' => 'application/vnd.ms-excel',
+ 'xlf' => 'application/x-xliff+xml',
+ 'xlm' => 'application/vnd.ms-excel',
+ 'xls' => 'application/vnd.ms-excel',
+ 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroenabled.12',
+ 'xlsm' => 'application/vnd.ms-excel.sheet.macroenabled.12',
+ 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+ 'xlt' => 'application/vnd.ms-excel',
+ 'xltm' => 'application/vnd.ms-excel.template.macroenabled.12',
+ 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
+ 'xlw' => 'application/vnd.ms-excel',
+ 'xm' => 'audio/xm',
+ 'xml' => 'application/xml',
+ 'xo' => 'application/vnd.olpc-sugar',
+ 'xop' => 'application/xop+xml',
+ 'xpi' => 'application/x-xpinstall',
+ 'xpl' => 'application/xproc+xml',
+ 'xpm' => 'image/x-xpixmap',
+ 'xpr' => 'application/vnd.is-xpr',
+ 'xps' => 'application/vnd.ms-xpsdocument',
+ 'xpw' => 'application/vnd.intercon.formnet',
+ 'xpx' => 'application/vnd.intercon.formnet',
+ 'xsl' => 'application/xml',
+ 'xslt' => 'application/xslt+xml',
+ 'xsm' => 'application/vnd.syncml+xml',
+ 'xspf' => 'application/xspf+xml',
+ 'xul' => 'application/vnd.mozilla.xul+xml',
+ 'xvm' => 'application/xv+xml',
+ 'xvml' => 'application/xv+xml',
+ 'xwd' => 'image/x-xwindowdump',
+ 'xyz' => 'chemical/x-xyz',
+ 'xz' => 'application/x-xz',
+ 'yang' => 'application/yang',
+ 'yin' => 'application/yin+xml',
+ 'z1' => 'application/x-zmachine',
+ 'z2' => 'application/x-zmachine',
+ 'z3' => 'application/x-zmachine',
+ 'z4' => 'application/x-zmachine',
+ 'z5' => 'application/x-zmachine',
+ 'z6' => 'application/x-zmachine',
+ 'z7' => 'application/x-zmachine',
+ 'z8' => 'application/x-zmachine',
+ 'zaz' => 'application/vnd.zzazz.deck+xml',
+ 'zip' => 'application/zip',
+ 'zir' => 'application/vnd.zul',
+ 'zirz' => 'application/vnd.zul',
+ 'zmm' => 'application/vnd.handheld-entertainment+xml',
+ '123' => 'application/vnd.lotus-1-2-3'
+);
diff --git a/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/preferences.php b/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/preferences.php
new file mode 100644
index 0000000..4223943
--- /dev/null
+++ b/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/preferences.php
@@ -0,0 +1,35 @@
+setCharset('utf-8');
+
+// Without these lines the default caching mechanism is "array" but this uses a lot of memory.
+// If possible, use a disk cache to enable attaching large attachments etc.
+// You can override the default temporary directory by setting the TMPDIR environment variable.
+
+// The @ operator in front of is_writable calls is to avoid PHP warnings
+// when using open_basedir
+$tmp = getenv('TMPDIR');
+if ($tmp && @is_writable($tmp)) {
+ $preferences
+ ->setTempDir($tmp)
+ ->setCacheType('disk');
+} elseif (function_exists('sys_get_temp_dir') && @is_writable(sys_get_temp_dir())) {
+ $preferences
+ ->setTempDir(sys_get_temp_dir())
+ ->setCacheType('disk');
+}
+
+// this should only be done when Swiftmailer won't use the native QP content encoder
+// see mime_deps.php
+if (version_compare(phpversion(), '5.4.7', '<')) {
+ $preferences->setQPDotEscape(false);
+}
diff --git a/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/swift_init.php b/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/swift_init.php
new file mode 100644
index 0000000..5c80b05
--- /dev/null
+++ b/src/user/plugins/email/vendor/swiftmailer/swiftmailer/lib/swift_init.php
@@ -0,0 +1,28 @@
+ 'application/x-php',
+ 'php3' => 'application/x-php',
+ 'php4' => 'application/x-php',
+ 'php5' => 'application/x-php',
+ 'pdf' => 'application/pdf',
+ 'zip' => 'application/zip',
+ 'gif' => 'image/gif',
+ 'jpg' => 'image/jpeg',
+ 'png' => 'image/png',
+ 'css' => 'text/css',
+ 'html' => 'text/html',
+ 'js' => 'text/javascript',
+ 'txt' => 'text/plain',
+ 'xml' => 'text/xml',
+ 'aif' => 'audio/x-aiff',
+ 'aiff' => 'audio/x-aiff',
+ 'avi' => 'video/avi',
+ 'bmp' => 'image/bmp',
+ 'bz2' => 'application/x-bz2',
+ 'csv' => 'text/csv',
+ 'dmg' => 'application/x-apple-diskimage',
+ 'doc' => 'application/msword',
+ 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+ 'eml' => 'message/rfc822',
+ 'aps' => 'application/postscript',
+ 'exe' => 'application/x-ms-dos-executable',
+ 'flv' => 'video/x-flv',
+ 'gif' => 'image/gif',
+ 'gz' => 'application/x-gzip',
+ 'hqx' => 'application/stuffit',
+ 'htm' => 'text/html',
+ 'html' => 'text/html',
+ 'jar' => 'application/x-java-archive',
+ 'jpeg' => 'image/jpeg',
+ 'jpg' => 'image/jpeg',
+ 'm3u' => 'audio/x-mpegurl',
+ 'm4a' => 'audio/mp4',
+ 'mdb' => 'application/x-msaccess',
+ 'mid' => 'audio/midi',
+ 'midi' => 'audio/midi',
+ 'mov' => 'video/quicktime',
+ 'mp3' => 'audio/mpeg',
+ 'mp4' => 'video/mp4',
+ 'mpeg' => 'video/mpeg',
+ 'mpg' => 'video/mpeg',
+ 'odg' => 'vnd.oasis.opendocument.graphics',
+ 'odp' => 'vnd.oasis.opendocument.presentation',
+ 'odt' => 'vnd.oasis.opendocument.text',
+ 'ods' => 'vnd.oasis.opendocument.spreadsheet',
+ 'ogg' => 'audio/ogg',
+ 'pdf' => 'application/pdf',
+ 'png' => 'image/png',
+ 'ppt' => 'application/vnd.ms-powerpoint',
+ 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
+ 'ps' => 'application/postscript',
+ 'rar' => 'application/x-rar-compressed',
+ 'rtf' => 'application/rtf',
+ 'tar' => 'application/x-tar',
+ 'sit' => 'application/x-stuffit',
+ 'svg' => 'image/svg+xml',
+ 'tif' => 'image/tiff',
+ 'tiff' => 'image/tiff',
+ 'ttf' => 'application/x-font-truetype',
+ 'txt' => 'text/plain',
+ 'vcf' => 'text/x-vcard',
+ 'wav' => 'audio/wav',
+ 'wma' => 'audio/x-ms-wma',
+ 'wmv' => 'audio/x-ms-wmv',
+ 'xls' => 'application/excel',
+ 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+ 'xml' => 'application/xml',
+ 'zip' => 'application/zip'
+ ];
+
+ // wrap array for generating file
+ foreach ($valid_mime_types_preset as $extension => $mime_type) {
+ // generate array for mimetype to extension resolver (only first match)
+ $valid_mime_types[$extension] = "'{$extension}' => '{$mime_type}'";
+ }
+
+ // collect extensions
+ $valid_extensions = [];
+
+ // all extensions from second match
+ foreach ($matches[2] as $i => $extensions) {
+ // explode multiple extensions from string
+ $extensions = explode(" ", strtolower($extensions));
+
+ // force array for foreach
+ if (!is_array($extensions)) {
+ $extensions = array($extensions);
+ }
+
+ foreach ($extensions as $extension) {
+ // get mime type
+ $mime_type = $matches[1][$i];
+
+ // check if string length lower than 10
+ if (strlen($extension) < 10) {
+ // add extension
+ $valid_extensions[] = $extension;
+
+ if (!isset($valid_mime_types[$mime_type])) {
+ // generate array for mimetype to extension resolver (only first match)
+ $valid_mime_types[$extension] = "'{$extension}' => '{$mime_type}'";
+ }
+ }
+ }
+ }
+ }
+
+ $xml = simplexml_load_string($mime_xml);
+
+ foreach ($xml as $node) {
+ // check if there is no pattern
+ if (!isset($node->glob["pattern"])) {
+ continue;
+ }
+
+ // get all matching extensions from match
+ foreach ((array) $node->glob["pattern"] as $extension) {
+ // skip none glob extensions
+ if (strpos($extension, '.') === FALSE) {
+ continue;
+ }
+
+ // remove get only last part
+ $extension = explode('.', strtolower($extension));
+ $extension = end($extension);
+
+ // maximum length in database column
+ if (strlen($extension) <= 9) {
+ $valid_extensions[] = $extension;
+ }
+ }
+
+ if (isset($node->glob["pattern"][0])) {
+ // mime type
+ $mime_type = strtolower((string) $node["type"]);
+
+ // get first extension
+ $extension = strtolower(trim($node->glob["ddpattern"][0], '*.'));
+
+ // skip none glob extensions and check if string length between 1 and 10
+ if (strpos($extension, '.') !== FALSE || strlen($extension) < 1 || strlen($extension) > 9) {
+ continue;
+ }
+
+ // check if string length lower than 10
+ if (!isset($valid_mime_types[$mime_type])) {
+ // generate array for mimetype to extension resolver (only first match)
+ $valid_mime_types[$extension] = "'{$extension}' => '{$mime_type}'";
+ }
+ }
+ }
+
+ // full list of valid extensions only
+ $valid_mime_types = array_unique($valid_mime_types);
+ ksort($valid_mime_types);
+
+ // combine mime types and extensions array
+ $output = "$preamble\$swift_mime_types = array(\n ".implode($valid_mime_types, ",\n ")."\n);";
+
+ // write mime_types.php config file
+ @file_put_contents('./mime_types.php', $output);
+}
+
+generateUpToDateMimeArray();
diff --git a/src/user/plugins/error/CHANGELOG.md b/src/user/plugins/error/CHANGELOG.md
new file mode 100644
index 0000000..632fbfb
--- /dev/null
+++ b/src/user/plugins/error/CHANGELOG.md
@@ -0,0 +1,17 @@
+# v1.3.0
+## 08/25/2015
+
+1. [](#improved)
+ * Added blueprints for Grav Admin plugin
+
+# v1.2.2
+## 01/06/2015
+
+1. [](#new)
+ * Added a default `error.json.twig` file
+
+# v1.2.1
+## 11/30/2014
+
+1. [](#new)
+ * ChangeLog started...
diff --git a/src/user/plugins/error/LICENSE b/src/user/plugins/error/LICENSE
new file mode 100644
index 0000000..484793a
--- /dev/null
+++ b/src/user/plugins/error/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Grav
+
+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/src/user/plugins/error/README.md b/src/user/plugins/error/README.md
new file mode 100644
index 0000000..e415be8
--- /dev/null
+++ b/src/user/plugins/error/README.md
@@ -0,0 +1,78 @@
+# Grav Error Plugin
+
+
+
+`error` is a [Grav](http://github.com/getgrav/grav) Plugin and allows to redirect errors to nice output pages.
+
+This plugin is required and you'll find it in any package distributed that contains Grav. If you decide to clone Grav from GitHub you will most likely want to install this.
+
+# Installation
+
+Installing the Error plugin can be done in one of two ways. Our GPM (Grav Package Manager) installation method enables you to quickly and easily install the plugin with a simple terminal command, while the manual method enables you to do so via a zip file.
+
+## GPM Installation (Preferred)
+
+The simplest way to install this plugin is via the [Grav Package Manager (GPM)](http://learn.getgrav.org/advanced/grav-gpm) through your system's Terminal (also called the command line). From the root of your Grav install type:
+
+ bin/gpm install error
+
+This will install the Error plugin into your `/user/plugins` directory within Grav. Its files can be found under `/your/site/grav/user/plugins/error`.
+
+## Manual Installation
+
+To install this plugin, just download the zip version of this repository and unzip it under `/your/site/grav/user/plugins`. Then, rename the folder to `error`. You can find these files either on [GitHub](https://github.com/getgrav/grav-plugin-error) or via [GetGrav.org](http://getgrav.org/downloads/plugins#extras).
+
+You should now have all the plugin files under
+
+ /your/site/grav/user/plugins/error
+
+>> NOTE: This plugin is a modular component for Grav which requires [Grav](http://github.com/getgrav/grav), the [Problems](https://github.com/getgrav/grav-plugin-problems) plugin, and a theme to be installed in order to operate.
+
+# Usage
+
+The `error` plugin doesn't require any configuration. The moment you install it, it is ready to use.
+
+Something you might want to do is to override the look and feel of the error page, and with Grav it is super easy.
+
+### Template
+
+Copy the template file [error.html.twig](templates/error.html.twig) into the `templates` folder of your custom theme and that is it.
+
+```
+/your/site/grav/user/themes/custom-theme/templates/error.html.twig
+```
+
+You can now edit the override and tweak it however you prefer.
+
+### Page
+
+Copy the page file [error.md](pages/error.error) into the `pages` folder of your user directory and that is it.
+
+```
+/your/site/grav/user/pages/error/error.md
+```
+
+You can now edit the override and tweak it however you prefer.
+
+# Updating
+
+As development for the Error plugin continues, new versions may become available that add additional features and functionality, improve compatibility with newer Grav releases, and generally provide a better user experience. Updating Error is easy, and can be done through Grav's GPM system, as well as manually.
+
+## GPM Update (Preferred)
+
+The simplest way to update this plugin is via the [Grav Package Manager (GPM)](http://learn.getgrav.org/advanced/grav-gpm). You can do this with this by navigating to the root directory of your Grav install using your system's Terminal (also called command line) and typing the following:
+
+ bin/gpm update error
+
+This command will check your Grav install to see if your Error plugin is due for an update. If a newer release is found, you will be asked whether or not you wish to update. To continue, type `y` and hit enter. The plugin will automatically update and clear Grav's cache.
+
+## Manual Update
+
+Manually updating Error is pretty simple. Here is what you will need to do to get this done:
+
+* Delete the `your/site/user/plugins/error` directory.
+* Downalod the new version of the Error plugin from either [GitHub](https://github.com/getgrav/grav-plugin-error) or [GetGrav.org](http://getgrav.org/downloads/plugins#extras).
+* Unzip the zip file in `your/site/user/plugins` and rename the resulting folder to `error`.
+* Clear the Grav cache. The simplest way to do this is by going to the root Grav directory in terminal and typing `bin/grav clear-cache`.
+
+> Note: Any changes you have made to any of the files listed under this directory will also be removed and replaced by the new set. Any files located elsewhere (for example a YAML settings file placed in `user/config/plugins`) will remain intact.
diff --git a/src/user/plugins/error/assets/readme_1.png b/src/user/plugins/error/assets/readme_1.png
new file mode 100644
index 0000000..930b87b
Binary files /dev/null and b/src/user/plugins/error/assets/readme_1.png differ
diff --git a/src/user/plugins/error/blueprints.yaml b/src/user/plugins/error/blueprints.yaml
new file mode 100644
index 0000000..c1a7c26
--- /dev/null
+++ b/src/user/plugins/error/blueprints.yaml
@@ -0,0 +1,32 @@
+name: Error
+version: 1.3.0
+description: Displays the error page.
+icon: warning
+author:
+ name: Team Grav
+ email: devs@getgrav.org
+ url: http://getgrav.org
+homepage: https://github.com/getgrav/grav-plugin-error
+keywords: error, plugin, required
+bugs: https://github.com/getgrav/grav-plugin-error/issues
+license: MIT
+
+form:
+ validation: strict
+ fields:
+ enabled:
+ type: toggle
+ label: Plugin status
+ highlight: 1
+ default: 0
+ options:
+ 1: Enabled
+ 0: Disabled
+ validate:
+ type: bool
+
+ routes.404:
+ type: text
+ size: medium
+ label: 404 Route
+ default: '/error'
diff --git a/src/user/plugins/error/error.php b/src/user/plugins/error/error.php
new file mode 100644
index 0000000..7e8044e
--- /dev/null
+++ b/src/user/plugins/error/error.php
@@ -0,0 +1,68 @@
+ ['onPageNotFound', 0],
+ 'onGetPageTemplates' => ['onGetPageTemplates', 0],
+ ];
+ }
+
+ /**
+ * Display error page if no page was found for the current route.
+ *
+ * @param Event $event
+ */
+ public function onPageNotFound(Event $event)
+ {
+ $this->enable([
+ 'onTwigTemplatePaths' => ['onTwigTemplatePaths', -10]
+ ]);
+
+ /** @var Pages $pages */
+ $pages = $this->grav['pages'];
+
+ // Try to load user error page.
+ $page = $pages->dispatch($this->config->get('plugins.error.routes.404', '/error'), true);
+
+ if (!$page) {
+ // If none provided use built in error page.
+ $page = new Page;
+ $page->init(new \SplFileInfo(__DIR__ . '/pages/error.md'));
+ }
+
+ $event->page = $page;
+ $event->stopPropagation();
+ }
+
+ /**
+ * Add page template types.
+ */
+ public function onGetPageTemplates(Event $event)
+ {
+ /** @var Types $types */
+ $types = $event->types;
+ $types->register('error');
+ }
+
+ /**
+ * Add current directory to twig lookup paths.
+ */
+ public function onTwigTemplatePaths()
+ {
+ $this->grav['twig']->twig_paths[] = __DIR__ . '/templates';
+ }
+}
diff --git a/src/user/plugins/error/error.yaml b/src/user/plugins/error/error.yaml
new file mode 100644
index 0000000..0a51d4c
--- /dev/null
+++ b/src/user/plugins/error/error.yaml
@@ -0,0 +1,3 @@
+enabled: true
+routes:
+ 404: '/error'
diff --git a/src/user/plugins/error/pages/error.md b/src/user/plugins/error/pages/error.md
new file mode 100644
index 0000000..f20b002
--- /dev/null
+++ b/src/user/plugins/error/pages/error.md
@@ -0,0 +1,8 @@
+---
+title: Page not Found
+robots: noindex,nofollow
+template: error
+routable: false
+http_response_code: 404
+---
+Woops. Looks like this page doesn't exist.
diff --git a/src/user/plugins/error/templates/error.html.twig b/src/user/plugins/error/templates/error.html.twig
new file mode 100644
index 0000000..54dbdb8
--- /dev/null
+++ b/src/user/plugins/error/templates/error.html.twig
@@ -0,0 +1,3 @@
+Error {{ header.http_response_code }}
+
+{{ page.content }}
diff --git a/src/user/plugins/error/templates/error.json.twig b/src/user/plugins/error/templates/error.json.twig
new file mode 100644
index 0000000..ae2064f
--- /dev/null
+++ b/src/user/plugins/error/templates/error.json.twig
@@ -0,0 +1 @@
+{{ page.content|json_encode() }}
\ No newline at end of file
diff --git a/src/user/plugins/form/CHANGELOG.md b/src/user/plugins/form/CHANGELOG.md
new file mode 100644
index 0000000..73b7064
--- /dev/null
+++ b/src/user/plugins/form/CHANGELOG.md
@@ -0,0 +1,55 @@
+# v0.6.0
+## 10/21/2015
+
+1. [](#improved)
+ * Added links to learn site for form examples
+1. [](#bugfix)
+ * Fixed for missing attributes in textarea field
+ * Fixed checkbox inputs
+
+# v0.5.0
+## 10/15/2015
+
+1. [](#new)
+ * New `operation` param to allow different file saving strategies
+ * Ability to add new file saving strategies
+ * Now calls a `process()` method during form processing
+1. [](#improved)
+ * Added server-side captcha validation and removed front-end validation
+ * Allow `filename` instead of `prefix`, `format` + `extension`
+1. [](#bugfix)
+ * Fixed radio inputs
+
+# v0.4.0
+## 9/16/2015
+
+1. [](#new)
+ * PHP server-side form validation
+ * Added new Google Catpcha field with front-end validation
+1. [](#improved)
+ * Add defaults for forms, moved from the themes to the Form plugin
+ * Store multi-line fields with line endings converted to HTML
+
+# v0.3.0
+## 9/11/2015
+
+1. [](#improved)
+ * Refactored all the forms fields
+
+# v0.2.1
+## 08/24/2015
+
+1. [](#improved)
+ * Translated tooltips
+
+# v0.2.0
+## 08/11/2015
+
+1. [](#improved)
+ * Disable `enable` in admin
+
+# v0.1.0
+## 08/04/2015
+
+1. [](#new)
+ * ChangeLog started...
diff --git a/src/user/plugins/form/LICENSE b/src/user/plugins/form/LICENSE
new file mode 100644
index 0000000..484793a
--- /dev/null
+++ b/src/user/plugins/form/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Grav
+
+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/src/user/plugins/form/README.md b/src/user/plugins/form/README.md
new file mode 100644
index 0000000..fbf59f1
--- /dev/null
+++ b/src/user/plugins/form/README.md
@@ -0,0 +1,31 @@
+# Grav Form Plugin
+
+The **form plugin** for [Grav](http://github.com/getgrav/grav) adds the ability to create and use forms. This is currently used extensively by the **admin** and **login** plugins.
+
+| IMPORTANT!!! This plugin is currently in development as is to be considered a **beta release**. As such, use this in a production environment **at your own risk!**. More features will be added in the future.
+
+# Installation
+
+The form plugin is easy to install with GPM.
+
+```
+$ bin/gpm install form
+```
+
+# Configuration
+
+Simply copy the `user/plugins/forms/forms.yaml` into `user/config/plugins/forms.yaml` and make your modifications.
+
+```
+enabled: true
+```
+
+# How to use the Form Plugin
+
+The Learn site has two pages describing how to use the Form Plugin:
+- [Forms](http://learn.getgrav.org/advanced/forms)
+- [Add a contact form](http://learn.getgrav.org/advanced/contact-form)
+
+# Using email
+
+Note: when using email functionality in your forms, make sure you have configured the Email plugin correctly. In particular, make sure you configured the "Email from" and "Email to" email addresses in the Email plugin with your email address
diff --git a/src/user/plugins/form/blueprints.yaml b/src/user/plugins/form/blueprints.yaml
new file mode 100644
index 0000000..0348645
--- /dev/null
+++ b/src/user/plugins/form/blueprints.yaml
@@ -0,0 +1,26 @@
+name: Form
+version: 0.6.0
+description: Enables the forms handling
+icon: check-square
+author:
+ name: Team Grav
+ email: devs@getgrav.org
+ url: http://getgrav.org
+keywords: plugin, form
+homepage: https://github.com/getgrav/grav-plugin-form
+bugs: https://github.com/getgrav/grav-plugin-form/issues
+license: MIT
+
+form:
+ validation: strict
+ fields:
+ enabled:
+ type: hidden
+ label: Plugin status
+ highlight: 1
+ default: 0
+ options:
+ 1: Enabled
+ 0: Disabled
+ validate:
+ type: bool
diff --git a/src/user/plugins/form/classes/form.php b/src/user/plugins/form/classes/form.php
new file mode 100644
index 0000000..8ecc7c4
--- /dev/null
+++ b/src/user/plugins/form/classes/form.php
@@ -0,0 +1,148 @@
+page = $page;
+
+ $header = $page->header();
+ $this->rules = isset($header->rules) ? $header->rules : array();
+ $this->data = isset($header->data) ? $header->data : array();
+ $this->items = $header->form;
+
+ // Set form name if not set.
+ if (empty($this->items['name'])) {
+ $this->items['name'] = $page->slug();
+ }
+ }
+
+ /**
+ * Return page object for the form.
+ *
+ * @return Page
+ */
+ public function page()
+ {
+ return $this->page;
+ }
+
+ /**
+ * Get value of given variable (or all values).
+ *
+ * @param string $name
+ * @return mixed
+ */
+ public function value($name = null)
+ {
+ if (!$name) {
+ return $this->values;
+ }
+ return $this->getField($name, 'values');
+ }
+
+ /**
+ * Get value of given variable (or all values).
+ *
+ * @param string $name
+ * @return mixed
+ */
+ public function setValue($name = null, $value = '')
+ {
+ if (!$name) {
+ return;
+ }
+
+ $this->values[$name] = $value;
+ }
+
+ /**
+ * Reset values.
+ */
+ public function reset()
+ {
+ $this->values = array();
+ }
+
+ /**
+ * Handle form processing on POST action.
+ */
+ public function post()
+ {
+ if (isset($_POST)) {
+ $this->values = (array) $_POST;
+ }
+
+ foreach($this->items['fields'] as $field) {
+ if ($field['type'] == 'checkbox') {
+ if (isset($this->values[$field['name']])) {
+ $this->values[$field['name']] = true;
+ } else {
+ $this->values[$field['name']] = false;
+ }
+ }
+ }
+
+ $process = isset($this->items['process']) ? $this->items['process'] : array();
+ if (is_array($process)) {
+ foreach ($process as $action => $data) {
+ if (is_numeric($action)) {
+ $action = \key($data);
+ $data = $data[$action];
+ }
+ self::getGrav()->fireEvent('onFormProcessed', new Event(['form' => $this, 'action' => $action, 'params' => $data]));
+ }
+ } else {
+ // Default action.
+ }
+ }
+
+
+ /**
+ * @param string $name
+ * @param string $scope
+ * @return mixed|null
+ * @internal
+ */
+ protected function getField($name, $scope = 'value')
+ {
+ $path = explode('.', $name);
+
+ $current = $this->{$scope};
+ foreach ($path as $field) {
+ if (is_object($current) && isset($current->{$field})) {
+ $current = $current->{$field};
+ } elseif (is_array($current) && isset($current[$field])) {
+ $current = $current[$field];
+ } else {
+ return null;
+ }
+ }
+
+ return $current;
+ }
+}
diff --git a/src/user/plugins/form/form.php b/src/user/plugins/form/form.php
new file mode 100644
index 0000000..a2fda6e
--- /dev/null
+++ b/src/user/plugins/form/form.php
@@ -0,0 +1,276 @@
+ ['onPageInitialized', 0],
+ 'onTwigTemplatePaths' => ['onTwigTemplatePaths', 0],
+ 'onTwigSiteVariables' => ['onTwigSiteVariables', 0],
+ 'onFormProcessed' => ['onFormProcessed', 0]
+ ];
+ }
+
+ /**
+ * Initialize form if the page has one. Also catches form processing if user posts the form.
+ */
+ public function onPageInitialized()
+ {
+ /** @var Page $page */
+ $page = $this->grav['page'];
+ if (!$page) {
+ return;
+ }
+
+ $header = $page->header();
+ if (isset($header->form) && is_array($header->form)) {
+ $this->active = true;
+
+ // Create form.
+ require_once __DIR__ . '/classes/form.php';
+ $this->form = new Form($page);
+
+ // Handle posting if needed.
+ if (!empty($_POST)) {
+ $this->form->post();
+ }
+ }
+ }
+
+ /**
+ * Add current directory to twig lookup paths.
+ */
+ public function onTwigTemplatePaths()
+ {
+ $this->grav['twig']->twig_paths[] = __DIR__ . '/templates';
+ }
+
+ /**
+ * Make form accessible from twig.
+ */
+ public function onTwigSiteVariables()
+ {
+ if (!$this->active) {
+ return;
+ }
+
+ $this->grav['twig']->twig_vars['form'] = $this->form;
+ }
+
+ /**
+ * Handle form processing instructions.
+ *
+ * @param Event $event
+ */
+ public function onFormProcessed(Event $event)
+ {
+ $form = $event['form'];
+ $action = $event['action'];
+ $params = $event['params'];
+
+ if (!$this->active) {
+ return;
+ }
+
+ if (!$this->validate($form)) {
+ /** @var Language $l */
+ $l = $this->grav['language'];
+ $this->form->message = $l->translate('FORM_PLUGIN.NOT_VALIDATED');
+ $uri = $this->grav['uri'];
+ $route = $uri->route();
+
+ /** @var Twig $twig */
+ $twig = $this->grav['twig'];
+ $twig->twig_vars['form'] = $form;
+
+ /** @var Pages $pages */
+ $pages = $this->grav['pages'];
+ $page = $pages->dispatch($route, true);
+ unset($this->grav['page']);
+ $this->grav['page'] = $page;
+
+ return;
+ }
+
+ $this->process($form);
+
+ switch ($action) {
+ case 'captcha':
+ // Validate the captcha
+ $query = http_build_query([
+ 'secret' => $params['recatpcha_secret'],
+ 'response' => $this->form->value('g-recaptcha-response')
+ ]);
+ $url = 'https://www.google.com/recaptcha/api/siteverify?'.$query;
+ $response = json_decode(file_get_contents($url), true);
+
+ if (!isset($response['success']) || $response['success'] !== true) {
+ throw new \RuntimeException('Error validating the Captcha');
+ }
+ break;
+ case 'message':
+ $this->form->message = (string) $params;
+ break;
+ case 'redirect':
+ $this->grav->redirect((string) $params);
+ break;
+ case 'reset':
+ if (in_array($params, array(true, 1, '1', 'yes', 'on', 'true'), true)) {
+ $this->form->reset();
+ }
+ break;
+ case 'display':
+ $route = (string) $params;
+ if (!$route || $route[0] != '/') {
+ /** @var Uri $uri */
+ $uri = $this->grav['uri'];
+ $route = $uri->route() . ($route ? '/' . $route : '');
+ }
+
+ /** @var Twig $twig */
+ $twig = $this->grav['twig'];
+ $twig->twig_vars['form'] = $form;
+
+ /** @var Pages $pages */
+ $pages = $this->grav['pages'];
+ $page = $pages->dispatch($route, true);
+ unset($this->grav['page']);
+ $this->grav['page'] = $page;
+ break;
+ case 'save':
+ $prefix = !empty($params['fileprefix']) ? $params['fileprefix'] : '';
+ $format = !empty($params['dateformat']) ? $params['dateformat'] : 'Ymd-His-u';
+ $ext = !empty($params['extension']) ? '.' . trim($params['extension'], '.') : '.txt';
+ $filename = !empty($params['filename']) ? $params['filename'] : '';
+ $operation = !empty($params['operation']) ? $params['operation'] : 'create';
+
+ if (!$filename) {
+ $filename = $prefix . $this->udate($format) . $ext;
+ }
+
+ /** @var Twig $twig */
+ $twig = $this->grav['twig'];
+ $vars = array(
+ 'form' => $this->form
+ );
+
+ $fullFileName = DATA_DIR . $this->form->name . '/' . $filename;
+
+ $file = File::instance($fullFileName);
+
+ if ($operation == 'create') {
+ $body = $twig->processString(
+ !empty($params['body']) ? $params['body'] : '{% include "forms/data.txt.twig" %}',
+ $vars
+ );
+ $file->save($body);
+ } elseif ($operation == 'add') {
+ $vars = $vars['form']->value();
+
+ foreach ($form->fields as $field) {
+ if (isset($field['process']) && isset($field['process']['ignore']) && $field['process']['ignore']) {
+ unset($vars[$field['name']]);
+ }
+ }
+
+ if (file_exists($fullFileName)) {
+ $data = Yaml::parse($file->content());
+ if (count($data) > 0) {
+ array_unshift($data, $vars);
+ } else {
+ $data[] = $vars;
+ }
+ } else {
+ $data[] = $vars;
+ }
+
+ $file->save(Yaml::dump($data));
+ }
+ break;
+ }
+ }
+
+ /**
+ * Validate a form
+ *
+ * @param Form $form
+ * @return bool
+ */
+ protected function validate($form) {
+ foreach ($form->fields as $field) {
+ if (isset($field['validate']) && isset($field['validate']['required']) && $field['validate']['required']) {
+ if (!$form->value($field['name'])) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Process a form
+ *
+ * Currently available processing tasks:
+ *
+ * - fillWithCurrentDateTime
+ *
+ * @param Form $form
+ * @return bool
+ */
+ protected function process($form) {
+ foreach ($form->fields as $field) {
+ if (isset($field['process'])) {
+ if (isset($field['process']['fillWithCurrentDateTime']) && $field['process']['fillWithCurrentDateTime']) {
+ $form->setValue($field['name'], gmdate('D, d M Y H:i:s', time()));
+ }
+ }
+ }
+ }
+
+ /**
+ * Create unix timestamp for storing the data into the filesystem.
+ *
+ * @param string $format
+ * @param int $utimestamp
+ * @return string
+ */
+ private function udate($format = 'u', $utimestamp = null)
+ {
+ if (is_null($utimestamp)) {
+ $utimestamp = microtime(true);
+ }
+
+ $timestamp = floor($utimestamp);
+ $milliseconds = round(($utimestamp - $timestamp) * 1000000);
+
+ return date(preg_replace('`(?{% block field_label %}{{ field.label }} {% endblock %}: {% block field_value %}{{ string(form.value(field.name)|e) }}{% endblock %}
+{% endblock %}
+{% endfor %}
diff --git a/src/user/plugins/form/templates/forms/default/data.txt.twig b/src/user/plugins/form/templates/forms/default/data.txt.twig
new file mode 100644
index 0000000..20abee7
--- /dev/null
+++ b/src/user/plugins/form/templates/forms/default/data.txt.twig
@@ -0,0 +1,3 @@
+{% for field in form.fields %}
+{{ field.name }}: {{ string(form.value(field.name)|e|nl2br)|replace({"\n":' ', "\r":' '}) }}
+{% endfor %}
diff --git a/src/user/plugins/form/templates/forms/default/form.html.twig b/src/user/plugins/form/templates/forms/default/form.html.twig
new file mode 100644
index 0000000..623ef6a
--- /dev/null
+++ b/src/user/plugins/form/templates/forms/default/form.html.twig
@@ -0,0 +1,18 @@
+{{ form.message }}
+
+
diff --git a/src/user/plugins/form/templates/forms/field.html.twig b/src/user/plugins/form/templates/forms/field.html.twig
new file mode 100644
index 0000000..aa029a0
--- /dev/null
+++ b/src/user/plugins/form/templates/forms/field.html.twig
@@ -0,0 +1,58 @@
+{% set originalValue = originalValue is defined ? originalValue : value %}
+{% set value = (value is null ? field.default : value) %}
+{# {% set vertical = field.style == 'vertical' %} #}
+{% set vertical = true %}
+
+{% block field %}
+
+{% endblock %}
diff --git a/src/user/plugins/form/templates/forms/fields/captcha/captcha.html.twig b/src/user/plugins/form/templates/forms/fields/captcha/captcha.html.twig
new file mode 100644
index 0000000..00f5030
--- /dev/null
+++ b/src/user/plugins/form/templates/forms/fields/captcha/captcha.html.twig
@@ -0,0 +1,27 @@
+{% extends "forms/field.html.twig" %}
+
+{% block input %}
+
+
+
+
+
+{% endblock %}
diff --git a/src/user/plugins/form/templates/forms/fields/checkbox/checkbox.html.twig b/src/user/plugins/form/templates/forms/fields/checkbox/checkbox.html.twig
new file mode 100644
index 0000000..c6920a5
--- /dev/null
+++ b/src/user/plugins/form/templates/forms/fields/checkbox/checkbox.html.twig
@@ -0,0 +1,29 @@
+{% extends "forms/field.html.twig" %}
+
+{% block label %}
+{% endblock %}
+
+{% block input %}
+
+
+
+ {{ field.label|e }} {{ field.validate.required in ['on', 'true', 1] ? '* ' }}
+
+{% endblock %}
diff --git a/src/user/plugins/form/templates/forms/fields/checkbox/checkbox.yaml b/src/user/plugins/form/templates/forms/fields/checkbox/checkbox.yaml
new file mode 100644
index 0000000..b407144
--- /dev/null
+++ b/src/user/plugins/form/templates/forms/fields/checkbox/checkbox.yaml
@@ -0,0 +1,11 @@
+field:
+ checkbox:
+ node: boolean
+ key: name
+ fields:
+ name:
+ type: text
+ validation:
+ required: true
+ value:
+ type: text
diff --git a/src/user/plugins/form/templates/forms/fields/checkboxes/checkboxes.html.twig b/src/user/plugins/form/templates/forms/fields/checkboxes/checkboxes.html.twig
new file mode 100644
index 0000000..5ec2b91
--- /dev/null
+++ b/src/user/plugins/form/templates/forms/fields/checkboxes/checkboxes.html.twig
@@ -0,0 +1,34 @@
+{% extends "forms/field.html.twig" %}
+
+{% set originalValue = value %}
+{% set value = (value is null ? field.default : value) %}
+{% if field.use == 'keys' and field.default %}
+ {% set value = field.default|merge(value) %}
+{% endif %}
+
+{% block global_attributes %}
+ {{ parent() }}
+ data-grav-keys="{{ field.use == 'keys' ? 'true' : 'false' }}"
+ data-grav-field-name="{{ field.name|fieldName }}"
+{% endblock %}
+
+{% block input %}
+ {% for key, text in field.options %}
+
+ {% set id = field.id|default(field.name) ~ '-' ~ key %}
+ {% set name = field.use == 'keys' ? key : id %}
+ {% set val = field.use == 'keys' ? '1' : key %}
+ {% set checked = (field.use == 'keys' ? value[key] : key in value) %}
+
+
+
+ {{ text|e }}
+
+ {% endfor %}
+{% endblock %}
diff --git a/src/user/plugins/form/templates/forms/fields/date/date.html.twig b/src/user/plugins/form/templates/forms/fields/date/date.html.twig
new file mode 100644
index 0000000..4e42985
--- /dev/null
+++ b/src/user/plugins/form/templates/forms/fields/date/date.html.twig
@@ -0,0 +1,8 @@
+{% extends "forms/field.html.twig" %}
+
+{% block input_attributes %}
+ type="date"
+ {% if field.validate.min %}min="{{ field.validate.min }}"{% endif %}
+ {% if field.validate.max %}max="{{ field.validate.max }}"{% endif %}
+ {{ parent() }}
+{% endblock %}
diff --git a/src/user/plugins/form/templates/forms/fields/datetime/datetime.html.twig b/src/user/plugins/form/templates/forms/fields/datetime/datetime.html.twig
new file mode 100644
index 0000000..4e95595
--- /dev/null
+++ b/src/user/plugins/form/templates/forms/fields/datetime/datetime.html.twig
@@ -0,0 +1,18 @@
+{% extends "forms/field.html.twig" %}
+
+{% set default_php_dateformat = "d-m-Y H:i" %}
+{% set php_dateformat = config.system.pages.dateformat.default ?: default_php_dateformat %}
+{% set js_dateformat = admin.dateformat2Kendo(php_dateformat) %}
+{% set value = (value is null ? field.default : value) %}
+{% set value = (value is null ? value : value|date(php_dateformat)) %}
+
+
+{% block input_attributes %}
+ type="text"
+ data-grav-field-datetime
+ data-date-formats="{{ {'format': js_dateformat} | json_encode | e('html_attr') }}"
+ {% if field.validate.min %}min="{{ (field.validate.min is null ? field.validate.min : field.validate.min|date(php_dateformat)) }}"{% endif %}
+ {% if field.validate.max %}max="{{ (field.validate.max is null ? field.validate.max : field.validate.max|date(php_dateformat)) }}"{% endif %}
+ {{ parent() }}
+{% endblock %}
+
diff --git a/src/user/plugins/form/templates/forms/fields/display/display.html.twig b/src/user/plugins/form/templates/forms/fields/display/display.html.twig
new file mode 100644
index 0000000..9ad1dee
--- /dev/null
+++ b/src/user/plugins/form/templates/forms/fields/display/display.html.twig
@@ -0,0 +1,11 @@
+{% extends "forms/field.html.twig" %}
+
+{% block input %}
+
+ {% if field.markdown %}
+ {{ field.content|markdown }}
+ {% else %}
+ {{ field.content }}
+ {% endif %}
+
+{% endblock %}
diff --git a/src/user/plugins/form/templates/forms/fields/email/email.html.twig b/src/user/plugins/form/templates/forms/fields/email/email.html.twig
new file mode 100644
index 0000000..a1b89ff
--- /dev/null
+++ b/src/user/plugins/form/templates/forms/fields/email/email.html.twig
@@ -0,0 +1,6 @@
+{% extends "forms/field.html.twig" %}
+
+{% block input_attributes %}
+ type="email"
+ {{ parent() }}
+{% endblock %}
\ No newline at end of file
diff --git a/src/user/plugins/form/templates/forms/fields/hidden/hidden.html.twig b/src/user/plugins/form/templates/forms/fields/hidden/hidden.html.twig
new file mode 100644
index 0000000..1e90d47
--- /dev/null
+++ b/src/user/plugins/form/templates/forms/fields/hidden/hidden.html.twig
@@ -0,0 +1,3 @@
+{% set value = (value is null ? field.default : value) %}
+
+
diff --git a/src/user/plugins/form/templates/forms/fields/password/password.html.twig b/src/user/plugins/form/templates/forms/fields/password/password.html.twig
new file mode 100644
index 0000000..58047e8
--- /dev/null
+++ b/src/user/plugins/form/templates/forms/fields/password/password.html.twig
@@ -0,0 +1,7 @@
+{% extends "forms/field.html.twig" %}
+
+{% block input_attributes %}
+ type="password"
+ class="input"
+ {{ parent() }}
+{% endblock %}
diff --git a/src/user/plugins/form/templates/forms/fields/radio/radio.html.twig b/src/user/plugins/form/templates/forms/fields/radio/radio.html.twig
new file mode 100644
index 0000000..a5e509c
--- /dev/null
+++ b/src/user/plugins/form/templates/forms/fields/radio/radio.html.twig
@@ -0,0 +1,21 @@
+{% extends "forms/field.html.twig" %}
+
+{% set originalValue = value %}
+{% set value = (value is null ? field.default : value) %}
+
+{% block input %}
+ {% for key, text in field.options %}
+ {% set id = field.id|default(field.name) ~ '-' ~ key %}
+
+
+
+ {{ text|e }}
+
+ {% endfor %}
+{% endblock %}
diff --git a/src/user/plugins/form/templates/forms/fields/select/select.html.twig b/src/user/plugins/form/templates/forms/fields/select/select.html.twig
new file mode 100644
index 0000000..df5edbc
--- /dev/null
+++ b/src/user/plugins/form/templates/forms/fields/select/select.html.twig
@@ -0,0 +1,22 @@
+{% extends "forms/field.html.twig" %}
+
+{% block global_attributes %}
+ data-grav-selectize="{{ (field.selectize is defined ? field.selectize : {})|json_encode()|e('html_attr') }}"
+ {{ parent() }}
+{% endblock %}
+
+{% block input %}
+
+
+ {% for key, text in field.options %}
+ {% if grav.twig.twig.filters['tu'] is defined %}{{ text|tu }}{% else %}{{ text|t }}{% endif %}
+ {% endfor %}
+
+
+{% endblock %}
diff --git a/src/user/plugins/form/templates/forms/fields/spacer/spacer.html.twig b/src/user/plugins/form/templates/forms/fields/spacer/spacer.html.twig
new file mode 100644
index 0000000..594bb18
--- /dev/null
+++ b/src/user/plugins/form/templates/forms/fields/spacer/spacer.html.twig
@@ -0,0 +1,13 @@
+
diff --git a/src/user/plugins/form/templates/forms/fields/text/text.html.twig b/src/user/plugins/form/templates/forms/fields/text/text.html.twig
new file mode 100644
index 0000000..2b96ebe
--- /dev/null
+++ b/src/user/plugins/form/templates/forms/fields/text/text.html.twig
@@ -0,0 +1,6 @@
+{% extends "forms/field.html.twig" %}
+
+{% block input_attributes %}
+ type="text"
+ {{ parent() }}
+{% endblock %}
diff --git a/src/user/plugins/form/templates/forms/fields/textarea/textarea.html.twig b/src/user/plugins/form/templates/forms/fields/textarea/textarea.html.twig
new file mode 100644
index 0000000..ffd0019
--- /dev/null
+++ b/src/user/plugins/form/templates/forms/fields/textarea/textarea.html.twig
@@ -0,0 +1,25 @@
+{% extends "forms/field.html.twig" %}
+
+{% block input %}
+
+
+
+{% endblock %}
diff --git a/src/user/plugins/form/templates/forms/form.html.twig b/src/user/plugins/form/templates/forms/form.html.twig
new file mode 100644
index 0000000..8f1d467
--- /dev/null
+++ b/src/user/plugins/form/templates/forms/form.html.twig
@@ -0,0 +1 @@
+{% extends "forms/default/form.html.twig" %}
diff --git a/src/user/plugins/login/CHANGELOG.md b/src/user/plugins/login/CHANGELOG.md
new file mode 100644
index 0000000..5093ec5
--- /dev/null
+++ b/src/user/plugins/login/CHANGELOG.md
@@ -0,0 +1,42 @@
+# v0.3.3
+## 09/011/2015
+
+1. [](#improved)
+ * Changed authorise to authorize
+1. [](#bugfix)
+ * Fix denied string
+
+# v0.3.2
+## 09/01/2015
+
+1. [](#improved)
+ * Broke out login form into its own partial
+
+# v0.3.1
+## 08/31/2015
+
+1. [](#improved)
+ * Added username field autofocus
+
+# v0.3.0
+## 08/24/2015
+
+1. [](#new)
+ * Added simple CSS styling
+ * Added simple login status with logout
+1. [](#improved)
+ * Improved README documentation
+ * More strings translated
+ * Updated blueprints
+
+# v0.2.0
+## 08/11/2015
+
+1. [](#improved)
+ * Disable `enable` in admin
+
+# v0.1.0
+## 08/04/2015
+
+1. [](#new)
+ * ChangeLog started...
diff --git a/src/user/plugins/login/LICENSE b/src/user/plugins/login/LICENSE
new file mode 100644
index 0000000..0e788c6
--- /dev/null
+++ b/src/user/plugins/login/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Grav
+
+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/src/user/plugins/login/README.md b/src/user/plugins/login/README.md
new file mode 100644
index 0000000..af5693e
--- /dev/null
+++ b/src/user/plugins/login/README.md
@@ -0,0 +1,103 @@
+# Grav Login Plugin
+
+The **login plugin** for [Grav](http://github.com/getgrav/grav) adds login, basic ACL, and session wide messages to Grav. It is designed to provide a way to secure front-end and admin content throughout Grav.
+
+| IMPORTANT!!! This plugin is currently in development as is to be considered a **beta release**. As such, use this in a production environment **at your own risk!**. More features will be added in the future.
+
+
+# Installation
+
+The **login** plugin actually requires the help of the **email** and **form** plugins. The **email** plugin is needed to ensure that you can recover a password via email if required. The **form** plugin is used to generate the forms required.
+
+These are available via GPM, and because the plugin has dependencies you just need to proceed and install the login plugin, and agree when prompted to install the others:
+
+```
+$ bin/gpm install login
+```
+
+# Creating Users
+
+You can either use the built-in CLI capabilities, or you create a user manually by creating a new YAML file in your `user/acounts` folder.
+
+### CLI NewUser
+
+The simplest way to create a new user is to simply run the `bin/grav newuser` command. This will take you through a few questions to gather information with which to create your user.
+
+```
+> bin/grav newuser
+Create new user
+
+Enter a username: joeuser
+Enter a password: 8c9sRCeBExAiwk
+Enter an email: joeuser@grav.org
+Please choose a set of permissions:
+ [a] admin access
+ [s] site access
+ [b] admin and site access
+ > b
+Enter a fullname: Joe User
+Enter a title: Site Administrator
+
+Success! User joeuser created.
+```
+
+### Manual User Creation
+
+Here is example user defined in `user/accounts/admin.yaml`:
+
+```
+password: password
+email: youremail@mail.com
+fullname: Johnny Appleseed
+title: Site Administrator
+access:
+ admin:
+ login: true
+ super: true
+```
+
+>> Note: the username is based on the name of the YAML file.
+
+# Usage
+
+You can add ACL to any page by typing something like below into the page header:
+
+```
+access:
+ site.login: true
+ admin.login: true
+```
+
+Users who have any of the listed ACL roles enabled will have access to the page.
+Others will be forwarded to login screen.
+
+Because the admin user contains an `admin.login: true` reference he will be able to login to the secured page because that is one of the conditions defined in the page header. You are free to create any specific set of ACL rules you like. Your user account must simply contain those same rules if you wish th user to have access.
+
+# Login Page
+
+>> Note: the **frontend site** and **admin plugin** use different sessions so you need to explicitly provide a login on the frontend.
+
+The login plugin can **automatically generate** a login page for you when you try to access a page that your user (or guest account) does not have access to.
+
+Alternatively, you can also provide a specific login route if you wish to forward users to a specific login page. To do this you need to create a copy of the `login.yaml` from the plugin in your `user/config/plugins` folder and provide a specific route (or just edit the plugin setttings in the admin plugin).
+
+```
+route: /user-login
+```
+
+You would then need to provide a suitable login form, probably based on the one that is provided with the plugin.
+
+# Logout
+
+The login plugin comes with a simple Twig partial to provide a logout link (`login-status.html.twig`). You will need to include it in your theme however. An example of this can be found in the Antimatter theme's `partials/navigation.html.twig` file:
+
+```
+{% if config.plugins.login.enabled and grav.user.username %}
+ {% include 'partials/login-status.html.twig' %}
+{% endif %}
+```
+
+You can also copy this `login-status.html.twig` file into your theme and modify it as you see fit.
+
+
+
diff --git a/src/user/plugins/login/blueprints.yaml b/src/user/plugins/login/blueprints.yaml
new file mode 100644
index 0000000..80d2da9
--- /dev/null
+++ b/src/user/plugins/login/blueprints.yaml
@@ -0,0 +1,51 @@
+name: Login
+version: 0.3.3
+description: Enables user authentication and login screen.
+icon: sign-in
+author:
+ name: Team Grav
+ email: devs@getgrav.org
+ url: http://getgrav.org
+keywords: admin, plugin, login
+homepage: https://github.com/getgrav/grav-plugin-login
+keywords: login, authentication, admin, security
+bugs: https://github.com/getgrav/grav-plugin-login/issues
+license: MIT
+
+dependencies:
+ - form
+ - email
+
+form:
+ validation: loose
+ fields:
+ enabled:
+ type: hidden
+ label: Plugin status
+ highlight: 1
+ default: 1
+ options:
+ 1: Enabled
+ 0: Disabled
+ validate:
+ type: bool
+
+ built_in_css:
+ type: toggle
+ label: Use built in CSS
+ highlight: 1
+ default: 1
+ help: "Include the CSS provided by the admin plugin"
+ options:
+ 1: Enabled
+ 0: Disabled
+ validate:
+ type: bool
+
+ route:
+ type: text
+ label: Login path
+ help: "Custom route to a custom login page that your theme provides"
+ placeholder: "/my-custom-login"
+
+
diff --git a/src/user/plugins/login/classes/controller.php b/src/user/plugins/login/classes/controller.php
new file mode 100644
index 0000000..ec3965c
--- /dev/null
+++ b/src/user/plugins/login/classes/controller.php
@@ -0,0 +1,217 @@
+grav = $grav;
+ $this->task = $task ?: 'display';
+ $this->post = $this->getPost($post);
+ }
+
+ /**
+ * Performs a task.
+ */
+ public function execute()
+ {
+ // Set redirect if available.
+ if (isset($this->post['_redirect'])) {
+ $redirect = $this->post['_redirect'];
+ unset($this->post['_redirect']);
+ }
+
+ $success = false;
+ $method = 'task' . ucfirst($this->task);
+
+ if (!method_exists($this, $method)) {
+ throw new \RuntimeException('Page Not Found', 404);
+ }
+
+ try {
+ $success = call_user_func(array($this, $method));
+ } catch (\RuntimeException $e) {
+ $this->setMessage($e->getMessage());
+ }
+
+ if (!$this->redirect && isset($redirect)) {
+ $this->setRedirect($redirect);
+ }
+
+ return $success;
+ }
+
+ public function redirect()
+ {
+ if ($this->redirect) {
+ $this->grav->redirect($this->redirect, $this->redirectCode);
+ }
+ }
+
+ /**
+ * Handle login.
+ *
+ * @return bool True if the action was performed.
+ */
+ public function taskLogin()
+ {
+ $t = $this->grav['language'];
+ $user = $this->grav['user'];
+
+ if ($this->authenticate($this->post)) {
+ $this->setMessage($t->translate('LOGIN_PLUGIN.LOGIN_SUCCESSFUL'));
+ $referrer = $this->grav['uri']->referrer('/');
+ $this->setRedirect($referrer);
+ } else {
+ if ($user->username) {
+ $this->setMessage($t->translate('LOGIN_PLUGIN.ACCESS_DENIED'));
+ } else {
+ $this->setMessage($t->translate('LOGIN_PLUGIN.LOGIN_FAILED'));
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Handle logout.
+ *
+ * @return bool True if the action was performed.
+ */
+ public function taskLogout()
+ {
+ $this->grav['session']->invalidate()->start();
+ $this->setRedirect('/');
+
+ return true;
+ }
+
+ /**
+ * Authenticate user.
+ *
+ * @param array $form Form fields.
+ * @return bool
+ */
+ protected function authenticate($form)
+ {
+ /** @var User $user */
+ $user = $this->grav['user'];
+
+ if (!$user->authenticated && isset($form['username']) && isset($form['password'])) {
+ $user = User::load($form['username']);
+ if ($user->exists()) {
+
+ // Authenticate user.
+ $result = $user->authenticate($form['password']);
+
+ if ($result) {
+ $this->grav['session']->user = $user;
+ }
+ }
+ }
+ $user->authenticated = $user->authorize('site.login');
+
+ return $user->authenticated;
+ }
+
+ /**
+ * Set redirect.
+ *
+ * @param $path
+ * @param int $code
+ */
+ public function setRedirect($path, $code = 303)
+ {
+ $this->redirect = '/' . preg_replace('|/+|', '/', trim($path, '/'));
+ $this->code = $code;
+ }
+
+ /**
+ * Add message into the session queue.
+ *
+ * @param string $msg
+ * @param string $type
+ */
+ public function setMessage($msg, $type = 'info')
+ {
+ /** @var Message $messages */
+ $messages = $this->grav['messages'];
+ $messages->add($msg, $type);
+ }
+
+ /**
+ * Prepare and return POST data.
+ *
+ * @param array $post
+ * @return array
+ */
+ protected function &getPost($post)
+ {
+ unset($post['task']);
+
+ // Decode JSON encoded fields and merge them to data.
+ if (isset($post['_json'])) {
+ $post = array_merge_recursive($post, $this->jsonDecode($post['_json']));
+ unset($post['_json']);
+ }
+ return $post;
+ }
+
+ /**
+ * Recursively JSON decode data.
+ *
+ * @param array $data
+ * @return array
+ */
+ protected function jsonDecode(array $data)
+ {
+ foreach ($data as &$value) {
+ if (is_array($value)) {
+ $value = $this->jsonDecode($value);
+ } else {
+ $value = json_decode($value, true);
+ }
+ }
+ return $data;
+ }
+}
diff --git a/src/user/plugins/login/css/login.css b/src/user/plugins/login/css/login.css
new file mode 100644
index 0000000..8eac448
--- /dev/null
+++ b/src/user/plugins/login/css/login.css
@@ -0,0 +1,23 @@
+#grav-login {
+ max-width: 30rem;
+ margin: 5rem auto;
+ background: #fcfcfc;
+ border: 4px solid #eee;
+ border-radius: 4px;
+ padding: 1rem 3rem 3rem 3rem;
+ text-align: center;
+}
+
+#grav-login .form-actions {
+ text-align: center;
+}
+
+#grav-logout {
+ position: absolute;
+ bottom: 5px;
+ right: 5px;
+}
+
+.alert.info {
+ color: #c00;
+}
diff --git a/src/user/plugins/login/languages.yaml b/src/user/plugins/login/languages.yaml
new file mode 100644
index 0000000..86a0f86
--- /dev/null
+++ b/src/user/plugins/login/languages.yaml
@@ -0,0 +1,8 @@
+en:
+ LOGIN_PLUGIN:
+ ACCESS_DENIED: Access denied...
+ LOGIN_FAILED: Login failed...
+ LOGIN_SUCCESSFUL: You have been successfully logged in.
+ BTN_LOGIN: Login
+ BTN_LOGOUT: Logout
+ BTN_FORGOT: Forgot
diff --git a/src/user/plugins/login/login.php b/src/user/plugins/login/login.php
new file mode 100644
index 0000000..0d5ca3e
--- /dev/null
+++ b/src/user/plugins/login/login.php
@@ -0,0 +1,188 @@
+ ['initialize', 10000],
+ 'onTask.login.login' => ['loginController', 0],
+ 'onTask.login.logout' => ['loginController', 0],
+ 'onPageInitialized' => ['authorizePage', 0],
+ 'onTwigTemplatePaths' => ['onTwigTemplatePaths', 0],
+ 'onTwigSiteVariables' => ['onTwigSiteVariables', -100000]
+ ];
+ }
+
+ /**
+ * Initialize login plugin if path matches.
+ */
+ public function initialize()
+ {
+ // Define session message service.
+ $this->grav['messages'] = function ($c) {
+ $session = $c['session'];
+
+ if (!isset($session->messages)) {
+ $session->messages = new Message;
+ }
+
+ return $session->messages;
+ };
+
+ // Define current user service.
+ $this->grav['user'] = function ($c) {
+ $session = $c['session'];
+
+ if (!isset($session->user)) {
+ $session->user = new User;
+ }
+
+ return $session->user;
+ };
+
+ // Register route to login page if it has been set.
+ $this->route = $this->config->get('plugins.login.route');
+ if ($this->route) {
+ $this->enable([
+ 'onPagesInitialized' => ['addLoginPage', 0]
+ ]);
+ }
+ }
+
+ public function addLoginPage()
+ {
+ /** @var Pages $pages */
+ $pages = $this->grav['pages'];
+ $page = $pages->dispatch($this->route);
+
+ if (!$page) {
+ // Only add login page if it hasn't already been defined.
+ $page = new Page;
+ $page->init(new \SplFileInfo(__DIR__ . "/pages/login.md"));
+ $page->slug(basename($this->route));
+
+ $pages->addPage($page, $this->route);
+ }
+ }
+
+ public function loginController()
+ {
+ /** @var Uri $uri */
+ $uri = $this->grav['uri'];
+ $task = !empty($_POST['task']) ? $_POST['task'] : $uri->param('task');
+ $task = substr($task, strlen('login.'));
+ $post = !empty($_POST) ? $_POST : [];
+
+ require_once __DIR__ . '/classes/controller.php';
+ $controller = new LoginController($this->grav, $task, $post);
+ $controller->execute();
+ $controller->redirect();
+ }
+
+ public function authorizePage()
+ {
+ /** @var Page $page */
+ $page = $this->grav['page'];
+
+ $header = $page->header();
+ $rules = isset($header->access) ? (array) $header->access : [];
+
+ // Continue to the page if it has no ACL rules.
+ if (!$rules) {
+ return;
+ }
+
+ /** @var User $user */
+ $user = $this->grav['user'];
+
+ // Continue to the page if user is authorized to access the page.
+ foreach ($rules as $rule => $value) {
+ if ($user->authorize($rule) == $value) {
+ return;
+ }
+ }
+
+ // User is not logged in; redirect to login page.
+ if ($this->route && !$user->authenticated) {
+ $this->grav->redirect($this->route, 302);
+ }
+
+ /** @var Language $l */
+ $l = $this->grav['language'];
+
+ // Reset page with login page.
+ if (!$user->authenticated) {
+ $page = new Page;
+ $page->init(new \SplFileInfo(__DIR__ . "/pages/login.md"));
+ $page->slug(basename($this->route));
+
+ $this->authenticated = false;
+
+ unset($this->grav['page']);
+ $this->grav['page'] = $page;
+ } else {
+ $this->grav['messages']->add($l->translate('LOGIN_PLUGIN.ACCESS_DENIED'), 'info');
+ $this->authenticated = false;
+
+ $twig = $this->grav['twig'];
+ $twig->twig_vars['notAuthorized'] = true;
+ }
+
+ }
+
+
+ /**
+ * Add twig paths to plugin templates.
+ */
+ public function onTwigTemplatePaths()
+ {
+ $twig = $this->grav['twig'];
+ $twig->twig_paths[] = __DIR__ . '/templates';
+ }
+
+ /**
+ * Set all twig variables for generating output.
+ */
+ public function onTwigSiteVariables()
+ {
+ /** @var Twig $twig */
+ $twig = $this->grav['twig'];
+
+ $extension = $this->grav['uri']->extension();
+ $extension = $extension ?: 'html';
+
+ if (!$this->authenticated) {
+ $twig->template = "login." . $extension . ".twig";
+ }
+
+ // add CSS for frontend if required
+ if (!$this->isAdmin() && $this->config->get('plugins.login.built_in_css')) {
+ $this->grav['assets']->add('plugin://login/css/login.css');
+ }
+ }
+}
diff --git a/src/user/plugins/login/login.yaml b/src/user/plugins/login/login.yaml
new file mode 100644
index 0000000..05cba8a
--- /dev/null
+++ b/src/user/plugins/login/login.yaml
@@ -0,0 +1,4 @@
+enabled: true
+built_in_css: true
+route: false
+
diff --git a/src/user/plugins/login/pages/login.md b/src/user/plugins/login/pages/login.md
new file mode 100644
index 0000000..f3a7219
--- /dev/null
+++ b/src/user/plugins/login/pages/login.md
@@ -0,0 +1,23 @@
+---
+title: Login
+template: form
+
+form:
+ name: login
+ action:
+ method: post
+
+ fields:
+ - name: username
+ type: text
+ placeholder: Username
+ autofocus: true
+
+ - name: password
+ type: password
+ placeholder: Password
+---
+
+# User Login
+
+This page is restricted...
\ No newline at end of file
diff --git a/src/user/plugins/login/templates/login.html.twig b/src/user/plugins/login/templates/login.html.twig
new file mode 100644
index 0000000..9c69bcf
--- /dev/null
+++ b/src/user/plugins/login/templates/login.html.twig
@@ -0,0 +1,5 @@
+{% extends 'partials/base.html.twig' %}
+
+{% block content %}
+ {% include 'partials/login-form.html.twig' %}
+{% endblock %}
diff --git a/src/user/plugins/login/templates/login.json.twig b/src/user/plugins/login/templates/login.json.twig
new file mode 100644
index 0000000..3cef0bb
--- /dev/null
+++ b/src/user/plugins/login/templates/login.json.twig
@@ -0,0 +1 @@
+{ "status": "unauthenticated" }
diff --git a/src/user/plugins/login/templates/partials/login-form.html.twig b/src/user/plugins/login/templates/partials/login-form.html.twig
new file mode 100644
index 0000000..821e3cb
--- /dev/null
+++ b/src/user/plugins/login/templates/partials/login-form.html.twig
@@ -0,0 +1,19 @@
+
+ {{ content }}
+
+ {% include 'partials/messages.html.twig' %}
+
+
+
\ No newline at end of file
diff --git a/src/user/plugins/login/templates/partials/login-status.html.twig b/src/user/plugins/login/templates/partials/login-status.html.twig
new file mode 100644
index 0000000..cf9672b
--- /dev/null
+++ b/src/user/plugins/login/templates/partials/login-status.html.twig
@@ -0,0 +1,5 @@
+
+ {% if grav.user.username %}
+ Welcome {{ grav.user.username }} , Logout
+ {% endif %}
+
diff --git a/src/user/plugins/login/templates/partials/messages.html.twig b/src/user/plugins/login/templates/partials/messages.html.twig
new file mode 100644
index 0000000..e3846f3
--- /dev/null
+++ b/src/user/plugins/login/templates/partials/messages.html.twig
@@ -0,0 +1,3 @@
+{% for message in grav.messages.fetch %}
+{{ message.message }}
+{% endfor %}
\ No newline at end of file
diff --git a/src/user/plugins/problems/CHANGELOG.md b/src/user/plugins/problems/CHANGELOG.md
new file mode 100644
index 0000000..0b2718d
--- /dev/null
+++ b/src/user/plugins/problems/CHANGELOG.md
@@ -0,0 +1,24 @@
+# v1.2.0
+## 08/25/2015
+
+1. [](#improved)
+ * Added blueprints for Grav Admin plugin
+
+# v1.1.6
+## 06/16/2015
+
+2. [](#new)
+ * Try to create missing `backup` folder if it is missing
+
+# v1.1.5
+## 05/09/2015
+
+2. [](#new)
+ * Added check for `backup` folder for Grav > 0.9.27
+
+# v1.1.4
+## 04/26/2015
+
+2. [](#new)
+ * Changelog started
+
diff --git a/src/user/plugins/problems/LICENSE b/src/user/plugins/problems/LICENSE
new file mode 100644
index 0000000..484793a
--- /dev/null
+++ b/src/user/plugins/problems/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Grav
+
+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/src/user/plugins/problems/README.md b/src/user/plugins/problems/README.md
new file mode 100644
index 0000000..25bbb24
--- /dev/null
+++ b/src/user/plugins/problems/README.md
@@ -0,0 +1,84 @@
+# Grav Problems Plugin
+
+
+
+`Problems` is a [Grav](http://github.com/getgrav/grav) Plugin and allows to detect issues.
+
+This plugin is required and you will find it in any package distributed that contains Grav. If you decide to clone Grav from GitHub, you will most likely want to install this.
+
+# Installation
+
+Installing the Problems plugin can be done in one of two ways. Our GPM (Grav Package Manager) installation method enables you to quickly and easily install the plugin with a simple terminal command, while the manual method enables you to do so via a zip file.
+
+## GPM Installation (Preferred)
+
+The simplest way to install this plugin is via the [Grav Package Manager (GPM)](http://learn.getgrav.org/advanced/grav-gpm) through your system's Terminal (also called the command line). From the root of your Grav install type:
+
+ bin/gpm install problems
+
+This will install the Problems plugin into your `/user/plugins` directory within Grav. Its files can be found under `/your/site/grav/user/plugins/problems`.
+
+## Manual Installation
+
+To install this plugin, just download the zip version of this repository and unzip it under `/your/site/grav/user/plugins`. Then, rename the folder to `problems`. You can find these files either on [GitHub](https://github.com/getgrav/grav-plugin-problems) or via [GetGrav.org](http://getgrav.org/downloads/plugins#extras).
+
+You should now have all the plugin files under
+
+ /your/site/grav/user/plugins/problems
+
+>> NOTE: This plugin is a modular component for Grav which requires [Grav](http://github.com/getgrav/grav), the [Error](https://github.com/getgrav/grav-plugin-error) and [Problems](https://github.com/getgrav/grav-plugin-problems) plugins, and a theme to be installed in order to operate.
+
+# Usage
+
+`Problems` runs in the background and most of the time you will not know it is there. Although as soon as an issue is caught, the plugin will let you know.
+
+`Problems` checks for the following common issues:
+
+| Check | Description |
+| :---------------------------------- | :-------------------------------------------------------------------------------------------------------- |
+| PHP Version | Checks to make sure the PHP version being run by the server meets or exceeds Grav's minimum requirements. |
+| PHP GD (Image Manipulation Library) | Checks to make sure that PHP GD is installed. |
+| .htaccess | Checks to make sure that there is an `.htaccess` file in Grav's root directory. |
+| Cache | Checks the `/cache` folder's existence and verifies that it is writeable. |
+| Logs | Checks the `/logs` folder's existence and verifies that it is writeable. |
+| Images | Checks the `/images` folder's existence and verifies that it is writeable. |
+| Assets | Checks the `/assets` folder's existence and verifies that it is writeable. |
+| System | Checks the `/system` folder's existence. |
+| Data | Checks the `/user/data` folder's existence and verifies that it is writeable. |
+| Pages | Checks the `/user/images` folder's existence. |
+| Config | Checks the `/user/config` folder's existence. |
+| Error | Checks to make sure the **Error** plugin is installed in `/user/plugins/error`. |
+| Plugins | Checks the `/user/plugins` folder's existence. |
+| Themes | Checks the `/user/themes` folder's existence. |
+| Vendor | Checks the `/vendor` folder's existence. |
+
+If an issue is discovered, you will be greeted with a page that lists these checks and whether or not your install passed or failed them. Green checks mean it passed, and a red x indicates that the there is something amiss with the item.
+
+Problems uses the cache as refresh indicator. That means that if nothing has changed anywhere, the plugin will just skip its validation tests altogether.
+
+If a change is caught and the cache is refreshed, the plugin will loop through its validation tests and making sure nothing is out of place.
+
+`Problems` gets also triggered if any fatal exception is caught.
+
+# Updating
+
+As development for the Problems plugin continues, new versions may become available that add additional features and functionality, improve compatibility with newer Grav releases, and generally provide a better user experience. Updating Problems is easy, and can be done through Grav's GPM system, as well as manually.
+
+## GPM Update (Preferred)
+
+The simplest way to update this plugin is via the [Grav Package Manager (GPM)](http://learn.getgrav.org/advanced/grav-gpm). You can do this with this by navigating to the root directory of your Grav install using your system's Terminal (also called command line) and typing the following:
+
+ bin/gpm update problems
+
+This command will check your Grav install to see if your Problems plugin is due for an update. If a newer release is found, you will be asked whether or not you wish to update. To continue, type `y` and hit enter. The plugin will automatically update and clear Grav's cache.
+
+## Manual Update
+
+Manually updating Problems is pretty simple. Here is what you will need to do to get this done:
+
+* Delete the `your/site/user/plugins/problems` directory.
+* Downalod the new version of the Problems plugin from either [GitHub](https://github.com/getgrav/grav-plugin-problems) or [GetGrav.org](http://getgrav.org/downloads/plugins#extras).
+* Unzip the zip file in `your/site/user/plugins` and rename the resulting folder to `problems`.
+* Clear the Grav cache. The simplest way to do this is by going to the root Grav directory in terminal and typing `bin/grav clear-cache`.
+
+> Note: Any changes you have made to any of the files listed under this directory will also be removed and replaced by the new set. Any files located elsewhere (for example a YAML settings file placed in `user/config/plugins`) will remain intact.
\ No newline at end of file
diff --git a/src/user/plugins/problems/assets/readme_1.png b/src/user/plugins/problems/assets/readme_1.png
new file mode 100644
index 0000000..bd6f916
Binary files /dev/null and b/src/user/plugins/problems/assets/readme_1.png differ
diff --git a/src/user/plugins/problems/blueprints.yaml b/src/user/plugins/problems/blueprints.yaml
new file mode 100644
index 0000000..842a697
--- /dev/null
+++ b/src/user/plugins/problems/blueprints.yaml
@@ -0,0 +1,37 @@
+name: Problems
+version: 1.2.0
+description: Detects and reports problems found in the site.
+icon: exclamation-circle
+author:
+ name: Team Grav
+ email: devs@getgrav.org
+ url: http://getgrav.org
+homepage: https://github.com/getgrav/grav-plugin-problems
+keywords: problems, plugin, detector, assistant, required
+bugs: https://github.com/getgrav/grav-plugin-problems/issues
+license: MIT
+
+form:
+ validation: strict
+ fields:
+ enabled:
+ type: toggle
+ label: Plugin status
+ highlight: 1
+ default: 0
+ options:
+ 1: Enabled
+ 0: Disabled
+ validate:
+ type: bool
+
+ built_in_css:
+ type: toggle
+ label: Use built in CSS
+ highlight: 1
+ default: 1
+ options:
+ 1: Enabled
+ 0: Disabled
+ validate:
+ type: bool
diff --git a/src/user/plugins/problems/css/problems.css b/src/user/plugins/problems/css/problems.css
new file mode 100644
index 0000000..4917e54
--- /dev/null
+++ b/src/user/plugins/problems/css/problems.css
@@ -0,0 +1,71 @@
+section#body {
+ padding-top: 3rem;
+}
+
+ul.problems {
+ list-style: none;
+ padding: 0;
+ margin-top: 3rem;
+}
+
+ul.problems li {
+ margin-bottom: 1rem;
+ padding: 1rem;
+}
+
+ul.problems li.success {
+ background: #F1F9F1;
+ border-left: 5px solid #5CB85C;
+ color: #3d8b3d;
+}
+
+ul.problems li.error {
+ background: #FDF7F7;
+ border-left: 5px solid #D9534F;
+ color: #b52b27;
+}
+
+ul.problems li.info {
+ background: #F4F8FA;
+ border-left: 5px solid #5bc0de;
+ color: #28a1c5;
+}
+
+ul.problems .fa {
+ font-size: 3rem;
+ vertical-align: middle;
+ margin-left: 1rem;
+ display: block;
+ float: left;
+}
+
+ul.problems p {
+ display: block;
+ margin: 0.5rem 0.5rem 0.5rem 5rem;
+}
+
+.button.big {
+ font-size: 1.2rem;
+}
+
+.center {
+ text-align: center;
+}
+
+.underline {
+ text-decoration: underline;
+}
+
+.clearfix:after {
+ visibility: hidden;
+ display: block;
+ font-size: 0;
+ content: " ";
+ clear: both;
+ height: 0;
+ }
+.clearfix { display: inline-block; }
+/* start commented backslash hack \*/
+* html .clearfix { height: 1%; }
+.clearfix { display: block; }
+/* close commented backslash hack */
diff --git a/src/user/plugins/problems/css/template.css b/src/user/plugins/problems/css/template.css
new file mode 100644
index 0000000..ba59ac8
--- /dev/null
+++ b/src/user/plugins/problems/css/template.css
@@ -0,0 +1,762 @@
+@import url(//fonts.googleapis.com/css?family=Montserrat:400|Raleway:300,400,600|Inconsolata);
+
+#header #logo h3, #header #navbar ul, #header #navbar .panel-activation, #footer p {
+ position: relative;
+ top: 50%;
+ -webkit-transform: translateY(-50%);
+ -moz-transform: translateY(-50%);
+ -o-transform: translateY(-50%);
+ -ms-transform: translateY(-50%);
+ transform: translateY(-50%); }
+
+.button, .button-secondary {
+ display: inline-block;
+ padding: 7px 20px; }
+
+html, body {
+ height: 100%; }
+
+body {
+ background: white;
+ color: #444444;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale; }
+
+a {
+ color: #1bb3e9; }
+ a:hover {
+ color: #0e6e90; }
+
+b, strong, label, th {
+ font-weight: 600; }
+
+#container {
+ min-height: 100%;
+ position: relative; }
+
+.fullwidth #body {
+ padding-left: 0;
+ padding-right: 0; }
+
+#body {
+ padding-top: 8rem;
+ padding-bottom: 11rem; }
+
+.default-animation, #body, #header, #header #logo h3, .modular .showcase .button {
+ -webkit-transition: all 0.5s ease;
+ -moz-transition: all 0.5s ease;
+ transition: all 0.5s ease; }
+
+.padding-horiz, .fullwidth #header, .fullwidth #breadcrumbs, .fullwidth .blog-header, .fullwidth .blog-content-item, .fullwidth .blog-content-list, .fullwidth ul.pagination, .fullwidth #body > .modular-row, #body, #header, #footer {
+ padding-left: 7rem;
+ padding-right: 7rem; }
+ @media only all and (max-width: 59.938rem) {
+ .padding-horiz, .fullwidth #header, .fullwidth #breadcrumbs, .fullwidth .blog-header, .fullwidth .blog-content-item, .fullwidth .blog-content-list, .fullwidth ul.pagination, .fullwidth #body > .modular-row, #body, #header, #footer {
+ padding-left: 4rem;
+ padding-right: 4rem; } }
+ @media only all and (max-width: 47.938rem) {
+ .padding-horiz, .fullwidth #header, .fullwidth #breadcrumbs, .fullwidth .blog-header, .fullwidth .blog-content-item, .fullwidth .blog-content-list, .fullwidth ul.pagination, .fullwidth #body > .modular-row, #body, #header, #footer {
+ padding-left: 1rem;
+ padding-right: 1rem; } }
+
+.padding-vert {
+ padding-top: 3rem;
+ padding-bottom: 3rem; }
+
+#header {
+ position: fixed;
+ z-index: 10;
+ width: 100%;
+ height: 5rem;
+ background-color: rgba(255, 255, 255, 0.9);
+ box-shadow: 0 0.05rem 1rem rgba(0, 0, 0, 0.15); }
+ #header.scrolled {
+ height: 3rem;
+ background-color: rgba(255, 255, 255, 0.9) !important;
+ box-shadow: 0 0.05rem 1rem rgba(0, 0, 0, 0.15) !important; }
+ #header.scrolled #logo h3 {
+ color: #444444 !important;
+ font-size: 1.6rem !important; }
+ #header.scrolled #logo a {
+ color: #444444 !important; }
+ #header.scrolled #navbar a {
+ color: #1bb3e9 !important; }
+ #header.scrolled #navbar a:before, #header.scrolled #navbar a:after {
+ background-color: #1bb3e9 !important; }
+ #header > .grid, #header #logo, #header #navbar {
+ height: 100%; }
+ #header #logo {
+ float: left; }
+ #header #logo h3 {
+ font-size: 2rem;
+ line-height: 2rem;
+ margin: 0;
+ text-transform: uppercase; }
+ #header #logo h3 a {
+ color: #444444; }
+ #header #navbar {
+ font-size: 0.9rem; }
+ #header #navbar ul {
+ display: inline-block;
+ margin: 0;
+ list-style: none;
+ float: right; }
+ #header #navbar ul li {
+ float: left;
+ position: relative; }
+ #header #navbar ul li a {
+ font-family: "Montserrat", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif;
+ display: inline-block;
+ padding: 0.1rem 0.8rem; }
+ #header #navbar ul li a:before, #header #navbar ul li a:after {
+ content: "";
+ position: absolute;
+ width: 100%;
+ height: 1px;
+ bottom: 0;
+ left: 0;
+ background-color: #1bb3e9;
+ visibility: hidden;
+ -webkit-transform: scaleX(0);
+ -moz-transform: scaleX(0);
+ -ms-transform: scaleX(0);
+ -o-transform: scaleX(0);
+ transform: scaleX(0);
+ -webkit-transition: all 0.2s ease;
+ -moz-transition: all 0.2s ease;
+ transition: all 0.2s ease; }
+ #header #navbar ul li a:hover:before {
+ visibility: visible;
+ -webkit-transform: scaleX(0.75);
+ -moz-transform: scaleX(0.75);
+ -ms-transform: scaleX(0.75);
+ -o-transform: scaleX(0.75);
+ transform: scaleX(0.75); }
+ #header #navbar ul li.active a:after {
+ top: 0;
+ visibility: visible;
+ -webkit-transform: scaleX(0.75);
+ -moz-transform: scaleX(0.75);
+ -ms-transform: scaleX(0.75);
+ -o-transform: scaleX(0.75);
+ transform: scaleX(0.75); }
+ @media only all and (max-width: 59.938rem) {
+ #header #navbar ul {
+ display: none; } }
+ #header #navbar .panel-activation {
+ display: none;
+ font-size: 2rem;
+ cursor: pointer;
+ float: right; }
+ @media only all and (max-width: 59.938rem) {
+ #header #navbar .panel-activation {
+ display: inline-block; } }
+
+.header-image.fullwidth #body {
+ padding-left: 0;
+ padding-right: 0; }
+ .header-image.fullwidth #body > .listing-row {
+ padding-left: 7rem;
+ padding-right: 7rem; }
+.header-image .listing-row:last-child {
+ margin-bottom: 2rem; }
+.header-image #body > .blog-header {
+ margin-top: -9.5rem;
+ padding-top: 9rem; }
+.header-image #breadcrumbs {
+ margin-top: 1rem; }
+.header-image #header {
+ background-color: rgba(255, 255, 255, 0);
+ box-shadow: none; }
+ .header-image #header #logo h3, .header-image #header #logo a {
+ color: white; }
+ .header-image #header a, .header-image #header .menu-btn {
+ color: white; }
+ .header-image #header a:before, .header-image #header a:after {
+ background-color: rgba(255, 255, 255, 0.7) !important; }
+
+#footer {
+ position: absolute;
+ background: #333;
+ height: 6rem;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ color: #999;
+ text-align: center; }
+ #footer a:hover {
+ color: #fff; }
+ #footer .totop {
+ position: absolute;
+ bottom: 5rem;
+ text-align: center;
+ left: 0;
+ right: 0; }
+ #footer .totop span {
+ font-size: 1.7rem;
+ line-height: 2.5rem;
+ background: #333;
+ width: 3rem;
+ height: 2rem;
+ border-radius: 3px;
+ display: inline-block;
+ text-align: top; }
+ #footer p {
+ margin: 0; }
+ #footer p .fa {
+ color: #fff; }
+
+body {
+ font-family: "Raleway", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif;
+ font-weight: 400; }
+
+h1, h2, h3, h4, h5, h6 {
+ font-family: "Montserrat", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif;
+ font-weight: 400;
+ text-rendering: optimizeLegibility;
+ letter-spacing: -0px; }
+
+h1 {
+ font-size: 3.2rem; }
+ @media only all and (max-width: 47.938rem) {
+ h1 {
+ font-size: 2.5rem;
+ line-height: 1.2;
+ margin-bottom: 2.5rem; } }
+
+@media only all and (min-width: 48rem) and (max-width: 59.938rem) {
+ h2 {
+ font-size: 2.1rem; } }
+@media only all and (max-width: 47.938rem) {
+ h2 {
+ font-size: 2rem; } }
+
+@media only all and (min-width: 48rem) and (max-width: 59.938rem) {
+ h3 {
+ font-size: 1.7rem; } }
+@media only all and (max-width: 47.938rem) {
+ h3 {
+ font-size: 1.6rem; } }
+
+@media only all and (min-width: 48rem) and (max-width: 59.938rem) {
+ h4 {
+ font-size: 1.35rem; } }
+@media only all and (max-width: 47.938rem) {
+ h4 {
+ font-size: 1.25rem; } }
+
+h1 {
+ text-align: center;
+ letter-spacing: -3px; }
+
+h2 {
+ letter-spacing: -2px; }
+
+h3 {
+ letter-spacing: -1px; }
+
+h1 + h2 {
+ margin: -2rem 0 2rem 0;
+ font-size: 2rem;
+ line-height: 1;
+ text-align: center;
+ font-family: "Raleway", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif;
+ font-weight: 300; }
+ @media only all and (min-width: 48rem) and (max-width: 59.938rem) {
+ h1 + h2 {
+ font-size: 1.6rem; } }
+ @media only all and (max-width: 47.938rem) {
+ h1 + h2 {
+ font-size: 1.5rem; } }
+
+h2 + h3 {
+ margin: 0.5rem 0 2rem 0;
+ font-size: 2rem;
+ line-height: 1;
+ text-align: center;
+ font-family: "Raleway", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif;
+ font-weight: 300; }
+ @media only all and (min-width: 48rem) and (max-width: 59.938rem) {
+ h2 + h3 {
+ font-size: 1.6rem; } }
+ @media only all and (max-width: 47.938rem) {
+ h2 + h3 {
+ font-size: 1.5rem; } }
+
+blockquote {
+ border-left: 10px solid #f0f2f4; }
+ blockquote p {
+ font-size: 1.1rem;
+ color: #999; }
+ blockquote cite {
+ display: block;
+ text-align: right;
+ color: #666;
+ font-size: 1.2rem; }
+
+blockquote > blockquote > blockquote {
+ margin: 0; }
+ blockquote > blockquote > blockquote p {
+ padding: 15px;
+ display: block;
+ font-size: 1rem;
+ margin-top: 0rem;
+ margin-bottom: 0rem; }
+ blockquote > blockquote > blockquote > p {
+ margin-left: -71px;
+ border-left: 10px solid #F0AD4E;
+ background: #FCF8F2;
+ color: #df8a13; }
+ blockquote > blockquote > blockquote > blockquote > p {
+ margin-left: -94px;
+ border-left: 10px solid #D9534F;
+ background: #FDF7F7;
+ color: #b52b27; }
+ blockquote > blockquote > blockquote > blockquote > blockquote > p {
+ margin-left: -118px;
+ border-left: 10px solid #5BC0DE;
+ background: #F4F8FA;
+ color: #28a1c5; }
+ blockquote > blockquote > blockquote > blockquote > blockquote > blockquote > p {
+ margin-left: -142px;
+ border-left: 10px solid #5CB85C;
+ background: #F1F9F1;
+ color: #3d8b3d; }
+
+code,
+kbd,
+pre,
+samp {
+ font-family: "Inconsolata", monospace; }
+
+code {
+ background: #f9f2f4;
+ color: #9c1d3d; }
+
+pre {
+ padding: 2rem;
+ background: #f6f6f6;
+ border: 1px solid #dddddd;
+ border-radius: 3px; }
+ pre code {
+ color: #237794;
+ background: inherit; }
+
+hr {
+ border-bottom: 4px solid #f0f2f4; }
+
+.page-title {
+ margin-top: -25px;
+ padding: 25px;
+ float: left;
+ clear: both;
+ background: #1bb3e9;
+ color: white; }
+
+fieldset {
+ border: 1px solid #dddddd; }
+
+textarea, input[type="email"], input[type="number"], input[type="password"], input[type="search"], input[type="tel"], input[type="text"], input[type="url"], input[type="color"], input[type="date"], input[type="datetime"], input[type="datetime-local"], input[type="month"], input[type="time"], input[type="week"], select[multiple=multiple] {
+ background-color: white;
+ border: 1px solid #dddddd;
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.06); }
+ textarea:hover, input[type="email"]:hover, input[type="number"]:hover, input[type="password"]:hover, input[type="search"]:hover, input[type="tel"]:hover, input[type="text"]:hover, input[type="url"]:hover, input[type="color"]:hover, input[type="date"]:hover, input[type="datetime"]:hover, input[type="datetime-local"]:hover, input[type="month"]:hover, input[type="time"]:hover, input[type="week"]:hover, select[multiple=multiple]:hover {
+ border-color: #c4c4c4; }
+ textarea:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="password"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="text"]:focus, input[type="url"]:focus, input[type="color"]:focus, input[type="date"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, select[multiple=multiple]:focus {
+ border-color: #1bb3e9;
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.06), 0 0 5px rgba(21, 163, 214, 0.7); }
+
+.form-field .required {
+ color: #F3443F;
+ font-size: 3rem;
+ line-height: 3rem;
+ vertical-align: top;
+ height: 1.5rem;
+ display: inline-block; }
+
+form .buttons {
+ text-align: center; }
+form input {
+ font-weight: 400; }
+
+table {
+ border: 1px solid #eaeaea; }
+
+th {
+ background: #f7f7f7;
+ padding: 0.5rem; }
+
+td {
+ padding: 0.5rem;
+ border: 1px solid #eaeaea; }
+
+.button {
+ background: white;
+ color: #1bb3e9;
+ border: 1px solid #1bb3e9;
+ border-radius: 3px; }
+ .button:hover {
+ background: #1bb3e9;
+ color: white; }
+ .button:active {
+ box-shadow: 0 1px 0 #118ab5; }
+
+.button-secondary {
+ background: white;
+ color: #f6635e;
+ border: 1px solid #f6635e;
+ border-radius: 3px; }
+ .button-secondary:hover {
+ background: #f6635e;
+ color: white; }
+ .button-secondary:active {
+ box-shadow: 0 1px 0 #f32b24; }
+
+.bullets {
+ margin: 1.7rem 0;
+ margin-left: -0.85rem;
+ margin-right: -0.85rem;
+ overflow: auto; }
+
+.bullet {
+ float: left;
+ padding: 0 0.85rem; }
+
+.two-column-bullet {
+ width: 50%; }
+ @media only all and (max-width: 47.938rem) {
+ .two-column-bullet {
+ width: 100%; } }
+
+.three-column-bullet {
+ width: 33.33333%; }
+ @media only all and (max-width: 47.938rem) {
+ .three-column-bullet {
+ width: 100%; } }
+
+.four-column-bullet {
+ width: 25%; }
+ @media only all and (max-width: 47.938rem) {
+ .four-column-bullet {
+ width: 100%; } }
+
+.bullet-icon {
+ float: left;
+ background: #1bb3e9;
+ padding: 0.875rem;
+ width: 3.5rem;
+ height: 3.5rem;
+ border-radius: 50%;
+ color: white;
+ font-size: 1.75rem;
+ text-align: center; }
+
+.bullet-icon-1 {
+ background: #1bb3e9; }
+
+.bullet-icon-2 {
+ background: #1be9da; }
+
+.bullet-icon-3 {
+ background: #d5e91b; }
+
+.bullet-content {
+ margin-left: 4.55rem; }
+
+#panel {
+ color: white; }
+ #panel .navigation {
+ list-style: none;
+ padding: 0; }
+ #panel .navigation li {
+ padding: 0.5rem 1rem;
+ border-bottom: 1px solid #404040;
+ font-weight: 600; }
+ #panel .navigation li.active {
+ background: #fff; }
+ #panel .navigation li.active a {
+ color: #444444; }
+ #panel .navigation li.active a:hover {
+ color: #444444; }
+ #panel .navigation li:last-child {
+ border-bottom: 0; }
+ #panel .navigation li a:hover {
+ color: white; }
+
+/* Menu Appearance */
+.pushy {
+ position: fixed;
+ width: 250px;
+ height: 100%;
+ top: 0;
+ z-index: 9999;
+ background: #333333;
+ overflow: auto;
+ -webkit-overflow-scrolling: touch;
+ /* enables momentum scrolling in iOS overflow elements */ }
+
+/* Menu Movement */
+.pushy-left {
+ -webkit-transform: translate3d(-250px, 0, 0);
+ -moz-transform: translate3d(-250px, 0, 0);
+ -ms-transform: translate3d(-250px, 0, 0);
+ -o-transform: translate3d(-250px, 0, 0);
+ transform: translate3d(-250px, 0, 0); }
+
+.pushy-open {
+ -webkit-transform: translate3d(0, 0, 0);
+ -moz-transform: translate3d(0, 0, 0);
+ -ms-transform: translate3d(0, 0, 0);
+ -o-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0); }
+
+.container-push, .push-push {
+ -webkit-transform: translate3d(250px, 0, 0);
+ -moz-transform: translate3d(250px, 0, 0);
+ -ms-transform: translate3d(250px, 0, 0);
+ -o-transform: translate3d(250px, 0, 0);
+ transform: translate3d(250px, 0, 0); }
+
+/* Menu Transitions */
+.pushy, #container, .push {
+ -webkit-transition: -webkit-transform 0.2s cubic-bezier(0.16, 0.68, 0.43, 0.99);
+ -moz-transition: -moz-transform 0.2s cubic-bezier(0.16, 0.68, 0.43, 0.99);
+ transition: transform 0.2s cubic-bezier(0.16, 0.68, 0.43, 0.99);
+ /* improves performance issues on mobile*/
+ -webkit-perspective: 1000; }
+
+/* Site Overlay */
+.site-overlay {
+ display: none; }
+
+.pushy-active .site-overlay {
+ display: block;
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 250px;
+ z-index: 9999; }
+
+.blog-header {
+ padding-top: 2rem;
+ padding-bottom: 2rem; }
+ .blog-header.blog-header-image {
+ background-size: cover;
+ background-position: center; }
+ .blog-header.blog-header-image h1, .blog-header.blog-header-image h2 {
+ color: white; }
+ .blog-header h1 {
+ font-size: 4rem;
+ margin-top: 0; }
+ @media only all and (min-width: 48rem) and (max-width: 59.938rem) {
+ .blog-header h1 {
+ font-size: 3rem; } }
+ @media only all and (max-width: 47.938rem) {
+ .blog-header h1 {
+ font-size: 2.5rem;
+ line-height: 1.2;
+ margin-bottom: 2.5rem; } }
+ .blog-header + .blog-content {
+ padding-top: 3rem; }
+
+.list-item {
+ border-bottom: 1px solid #eeeeee;
+ margin-bottom: 3rem; }
+ .list-item:last-child {
+ border-bottom: 0; }
+ .list-item .list-blog-header {
+ position: relative; }
+ .list-item .list-blog-header h4 {
+ margin-bottom: 0.5rem; }
+ .list-item .list-blog-header h4 a {
+ color: #444444; }
+ .list-item .list-blog-header h4 a:hover {
+ color: #1bb3e9; }
+ .list-item .list-blog-header img {
+ display: block;
+ margin-top: 1rem;
+ border-radius: 3px; }
+ .list-item .list-blog-date {
+ float: right;
+ text-align: center; }
+ .list-item .list-blog-date span {
+ display: block;
+ font-size: 1.75rem;
+ font-weight: 600;
+ line-height: 110%; }
+ .list-item .list-blog-date em {
+ display: block;
+ border-top: 1px solid #eeeeee;
+ font-style: normal;
+ text-transform: uppercase; }
+
+.blog-content-item .list-blog-padding > p:nth-child(2) {
+ font-size: 1.2rem; }
+
+.tags a {
+ display: inline-block;
+ font-size: 0.8rem;
+ border: 1px solid #1bb3e9;
+ border-radius: 3px;
+ padding: 0.1rem 0.4rem;
+ margin-bottom: 0.2rem;
+ text-transform: uppercase; }
+
+.archives {
+ padding: 0;
+ list-style: none; }
+ .archives li {
+ border-bottom: 1px solid #eeeeee;
+ line-height: 2rem; }
+ .archives li:last-child {
+ border-bottom: 0; }
+
+.syndicate a {
+ margin-bottom: 1rem; }
+
+div#breadcrumbs {
+ padding-left: 0; }
+
+#sidebar {
+ padding-left: 3rem; }
+ @media only all and (max-width: 47.938rem) {
+ #sidebar {
+ padding-left: 0; } }
+ #sidebar .sidebar-content {
+ margin-bottom: 3rem; }
+ #sidebar .sidebar-content h4 {
+ margin-bottom: 1rem; }
+ #sidebar .sidebar-content p, #sidebar .sidebar-content ul {
+ margin-top: 1rem; }
+
+ul.pagination {
+ margin: 0 0 3rem;
+ text-align: left; }
+
+#error {
+ text-align: center;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 100%;
+ padding-bottom: 6rem; }
+ #error h1 {
+ font-size: 5rem; }
+ #error p {
+ margin: 1rem 0; }
+
+.modular.header-image #body > .showcase {
+ margin-top: -9.5rem;
+ padding-top: 9rem; }
+.modular.header-image #header {
+ background-color: rgba(255, 255, 255, 0);
+ box-shadow: none; }
+ .modular.header-image #header #logo h3 {
+ color: white; }
+ .modular.header-image #header #navbar a {
+ color: white; }
+.modular .showcase {
+ padding-top: 4rem;
+ padding-bottom: 4rem;
+ background-color: #666;
+ background-size: cover;
+ background-attachment: fixed;
+ background-position: center;
+ text-align: center;
+ color: white; }
+ .modular .showcase h1 {
+ font-size: 4rem;
+ margin-top: 0; }
+ @media only all and (min-width: 48rem) and (max-width: 59.938rem) {
+ .modular .showcase h1 {
+ font-size: 3rem; } }
+ @media only all and (max-width: 47.938rem) {
+ .modular .showcase h1 {
+ font-size: 2.5rem;
+ line-height: 1.2;
+ margin-bottom: 2.5rem; } }
+ .modular .showcase .button {
+ color: white;
+ padding: 0.7rem 2rem;
+ margin-top: 2rem;
+ background: rgba(255, 255, 255, 0);
+ border: 1px solid white;
+ border-radius: 3px;
+ box-shadow: none;
+ font-size: 1.3rem; }
+ .modular .showcase .button:hover {
+ background: rgba(255, 255, 255, 0.2); }
+
+.modular .features {
+ padding: 3rem 0;
+ text-align: center; }
+ .modular .features:after {
+ content: "";
+ display: table;
+ clear: both; }
+ .modular .features h2 {
+ margin: 0;
+ line-height: 100%; }
+ .modular .features p {
+ margin: 1rem 0;
+ font-size: 1.2rem; }
+ @media only all and (max-width: 47.938rem) {
+ .modular .features p {
+ font-size: 1rem; } }
+ .modular .features .feature-items {
+ margin-top: 2rem; }
+ .modular .features .feature {
+ display: block;
+ float: left;
+ width: 25%;
+ vertical-align: top;
+ margin-top: 2rem;
+ margin-bottom: 1rem; }
+ @media only all and (max-width: 47.938rem) {
+ .modular .features .feature {
+ width: 100%; } }
+ .modular .features .feature i.fa {
+ font-size: 2rem;
+ color: #1bb3e9; }
+ .modular .features .feature h4 {
+ margin: 0;
+ font-size: 1.1rem; }
+ .modular .features .feature p {
+ display: inline-block;
+ font-size: 1rem;
+ margin: 0.2rem 0 1rem; }
+ .modular .features.big {
+ text-align: center; }
+ .modular .features.big .feature {
+ width: 50%; }
+ .modular .features.big i.fa {
+ font-size: 3rem;
+ float: left; }
+ .modular .features.big .feature-content {
+ padding-right: 2rem; }
+ .modular .features.big .feature-content.push {
+ margin-left: 5rem; }
+ .modular .features.big .feature-content h4 {
+ font-size: 1.3rem;
+ text-align: left; }
+ .modular .features.big .feature-content p {
+ padding: 0;
+ text-align: left; }
+
+.callout {
+ background: #f6f6f6;
+ padding: 3rem 0.938rem; }
+ .callout .align-left {
+ float: left;
+ margin-right: 2rem; }
+ .callout .align-right {
+ float: right;
+ margin-left: 2rem; }
+ .callout img {
+ border-radius: 3px; }
+
+.modular .modular-row:last-child {
+ margin-bottom: 2rem; }
+
+/*# sourceMappingURL=template.css.map */
diff --git a/src/user/plugins/problems/html/problems.html b/src/user/plugins/problems/html/problems.html
new file mode 100644
index 0000000..241d6b7
--- /dev/null
+++ b/src/user/plugins/problems/html/problems.html
@@ -0,0 +1,28 @@
+
+
+
+
+ Grav Problems
+
+
+
+
+
+
+
+
+
+ Issues Found
+ Please Review and Resolve before continuing...
+
+
+ Reload Page
+
+
+
+
+
+
+
diff --git a/src/user/plugins/problems/problems.php b/src/user/plugins/problems/problems.php
new file mode 100644
index 0000000..94fc007
--- /dev/null
+++ b/src/user/plugins/problems/problems.php
@@ -0,0 +1,221 @@
+ ['onPluginsInitialized', 0],
+ 'onFatalException' => ['onFatalException', 0]
+ ];
+ }
+
+ public function onFatalException()
+ {
+ if ($this->isAdmin()) {
+ $this->active = false;
+ return;
+ }
+
+ // Run through potential issues
+ if ($this->problemChecker()) {
+ $this->renderProblems();
+ }
+ }
+
+ public function onPluginsInitialized()
+ {
+ if ($this->isAdmin()) {
+ $this->active = false;
+ return;
+ }
+
+ /** @var Cache $cache */
+ $cache = $this->grav['cache'];
+ $validated_prefix = 'problem-check-';
+
+ $this->check = CACHE_DIR . $validated_prefix . $cache->getKey();
+
+ if (!file_exists($this->check)) {
+ // If no issues remain, save a state file in the cache
+ if (!$this->problemChecker()) {
+ // delete any existing validated files
+ foreach (new \GlobIterator(CACHE_DIR . $validated_prefix . '*') as $fileInfo) {
+ @unlink($fileInfo->getPathname());
+ }
+
+ // create a file in the cache dir so it only runs on cache changes
+ touch($this->check);
+
+ } else {
+ $this->renderProblems();
+ }
+
+ }
+ }
+
+ protected function renderProblems()
+ {
+ $theme = 'antimatter';
+
+ /** @var Uri $uri */
+ $uri = $this->grav['uri'];
+ $baseUrlRelative = $uri->rootUrl(false);
+ $themeUrl = $baseUrlRelative . '/' . USER_PATH . basename(THEMES_DIR) . '/' . $theme;
+ $problemsUrl = $baseUrlRelative . '/user/plugins/problems';
+
+ $html = file_get_contents(__DIR__ . '/html/problems.html');
+
+ $problems = '';
+ foreach ($this->results as $key => $result) {
+ if ($key == 'files') {
+ foreach ($result as $filename => $file_result) {
+ foreach ($file_result as $status => $text) {
+ $problems .= $this->getListRow($status, '' . $filename . ' ' . $text);
+ }
+ }
+ } else {
+ foreach ($result as $status => $text) {
+ $problems .= $this->getListRow($status, $text);
+ }
+ }
+ }
+
+ $html = str_replace('%%BASE_URL%%', $baseUrlRelative, $html);
+ $html = str_replace('%%THEME_URL%%', $themeUrl, $html);
+ $html = str_replace('%%PROBLEMS_URL%%', $problemsUrl, $html);
+ $html = str_replace('%%PROBLEMS%%', $problems, $html);
+
+ echo $html;
+
+ exit();
+
+
+ }
+
+ protected function getListRow($status, $text)
+ {
+ if ($status == 'error') {
+ $icon = 'fa-times';
+ } elseif ($status == 'info') {
+ $icon = 'fa-info';
+ } else {
+ $icon = 'fa-check';
+ }
+ $output = "\n";
+ $output .= ''. $text . '
';
+ return $output;
+ }
+
+ protected function problemChecker()
+ {
+ $min_php_version = '5.4.0';
+ $problems_found = false;
+
+ $essential_files = [
+ 'cache' => true,
+ 'logs' => true,
+ 'images' => true,
+ 'assets' => true,
+ 'system' => false,
+ 'user/data' => true,
+ 'user/pages' => false,
+ 'user/config' => false,
+ 'user/plugins/error' => false,
+ 'user/plugins' => false,
+ 'user/themes' => false,
+ 'vendor' => false
+ ];
+
+ if (version_compare(GRAV_VERSION, '0.9.27', ">=")) {
+ $essential_files['backup'] = true;
+ $backup_folder = ROOT_DIR . 'backup';
+ // try to create backup folder if missing
+ if (!file_exists($backup_folder)) {
+ mkdir($backup_folder, 0770);
+ }
+ }
+
+ // Check PHP version
+ if (version_compare(phpversion(), $min_php_version, '<')) {
+ $problems_found = true;
+ $php_version_adjective = 'lower';
+ $php_version_status = 'error';
+
+ } else {
+ $php_version_adjective = 'greater';
+ $php_version_status = 'success';
+ }
+ $this->results['php'] = [$php_version_status => 'Your PHP version (' . phpversion() . ') is '. $php_version_adjective . ' than the minimum required: ' . $min_php_version . ' '];
+
+ // Check for GD library
+ if (defined('GD_VERSION') && function_exists('gd_info')) {
+ $gd_adjective = '';
+ $gd_status = 'success';
+ } else {
+ $problems_found = true;
+ $gd_adjective = 'not ';
+ $gd_status = 'error';
+ }
+ $this->results['gd'] = [$gd_status => 'PHP GD (Image Manipulation Library) is '. $gd_adjective . 'installed'];
+
+ // Check for PHP CURL library
+ if (function_exists('curl_version')) {
+ $curl_adjective = '';
+ $curl_status = 'success';
+ } else {
+ $problems_found = true;
+ $curl_adjective = 'not ';
+ $curl_status = 'error';
+ }
+ $this->results['curl'] = [$curl_status => 'PHP Curl (Data Transfer Library) is '. $curl_adjective . 'installed'];
+
+ // Check for essential files & perms
+ $file_problems = [];
+ foreach ($essential_files as $file => $check_writable) {
+ $file_path = ROOT_DIR . $file;
+ $is_dir = false;
+ if (!file_exists($file_path)) {
+ $problems_found = true;
+ $file_status = 'error';
+ $file_adjective = 'does not exist';
+
+ } else {
+ $file_status = 'success';
+ $file_adjective = 'exists';
+ $is_writeable = is_writable($file_path);
+ $is_dir = is_dir($file_path);
+
+ if ($check_writable) {
+ if (!$is_writeable) {
+ $file_status = 'error';
+ $problems_found = true;
+ $file_adjective .= ' but is not writeable ';
+ } else {
+ $file_adjective .= ' and is writeable ';
+ }
+ }
+ }
+
+ $file_problems[$file_path] = [$file_status => $file_adjective];
+
+ }
+ if (sizeof($file_problems) > 0) {
+ $this->results['files'] = $file_problems;
+ }
+
+ return $problems_found;
+ }
+}
diff --git a/src/user/plugins/problems/problems.yaml b/src/user/plugins/problems/problems.yaml
new file mode 100644
index 0000000..1ab22e7
--- /dev/null
+++ b/src/user/plugins/problems/problems.yaml
@@ -0,0 +1,2 @@
+enabled: true
+built_in_css: true
diff --git a/src/user/themes/.gitkeep b/src/user/themes/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/src/user/themes/antimatter/CHANGELOG.md b/src/user/themes/antimatter/CHANGELOG.md
new file mode 100644
index 0000000..0aa0b57
--- /dev/null
+++ b/src/user/themes/antimatter/CHANGELOG.md
@@ -0,0 +1,220 @@
+# v1.7.6
+## 10/07/2015
+
+1. [](#new)
+ * Added logic to include site.menu items in modular pages
+1. [](#improved)
+ * Removed unused `` tags
+
+# v1.7.5
+## 09/16/2015
+
+1. [](#improved)
+ * Use new form plugin templates
+
+# v1.7.3
+## 09/11/2015
+
+1. [](#new)
+ * Added SCSS configurable notes colors
+1. [](#improved)
+ * Various typos
+
+# v1.7.3
+## 08/31/2015
+
+1. [](#new)
+ * Added header image control and blueprints to admin plugin
+1. [](#improved)
+ * Use new template field for modular pages
+
+# v1.7.2
+## 08/24/2015
+
+1. [](#new)
+ * Added support for `login-status` partial in menu
+
+# v1.7.1
+## 08/11/2015
+
+1. [](#improved)
+ * Use new toggle for item blueprint
+
+# v1.7.0
+## 08/06/2015
+
+1. [](#new)
+ * Blueprints that work with new admin plugin!
+1. [](#bugfix)
+ * Favicon with full image URL
+
+# v1.6.1
+## 07/24/2015
+
+1. [](#bugfix)
+ * Fixed sidebar links when site at root
+
+# v1.6.0
+## 07/21/2015
+
+1. [](#new)
+ * Added support for `langswitcher` plugin
+1. [](#improved)
+ * Made sidebar links more robust
+
+# v1.5.0
+## 07/14/2015
+
+1. [](#new)
+ * Added canonical URL support
+1. [](#improved)
+ * More improvements for blueprints
+1. [](#bugfix)
+ * Fixes for multi-language support
+
+# v1.4.0
+## 05/09/2015
+
+1. [](#improved)
+ * Improved blueprints
+1. [](#bugfix)
+ * Fix for when page.summary is equal to page.content
+
+# v1.3.9
+## 04/13/2015
+
+1. [](#bugfix)
+ * Fix for image class in modular template 'text.html.twig`
+
+# v1.3.8
+## 04/07/2015
+
+1. [](#improved)
+ * Genericized theme_config variable for better inheritance
+
+# v1.3.7
+## 03/28/2015
+
+1. [](#bugfix)
+ * Rolled back changes that resulted in broken header
+
+# v1.3.6
+## 03/24/2015
+
+1. [](#bugfix)
+ * Fix for compressed text in `.pure-g` divs
+
+# v1.3.5
+## 03/24/2015
+
+1. [](#improved)
+ * Keep html,body on height:100%; use body for scroll event
+ * Use Footer colors from vars rather than hard-coded
+1. [](#bugfix)
+ * Load pure grids at all times for better non-flexbox support
+
+# v1.3.4
+## 03/01/2015
+
+1. [](#improved)
+ * Use new Grav builtin 'jQuery' support
+
+# v1.3.3
+## 02/19/2015
+
+1. [](#improved)
+ * Implemented new `param_sep` variable from Grav 0.9.18
+1. [](#bugfix)
+ * Fix for table column widths
+ * Force snipcart slider to look in all pages
+
+# v1.3.2
+## 02/05/2015
+
+1. [](#improved)
+ * Minor typo in assets
+
+# v1.3.1
+## 01/23/2015
+
+1. [](#bugfix)
+ * Added page title encoding
+ * Stop modular pages showing up in dropdown menus
+ * Fixed typo in streams setup
+
+# v1.3.0
+## 01/09/2015
+
+1. [](#improved)
+ * NOTE: BREAKING CHANGE - Fixed references to plugins in `partials/` folder
+ * Updated README.md
+
+# v1.2.7
+## 12/29/2014
+
+1. [](#bugfix)
+ * Removed `Fixed` header image to resolve issues with mobile browsers
+
+# v1.2.6
+## 12/21/2014
+
+1. [](#new)
+ * Added support for list of custom menu items in `site.yaml`
+ * Updated `README.md` with some instructions on how to use some Antimatter features
+1. [](#improved)
+ * Removed `cache.html.twig` file that was used only for testing
+ * Removed unused `color` option in `antimatter.yaml`
+
+# v1.2.5
+## 12/15/2014
+
+1. [](#bugfix)
+ * Fix for Firefox 34 Flex/Responsiveness issues
+
+# v1.2.4
+## 12/12/2014
+
+1. [](#new)
+ * Added demo link to blueprints
+1. [](#improved)
+ * Inverted Previous/Next buttons on blog item template
+
+# v1.2.3
+## 12/05/2014
+
+1. [](#improved)
+ * Simplified Previous/Next buttons to use Page methods
+
+# v1.2.2
+## 12/04/2014
+
+1. [](#new)
+ * Added Previous/Next buttons with Collection methods
+ * Added Related posts in blog sidebar
+1. [](#bugfix)
+ * Fix for DaringFireball style link
+
+# v1.2.1
+## 11/30/2014
+
+1. [](#improved)
+ * Renamed core theme JS file
+ * Removed featherlight from Antimatter
+1. [](#bugfix)
+ * Fixed response code in error template
+
+# v1.2.0
+## 11/28/2014
+
+1. [](#new)
+ * Added SimpleSearch display in blog sidebar
+ * Added reference to `custom.css` file in core
+1. [](#improved)
+ * Added plugins checks for improved flexibility if plugins are not installed
+
+
+# v1.1.11
+## 11/21/2014
+
+1. [](#new)
+ * ChangeLog started...
diff --git a/src/user/themes/antimatter/LICENSE b/src/user/themes/antimatter/LICENSE
new file mode 100644
index 0000000..484793a
--- /dev/null
+++ b/src/user/themes/antimatter/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Grav
+
+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/src/user/themes/antimatter/README.md b/src/user/themes/antimatter/README.md
new file mode 100644
index 0000000..1797c1e
--- /dev/null
+++ b/src/user/themes/antimatter/README.md
@@ -0,0 +1,136 @@
+# Antimatter
+
+
+
+Antimatter is the default [Grav](http://getgrav.org) theme. Simple, fast and modern.
+
+# Installation
+
+Installing the Antimatter theme can be done in one of two ways. Our GPM (Grav Package Manager) installation method enables you to quickly and easily install the theme with a simple terminal command, while the manual method enables you to do so via a zip file.
+
+The theme by itself is useful, but you may have an easier time getting up and running by installing a skeleton. The Antimatter theme can be found in both the [One-page](https://github.com/getgrav/grav-skeleton-onepage-site) and [Blog Site](https://github.com/getgrav/grav-skeleton-blog-site) which are self-contained repositories for a complete sites which include: sample content, configuration, theme, and plugins.
+
+## GPM Installation (Preferred)
+
+The simplest way to install this theme is via the [Grav Package Manager (GPM)](http://learn.getgrav.org/advanced/grav-gpm) through your system's Terminal (also called the command line). From the root of your Grav install type:
+
+ bin/gpm install antimatter
+
+This will install the Antimatter theme into your `/user/themes` directory within Grav. Its files can be found under `/your/site/grav/user/themes/antimatter`.
+
+## Manual Installation
+
+To install this theme, just download the zip version of this repository and unzip it under `/your/site/grav/user/themes`. Then, rename the folder to `antimatter`. You can find these files either on [GitHub](https://github.com/getgrav/grav-theme-antimatter) or via [GetGrav.org](http://getgrav.org/downloads/themes).
+
+You should now have all the theme files under
+
+ /your/site/grav/user/themes/antimatter
+
+>> NOTE: This theme is a modular component for Grav which requires the [Grav](http://github.com/getgrav/grav), [Error](https://github.com/getgrav/grav-theme-error) and [Problems](https://github.com/getgrav/grav-plugin-problems) plugins.
+
+# Updating
+
+As development for the Antimatter theme continues, new versions may become available that add additional features and functionality, improve compatibility with newer Grav releases, and generally provide a better user experience. Updating Antimatter is easy, and can be done through Grav's GPM system, as well as manually.
+
+## GPM Update (Preferred)
+
+The simplest way to update this theme is via the [Grav Package Manager (GPM)](http://learn.getgrav.org/advanced/grav-gpm). You can do this with this by navigating to the root directory of your Grav install using your system's Terminal (also called command line) and typing the following:
+
+ bin/gpm update antimatter
+
+This command will check your Grav install to see if your Antimatter theme is due for an update. If a newer release is found, you will be asked whether or not you wish to update. To continue, type `y` and hit enter. The theme will automatically update and clear Grav's cache.
+
+## Manual Update
+
+Manually updating Antimatter is pretty simple. Here is what you will need to do to get this done:
+
+* Delete the `your/site/user/themes/antimatter` directory.
+* Download the new version of the Antimatter theme from either [GitHub](https://github.com/getgrav/grav-plugin-antimatter) or [GetGrav.org](http://getgrav.org/downloads/themes#extras).
+* Unzip the zip file in `your/site/user/themes` and rename the resulting folder to `antimatter`.
+* Clear the Grav cache. The simplest way to do this is by going to the root Grav directory in terminal and typing `bin/grav clear-cache`.
+
+> Note: Any changes you have made to any of the files listed under this directory will also be removed and replaced by the new set. Any files located elsewhere (for example a YAML settings file placed in `user/config/themes`) will remain intact.
+
+## Features
+
+* Lightweight and minimal for optimal performance
+* Fully responsive with off-page mobile navigation
+* SCSS based CSS source files for easy customization
+* Built-in support for on-page navigation
+* Multiple page template types
+* Fontawesome icon support
+
+### Supported Page Templates
+
+* Default view template
+* Blog view template
+* Error view template
+* Blog item view template
+* Modular view templates:
+ * Features Modular view template
+ * Showcase Modular view template
+ * Text Modular view template
+* SnipCart view template
+
+### Menu Features
+
+##### Dropdown Menu
+
+You can enable **dropdown menu** support by enabling it in the `antimatter.yaml` configuration file. As per usual, copy this file to your `user/config/themes/` folder (create if required) and edit there.
+
+```
+dropdown:
+ enabled: true
+```
+
+This will ensure that sub-pages show up as sub-menus in the navigation.
+
+##### Menu Text & Icons
+
+Each page shows up in the menu using the title by default, however you can set what displays in the menu directly by setting an explicit `menu:` option in the page header:
+
+```
+menu: My Menu
+```
+
+You can also provide an icon to show up in front of the menu item by providing an `icon:` option. You need to use name of the FontAwesome icon without the `fa-` prefix. Check out the full [list of current FontAwesome 4.2 icons](http://fortawesome.github.io/Font-Awesome/icons/):
+
+```
+icon: bar-chart-o
+```
+
+#### Custom Menu Items
+
+By default, Grav generates the menu from the page structure. However, there are times when you may want to add custom menu items to the end of the menu. This is now supported in Antimatter by creating a menu list in your `site.yaml` file. An example of this is as follows:
+
+```
+menu:
+ - text: Source
+ url: https://github.com/getgrav/grav
+ - icon: twitter
+ url: http://twitter.com/getgrav
+```
+
+The `url:` option is required, but you can provide **either** or **both** `text:` and/or `icon:`
+
+### Blog Features
+
+##### Daring Fireball Link Pages
+
+Antimatter supports the ability for a page to have a `link:` header option. This will then in turn create a **link page** where the title of the page will actually be linked to the link provided and a prefexid double angle `>>` will link to the page itself. Simply provide the link in the page header:
+
+```
+link: http://getgrav.org/blog
+```
+
+# Setup
+
+If you want to set Antimatter as the default theme, you can do so by following these steps:
+
+* Navigate to `/your/site/grav/user/config`.
+* Open the **system.yaml** file.
+* Change the `theme:` setting to `theme: antimatter`.
+* Save your changes.
+* Clear the Grav cache. The simplest way to do this is by going to the root Grav directory in Terminal and typing `bin/grav clear-cache`.
+
+Once this is done, you should be able to see the new theme on the frontend. Keep in mind any customizations made to the previous theme will not be reflected as all of the theme and templating information is now being pulled from the **antimatter** folder.
diff --git a/src/user/themes/antimatter/antimatter.php b/src/user/themes/antimatter/antimatter.php
new file mode 100644
index 0000000..f0bd1b8
--- /dev/null
+++ b/src/user/themes/antimatter/antimatter.php
@@ -0,0 +1,9 @@
+=5.4.0",
+ "composer/installers": "~1.0"
+ },
+ "extra": {
+ "installer-name": "antimatter",
+ "installer-paths": {
+ "user/themes/{$name}/": ["getgrav/grav-theme-antimatter"]
+ }
+ }
+}
diff --git a/src/user/themes/antimatter/css-compiled/nucleus.css b/src/user/themes/antimatter/css-compiled/nucleus.css
new file mode 100644
index 0000000..3643d5d
--- /dev/null
+++ b/src/user/themes/antimatter/css-compiled/nucleus.css
@@ -0,0 +1,629 @@
+*, *::before, *::after {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box; }
+
+@-webkit-viewport {
+ width: device-width; }
+@-moz-viewport {
+ width: device-width; }
+@-ms-viewport {
+ width: device-width; }
+@-o-viewport {
+ width: device-width; }
+@viewport {
+ width: device-width; }
+html {
+ font-size: 100%;
+ -ms-text-size-adjust: 100%;
+ -webkit-text-size-adjust: 100%; }
+
+body {
+ margin: 0; }
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+nav,
+section,
+summary {
+ display: block; }
+
+audio,
+canvas,
+progress,
+video {
+ display: inline-block;
+ vertical-align: baseline; }
+
+audio:not([controls]) {
+ display: none;
+ height: 0; }
+
+[hidden],
+template {
+ display: none; }
+
+a {
+ background: transparent;
+ text-decoration: none; }
+
+a:active,
+a:hover {
+ outline: 0; }
+
+abbr[title] {
+ border-bottom: 1px dotted; }
+
+b,
+strong {
+ font-weight: bold; }
+
+dfn {
+ font-style: italic; }
+
+mark {
+ background: #ff0;
+ color: #000; }
+
+sub,
+sup {
+ font-size: 0.75rem;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline; }
+
+sup {
+ top: -0.5em; }
+
+sub {
+ bottom: -0.25em; }
+
+img {
+ border: 0;
+ max-width: 100%; }
+
+svg:not(:root) {
+ overflow: hidden; }
+
+figure {
+ margin: 1em 40px; }
+
+hr {
+ height: 0; }
+
+pre {
+ overflow: auto; }
+
+code,
+kbd,
+pre,
+samp {
+ font-size: 1rem; }
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ color: inherit;
+ font: inherit;
+ margin: 0; }
+
+button {
+ overflow: visible; }
+
+button,
+select {
+ text-transform: none; }
+
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button;
+ cursor: pointer; }
+
+button[disabled],
+html input[disabled] {
+ cursor: default; }
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0; }
+
+input {
+ line-height: normal; }
+
+input[type="checkbox"],
+input[type="radio"] {
+ padding: 0; }
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ height: auto; }
+
+input[type="search"] {
+ -webkit-appearance: textfield; }
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none; }
+
+legend {
+ border: 0;
+ padding: 0; }
+
+textarea {
+ overflow: auto; }
+
+optgroup {
+ font-weight: bold; }
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ table-layout: fixed;
+ width: 100%; }
+
+tr, td, th {
+ vertical-align: middle; }
+
+th, td {
+ padding: 0.425rem 0; }
+
+th {
+ text-align: left; }
+
+.container {
+ width: 75em;
+ margin: 0 auto;
+ padding: 0; }
+ @media only all and (min-width: 60em) and (max-width: 74.938em) {
+ .container {
+ width: 60em; } }
+ @media only all and (min-width: 48em) and (max-width: 59.938em) {
+ .container {
+ width: 48em; } }
+ @media only all and (min-width: 30.063em) and (max-width: 47.938em) {
+ .container {
+ width: 30em; } }
+ @media only all and (max-width: 30em) {
+ .container {
+ width: 100%; } }
+
+.grid {
+ display: -webkit-box;
+ display: -moz-box;
+ display: box;
+ display: -webkit-flex;
+ display: -moz-flex;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-flex-flow: row;
+ -moz-flex-flow: row;
+ flex-flow: row;
+ list-style: none;
+ margin: 0;
+ padding: 0; }
+ @media only all and (max-width: 47.938em) {
+ .grid {
+ -webkit-flex-flow: row wrap;
+ -moz-flex-flow: row wrap;
+ flex-flow: row wrap; } }
+
+.block {
+ -webkit-box-flex: 1;
+ -moz-box-flex: 1;
+ box-flex: 1;
+ -webkit-flex: 1;
+ -moz-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+ min-width: 0;
+ min-height: 0; }
+ @media only all and (max-width: 47.938em) {
+ .block {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 100%;
+ -moz-flex: 0 100%;
+ -ms-flex: 0 100%;
+ flex: 0 100%; } }
+
+.content {
+ margin: 0.625rem;
+ padding: 0.938rem; }
+
+@media only all and (max-width: 47.938em) {
+ body [class*="size-"] {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 100%;
+ -moz-flex: 0 100%;
+ -ms-flex: 0 100%;
+ flex: 0 100%; } }
+
+.size-1-2 {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 50%;
+ -moz-flex: 0 50%;
+ -ms-flex: 0 50%;
+ flex: 0 50%; }
+
+.size-1-3 {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 33.33333%;
+ -moz-flex: 0 33.33333%;
+ -ms-flex: 0 33.33333%;
+ flex: 0 33.33333%; }
+
+.size-1-4 {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 25%;
+ -moz-flex: 0 25%;
+ -ms-flex: 0 25%;
+ flex: 0 25%; }
+
+.size-1-5 {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 20%;
+ -moz-flex: 0 20%;
+ -ms-flex: 0 20%;
+ flex: 0 20%; }
+
+.size-1-6 {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 16.66667%;
+ -moz-flex: 0 16.66667%;
+ -ms-flex: 0 16.66667%;
+ flex: 0 16.66667%; }
+
+.size-1-7 {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 14.28571%;
+ -moz-flex: 0 14.28571%;
+ -ms-flex: 0 14.28571%;
+ flex: 0 14.28571%; }
+
+.size-1-8 {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 12.5%;
+ -moz-flex: 0 12.5%;
+ -ms-flex: 0 12.5%;
+ flex: 0 12.5%; }
+
+.size-1-9 {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 11.11111%;
+ -moz-flex: 0 11.11111%;
+ -ms-flex: 0 11.11111%;
+ flex: 0 11.11111%; }
+
+.size-1-10 {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 10%;
+ -moz-flex: 0 10%;
+ -ms-flex: 0 10%;
+ flex: 0 10%; }
+
+.size-1-11 {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 9.09091%;
+ -moz-flex: 0 9.09091%;
+ -ms-flex: 0 9.09091%;
+ flex: 0 9.09091%; }
+
+.size-1-12 {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 8.33333%;
+ -moz-flex: 0 8.33333%;
+ -ms-flex: 0 8.33333%;
+ flex: 0 8.33333%; }
+
+@media only all and (min-width: 48em) and (max-width: 59.938em) {
+ .size-tablet-1-2 {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 50%;
+ -moz-flex: 0 50%;
+ -ms-flex: 0 50%;
+ flex: 0 50%; }
+
+ .size-tablet-1-3 {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 33.33333%;
+ -moz-flex: 0 33.33333%;
+ -ms-flex: 0 33.33333%;
+ flex: 0 33.33333%; }
+
+ .size-tablet-1-4 {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 25%;
+ -moz-flex: 0 25%;
+ -ms-flex: 0 25%;
+ flex: 0 25%; }
+
+ .size-tablet-1-5 {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 20%;
+ -moz-flex: 0 20%;
+ -ms-flex: 0 20%;
+ flex: 0 20%; }
+
+ .size-tablet-1-6 {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 16.66667%;
+ -moz-flex: 0 16.66667%;
+ -ms-flex: 0 16.66667%;
+ flex: 0 16.66667%; }
+
+ .size-tablet-1-7 {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 14.28571%;
+ -moz-flex: 0 14.28571%;
+ -ms-flex: 0 14.28571%;
+ flex: 0 14.28571%; }
+
+ .size-tablet-1-8 {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 12.5%;
+ -moz-flex: 0 12.5%;
+ -ms-flex: 0 12.5%;
+ flex: 0 12.5%; }
+
+ .size-tablet-1-9 {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 11.11111%;
+ -moz-flex: 0 11.11111%;
+ -ms-flex: 0 11.11111%;
+ flex: 0 11.11111%; }
+
+ .size-tablet-1-10 {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 10%;
+ -moz-flex: 0 10%;
+ -ms-flex: 0 10%;
+ flex: 0 10%; }
+
+ .size-tablet-1-11 {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 9.09091%;
+ -moz-flex: 0 9.09091%;
+ -ms-flex: 0 9.09091%;
+ flex: 0 9.09091%; }
+
+ .size-tablet-1-12 {
+ -webkit-box-flex: 0;
+ -moz-box-flex: 0;
+ box-flex: 0;
+ -webkit-flex: 0 8.33333%;
+ -moz-flex: 0 8.33333%;
+ -ms-flex: 0 8.33333%;
+ flex: 0 8.33333%; } }
+@media only all and (max-width: 47.938em) {
+ @supports not (flex-wrap: wrap) {
+ .grid {
+ display: block;
+ -webkit-box-lines: inherit;
+ -moz-box-lines: inherit;
+ box-lines: inherit;
+ -webkit-flex-wrap: inherit;
+ -moz-flex-wrap: inherit;
+ -ms-flex-wrap: inherit;
+ flex-wrap: inherit; }
+
+ .block {
+ display: block;
+ -webkit-box-flex: inherit;
+ -moz-box-flex: inherit;
+ box-flex: inherit;
+ -webkit-flex: inherit;
+ -moz-flex: inherit;
+ -ms-flex: inherit;
+ flex: inherit; } } }
+.first-block {
+ -webkit-box-ordinal-group: 0;
+ -webkit-order: -1;
+ -ms-flex-order: -1;
+ order: -1; }
+
+.last-block {
+ -webkit-box-ordinal-group: 2;
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1; }
+
+.fixed-blocks {
+ -webkit-flex-flow: row wrap;
+ -moz-flex-flow: row wrap;
+ flex-flow: row wrap; }
+ .fixed-blocks .block {
+ -webkit-box-flex: inherit;
+ -moz-box-flex: inherit;
+ box-flex: inherit;
+ -webkit-flex: inherit;
+ -moz-flex: inherit;
+ -ms-flex: inherit;
+ flex: inherit;
+ width: 25%; }
+ @media only all and (min-width: 60em) and (max-width: 74.938em) {
+ .fixed-blocks .block {
+ width: 33.33333%; } }
+ @media only all and (min-width: 48em) and (max-width: 59.938em) {
+ .fixed-blocks .block {
+ width: 50%; } }
+ @media only all and (max-width: 47.938em) {
+ .fixed-blocks .block {
+ width: 100%; } }
+
+@supports not (flex-wrap: wrap) {
+ .fixed-blocks {
+ display: block;
+ -webkit-flex-flow: inherit;
+ -moz-flex-flow: inherit;
+ flex-flow: inherit; } }
+body {
+ font-size: 1rem;
+ line-height: 1.7; }
+
+h1, h2, h3, h4, h5, h6 {
+ margin: 0.85rem 0 1.7rem 0;
+ text-rendering: optimizeLegibility; }
+
+h1 {
+ font-size: 3.2rem; }
+
+h2 {
+ font-size: 2.5rem; }
+
+h3 {
+ font-size: 2.1rem; }
+
+h4 {
+ font-size: 1.75rem; }
+
+h5 {
+ font-size: 1.35rem; }
+
+h6 {
+ font-size: 0.85rem; }
+
+p {
+ margin: 1.7rem 0; }
+
+ul, ol {
+ margin-top: 1.7rem;
+ margin-bottom: 1.7rem; }
+ ul ul, ul ol, ol ul, ol ol {
+ margin-top: 0;
+ margin-bottom: 0; }
+
+blockquote {
+ margin: 1.7rem 0;
+ padding-left: 0.85rem; }
+
+cite {
+ display: block;
+ font-size: 0.875rem; }
+ cite:before {
+ content: "\2014 \0020"; }
+
+pre {
+ margin: 1.7rem 0;
+ padding: 0.938rem; }
+
+code {
+ vertical-align: bottom; }
+
+small {
+ font-size: 0.875rem; }
+
+hr {
+ border-left: none;
+ border-right: none;
+ border-top: none;
+ margin: 1.7rem 0; }
+
+fieldset {
+ border: 0;
+ padding: 0.938rem;
+ margin: 0 0 1.7rem 0; }
+
+input,
+label,
+select {
+ display: block; }
+
+label {
+ margin-bottom: 0.425rem; }
+ label.required:after {
+ content: "*"; }
+ label abbr {
+ display: none; }
+
+textarea, input[type="email"], input[type="number"], input[type="password"], input[type="search"], input[type="tel"], input[type="text"], input[type="url"], input[type="color"], input[type="date"], input[type="datetime"], input[type="datetime-local"], input[type="month"], input[type="time"], input[type="week"], select[multiple=multiple] {
+ -webkit-transition: border-color;
+ -moz-transition: border-color;
+ transition: border-color;
+ border-radius: 0.1875rem;
+ margin-bottom: 0.85rem;
+ padding: 0.425rem 0.425rem;
+ width: 100%; }
+ textarea:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="password"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="text"]:focus, input[type="url"]:focus, input[type="color"]:focus, input[type="date"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, select[multiple=multiple]:focus {
+ outline: none; }
+
+textarea {
+ resize: vertical; }
+
+input[type="checkbox"], input[type="radio"] {
+ display: inline;
+ margin-right: 0.425rem; }
+
+input[type="file"] {
+ width: 100%; }
+
+select {
+ width: auto;
+ max-width: 100%;
+ margin-bottom: 1.7rem; }
+
+button,
+input[type="submit"] {
+ cursor: pointer;
+ user-select: none;
+ vertical-align: middle;
+ white-space: nowrap;
+ border: inherit; }
+
+/*# sourceMappingURL=nucleus.css.map */
diff --git a/src/user/themes/antimatter/css-compiled/nucleus.css.map b/src/user/themes/antimatter/css-compiled/nucleus.css.map
new file mode 100644
index 0000000..c68a93b
--- /dev/null
+++ b/src/user/themes/antimatter/css-compiled/nucleus.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": "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",
+"sources": ["../scss/nucleus/_core.scss","../scss/vendor/bourbon/addons/_prefixer.scss","../scss/configuration/nucleus/_typography.scss","../scss/nucleus/_flex.scss","../scss/configuration/nucleus/_breakpoints.scss","../scss/nucleus/mixins/_breakpoints.scss","../scss/vendor/bourbon/css3/_flex-box.scss","../scss/configuration/nucleus/_layout.scss","../scss/nucleus/_typography.scss","../scss/nucleus/_forms.scss","../scss/configuration/nucleus/_core.scss"],
+"names": [],
+"file": "nucleus.css"
+}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/css-compiled/particles.css b/src/user/themes/antimatter/css-compiled/particles.css
new file mode 100644
index 0000000..c86d1e1
--- /dev/null
+++ b/src/user/themes/antimatter/css-compiled/particles.css
@@ -0,0 +1,98 @@
+.text-left {
+ text-align: left !important; }
+
+.text-right {
+ text-align: right !important; }
+
+.text-center {
+ text-align: center !important; }
+
+.text-justify {
+ text-align: justify !important; }
+
+@media all and (min-width: 75em) {
+ .large-desktop-text-left {
+ text-align: left !important; }
+
+ .large-desktop-text-right {
+ text-align: right !important; }
+
+ .large-desktop-text-center {
+ text-align: center !important; }
+
+ .large-desktop-text-justify {
+ text-align: justify !important; } }
+@media all and (min-width: 60em) and (max-width: 74.938em) {
+ .desktop-text-left {
+ text-align: left !important; }
+
+ .desktop-text-right {
+ text-align: right !important; }
+
+ .desktop-text-center {
+ text-align: center !important; }
+
+ .desktop-text-justify {
+ text-align: justify !important; } }
+@media all and (min-width: 48em) and (max-width: 59.938em) {
+ .tablet-text-left {
+ text-align: left !important; }
+
+ .tablet-text-right {
+ text-align: right !important; }
+
+ .tablet-text-center {
+ text-align: center !important; }
+
+ .tablet-text-justify {
+ text-align: justify !important; } }
+@media all and (min-width: 30.063em) and (max-width: 47.938em) {
+ .large-mobile-text-left {
+ text-align: left !important; }
+
+ .large-mobile-text-right {
+ text-align: right !important; }
+
+ .large-mobile-text-center {
+ text-align: center !important; }
+
+ .large-mobile-text-justify {
+ text-align: justify !important; } }
+@media all and (max-width: 30em) {
+ .small-mobile-text-left {
+ text-align: left !important; }
+
+ .small-mobile-text-right {
+ text-align: right !important; }
+
+ .small-mobile-text-center {
+ text-align: center !important; }
+
+ .small-mobile-text-justify {
+ text-align: justify !important; } }
+@media all and (min-width: 48em) {
+ .no-mobile-text-left {
+ text-align: left !important; }
+
+ .no-mobile-text-right {
+ text-align: right !important; }
+
+ .no-mobile-text-center {
+ text-align: center !important; }
+
+ .no-mobile-text-justify {
+ text-align: justify !important; } }
+@media all and (max-width: 47.938em) {
+ .mobile-only-text-left {
+ text-align: left !important; }
+
+ .mobile-only-text-right {
+ text-align: right !important; }
+
+ .mobile-only-text-center {
+ text-align: center !important; }
+
+ .mobile-only-text-justify {
+ text-align: justify !important; } }
+
+/*# sourceMappingURL=particles.css.map */
diff --git a/src/user/themes/antimatter/css-compiled/particles.css.map b/src/user/themes/antimatter/css-compiled/particles.css.map
new file mode 100644
index 0000000..b04cb80
--- /dev/null
+++ b/src/user/themes/antimatter/css-compiled/particles.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": "AAsBC,UAAW;EACV,UAAU,EAAE,eAAe;;AAE5B,WAAY;EACX,UAAU,EAAE,gBAAgB;;AAE7B,YAAa;EACZ,UAAU,EAAE,iBAAiB;;AAE9B,aAAc;EACb,UAAU,EAAE,kBAAkB;;AAI9B,gCAA8C;EAC7C,wBAA4C;IAAE,UAAU,EAAE,eAAe;;EACzE,yBAA+C;IAAE,UAAU,EAAE,gBAAgB;;EAC7E,0BAA+C;IAAE,UAAU,EAAE,iBAAiB;;EAC9E,2BAA+C;IAAE,UAAU,EAAE,kBAAkB;AAJhF,0DAA8C;EAC7C,kBAA4C;IAAE,UAAU,EAAE,eAAe;;EACzE,mBAA+C;IAAE,UAAU,EAAE,gBAAgB;;EAC7E,oBAA+C;IAAE,UAAU,EAAE,iBAAiB;;EAC9E,qBAA+C;IAAE,UAAU,EAAE,kBAAkB;AAJhF,0DAA8C;EAC7C,iBAA4C;IAAE,UAAU,EAAE,eAAe;;EACzE,kBAA+C;IAAE,UAAU,EAAE,gBAAgB;;EAC7E,mBAA+C;IAAE,UAAU,EAAE,iBAAiB;;EAC9E,oBAA+C;IAAE,UAAU,EAAE,kBAAkB;AAJhF,8DAA8C;EAC7C,uBAA4C;IAAE,UAAU,EAAE,eAAe;;EACzE,wBAA+C;IAAE,UAAU,EAAE,gBAAgB;;EAC7E,yBAA+C;IAAE,UAAU,EAAE,iBAAiB;;EAC9E,0BAA+C;IAAE,UAAU,EAAE,kBAAkB;AAJhF,gCAA8C;EAC7C,uBAA4C;IAAE,UAAU,EAAE,eAAe;;EACzE,wBAA+C;IAAE,UAAU,EAAE,gBAAgB;;EAC7E,yBAA+C;IAAE,UAAU,EAAE,iBAAiB;;EAC9E,0BAA+C;IAAE,UAAU,EAAE,kBAAkB;AAJhF,gCAA8C;EAC7C,oBAA4C;IAAE,UAAU,EAAE,eAAe;;EACzE,qBAA+C;IAAE,UAAU,EAAE,gBAAgB;;EAC7E,sBAA+C;IAAE,UAAU,EAAE,iBAAiB;;EAC9E,uBAA+C;IAAE,UAAU,EAAE,kBAAkB;AAJhF,oCAA8C;EAC7C,sBAA4C;IAAE,UAAU,EAAE,eAAe;;EACzE,uBAA+C;IAAE,UAAU,EAAE,gBAAgB;;EAC7E,wBAA+C;IAAE,UAAU,EAAE,iBAAiB;;EAC9E,yBAA+C;IAAE,UAAU,EAAE,kBAAkB",
+"sources": ["../scss/nucleus/particles/_align-text.scss"],
+"names": [],
+"file": "particles.css"
+}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/css-compiled/template.css b/src/user/themes/antimatter/css-compiled/template.css
new file mode 100644
index 0000000..57ef5bb
--- /dev/null
+++ b/src/user/themes/antimatter/css-compiled/template.css
@@ -0,0 +1,868 @@
+@import url(//fonts.googleapis.com/css?family=Montserrat:400|Raleway:300,400,600|Inconsolata);
+#header #logo h3, #header #navbar ul.navigation, #header #navbar .panel-activation, #footer p {
+ position: relative;
+ top: 50%;
+ -webkit-transform: translateY(-50%);
+ -moz-transform: translateY(-50%);
+ -o-transform: translateY(-50%);
+ -ms-transform: translateY(-50%);
+ transform: translateY(-50%); }
+
+.button, .button-secondary {
+ display: inline-block;
+ padding: 7px 20px; }
+ .button-small.button, .button-small.button-secondary {
+ padding: 3px 10px;
+ font-size: 0.9rem; }
+
+html, body {
+ height: 100%; }
+
+body {
+ background: #fff;
+ color: #444;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale; }
+
+a {
+ color: #1BB3E9; }
+ a:hover {
+ color: #0e6e90; }
+
+b, strong, label, th {
+ font-weight: 600; }
+
+#container {
+ min-height: 100%;
+ position: relative; }
+
+.fullwidth #body {
+ padding-left: 0;
+ padding-right: 0; }
+
+#body {
+ background: #fff;
+ padding-top: 8rem;
+ padding-bottom: 11rem; }
+
+.left {
+ float: left; }
+
+.right {
+ float: right; }
+
+.default-animation, #body, #header, #header #logo h3, .modular .showcase .button {
+ -webkit-transition: all 0.5s ease;
+ -moz-transition: all 0.5s ease;
+ transition: all 0.5s ease; }
+
+.padding-horiz, .fullwidth #header, .fullwidth #breadcrumbs, .fullwidth .blog-header, .fullwidth .blog-content-item, .fullwidth .content-wrapper, .fullwidth ul.pagination, .fullwidth #body > .modular-row, #body, #header, #footer {
+ padding-left: 7rem;
+ padding-right: 7rem; }
+ @media only all and (max-width: 59.938em) {
+ .padding-horiz, .fullwidth #header, .fullwidth #breadcrumbs, .fullwidth .blog-header, .fullwidth .blog-content-item, .fullwidth .content-wrapper, .fullwidth ul.pagination, .fullwidth #body > .modular-row, #body, #header, #footer {
+ padding-left: 4rem;
+ padding-right: 4rem; } }
+ @media only all and (max-width: 47.938em) {
+ .padding-horiz, .fullwidth #header, .fullwidth #breadcrumbs, .fullwidth .blog-header, .fullwidth .blog-content-item, .fullwidth .content-wrapper, .fullwidth ul.pagination, .fullwidth #body > .modular-row, #body, #header, #footer {
+ padding-left: 1rem;
+ padding-right: 1rem; } }
+
+.padding-vert {
+ padding-top: 3rem;
+ padding-bottom: 3rem; }
+
+#header {
+ position: fixed;
+ z-index: 10;
+ width: 100%;
+ height: 5rem;
+ background-color: rgba(255, 255, 255, 0.9);
+ box-shadow: 0 0.05rem 1rem rgba(0, 0, 0, 0.15); }
+ #header.scrolled {
+ height: 3rem;
+ background-color: rgba(255, 255, 255, 0.9) !important;
+ box-shadow: 0 0.05rem 1rem rgba(0, 0, 0, 0.15) !important; }
+ #header.scrolled #logo h3 {
+ color: #444 !important;
+ font-size: 1.6rem !important; }
+ #header.scrolled #logo a, #header.scrolled #navbar span {
+ color: #444 !important; }
+ #header.scrolled #navbar a {
+ color: #1BB3E9 !important; }
+ #header.scrolled #navbar a:hover {
+ color: #0e6e90 !important; }
+ #header.scrolled #navbar a:before, #header.scrolled #navbar a:after {
+ background-color: #1BB3E9 !important; }
+ #header > .grid, #header #logo, #header #navbar {
+ height: 100%; }
+ #header #logo {
+ float: left; }
+ #header #logo h3 {
+ font-size: 2rem;
+ line-height: 2rem;
+ margin: 0;
+ text-transform: uppercase; }
+ #header #logo h3 a {
+ color: #444; }
+ #header #navbar {
+ font-size: 0.9rem; }
+ #header #navbar ul {
+ margin: 0;
+ padding: 0;
+ list-style: none; }
+ #header #navbar ul.navigation {
+ display: inline-block;
+ float: right; }
+ #header #navbar ul.navigation li {
+ float: left;
+ position: relative; }
+ #header #navbar ul.navigation li a {
+ font-family: "Montserrat", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif;
+ display: inline-block;
+ padding: 0.3rem 0.8rem; }
+ #header #navbar ul.navigation li a:before, #header #navbar ul.navigation li a:after {
+ content: "";
+ position: absolute;
+ width: 100%;
+ height: 1px;
+ bottom: 0;
+ left: 0;
+ background-color: #1BB3E9;
+ visibility: hidden;
+ -webkit-transform: scaleX(0);
+ -moz-transform: scaleX(0);
+ -ms-transform: scaleX(0);
+ -o-transform: scaleX(0);
+ transform: scaleX(0);
+ -webkit-transition: all 0.2s ease;
+ -moz-transition: all 0.2s ease;
+ transition: all 0.2s ease; }
+ #header #navbar ul.navigation li a:hover:before {
+ visibility: visible;
+ -webkit-transform: scaleX(0.75);
+ -moz-transform: scaleX(0.75);
+ -ms-transform: scaleX(0.75);
+ -o-transform: scaleX(0.75);
+ transform: scaleX(0.75); }
+ #header #navbar ul.navigation li a.active:after {
+ top: 0;
+ visibility: visible;
+ -webkit-transform: scaleX(0.75);
+ -moz-transform: scaleX(0.75);
+ -ms-transform: scaleX(0.75);
+ -o-transform: scaleX(0.75);
+ transform: scaleX(0.75); }
+ #header #navbar ul.navigation li.active a:after {
+ top: 0;
+ visibility: visible;
+ -webkit-transform: scaleX(0.75);
+ -moz-transform: scaleX(0.75);
+ -ms-transform: scaleX(0.75);
+ -o-transform: scaleX(0.75);
+ transform: scaleX(0.75); }
+ #header #navbar ul.navigation li ul {
+ display: none;
+ padding: 0;
+ box-shadow: 0 0.05rem 1rem rgba(0, 0, 0, 0.15) !important; }
+ #header #navbar ul.navigation li ul ul {
+ left: 100%;
+ top: 0; }
+ #header #navbar ul.navigation li:hover > ul {
+ display: block;
+ position: absolute;
+ background: rgba(255, 255, 255, 0.9);
+ width: 10rem; }
+ #header #navbar ul.navigation li:hover li {
+ float: none;
+ margin: 0;
+ padding: 0; }
+ #header #navbar ul.navigation li:hover li a {
+ padding: 0.5rem 0.8rem;
+ display: block; }
+ #header #navbar ul.navigation li:hover li a:before, #header #navbar ul.navigation li:hover li a:after {
+ display: none; }
+ #header #navbar ul.navigation li:hover li.active > a {
+ background: #1BB3E9;
+ color: #fff; }
+ @media only all and (max-width: 59.938em) {
+ #header #navbar ul.navigation {
+ display: none; } }
+ #header #navbar .panel-activation {
+ padding: 1rem;
+ display: none;
+ font-size: 1.8rem;
+ cursor: pointer;
+ float: right; }
+ @media only all and (max-width: 59.938em) {
+ #header #navbar .panel-activation {
+ display: inline-block; } }
+
+.header-image.fullwidth #body {
+ padding-left: 0;
+ padding-right: 0; }
+ .header-image.fullwidth #body > .listing-row {
+ padding-left: 7rem;
+ padding-right: 7rem; }
+.header-image .listing-row:last-child {
+ margin-bottom: 2rem; }
+.header-image #body .flush-top {
+ margin-top: -9.5rem;
+ padding-top: 9rem; }
+.header-image #breadcrumbs {
+ margin-top: 1rem; }
+.header-image #header {
+ background-color: rgba(255, 255, 255, 0);
+ box-shadow: none; }
+ .header-image #header #logo h3, .header-image #header #logo a {
+ color: #FFFFFF; }
+ .header-image #header a, .header-image #header .menu-btn {
+ color: #FFFFFF; }
+ .header-image #header a:before, .header-image #header a:after {
+ background-color: rgba(255, 255, 255, 0.7) !important; }
+ .header-image #header #navbar ul.navigation ul li a {
+ color: #1BB3E9; }
+ .header-image #header #navbar ul.navigation ul li a:hover {
+ color: #0e6e90; }
+
+#footer {
+ position: absolute;
+ background: #333;
+ height: 6rem;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ color: #999;
+ text-align: center; }
+ #footer a:hover {
+ color: #fff; }
+ #footer .totop {
+ position: absolute;
+ bottom: 5rem;
+ text-align: center;
+ left: 0;
+ right: 0; }
+ #footer .totop span {
+ font-size: 1.7rem;
+ line-height: 2.5rem;
+ background: #333;
+ width: 3rem;
+ height: 2rem;
+ border-radius: 3px;
+ display: inline-block;
+ text-align: top; }
+ #footer p {
+ margin: 0; }
+ #footer p .fa {
+ color: #fff; }
+
+html, body, button, input, select, textarea, .pure-g, .pure-g [class*="pure-u"] {
+ font-family: "Raleway", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif;
+ font-weight: 400; }
+
+h1, h2, h3, h4, h5, h6 {
+ font-family: "Montserrat", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif;
+ font-weight: 400;
+ text-rendering: optimizeLegibility;
+ letter-spacing: -0px; }
+
+h1 {
+ font-size: 3.2rem; }
+ @media only all and (max-width: 47.938em) {
+ h1 {
+ font-size: 2.5rem;
+ line-height: 1.2;
+ margin-bottom: 2.5rem; } }
+
+@media only all and (min-width: 48em) and (max-width: 59.938em) {
+ h2 {
+ font-size: 2.1rem; } }
+@media only all and (max-width: 47.938em) {
+ h2 {
+ font-size: 2rem; } }
+
+@media only all and (min-width: 48em) and (max-width: 59.938em) {
+ h3 {
+ font-size: 1.7rem; } }
+@media only all and (max-width: 47.938em) {
+ h3 {
+ font-size: 1.6rem; } }
+
+@media only all and (min-width: 48em) and (max-width: 59.938em) {
+ h4 {
+ font-size: 1.35rem; } }
+@media only all and (max-width: 47.938em) {
+ h4 {
+ font-size: 1.25rem; } }
+
+h1 {
+ text-align: center;
+ letter-spacing: -3px; }
+
+h2 {
+ letter-spacing: -2px; }
+
+h3 {
+ letter-spacing: -1px; }
+
+h1 + h2 {
+ margin: -2rem 0 2rem 0;
+ font-size: 2rem;
+ line-height: 1;
+ text-align: center;
+ font-family: "Raleway", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif;
+ font-weight: 300; }
+ @media only all and (min-width: 48em) and (max-width: 59.938em) {
+ h1 + h2 {
+ font-size: 1.6rem; } }
+ @media only all and (max-width: 47.938em) {
+ h1 + h2 {
+ font-size: 1.5rem; } }
+
+h2 + h3 {
+ margin: 0.5rem 0 2rem 0;
+ font-size: 2rem;
+ line-height: 1;
+ text-align: center;
+ font-family: "Raleway", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif;
+ font-weight: 300; }
+ @media only all and (min-width: 48em) and (max-width: 59.938em) {
+ h2 + h3 {
+ font-size: 1.6rem; } }
+ @media only all and (max-width: 47.938em) {
+ h2 + h3 {
+ font-size: 1.5rem; } }
+
+blockquote {
+ border-left: 10px solid #F0F2F4; }
+ blockquote p {
+ font-size: 1.1rem;
+ color: #999; }
+ blockquote cite {
+ display: block;
+ text-align: right;
+ color: #666;
+ font-size: 1.2rem; }
+
+blockquote > blockquote > blockquote {
+ margin: 0; }
+ blockquote > blockquote > blockquote p {
+ padding: 15px;
+ display: block;
+ font-size: 1rem;
+ margin-top: 0rem;
+ margin-bottom: 0rem; }
+ blockquote > blockquote > blockquote > p {
+ margin-left: -71px;
+ border-left: 10px solid #F0AD4E;
+ background: #FCF8F2;
+ color: #df8a13; }
+ blockquote > blockquote > blockquote > blockquote > p {
+ margin-left: -94px;
+ border-left: 10px solid #D9534F;
+ background: #FDF7F7;
+ color: #b52b27; }
+ blockquote > blockquote > blockquote > blockquote > blockquote > p {
+ margin-left: -118px;
+ border-left: 10px solid #5BC0DE;
+ background: #F4F8FA;
+ color: #28a1c5; }
+ blockquote > blockquote > blockquote > blockquote > blockquote > blockquote > p {
+ margin-left: -142px;
+ border-left: 10px solid #5CB85C;
+ background: #F1F9F1;
+ color: #3d8b3d; }
+
+code,
+kbd,
+pre,
+samp {
+ font-family: "Inconsolata", monospace; }
+
+code {
+ background: #f9f2f4;
+ color: #9c1d3d; }
+
+pre {
+ padding: 2rem;
+ background: #f6f6f6;
+ border: 1px solid #ddd;
+ border-radius: 3px; }
+ pre code {
+ color: #237794;
+ background: inherit; }
+
+hr {
+ border-bottom: 4px solid #F0F2F4; }
+
+.page-title {
+ margin-top: -25px;
+ padding: 25px;
+ float: left;
+ clear: both;
+ background: #1BB3E9;
+ color: #fff; }
+
+.label {
+ vertical-align: middle;
+ background: #1BB3E9;
+ border-radius: 100%;
+ color: #fff;
+ height: 1rem;
+ min-width: 1rem;
+ line-height: 1rem;
+ display: inline-block;
+ text-align: center;
+ font-size: 0.7rem;
+ font-family: "Montserrat", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif;
+ margin-right: 0.75rem; }
+
+fieldset {
+ border: 1px solid #ddd; }
+
+textarea, input[type="email"], input[type="number"], input[type="password"], input[type="search"], input[type="tel"], input[type="text"], input[type="url"], input[type="color"], input[type="date"], input[type="datetime"], input[type="datetime-local"], input[type="month"], input[type="time"], input[type="week"], select[multiple=multiple] {
+ background-color: white;
+ border: 1px solid #ddd;
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.06); }
+ textarea:hover, input[type="email"]:hover, input[type="number"]:hover, input[type="password"]:hover, input[type="search"]:hover, input[type="tel"]:hover, input[type="text"]:hover, input[type="url"]:hover, input[type="color"]:hover, input[type="date"]:hover, input[type="datetime"]:hover, input[type="datetime-local"]:hover, input[type="month"]:hover, input[type="time"]:hover, input[type="week"]:hover, select[multiple=multiple]:hover {
+ border-color: #c4c4c4; }
+ textarea:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="password"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="text"]:focus, input[type="url"]:focus, input[type="color"]:focus, input[type="date"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, select[multiple=multiple]:focus {
+ border-color: #1BB3E9;
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.06), 0 0 5px rgba(21, 163, 214, 0.7); }
+
+.form-field .required {
+ color: #F3443F;
+ font-size: 3rem;
+ line-height: 3rem;
+ vertical-align: top;
+ height: 1.5rem;
+ display: inline-block; }
+
+form .buttons {
+ text-align: center; }
+form input {
+ font-weight: 400; }
+
+table {
+ border: 1px solid #eaeaea;
+ table-layout: auto; }
+
+th {
+ background: #f7f7f7;
+ padding: 0.5rem; }
+
+td {
+ padding: 0.5rem;
+ border: 1px solid #eaeaea; }
+
+.button {
+ background: #fff;
+ color: #1BB3E9;
+ border: 1px solid #1BB3E9;
+ border-radius: 3px; }
+ .button:hover {
+ background: #1BB3E9;
+ color: #fff; }
+ .button:active {
+ box-shadow: 0 1px 0 #118ab5; }
+
+.button-secondary {
+ background: #fff;
+ color: #F6635E;
+ border: 1px solid #F6635E;
+ border-radius: 3px; }
+ .button-secondary:hover {
+ background: #F6635E;
+ color: #fff; }
+ .button-secondary:active {
+ box-shadow: 0 1px 0 #f32b24; }
+
+.bullets {
+ margin: 1.7rem 0;
+ margin-left: -0.85rem;
+ margin-right: -0.85rem;
+ overflow: auto; }
+
+.bullet {
+ float: left;
+ padding: 0 0.85rem; }
+
+.two-column-bullet {
+ width: 50%; }
+ @media only all and (max-width: 47.938em) {
+ .two-column-bullet {
+ width: 100%; } }
+
+.three-column-bullet {
+ width: 33.33333%; }
+ @media only all and (max-width: 47.938em) {
+ .three-column-bullet {
+ width: 100%; } }
+
+.four-column-bullet {
+ width: 25%; }
+ @media only all and (max-width: 47.938em) {
+ .four-column-bullet {
+ width: 100%; } }
+
+.bullet-icon {
+ float: left;
+ background: #1BB3E9;
+ padding: 0.875rem;
+ width: 3.5rem;
+ height: 3.5rem;
+ border-radius: 50%;
+ color: #fff;
+ font-size: 1.75rem;
+ text-align: center; }
+
+.bullet-icon-1 {
+ background: #1BB3E9; }
+
+.bullet-icon-2 {
+ background: #1be9da; }
+
+.bullet-icon-3 {
+ background: #d5e91b; }
+
+.bullet-content {
+ margin-left: 4.55rem; }
+
+.sb-slidebar {
+ background-color: #333 !important; }
+
+#panel {
+ padding-top: 1rem;
+ color: #ddd; }
+ #panel .navigation {
+ list-style: none;
+ padding: 0; }
+ #panel .navigation li {
+ border-bottom: 1px solid #3d3d3d; }
+ #panel .navigation li a {
+ color: #ddd;
+ display: block;
+ padding: 0.5rem 1rem;
+ font-weight: 600; }
+ #panel .navigation li a:hover {
+ color: white;
+ background-color: #262626; }
+ #panel .navigation li a:last-child {
+ border-bottom: 0; }
+ #panel .navigation li.active > a {
+ background: #fff;
+ color: #444; }
+ #panel .navigation li.active > a:hover {
+ color: #444; }
+ #panel .navigation li:first-child {
+ border-top: 1px solid #3d3d3d; }
+ #panel .navigation li ul {
+ list-style: none;
+ padding: 0; }
+ #panel .navigation li ul li {
+ border: 0 !important; }
+ #panel .navigation li ul li a {
+ color: #c4c4c4;
+ padding: 0.2rem 1rem 0.2rem 2rem;
+ font-size: 0.9rem; }
+ #panel .navigation li ul li li a {
+ padding-left: 3rem; }
+ #panel .navigation li ul li li a li a {
+ padding-left: 4rem; }
+ #panel .navigation li ul li.active > a {
+ background: #ccc; }
+
+.blog-header {
+ padding-top: 2rem;
+ padding-bottom: 2rem; }
+ .blog-header.blog-header-image {
+ background-size: cover;
+ background-position: center; }
+ .blog-header.blog-header-image h1, .blog-header.blog-header-image h2 {
+ color: #FFFFFF; }
+ .blog-header h1 {
+ font-size: 4rem;
+ margin-top: 0; }
+ @media only all and (min-width: 48em) and (max-width: 59.938em) {
+ .blog-header h1 {
+ font-size: 3rem; } }
+ @media only all and (max-width: 47.938em) {
+ .blog-header h1 {
+ font-size: 2.5rem;
+ line-height: 1.2;
+ margin-bottom: 2.5rem; } }
+ .blog-header + .blog-content {
+ padding-top: 3rem; }
+
+.list-item {
+ border-bottom: 1px solid #EEEEEE;
+ margin-bottom: 3rem; }
+ .list-item:last-child {
+ border-bottom: 0; }
+ .list-item .list-blog-header {
+ position: relative; }
+ .list-item .list-blog-header h4 {
+ margin-bottom: 0.5rem; }
+ .list-item .list-blog-header h4 a {
+ color: #444; }
+ .list-item .list-blog-header h4 a:hover {
+ color: #1BB3E9; }
+ .list-item .list-blog-header img {
+ display: block;
+ margin-top: 1rem;
+ border-radius: 3px; }
+ .list-item .list-blog-date {
+ float: right;
+ text-align: center; }
+ .list-item .list-blog-date span {
+ display: block;
+ font-size: 1.75rem;
+ font-weight: 600;
+ line-height: 110%; }
+ .list-item .list-blog-date em {
+ display: block;
+ border-top: 1px solid #EEEEEE;
+ font-style: normal;
+ text-transform: uppercase; }
+
+.blog-content-item .list-blog-padding > p:nth-child(2) {
+ font-size: 1.2rem; }
+
+.tags a {
+ display: inline-block;
+ font-size: 0.8rem;
+ border: 1px solid #1BB3E9;
+ border-radius: 3px;
+ padding: 0.1rem 0.4rem;
+ margin-bottom: 0.2rem;
+ text-transform: uppercase; }
+
+.archives, .related-pages {
+ padding: 0;
+ list-style: none; }
+ .archives li, .related-pages li {
+ border-bottom: 1px solid #EEEEEE;
+ line-height: 2rem; }
+ .archives li:last-child, .related-pages li:last-child {
+ border-bottom: 0; }
+
+.related-pages li a {
+ display: block; }
+.related-pages .score {
+ display: block;
+ float: right;
+ color: #999;
+ font-size: 85%; }
+
+.syndicate a {
+ margin-bottom: 1rem; }
+
+div#breadcrumbs {
+ padding-left: 0; }
+ @media only all and (max-width: 47.938em) {
+ div#breadcrumbs {
+ display: none; } }
+
+#sidebar {
+ padding-left: 3rem; }
+ @media only all and (max-width: 47.938em) {
+ #sidebar {
+ padding-left: 0; } }
+ #sidebar .sidebar-content {
+ margin-bottom: 3rem; }
+ #sidebar .sidebar-content h4 {
+ margin-bottom: 1rem; }
+ #sidebar .sidebar-content p, #sidebar .sidebar-content ul {
+ margin-top: 1rem; }
+
+ul.pagination {
+ margin: 0 0 3rem;
+ text-align: center; }
+
+.prev-next {
+ margin-top: 5rem;
+ text-align: center; }
+
+#error {
+ text-align: center;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 100%;
+ padding-bottom: 6rem; }
+ #error h1 {
+ font-size: 5rem; }
+ #error p {
+ margin: 1rem 0; }
+
+.simplesearch h1 {
+ margin-bottom: 0; }
+.simplesearch .center {
+ text-align: center; }
+.simplesearch input {
+ display: inline-block;
+ max-width: 30rem;
+ font-size: 2rem; }
+.simplesearch .search-image {
+ margin-top: 1rem; }
+ .simplesearch .search-image img {
+ border-radius: 4px; }
+ @media only all and (max-width: 47.938em) {
+ .simplesearch .search-image img {
+ display: none; } }
+@media only all and (max-width: 47.938em) {
+ .simplesearch .search-item {
+ margin-left: 0; } }
+.simplesearch .search-details {
+ float: right;
+ margin-top: -2.5rem;
+ font-weight: bold;
+ font-size: 1rem;
+ color: #777777; }
+ @media only all and (max-width: 47.938em) {
+ .simplesearch .search-details {
+ float: none;
+ margin-top: -0.2rem;
+ margin-bottom: 1rem; } }
+.simplesearch hr {
+ border-bottom: 1px solid #eee; }
+
+.grav-lightslider .lSSlideOuter .lSPager.lSpg > li a {
+ z-index: 1; }
+
+#body > script:first-child + .grav-lightslider {
+ margin-top: -3rem; }
+
+.modular.header-image #header {
+ background-color: rgba(255, 255, 255, 0);
+ box-shadow: none; }
+ .modular.header-image #header #logo h3 {
+ color: #FFFFFF; }
+ .modular.header-image #header #navbar a {
+ color: #FFFFFF; }
+.modular .showcase {
+ padding-top: 4rem;
+ padding-bottom: 4rem;
+ background-color: #666;
+ background-size: cover;
+ background-position: center;
+ text-align: center;
+ color: #FFFFFF; }
+ .modular .showcase h1 {
+ font-size: 4rem;
+ margin-top: 0; }
+ @media only all and (min-width: 48em) and (max-width: 59.938em) {
+ .modular .showcase h1 {
+ font-size: 3rem; } }
+ @media only all and (max-width: 47.938em) {
+ .modular .showcase h1 {
+ font-size: 2.5rem;
+ line-height: 1.2;
+ margin-bottom: 2.5rem; } }
+ .modular .showcase .button {
+ color: #FFFFFF;
+ padding: 0.7rem 2rem;
+ margin-top: 2rem;
+ background: rgba(255, 255, 255, 0);
+ border: 1px solid #FFFFFF;
+ border-radius: 3px;
+ box-shadow: none;
+ font-size: 1.3rem; }
+ .modular .showcase .button:hover {
+ background: rgba(255, 255, 255, 0.2); }
+
+.modular .features {
+ padding: 6rem 0;
+ text-align: center; }
+ .modular .features:after {
+ content: "";
+ display: table;
+ clear: both; }
+ .modular .features h2 {
+ margin: 0;
+ line-height: 100%; }
+ .modular .features p {
+ margin: 1rem 0;
+ font-size: 1.2rem; }
+ @media only all and (max-width: 47.938em) {
+ .modular .features p {
+ font-size: 1rem; } }
+ .modular .features .feature-items {
+ margin-top: 2rem; }
+ @supports not (flex-wrap: wrap) {
+ .modular .features .feature-items {
+ overflow: hidden; } }
+ .modular .features .feature {
+ display: block;
+ float: left;
+ width: 25%;
+ vertical-align: top;
+ margin-top: 2rem;
+ margin-bottom: 1rem; }
+ @media only all and (min-width: 30.063em) and (max-width: 47.938em) {
+ .modular .features .feature {
+ margin-top: 1rem;
+ width: 50%; } }
+ @media only all and (max-width: 30em) {
+ .modular .features .feature {
+ margin-top: 1rem;
+ width: 100%; } }
+ .modular .features .feature i.fa {
+ font-size: 2rem;
+ color: #1BB3E9; }
+ .modular .features .feature h4 {
+ margin: 0;
+ font-size: 1.1rem; }
+ .modular .features .feature p {
+ display: inline-block;
+ font-size: 1rem;
+ margin: 0.2rem 0 1rem; }
+ .modular .features.big {
+ text-align: center; }
+ .modular .features.big .feature {
+ width: 50%; }
+ @media only all and (max-width: 30em) {
+ .modular .features.big .feature {
+ margin-top: 1rem;
+ width: 100%; } }
+ .modular .features.big i.fa {
+ font-size: 3rem;
+ float: left; }
+ .modular .features.big .feature-content {
+ padding-right: 2rem; }
+ .modular .features.big .feature-content.icon-offset {
+ margin-left: 5rem; }
+ .modular .features.big .feature-content h4 {
+ font-size: 1.3rem;
+ text-align: left; }
+ .modular .features.big .feature-content p {
+ padding: 0;
+ text-align: left; }
+
+.callout {
+ background: #f6f6f6;
+ padding: 6rem 0.938rem; }
+ @media only all and (max-width: 59.938em) {
+ .callout {
+ text-align: center; } }
+ .callout .align-left {
+ float: left;
+ margin-right: 2rem; }
+ @media only all and (max-width: 59.938em) {
+ .callout .align-left {
+ float: none;
+ margin-right: 0; } }
+ .callout .align-right {
+ float: right;
+ margin-left: 2rem; }
+ @media only all and (max-width: 59.938em) {
+ .callout .align-right {
+ float: none;
+ margin-left: 0; } }
+ .callout img {
+ border-radius: 3px; }
+
+.modular .modular-row:last-child {
+ margin-bottom: 2rem; }
+
+/*# sourceMappingURL=template.css.map */
diff --git a/src/user/themes/antimatter/css-compiled/template.css.map b/src/user/themes/antimatter/css-compiled/template.css.map
new file mode 100644
index 0000000..4568d5b
--- /dev/null
+++ b/src/user/themes/antimatter/css-compiled/template.css.map
@@ -0,0 +1,7 @@
+{
+"version": 3,
+"mappings": "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",
+"sources": ["../scss/template/_fonts.scss","../scss/nucleus/mixins/_utilities.scss","../scss/template/modules/_buttons.scss","../scss/template/_core.scss","../scss/configuration/template/_colors.scss","../scss/configuration/template/_bullets.scss","../scss/configuration/template/_variables.scss","../scss/template/_extensions.scss","../scss/vendor/bourbon/addons/_prefixer.scss","../scss/nucleus/mixins/_breakpoints.scss","../scss/template/_header.scss","../scss/configuration/template/_typography.scss","../scss/template/_footer.scss","../scss/template/_typography.scss","../scss/configuration/nucleus/_typography.scss","../scss/template/_forms.scss","../scss/template/_tables.scss","../scss/template/_buttons.scss","../scss/template/_bullets.scss","../scss/template/_panel.scss","../scss/template/_blog.scss","../scss/template/_errors.scss","../scss/template/_simplesearch.scss","../scss/template/_custom.scss","../scss/template/modular/_showcase.scss","../scss/template/modular/_features.scss","../scss/vendor/bourbon/addons/_clearfix.scss","../scss/template/modular/_text.scss","../scss/template/modular/_all.scss"],
+"names": [],
+"file": "template.css"
+}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/css/font-awesome.min.css b/src/user/themes/antimatter/css/font-awesome.min.css
new file mode 100644
index 0000000..3d920fc
--- /dev/null
+++ b/src/user/themes/antimatter/css/font-awesome.min.css
@@ -0,0 +1,4 @@
+/*!
+ * Font Awesome 4.1.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.1.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.1.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.1.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.1.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.1.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1)}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-square:before,.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/css/nucleus-ie10.css b/src/user/themes/antimatter/css/nucleus-ie10.css
new file mode 100644
index 0000000..c1d2f2a
--- /dev/null
+++ b/src/user/themes/antimatter/css/nucleus-ie10.css
@@ -0,0 +1,24 @@
+button {
+ overflow: visible;
+}
+
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box;
+ padding: 0;
+}
+
+.fixed-blocks {
+ display: block;
+}
+
+.feature-items {
+ overflow: hidden;
+}
+
+.modular .features .feature {
+ margin: 1%;
+ display: inline-block;
+ vertical-align: top;
+ float: none;
+}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/css/nucleus-ie9.css b/src/user/themes/antimatter/css/nucleus-ie9.css
new file mode 100644
index 0000000..46df376
--- /dev/null
+++ b/src/user/themes/antimatter/css/nucleus-ie9.css
@@ -0,0 +1,62 @@
+/* IE9 Resets and Normalization */
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+nav,
+section,
+summary {
+ display: block;
+}
+
+audio,
+canvas,
+progress,
+video {
+ display: inline-block;
+}
+
+[hidden],
+template {
+ display: none;
+}
+
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+
+img {
+ border: 0;
+}
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+figure {
+ margin: 1em 40px;
+}
+
+button {
+ overflow: visible;
+}
+
+input[type="checkbox"],
+input[type="radio"] {
+ box-sizing: border-box;
+ padding: 0;
+}
+
+legend {
+ border: 0;
+ padding: 0;
+}
+
+textarea {
+ overflow: auto;
+}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/css/prism.css b/src/user/themes/antimatter/css/prism.css
new file mode 100644
index 0000000..00005b3
--- /dev/null
+++ b/src/user/themes/antimatter/css/prism.css
@@ -0,0 +1,121 @@
+/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+
+code[class*="language-"],
+pre[class*="language-"] {
+ color: black;
+ text-shadow: 0 1px white;
+ direction: ltr;
+ text-align: left;
+ white-space: pre;
+ word-spacing: normal;
+ word-break: normal;
+
+
+ -moz-tab-size: 4;
+ -o-tab-size: 4;
+ tab-size: 4;
+
+ -webkit-hyphens: none;
+ -moz-hyphens: none;
+ -ms-hyphens: none;
+ hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection, pre[class*="language-"] ::selection,
+code[class*="language-"]::selection, code[class*="language-"] ::selection {
+ text-shadow: none;
+ background: #b3d4fc;
+}
+
+@media print {
+ code[class*="language-"],
+ pre[class*="language-"] {
+ text-shadow: none;
+ }
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+ padding: 1em;
+ margin: .5em 0;
+ overflow: auto;
+}
+
+/* Inline code */
+:not(pre) > code[class*="language-"] {
+ padding: .1em;
+ border-radius: .3em;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+ color: slategray;
+}
+
+.token.punctuation {
+ color: #999;
+}
+
+.namespace {
+ opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol {
+ color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.builtin {
+ color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string,
+.token.variable {
+ color: #a67f59;
+ background: hsla(0,0%,100%,.5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+ color: #07a;
+}
+
+
+.token.regex,
+.token.important {
+ color: #e90;
+}
+
+.token.important {
+ font-weight: bold;
+}
+
+.token.entity {
+ cursor: help;
+}
+
diff --git a/src/user/themes/antimatter/css/pure-0.5.0/grids-min.css b/src/user/themes/antimatter/css/pure-0.5.0/grids-min.css
new file mode 100644
index 0000000..82bf816
--- /dev/null
+++ b/src/user/themes/antimatter/css/pure-0.5.0/grids-min.css
@@ -0,0 +1,15 @@
+/*!
+Pure v0.5.0-rc-1
+Copyright 2014 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+https://github.com/yui/pure/blob/master/LICENSE.md
+*/
+.pure-g{letter-spacing:-.31em;*letter-spacing:normal;*word-spacing:-.43em;text-rendering:optimizespeed;font-family:FreeSans,Arimo,"Droid Sans",Helvetica,Arial,sans-serif;display:-webkit-flex;-webkit-flex-flow:row wrap;display:-ms-flexbox;-ms-flex-flow:row wrap}.opera-only :-o-prefocus,.pure-g{word-spacing:-.43em}.pure-u{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-g [class *="pure-u"]{font-family:sans-serif}.pure-u-1,.pure-u-1-1,.pure-u-1-2,.pure-u-1-3,.pure-u-2-3,.pure-u-1-4,.pure-u-3-4,.pure-u-1-5,.pure-u-2-5,.pure-u-3-5,.pure-u-4-5,.pure-u-5-5,.pure-u-1-6,.pure-u-5-6,.pure-u-1-8,.pure-u-3-8,.pure-u-5-8,.pure-u-7-8,.pure-u-1-12,.pure-u-5-12,.pure-u-7-12,.pure-u-11-12,.pure-u-1-24,.pure-u-2-24,.pure-u-3-24,.pure-u-4-24,.pure-u-5-24,.pure-u-6-24,.pure-u-7-24,.pure-u-8-24,.pure-u-9-24,.pure-u-10-24,.pure-u-11-24,.pure-u-12-24,.pure-u-13-24,.pure-u-14-24,.pure-u-15-24,.pure-u-16-24,.pure-u-17-24,.pure-u-18-24,.pure-u-19-24,.pure-u-20-24,.pure-u-21-24,.pure-u-22-24,.pure-u-23-24,.pure-u-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-1-24{width:4.1667%;*width:4.1357%}.pure-u-1-12,.pure-u-2-24{width:8.3333%;*width:8.3023%}.pure-u-1-8,.pure-u-3-24{width:12.5%;*width:12.469%}.pure-u-1-6,.pure-u-4-24{width:16.6667%;*width:16.6357%}.pure-u-1-5{width:20%;*width:19.969%}.pure-u-5-24{width:20.8333%;*width:20.8023%}.pure-u-1-4,.pure-u-6-24{width:25%;*width:24.969%}.pure-u-7-24{width:29.1667%;*width:29.1357%}.pure-u-1-3,.pure-u-8-24{width:33.3333%;*width:33.3023%}.pure-u-3-8,.pure-u-9-24{width:37.5%;*width:37.469%}.pure-u-2-5{width:40%;*width:39.969%}.pure-u-5-12,.pure-u-10-24{width:41.6667%;*width:41.6357%}.pure-u-11-24{width:45.8333%;*width:45.8023%}.pure-u-1-2,.pure-u-12-24{width:50%;*width:49.969%}.pure-u-13-24{width:54.1667%;*width:54.1357%}.pure-u-7-12,.pure-u-14-24{width:58.3333%;*width:58.3023%}.pure-u-3-5{width:60%;*width:59.969%}.pure-u-5-8,.pure-u-15-24{width:62.5%;*width:62.469%}.pure-u-2-3,.pure-u-16-24{width:66.6667%;*width:66.6357%}.pure-u-17-24{width:70.8333%;*width:70.8023%}.pure-u-3-4,.pure-u-18-24{width:75%;*width:74.969%}.pure-u-19-24{width:79.1667%;*width:79.1357%}.pure-u-4-5{width:80%;*width:79.969%}.pure-u-5-6,.pure-u-20-24{width:83.3333%;*width:83.3023%}.pure-u-7-8,.pure-u-21-24{width:87.5%;*width:87.469%}.pure-u-11-12,.pure-u-22-24{width:91.6667%;*width:91.6357%}.pure-u-23-24{width:95.8333%;*width:95.8023%}.pure-u-1,.pure-u-1-1,.pure-u-5-5,.pure-u-24-24{width:100%}
+
+/* Custom */
+[class *="pure-u"] {display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto;}
+.pure-u-1-7 {width: 14.285%;}.pure-u-2-7 {width: 28.571%;}.pure-u-3-7 {width: 42.857%;}.pure-u-4-7 {width: 57.142%;}.pure-u-5-7 {width: 71.428%;}.pure-u-6-7 {width: 85.714%;}
+.pure-u-1-9 {width: 11.111%;}.pure-u-2-9 {width: 22.222%;}.pure-u-3-9 {width: 33.333%;}.pure-u-4-9 {width: 44.444%;}.pure-u-5-9 {width: 55.555%;}.pure-u-6-9 {width: 66.666%;}.pure-u-7-9 {width: 77.777%;}.pure-u-8-9 {width: 88.888%;}
+.pure-u-1-10 {width: 10%;}.pure-u-2-10 {width: 20%;}.pure-u-3-10 {width: 30%;}.pure-u-4-10 {width: 40%;}.pure-u-5-10 {width: 50%;}.pure-u-6-10 {width: 60%;}.pure-u-7-10 {width: 70%;}.pure-u-8-10 {width: 80%;}.pure-u-9-10 {width: 90%;}
+
+.pure-u-1-11 {width: 9.090%;}.pure-u-2-11 {width: 18.181%;}.pure-u-3-11 {width: 27.272%;}.pure-u-4-11 {width: 36.363%;}.pure-u-5-11 {width: 45.454%;}.pure-u-6-11 {width: 54.545%;}.pure-u-7-11 {width: 63.636%;}.pure-u-8-11 {width: 72.727%;}.pure-u-9-11 {width: 81.818%;}.pure-u-10-11 {width: 90.909%;}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/css/slidebars.min.css b/src/user/themes/antimatter/css/slidebars.min.css
new file mode 100644
index 0000000..41af739
--- /dev/null
+++ b/src/user/themes/antimatter/css/slidebars.min.css
@@ -0,0 +1,2 @@
+/* Slidebars 0.10.2 (http://plugins.adchsm.me/slidebars/) written by Adam Smith (http://www.adchsm.me/) released under MIT License (http://plugins.adchsm.me/slidebars/license.txt) */
+#sb-site,.sb-site-container,.sb-slidebar,body,html{margin:0;padding:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body,html{width:100%;overflow-x:hidden}html{height:100%}body{min-height:100%;height:auto;position:relative}html.sb-scroll-lock.sb-active:not(.sb-static){overflow:hidden}#sb-site,.sb-site-container{width:100%;position:relative;z-index:1;background-color:#fff}.sb-slidebar{height:100%;overflow-y:auto;position:fixed;top:0;z-index:0;display:none;background-color:#222;-webkit-transform:translate(0px)}.sb-left{left:0}.sb-right{right:0}.sb-slidebar.sb-static,html.sb-static .sb-slidebar{position:absolute}.sb-slidebar.sb-active{display:block}.sb-style-overlay{z-index:9999}.sb-momentum-scrolling{-webkit-overflow-scrolling:touch}.sb-slidebar{width:30%}.sb-width-thin{width:15%}.sb-width-wide{width:45%}@media (max-width:480px){.sb-slidebar{width:70%}.sb-width-thin{width:55%}.sb-width-wide{width:85%}}@media (min-width:481px){.sb-slidebar{width:55%}.sb-width-thin{width:40%}.sb-width-wide{width:70%}}@media (min-width:768px){.sb-slidebar{width:40%}.sb-width-thin{width:25%}.sb-width-wide{width:55%}}@media (min-width:992px){.sb-slidebar{width:30%}.sb-width-thin{width:15%}.sb-width-wide{width:45%}}@media (min-width:1200px){.sb-slidebar{width:20%}.sb-width-thin{width:5%}.sb-width-wide{width:35%}}#sb-site,.sb-site-container,.sb-slide,.sb-slidebar{-webkit-transition:-webkit-transform 400ms ease;-moz-transition:-moz-transform 400ms ease;-o-transition:-o-transform 400ms ease;transition:transform 400ms ease;-webkit-transition-property:-webkit-transform,left,right;}.sb-hide{display:none}
diff --git a/src/user/themes/antimatter/fonts/FontAwesome.otf b/src/user/themes/antimatter/fonts/FontAwesome.otf
new file mode 100644
index 0000000..8b0f54e
Binary files /dev/null and b/src/user/themes/antimatter/fonts/FontAwesome.otf differ
diff --git a/src/user/themes/antimatter/fonts/fontawesome-webfont.eot b/src/user/themes/antimatter/fonts/fontawesome-webfont.eot
new file mode 100644
index 0000000..6cfd566
Binary files /dev/null and b/src/user/themes/antimatter/fonts/fontawesome-webfont.eot differ
diff --git a/src/user/themes/antimatter/fonts/fontawesome-webfont.svg b/src/user/themes/antimatter/fonts/fontawesome-webfont.svg
new file mode 100644
index 0000000..a9f8469
--- /dev/null
+++ b/src/user/themes/antimatter/fonts/fontawesome-webfont.svg
@@ -0,0 +1,504 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/user/themes/antimatter/fonts/fontawesome-webfont.ttf b/src/user/themes/antimatter/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000..5cd6cff
Binary files /dev/null and b/src/user/themes/antimatter/fonts/fontawesome-webfont.ttf differ
diff --git a/src/user/themes/antimatter/fonts/fontawesome-webfont.woff b/src/user/themes/antimatter/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000..9eaecb3
Binary files /dev/null and b/src/user/themes/antimatter/fonts/fontawesome-webfont.woff differ
diff --git a/src/user/themes/antimatter/images/favicon.png b/src/user/themes/antimatter/images/favicon.png
new file mode 100644
index 0000000..ec645f1
Binary files /dev/null and b/src/user/themes/antimatter/images/favicon.png differ
diff --git a/src/user/themes/antimatter/images/logo.png b/src/user/themes/antimatter/images/logo.png
new file mode 100644
index 0000000..64be1a9
Binary files /dev/null and b/src/user/themes/antimatter/images/logo.png differ
diff --git a/src/user/themes/antimatter/js/antimatter.js b/src/user/themes/antimatter/js/antimatter.js
new file mode 100644
index 0000000..298ed75
--- /dev/null
+++ b/src/user/themes/antimatter/js/antimatter.js
@@ -0,0 +1,37 @@
+var isTouch = window.DocumentTouch && document instanceof DocumentTouch;
+
+function scrollHeader() {
+ // Has scrolled class on header
+ var zvalue = $(document).scrollTop();
+ if ( zvalue > 75 )
+ $("#header").addClass("scrolled");
+ else
+ $("#header").removeClass("scrolled");
+}
+
+jQuery(document).ready(function($){
+
+ // ON SCROLL EVENTS
+ if (!isTouch){
+ $(document).scroll(function() {
+ scrollHeader();
+ });
+ };
+
+ // TOUCH SCROLL
+ $(document).on({
+ 'touchmove': function(e) {
+ scrollHeader(); // Replace this with your code.
+ }
+ });
+
+ //Smooth scroll to top
+ $('#toTop').click(function(){
+ $("html, body").animate({ scrollTop: 0 }, 500);
+ return false;
+ });
+ // Responsive Menu
+
+});
+
+
diff --git a/src/user/themes/antimatter/js/html5shiv-printshiv.min.js b/src/user/themes/antimatter/js/html5shiv-printshiv.min.js
new file mode 100644
index 0000000..9c78ee3
--- /dev/null
+++ b/src/user/themes/antimatter/js/html5shiv-printshiv.min.js
@@ -0,0 +1,4 @@
+/**
+* @preserve HTML5 Shiv prev3.7.1 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
+*/
+!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=x.elements;return"string"==typeof a?a.split(" "):a}function e(a){var b=w[a[u]];return b||(b={},v++,a[u]=v,w[v]=b),b}function f(a,c,d){if(c||(c=b),p)return c.createElement(a);d||(d=e(c));var f;return f=d.cache[a]?d.cache[a].cloneNode():t.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!f.canHaveChildren||s.test(a)||f.tagUrn?f:d.frag.appendChild(f)}function g(a,c){if(a||(a=b),p)return a.createDocumentFragment();c=c||e(a);for(var f=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)f.createElement(h[g]);return f}function h(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return x.shivMethods?f(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(x,b.frag)}function i(a){a||(a=b);var d=e(a);return!x.shivCSS||o||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),p||h(a,d),a}function j(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(k(b)));return g}function k(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(z+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function l(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+z+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function m(a){for(var b=a.length;b--;)a[b].removeNode()}function n(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,f,g=e(a),h=a.namespaces,i=a.parentWindow;return!A||a.printShived?a:("undefined"==typeof h[z]&&h.add(z),i.attachEvent("onbeforeprint",function(){b();for(var e,g,h,i=a.styleSheets,k=[],m=i.length,n=Array(m);m--;)n[m]=i[m];for(;h=n.pop();)if(!h.disabled&&y.test(h.media)){try{e=h.imports,g=e.length}catch(o){g=0}for(m=0;g>m;m++)n.push(e[m]);try{k.push(h.cssText)}catch(o){}}k=l(k.reverse().join("")),f=j(a),d=c(a,k)}),i.attachEvent("onafterprint",function(){m(f),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var o,p,q="3.7.0",r=a.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,t=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,u="_html5shiv",v=0,w={};!function(){try{var a=b.createElement("a");a.innerHTML=" ",o="hidden"in a,p=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){o=!0,p=!0}}();var x={elements:r.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:q,shivCSS:r.shivCSS!==!1,supportsUnknownElements:p,shivMethods:r.shivMethods!==!1,type:"default",shivDocument:i,createElement:f,createDocumentFragment:g};a.html5=x,i(b);var y=/^$|\b(?:all|print)\b/,z="html5shiv",A=!p&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();x.type+=" print",x.shivPrint=n,n(b)}(this,document);
\ No newline at end of file
diff --git a/src/user/themes/antimatter/js/modernizr.custom.71422.js b/src/user/themes/antimatter/js/modernizr.custom.71422.js
new file mode 100644
index 0000000..63cc6c2
--- /dev/null
+++ b/src/user/themes/antimatter/js/modernizr.custom.71422.js
@@ -0,0 +1,4 @@
+/* Modernizr 2.7.1 (Custom Build) | MIT & BSD
+ * Build: http://modernizr.com/download/#-csstransforms3d-shiv-cssclasses-teststyles-testprop-testallprops-prefixes-domprefixes-load
+ */
+;window.Modernizr=function(a,b,c){function z(a){j.cssText=a}function A(a,b){return z(m.join(a+";")+(b||""))}function B(a,b){return typeof a===b}function C(a,b){return!!~(""+a).indexOf(b)}function D(a,b){for(var d in a){var e=a[d];if(!C(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function E(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:B(f,"function")?f.bind(d||b):f}return!1}function F(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+o.join(d+" ")+d).split(" ");return B(b,"string")||B(b,"undefined")?D(e,b):(e=(a+" "+p.join(d+" ")+d).split(" "),E(e,b,c))}var d="2.7.1",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k,l={}.toString,m=" -webkit- -moz- -o- -ms- ".split(" "),n="Webkit Moz O ms",o=n.split(" "),p=n.toLowerCase().split(" "),q={},r={},s={},t=[],u=t.slice,v,w=function(a,c,d,e){var f,i,j,k,l=b.createElement("div"),m=b.body,n=m||b.createElement("body");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:h+(d+1),l.appendChild(j);return f=["",'"].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},x={}.hasOwnProperty,y;!B(x,"undefined")&&!B(x.call,"undefined")?y=function(a,b){return x.call(a,b)}:y=function(a,b){return b in a&&B(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=u.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(u.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(u.call(arguments)))};return e}),q.csstransforms3d=function(){var a=!!F("perspective");return a&&"webkitPerspective"in g.style&&w("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=b.offsetLeft===9&&b.offsetHeight===3}),a};for(var G in q)y(q,G)&&(v=G.toLowerCase(),e[v]=q[G](),t.push((e[v]?"":"no-")+v));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)y(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},z(""),i=k=null,function(a,b){function l(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function m(){var a=s.elements;return typeof a=="string"?a.split(" "):a}function n(a){var b=j[a[h]];return b||(b={},i++,a[h]=i,j[i]=b),b}function o(a,c,d){c||(c=b);if(k)return c.createElement(a);d||(d=n(c));var g;return d.cache[a]?g=d.cache[a].cloneNode():f.test(a)?g=(d.cache[a]=d.createElem(a)).cloneNode():g=d.createElem(a),g.canHaveChildren&&!e.test(a)&&!g.tagUrn?d.frag.appendChild(g):g}function p(a,c){a||(a=b);if(k)return a.createDocumentFragment();c=c||n(a);var d=c.frag.cloneNode(),e=0,f=m(),g=f.length;for(;e",g="hidden"in a,k=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){g=!0,k=!0}})();var s={elements:d.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:c,shivCSS:d.shivCSS!==!1,supportsUnknownElements:k,shivMethods:d.shivMethods!==!1,type:"default",shivDocument:r,createElement:o,createDocumentFragment:p};a.html5=s,r(b)}(this,b),e._version=d,e._prefixes=m,e._domPrefixes=p,e._cssomPrefixes=o,e.testProp=function(a){return D([a])},e.testAllProps=F,e.testStyles=w,g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+t.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f
+ * Dual licensed under MIT and GPL.
+ * @author Chris Wojcik
+ * @version 1.2.0
+ */
+if(typeof Object.create!=="function"){Object.create=function(e){function t(){}t.prototype=e;return new t}}(function(e,t,n,r){"use strict";var i={init:function(n,r){this.options=e.extend({},e.fn.singlePageNav.defaults,n);this.container=r;this.$container=e(r);this.$links=this.$container.find("a");if(this.options.filter!==""){this.$links=this.$links.filter(this.options.filter)}this.$window=e(t);this.$htmlbody=e("html, body");this.$links.on("click.singlePageNav",e.proxy(this.handleClick,this));this.didScroll=false;this.checkPosition();this.setTimer()},handleClick:function(t){var n=this,r=t.currentTarget,i=e(r.hash);t.preventDefault();if(i.length){n.clearTimer();if(typeof n.options.beforeStart==="function"){n.options.beforeStart()}n.setActiveLink(r.hash);n.scrollTo(i,function(){if(n.options.updateHash&&history.pushState){history.pushState(null,null,r.hash)}n.setTimer();if(typeof n.options.onComplete==="function"){n.options.onComplete()}})}},scrollTo:function(e,t){var n=this;var r=n.getCoords(e).top;var i=false;n.$htmlbody.stop().animate({scrollTop:r},{duration:n.options.speed,easing:n.options.easing,complete:function(){if(typeof t==="function"&&!i){t()}i=true}})},setTimer:function(){var e=this;e.$window.on("scroll.singlePageNav",function(){e.didScroll=true});e.timer=setInterval(function(){if(e.didScroll){e.didScroll=false;e.checkPosition()}},250)},clearTimer:function(){clearInterval(this.timer);this.$window.off("scroll.singlePageNav");this.didScroll=false},checkPosition:function(){var e=this.$window.scrollTop();var t=this.getCurrentSection(e);this.setActiveLink(t)},getCoords:function(e){return{top:Math.round(e.offset().top)-this.options.offset}},setActiveLink:function(e){var t=this.$container.find("a[href$='"+e+"']");if(!t.hasClass(this.options.currentClass)){this.$links.removeClass(this.options.currentClass);t.addClass(this.options.currentClass)}},getCurrentSection:function(t){var n,r,i,s;for(n=0;n=i.top-this.options.threshold){s=r}}}return s||this.$links[0].hash}};e.fn.singlePageNav=function(e){return this.each(function(){var t=Object.create(i);t.init(e,this)})};e.fn.singlePageNav.defaults={offset:0,threshold:120,speed:400,currentClass:"current",easing:"swing",updateHash:false,filter:"",onComplete:false,beforeStart:false}})(jQuery,window,document);
\ No newline at end of file
diff --git a/src/user/themes/antimatter/js/slidebars.min.js b/src/user/themes/antimatter/js/slidebars.min.js
new file mode 100644
index 0000000..528522d
--- /dev/null
+++ b/src/user/themes/antimatter/js/slidebars.min.js
@@ -0,0 +1,2 @@
+// Slidebars 0.10.2 (http://plugins.adchsm.me/slidebars/) written by Adam Smith (http://www.adchsm.me/) released under MIT License (http://plugins.adchsm.me/slidebars/license.txt)
+!function(t){t.slidebars=function(s){function e(){!c.disableOver||"number"==typeof c.disableOver&&c.disableOver>=T?(y=!0,t("html").addClass("sb-init"),c.hideControlClasses&&k.removeClass("sb-hide"),i()):"number"==typeof c.disableOver&&c.disableOverb||v&&5>v)&&t("html").addClass("sb-static");var g=t("#sb-site, .sb-site-container");if(t(".sb-left").length)var m=t(".sb-left"),C=!1;if(t(".sb-right").length)var p=t(".sb-right"),w=!1;var y=!1,T=t(window).width(),k=t(".sb-toggle-left, .sb-toggle-right, .sb-open-left, .sb-open-right, .sb-close"),O=t(".sb-slide");e(),t(window).resize(function(){var s=t(window).width();T!==s&&(T=s,e(),C&&o("left"),w&&o("right"))});var x;d&&f?(x="translate",b&&4.4>b&&(x="side")):x="jQuery",this.slidebars={open:o,close:a,toggle:l,init:function(){return y},active:function(t){return"left"===t&&m?C:"right"===t&&p?w:void 0},destroy:function(t){"left"===t&&m&&(C&&a(),setTimeout(function(){m.remove(),m=!1},400)),"right"===t&&p&&(w&&a(),setTimeout(function(){p.remove(),p=!1},400))}},t(".sb-toggle-left").on("touchend click",function(s){r(s,t(this)),l("left")}),t(".sb-toggle-right").on("touchend click",function(s){r(s,t(this)),l("right")}),t(".sb-open-left").on("touchend click",function(s){r(s,t(this)),o("left")}),t(".sb-open-right").on("touchend click",function(s){r(s,t(this)),o("right")}),t(".sb-close").on("touchend click",function(s){if(t(this).is("a")||t(this).children().is("a")){if("click"===s.type){s.preventDefault();var e=t(this).is("a")?t(this).attr("href"):t(this).find("a").attr("href");a(e)}}else r(s,t(this)),a()}),g.on("touchend click",function(s){c.siteClose&&(C||w)&&(r(s,t(this)),a())})}}(jQuery);
\ No newline at end of file
diff --git a/src/user/themes/antimatter/languages.yaml b/src/user/themes/antimatter/languages.yaml
new file mode 100644
index 0000000..1276920
--- /dev/null
+++ b/src/user/themes/antimatter/languages.yaml
@@ -0,0 +1,2 @@
+en:
+ TRANSLATION_TEST: Antimatter!
\ No newline at end of file
diff --git a/src/user/themes/antimatter/screenshot.jpg b/src/user/themes/antimatter/screenshot.jpg
new file mode 100644
index 0000000..2c0e79c
Binary files /dev/null and b/src/user/themes/antimatter/screenshot.jpg differ
diff --git a/src/user/themes/antimatter/scss.sh b/src/user/themes/antimatter/scss.sh
new file mode 100755
index 0000000..4a386d1
--- /dev/null
+++ b/src/user/themes/antimatter/scss.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+scss --watch scss:css-compiled
diff --git a/src/user/themes/antimatter/scss/configuration/nucleus/_base.scss b/src/user/themes/antimatter/scss/configuration/nucleus/_base.scss
new file mode 100644
index 0000000..0b7e898
--- /dev/null
+++ b/src/user/themes/antimatter/scss/configuration/nucleus/_base.scss
@@ -0,0 +1,14 @@
+// Core
+@import "core";
+
+// Breakpoints
+@import "breakpoints";
+
+// Layout
+@import "layout";
+
+// Typography
+@import "typography";
+
+// Nav
+@import "nav";
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/configuration/nucleus/_breakpoints.scss b/src/user/themes/antimatter/scss/configuration/nucleus/_breakpoints.scss
new file mode 100644
index 0000000..43d0e02
--- /dev/null
+++ b/src/user/themes/antimatter/scss/configuration/nucleus/_breakpoints.scss
@@ -0,0 +1,16 @@
+// Media Device Breakpoints
+$large-desktop-container: 75.000em !default;
+$desktop-container: 60.000em !default;
+$tablet-container: 48.000em !default;
+$large-mobile-container: 30.000em !default;
+$mobile-container: 100% !default;
+
+// Breakpoint Variables For Particles
+$media: "all" !default;
+$mobile-only: "#{$media} and (max-width:#{$tablet-container - 0.062})" !default;
+$no-mobile: "#{$media} and (min-width:#{$tablet-container})" !default;
+$small-mobile-range: "#{$media} and (max-width:#{$large-mobile-container})" !default;
+$large-mobile-range: "#{$media} and (min-width:#{$large-mobile-container + 0.063}) and (max-width:#{$tablet-container - 0.062})" !default;
+$tablet-range: "#{$media} and (min-width:#{$tablet-container}) and (max-width:#{$desktop-container - 0.062})" !default;
+$desktop-range: "#{$media} and (min-width:#{$desktop-container}) and (max-width:#{$large-desktop-container - 0.062})" !default;
+$large-desktop-range: "#{$media} and (min-width:#{$large-desktop-container})" !default;
diff --git a/src/user/themes/antimatter/scss/configuration/nucleus/_core.scss b/src/user/themes/antimatter/scss/configuration/nucleus/_core.scss
new file mode 100644
index 0000000..49c79ff
--- /dev/null
+++ b/src/user/themes/antimatter/scss/configuration/nucleus/_core.scss
@@ -0,0 +1,2 @@
+// Border Radius
+$core-border-radius: rem(3) !default;
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/configuration/nucleus/_layout.scss b/src/user/themes/antimatter/scss/configuration/nucleus/_layout.scss
new file mode 100644
index 0000000..98b2803
--- /dev/null
+++ b/src/user/themes/antimatter/scss/configuration/nucleus/_layout.scss
@@ -0,0 +1,8 @@
+// Content Block Spacing Variables
+$content-margin: 0.625rem !default;
+$content-padding: 0.938rem !default;
+
+// Fixed Block Variables
+$fixed-block-full: percentage(1/4) !default;
+$fixed-block-desktop: percentage(1/3) !default;
+$fixed-block-tablet: percentage(1/2) !default;
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/configuration/nucleus/_nav.scss b/src/user/themes/antimatter/scss/configuration/nucleus/_nav.scss
new file mode 100644
index 0000000..5a63a55
--- /dev/null
+++ b/src/user/themes/antimatter/scss/configuration/nucleus/_nav.scss
@@ -0,0 +1,3 @@
+// Dropdowns
+$dropdown-width: 140px !default;
+$flyout-width: 140px !default;
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/configuration/nucleus/_typography.scss b/src/user/themes/antimatter/scss/configuration/nucleus/_typography.scss
new file mode 100644
index 0000000..09a3e9b
--- /dev/null
+++ b/src/user/themes/antimatter/scss/configuration/nucleus/_typography.scss
@@ -0,0 +1,14 @@
+// Base Sizes
+$core-font-size: 1rem !default;
+$core-line-height: 1.7 !default;
+
+// Heading Sizes
+$h1-font-size: $core-font-size + 2.20 !default;
+$h2-font-size: $core-font-size + 1.50 !default;
+$h3-font-size: $core-font-size + 1.10 !default;
+$h4-font-size: $core-font-size + 0.75 !default;
+$h5-font-size: $core-font-size + 0.35 !default;
+$h6-font-size: $core-font-size - 0.15 !default;
+
+// Spacing
+$leading-margin: $core-line-height * 1rem !default;
diff --git a/src/user/themes/antimatter/scss/configuration/template/_base.scss b/src/user/themes/antimatter/scss/configuration/template/_base.scss
new file mode 100644
index 0000000..5b5e7ee
--- /dev/null
+++ b/src/user/themes/antimatter/scss/configuration/template/_base.scss
@@ -0,0 +1,11 @@
+// Colors
+@import "colors";
+
+// Typography
+@import "typography";
+
+// Typography
+@import "bullets";
+
+// Variables
+@import "variables";
diff --git a/src/user/themes/antimatter/scss/configuration/template/_bullets.scss b/src/user/themes/antimatter/scss/configuration/template/_bullets.scss
new file mode 100644
index 0000000..004a88a
--- /dev/null
+++ b/src/user/themes/antimatter/scss/configuration/template/_bullets.scss
@@ -0,0 +1,5 @@
+$bullet-icon-size: 3.5rem;
+
+$bullet-icon-color-1: $core-accent;
+$bullet-icon-color-2: adjust-hue($core-accent, -20);
+$bullet-icon-color-3: adjust-hue($core-accent, -130);
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/configuration/template/_colors.scss b/src/user/themes/antimatter/scss/configuration/template/_colors.scss
new file mode 100644
index 0000000..01aff52
--- /dev/null
+++ b/src/user/themes/antimatter/scss/configuration/template/_colors.scss
@@ -0,0 +1,75 @@
+// Core
+$core-text: #444;
+$core-accent: #1BB3E9;
+$secondary-link: #F6635E;
+$white: #fff;
+$black: #000;
+$light-gray: #ddd;
+$border-color: #EEEEEE;
+
+// Borders
+$core-border-color: $light-gray;
+$core-border-color-hover: darken($core-border-color, 10);
+$core-border-color-focus: $core-accent;
+
+// Shadows
+$core-box-shadow: inset 0 1px 3px hsla(0, 0%, 0%, 0.06);
+$core-box-shadow-focus: $core-box-shadow, 0 0 5px rgba(darken($core-border-color-focus, 5), 0.7);
+
+// Background
+$page-bg: #fff;
+
+// Header
+$header-text: #FFFFFF;
+
+// Nav
+$navbar-text: #75879A;
+$navbar-bg: #FFFFFF;
+
+// Showcase
+$showcase-bg: lighten($core-accent, 6%);
+$showcase-text: #fff;
+
+// Feature
+$feature-bg: #fff;
+
+// Main Body
+$main-bg: #f7f7f7;
+$body-border: darken($main-bg, 5%);
+
+// Sidebar
+$sidebar-text: #aaa;
+
+// Bottom
+$bottom-bg: #f7f7f7;
+$bottom-text: $core-text;
+
+// Footer
+$footer-bg: #333;
+$footer-text: #999;
+
+$rule-color: #F0F2F4;
+$code-text: #c7254e;
+$code-bg: #f9f2f4;
+$pre-text: #237794;
+$pre-bg: #f6f6f6;
+
+// Dark Contrast variation
+$dark-navbar-text: #999;
+$dark-sidebar: #222;
+$dark-sidebar-text: #999;
+$dark-main-bg: #333;
+$dark-body-border: #666;
+
+// Info - Yellow
+$notes-info-border: #F0AD4E;
+$notes-info-bg: #FCF8F2;
+// Warning - Red
+$notes-warning-border: #D9534F;
+$notes-warning-bg: #FDF7F7;
+// Note - Blue
+$notes-note-border: #5BC0DE;
+$notes-note-bg: #F4F8FA;
+// Success - Green
+$notes-success-border: #5CB85C;
+$notes-success-bg: #F1F9F1;
diff --git a/src/user/themes/antimatter/scss/configuration/template/_typography.scss b/src/user/themes/antimatter/scss/configuration/template/_typography.scss
new file mode 100644
index 0000000..9acc432
--- /dev/null
+++ b/src/user/themes/antimatter/scss/configuration/template/_typography.scss
@@ -0,0 +1,7 @@
+// Font Family
+$font-family-default: "Raleway", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif;
+$font-family-header: "Montserrat", "Helvetica", "Tahoma", "Geneva", "Arial", sans-serif;
+$font-family-mono: "Inconsolata", monospace;
+$font-family-serif: "Georgia", "Times", "Times New Roman", serif;
+
+$icons: "FontAwesome";
diff --git a/src/user/themes/antimatter/scss/configuration/template/_variables.scss b/src/user/themes/antimatter/scss/configuration/template/_variables.scss
new file mode 100644
index 0000000..48fc717
--- /dev/null
+++ b/src/user/themes/antimatter/scss/configuration/template/_variables.scss
@@ -0,0 +1,13 @@
+// Sizes
+$header-height: 5rem;
+$footer-height: 6rem;
+$border-radius: 3px;
+
+// Font Weights
+$font-weight-bold: 600;
+$font-weight-regular: 400;
+$font-weight-light:300;
+
+// Global Paddings
+$padding-horiz: 7rem;
+$padding-vert: 3rem;
diff --git a/src/user/themes/antimatter/scss/nucleus.scss b/src/user/themes/antimatter/scss/nucleus.scss
new file mode 100644
index 0000000..9cb9575
--- /dev/null
+++ b/src/user/themes/antimatter/scss/nucleus.scss
@@ -0,0 +1,27 @@
+// REQUIRED DEPENDENCIES - DO NOT CHANGE
+
+// Load Third Party Libraries
+@import "vendor/bourbon/bourbon";
+
+// Load Nucleus Configuration
+@import "configuration/nucleus/base";
+
+// Load Nucleus Mixins and Functions
+@import "nucleus/functions/base";
+@import "nucleus/mixins/base";
+
+//-------------------------------------------
+
+// LOAD NUCLEUS COMPONENTS
+
+// Core
+@import "nucleus/core";
+
+// Flex
+@import "nucleus/flex";
+
+// Typography
+@import "nucleus/typography";
+
+// Forms
+@import "nucleus/forms";
diff --git a/src/user/themes/antimatter/scss/nucleus/_core.scss b/src/user/themes/antimatter/scss/nucleus/_core.scss
new file mode 100644
index 0000000..947b500
--- /dev/null
+++ b/src/user/themes/antimatter/scss/nucleus/_core.scss
@@ -0,0 +1,217 @@
+*, *::before, *::after {
+ @include box-sizing(border-box);
+}
+
+@-webkit-viewport{width:device-width}
+@-moz-viewport{width:device-width}
+@-ms-viewport{width:device-width}
+@-o-viewport{width:device-width}
+@viewport{width:device-width}
+
+html {
+ font-size: 100%;
+ -ms-text-size-adjust: 100%;
+ -webkit-text-size-adjust: 100%;
+}
+
+body {
+ margin: 0;
+}
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+nav,
+section,
+summary {
+ display: block;
+}
+
+audio,
+canvas,
+progress,
+video {
+ display: inline-block;
+ vertical-align: baseline;
+}
+
+audio:not([controls]) {
+ display: none;
+ height: 0;
+}
+
+[hidden],
+template {
+ display: none;
+}
+
+a {
+ background: transparent;
+ text-decoration: none;
+}
+
+a:active,
+a:hover {
+ outline: 0;
+}
+
+abbr[title] {
+ border-bottom: 1px dotted;
+}
+
+b,
+strong {
+ font-weight: bold;
+}
+
+dfn {
+ font-style: italic;
+}
+
+mark {
+ background: #ff0;
+ color: #000;
+}
+
+sub,
+sup {
+ font-size: $core-font-size - 0.250;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sup {
+ top: -0.5em;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+img {
+ border: 0;
+ max-width: 100%;
+}
+
+svg:not(:root) {
+ overflow: hidden;
+}
+
+figure {
+ margin: 1em 40px;
+}
+
+hr {
+ height: 0;
+}
+
+pre {
+ overflow: auto;
+}
+
+code,
+kbd,
+pre,
+samp {
+ font-size: $core-font-size;
+}
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ color: inherit;
+ font: inherit;
+ margin: 0;
+}
+
+button {
+ overflow: visible;
+}
+
+button,
+select {
+ text-transform: none;
+}
+
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button;
+ cursor: pointer;
+}
+
+button[disabled],
+html input[disabled] {
+ cursor: default;
+}
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+ border: 0;
+ padding: 0;
+}
+
+input {
+ line-height: normal;
+}
+
+input[type="checkbox"],
+input[type="radio"] {
+ padding: 0;
+}
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+
+input[type="search"] {
+ -webkit-appearance: textfield;
+}
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+legend {
+ border: 0;
+ padding: 0;
+}
+
+textarea {
+ overflow: auto;
+}
+
+optgroup {
+ font-weight: bold;
+}
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ table-layout: fixed;
+ width: 100%;
+}
+
+tr, td, th {
+ vertical-align: middle;
+}
+
+th, td {
+ padding: ($leading-margin / 4) 0;
+}
+
+th {
+ text-align: left;
+}
diff --git a/src/user/themes/antimatter/scss/nucleus/_flex.scss b/src/user/themes/antimatter/scss/nucleus/_flex.scss
new file mode 100644
index 0000000..f4ddf0d
--- /dev/null
+++ b/src/user/themes/antimatter/scss/nucleus/_flex.scss
@@ -0,0 +1,197 @@
+// Page Container
+.container {
+ width: $large-desktop-container;
+ margin: 0 auto;
+ padding: 0;
+ @include breakpoint(desktop-range) {
+ width: $desktop-container;
+ }
+ @include breakpoint(tablet-range) {
+ width: $tablet-container;
+ }
+ @include breakpoint(large-mobile-range) {
+ width: $large-mobile-container;
+ }
+ @include breakpoint(small-mobile-range) {
+ width: $mobile-container;
+ }
+}
+
+// Grid Row and Column Setup
+.grid {
+ @include display(flex);
+ @include flex-flow(row);
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ @include breakpoint(mobile-only) {
+ @include flex-flow(row wrap);
+ }
+}
+
+.block {
+ @include flex(1);
+ min-width: 0;
+ min-height: 0;
+ @include breakpoint(mobile-only) {
+ @include flex(0 100%);
+ }
+}
+
+// Content Block Spacing
+.content {
+ margin: $content-margin;
+ padding: $content-padding;
+}
+
+body [class*="size-"] {
+ @include breakpoint(mobile-only) {
+ @include flex(0 100%);
+ }
+}
+
+// Custom Size Modifiers
+.size-1-2 {
+ @include flex(0 percentage(1/2));
+}
+
+.size-1-3 {
+ @include flex(0 percentage(1/3));
+}
+
+.size-1-4 {
+ @include flex(0 percentage(1/4));
+}
+
+.size-1-5 {
+ @include flex(0 percentage(1/5));
+}
+
+.size-1-6 {
+ @include flex(0 percentage(1/6));
+}
+
+.size-1-7 {
+ @include flex(0 percentage(1/7));
+}
+
+.size-1-8 {
+ @include flex(0 percentage(1/8));
+}
+
+.size-1-9 {
+ @include flex(0 percentage(1/9));
+}
+
+.size-1-10 {
+ @include flex(0 percentage(1/10));
+}
+
+.size-1-11 {
+ @include flex(0 percentage(1/11));
+}
+
+.size-1-12 {
+ @include flex(0 percentage(1/12));
+}
+
+@include breakpoint(tablet-range) {
+ .size-tablet-1-2 {
+ @include flex(0 percentage(1/2));
+ }
+
+ .size-tablet-1-3 {
+ @include flex(0 percentage(1/3));
+ }
+
+ .size-tablet-1-4 {
+ @include flex(0 percentage(1/4));
+ }
+
+ .size-tablet-1-5 {
+ @include flex(0 percentage(1/5));
+ }
+
+ .size-tablet-1-6 {
+ @include flex(0 percentage(1/6));
+ }
+
+ .size-tablet-1-7 {
+ @include flex(0 percentage(1/7));
+ }
+
+ .size-tablet-1-8 {
+ @include flex(0 percentage(1/8));
+ }
+
+ .size-tablet-1-9 {
+ @include flex(0 percentage(1/9));
+ }
+
+ .size-tablet-1-10 {
+ @include flex(0 percentage(1/10));
+ }
+
+ .size-tablet-1-11 {
+ @include flex(0 percentage(1/11));
+ }
+
+ .size-tablet-1-12 {
+ @include flex(0 percentage(1/12));
+ }
+}
+
+// Fix for Firefox versions 27 and below
+@include breakpoint(mobile-only) {
+ @supports not (flex-wrap: wrap) {
+ .grid {
+ display: block;
+ @include flex-wrap(inherit);
+ }
+ .block {
+ display: block;
+ @include flex(inherit);
+ }
+ }
+}
+
+// Reordering
+.first-block {
+ -webkit-box-ordinal-group: 0;
+ -webkit-order: -1;
+ -ms-flex-order: -1;
+ order: -1;
+}
+
+.last-block {
+ -webkit-box-ordinal-group: 2;
+ -webkit-order: 1;
+ -ms-flex-order: 1;
+ order: 1;
+}
+
+// Fixed Grid Style
+.fixed-blocks {
+ @include flex-flow(row wrap);
+ .block {
+ @include flex(inherit);
+ width: $fixed-block-full;
+ @include breakpoint(desktop-range) {
+ width: $fixed-block-desktop;
+ }
+ @include breakpoint(tablet-range) {
+ width: $fixed-block-tablet;
+ }
+ @include breakpoint(mobile-only) {
+ width: 100%;
+ }
+ }
+}
+
+// Fix for browsers that don't support flex-wrap
+@supports not (flex-wrap: wrap) {
+ .fixed-blocks {
+ display: block;
+ @include flex-flow(inherit);
+ }
+}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/nucleus/_forms.scss b/src/user/themes/antimatter/scss/nucleus/_forms.scss
new file mode 100644
index 0000000..0c3e91f
--- /dev/null
+++ b/src/user/themes/antimatter/scss/nucleus/_forms.scss
@@ -0,0 +1,63 @@
+fieldset {
+ border: 0;
+ padding: $content-padding;
+ margin: 0 0 $leading-margin 0;
+}
+
+input,
+label,
+select {
+ display: block;
+}
+
+label {
+ margin-bottom: $leading-margin / 4;
+
+ &.required:after {
+ content: "*";
+ }
+
+ abbr {
+ display: none;
+ }
+}
+
+textarea, #{$all-text-inputs}, select[multiple=multiple] {
+ @include transition(border-color);
+ border-radius: $core-border-radius;
+ margin-bottom: $leading-margin / 2;
+ padding: ($leading-margin / 4) ($leading-margin / 4);
+ width: 100%;
+
+ &:focus {
+ outline: none;
+ }
+}
+
+textarea {
+ resize: vertical;
+}
+
+input[type="checkbox"], input[type="radio"] {
+ display: inline;
+ margin-right: $leading-margin / 4;
+}
+
+input[type="file"] {
+ width: 100%;
+}
+
+select {
+ width: auto;
+ max-width: 100%;
+ margin-bottom: $leading-margin;
+}
+
+button,
+input[type="submit"] {
+ cursor: pointer;
+ user-select: none;
+ vertical-align: middle;
+ white-space: nowrap;
+ border: inherit;
+}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/nucleus/_typography.scss b/src/user/themes/antimatter/scss/nucleus/_typography.scss
new file mode 100644
index 0000000..5e74101
--- /dev/null
+++ b/src/user/themes/antimatter/scss/nucleus/_typography.scss
@@ -0,0 +1,86 @@
+// Body Base
+body {
+ font-size: $core-font-size;
+ line-height: $core-line-height;
+}
+
+// Headings
+h1, h2, h3, h4, h5, h6 {
+ margin: $leading-margin / 2 0 $leading-margin 0;
+ text-rendering: optimizeLegibility;
+}
+
+h1 {
+ font-size: $h1-font-size;
+}
+
+h2 {
+ font-size: $h2-font-size;
+}
+
+h3 {
+ font-size: $h3-font-size;
+}
+
+h4 {
+ font-size: $h4-font-size;
+}
+
+h5 {
+ font-size: $h5-font-size;
+}
+
+h6 {
+ font-size: $h6-font-size;
+}
+
+// Paragraph
+p {
+ margin: $leading-margin 0;
+}
+
+// Lists
+ul, ol {
+ margin-top: $leading-margin;
+ margin-bottom: $leading-margin;
+ ul, ol {
+ margin-top: 0;
+ margin-bottom: 0;
+ }
+}
+
+// Blockquote
+blockquote {
+ margin: $leading-margin 0;
+ padding-left: $leading-margin / 2;
+}
+
+cite {
+ display: block;
+ font-size: $core-font-size - 0.125;
+ &:before {
+ content: "\2014 \0020";
+ }
+}
+
+// Inline and Code
+pre {
+ margin: $leading-margin 0;
+ padding: $content-padding;
+}
+
+code {
+ vertical-align: bottom;
+}
+
+// Extras
+small {
+ font-size: $core-font-size - 0.125;
+}
+
+hr {
+ border-left: none;
+ border-right: none;
+ border-top: none;
+ margin: $leading-margin 0;
+}
diff --git a/src/user/themes/antimatter/scss/nucleus/functions/_base.scss b/src/user/themes/antimatter/scss/nucleus/functions/_base.scss
new file mode 100644
index 0000000..ffef250
--- /dev/null
+++ b/src/user/themes/antimatter/scss/nucleus/functions/_base.scss
@@ -0,0 +1,2 @@
+@import "direction";
+@import "range";
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/nucleus/functions/_direction.scss b/src/user/themes/antimatter/scss/nucleus/functions/_direction.scss
new file mode 100644
index 0000000..e336bb5
--- /dev/null
+++ b/src/user/themes/antimatter/scss/nucleus/functions/_direction.scss
@@ -0,0 +1,37 @@
+@function opposite-direction($dir) {
+ @if $dir == 'left' {
+ @return right;
+ }
+ @else if $dir == 'right' {
+ @return left;
+ }
+ @else if $dir == 'ltr' {
+ @return rtl;
+ }
+ @else if $dir == 'rtl' {
+ @return ltr;
+ }
+ @else if $dir == 'top' {
+ @return bottom;
+ }
+ @else if $dir == 'bottom' {
+ @return top;
+ }
+ @else {
+ @warn "#{$dir} is not a direction! Make sure your direction is all lowercase!";
+ @return false;
+ }
+}
+
+@function named-direction($dir) {
+ @if $dir == 'ltr' {
+ @return left;
+ }
+ @else if $dir == 'rtl' {
+ @return right;
+ }
+ @else {
+ @warn "#{$dir} is not a valid HTML direction! Make sure you are using a valid HTML direction";
+ @return false;
+ }
+}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/nucleus/functions/_range.scss b/src/user/themes/antimatter/scss/nucleus/functions/_range.scss
new file mode 100644
index 0000000..0e9dec9
--- /dev/null
+++ b/src/user/themes/antimatter/scss/nucleus/functions/_range.scss
@@ -0,0 +1,13 @@
+@function lower-bound($range){
+ @if length($range) <= 0 {
+ @return 0;
+ }
+ @return nth($range,1);
+}
+
+@function upper-bound($range) {
+ @if length($range) < 2 {
+ @return 999999999999;
+ }
+ @return nth($range, 2);
+}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/nucleus/mixins/_base.scss b/src/user/themes/antimatter/scss/nucleus/mixins/_base.scss
new file mode 100644
index 0000000..5e4a709
--- /dev/null
+++ b/src/user/themes/antimatter/scss/nucleus/mixins/_base.scss
@@ -0,0 +1,2 @@
+@import "breakpoints";
+@import "utilities";
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/nucleus/mixins/_breakpoints.scss b/src/user/themes/antimatter/scss/nucleus/mixins/_breakpoints.scss
new file mode 100644
index 0000000..7e86f8b
--- /dev/null
+++ b/src/user/themes/antimatter/scss/nucleus/mixins/_breakpoints.scss
@@ -0,0 +1,30 @@
+// Breakpoints
+@mixin breakpoint($breakpoints, $media: all) {
+ @each $breakpoint in $breakpoints {
+ @if $breakpoint == large-desktop-range {
+ @media only #{$media} and (min-width: $large-desktop-container) { @content; }
+ }
+ @else if $breakpoint == desktop-range {
+ @media only #{$media} and (min-width: $desktop-container) and (max-width: $large-desktop-container - 0.062) { @content; }
+ }
+ @else if $breakpoint == tablet-range {
+ @media only #{$media} and (min-width: $tablet-container) and (max-width: $desktop-container - 0.062) { @content; }
+ }
+ @else if $breakpoint == large-mobile-range {
+ @media only #{$media} and (min-width: $large-mobile-container + 0.063) and (max-width: $tablet-container - 0.062) { @content; }
+ }
+ @else if $breakpoint == small-mobile-range {
+ @media only #{$media} and (max-width: $large-mobile-container) { @content; }
+ }
+ @else if $breakpoint == no-mobile {
+ @media only #{$media} and (min-width: $tablet-container) { @content; }
+ }
+ @else if $breakpoint == mobile-only {
+ @media only #{$media} and (max-width: $tablet-container - 0.062) { @content; }
+ }
+ @else if $breakpoint == desktop-only {
+ @media only #{$media} and (max-width: $desktop-container - 0.062) { @content; }
+ }
+ }
+
+}
diff --git a/src/user/themes/antimatter/scss/nucleus/mixins/_utilities.scss b/src/user/themes/antimatter/scss/nucleus/mixins/_utilities.scss
new file mode 100644
index 0000000..217d4df
--- /dev/null
+++ b/src/user/themes/antimatter/scss/nucleus/mixins/_utilities.scss
@@ -0,0 +1,30 @@
+
+
+// List Reset
+%list-reset {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+// Vertical Centering
+%vertical-align {
+ position: relative;
+ top: 50%;
+ -webkit-transform: translateY(-50%);
+ -moz-transform: translateY(-50%);
+ -o-transform: translateY(-50%);
+ -ms-transform: translateY(-50%);
+ transform: translateY(-50%);
+}
+
+// Columns
+@mixin columns($columns) {
+ width: percentage(1/$columns);
+}
+
+// Float with margin variable
+@mixin float($direction, $margin: 0) {
+ float: $direction;
+ margin-#{opposite-direction($direction)}: $margin;
+}
diff --git a/src/user/themes/antimatter/scss/nucleus/particles/_align-text.scss b/src/user/themes/antimatter/scss/nucleus/particles/_align-text.scss
new file mode 100644
index 0000000..94ef815
--- /dev/null
+++ b/src/user/themes/antimatter/scss/nucleus/particles/_align-text.scss
@@ -0,0 +1,46 @@
+// Alignment Classes
+$align-class-names:
+ large-desktop,
+ desktop,
+ tablet,
+ large-mobile,
+ small-mobile,
+ no-mobile,
+ mobile-only;
+
+// Breakpoints
+$align-class-breakpoints:
+ $large-desktop-range,
+ $desktop-range,
+ $tablet-range,
+ $large-mobile-range,
+ $small-mobile-range,
+ $no-mobile,
+ $mobile-only;
+
+// Create Responsive Alignment Classes
+@mixin align-classes{
+ .text-left {
+ text-align: left !important;
+ }
+ .text-right {
+ text-align: right !important;
+ }
+ .text-center {
+ text-align: center !important;
+ }
+ .text-justify {
+ text-align: justify !important;
+ }
+
+ @for $i from 1 through length($align-class-names) {
+ @media #{(nth($align-class-breakpoints, $i))} {
+ .#{(nth($align-class-names, $i))}-text-left { text-align: left !important; }
+ .#{(nth($align-class-names, $i))}-text-right { text-align: right !important; }
+ .#{(nth($align-class-names, $i))}-text-center { text-align: center !important; }
+ .#{(nth($align-class-names, $i))}-text-justify { text-align: justify !important; }
+ }
+ }
+}
+
+@include align-classes;
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/nucleus/particles/_visibility.scss b/src/user/themes/antimatter/scss/nucleus/particles/_visibility.scss
new file mode 100644
index 0000000..e69de29
diff --git a/src/user/themes/antimatter/scss/particles.scss b/src/user/themes/antimatter/scss/particles.scss
new file mode 100644
index 0000000..79c7aab
--- /dev/null
+++ b/src/user/themes/antimatter/scss/particles.scss
@@ -0,0 +1,24 @@
+// REQUIRED DEPENDENCIES - DO NOT CHANGE
+
+// Load Third Party Libraries
+@import "vendor/bourbon/bourbon";
+
+// Load Nucleus Configuration
+@import "configuration/nucleus/base";
+
+// Load Template Configuration
+@import "configuration/template/base";
+
+// Load Nucleus Mixins and Functions
+@import "nucleus/functions/base";
+@import "nucleus/mixins/base";
+
+//-------------------------------------------
+
+// LOAD PARTICLES
+
+// Text Alignment Classes
+@import "nucleus/particles/align-text";
+
+// Show and Hide Based on Screen Size
+@import "nucleus/particles/visibility";
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/template.scss b/src/user/themes/antimatter/scss/template.scss
new file mode 100644
index 0000000..43a4045
--- /dev/null
+++ b/src/user/themes/antimatter/scss/template.scss
@@ -0,0 +1,67 @@
+// REQUIRED DEPENDENCIES - DO NOT CHANGE
+
+// Load Third Party Libraries
+@import "vendor/bourbon/bourbon";
+
+// Load Nucleus Configuration
+@import "configuration/nucleus/base";
+
+// Load Template Configuration
+@import "configuration/template/base";
+
+// Load Nucleus Mixins and Functions
+@import "nucleus/functions/base";
+@import "nucleus/mixins/base";
+
+// Load Template Library
+@import "template/modules/base";
+
+//-------------------------------------------
+
+// TEMPLATE COMPONENTS
+
+// Core
+@import "template/core";
+@import "template/fonts";
+
+// Extensions
+@import "template/extensions";
+
+// Header
+@import "template/header";
+
+// Footer
+@import "template/footer";
+
+// Typography
+@import "template/typography";
+
+// Forms
+@import "template/forms";
+
+// Tables
+@import "template/tables";
+
+// Buttons
+@import "template/buttons";
+
+// Bullets
+@import "template/bullets";
+
+// Pushy Panel
+@import "template/panel";
+
+// Blog
+@import "template/blog";
+
+// Errors
+@import "template/errors";
+
+// SimpleSearch
+@import "template/simplesearch";
+
+// Custom
+@import "template/custom";
+
+// Modular
+@import "template/modular/all";
diff --git a/src/user/themes/antimatter/scss/template/_blog.scss b/src/user/themes/antimatter/scss/template/_blog.scss
new file mode 100644
index 0000000..233731a
--- /dev/null
+++ b/src/user/themes/antimatter/scss/template/_blog.scss
@@ -0,0 +1,171 @@
+.blog-header {
+
+ padding-top: 2rem;
+ padding-bottom: 2rem;
+
+ &.blog-header-image {
+ background-size: cover;
+ background-position: center;
+
+ h1, h2 {
+ color: $header-text;
+ }
+
+ }
+
+ h1 {
+ font-size: 4rem;
+ margin-top: 0;
+ @include breakpoint(tablet-range) {
+ font-size: 3rem;
+ }
+ @include breakpoint(mobile-only) {
+ font-size: 2.5rem;
+ line-height: 1.2;
+ margin-bottom: 2.5rem;
+ }
+ }
+
+ & + .blog-content {
+ padding-top: $padding-vert;
+ }
+}
+
+// List Blog Item
+.list-item {
+
+ border-bottom: 1px solid $border-color;
+ margin-bottom: $padding-vert;
+
+ &:last-child {
+ border-bottom: 0;
+ }
+
+ .list-blog-header {
+ position: relative;
+ h4 {
+
+ margin-bottom: 0.5rem;
+ a {
+ color: $core-text;
+ &:hover {
+ color: $core-accent;
+ }
+ }
+ }
+
+ img {
+ display: block;
+ margin-top: 1rem;
+ border-radius: $border-radius;
+ }
+ }
+
+ .list-blog-date {
+ float: right;
+ text-align: center;
+ span {
+ display: block;
+ font-size: 1.75rem;
+ font-weight: $font-weight-bold;
+ line-height: 110%;
+ }
+ em {
+ display: block;
+ border-top: 1px solid $border-color;
+ font-style: normal;
+ text-transform: uppercase;
+ }
+ }
+}
+
+// Bigger first para
+.blog-content-item {
+ .list-blog-padding > p:nth-child(2) {
+ font-size: $core-font-size + 0.2rem;
+ }
+}
+
+// Tags
+.tags {
+ a {
+ display: inline-block;
+ font-size: $core-font-size - 0.2rem;
+ border: 1px solid $core-accent;
+ border-radius: $border-radius;
+ padding: 0.1rem 0.4rem;
+ margin-bottom: 0.2rem;
+ text-transform: uppercase;
+ }
+}
+
+// Archives & Related-Pages
+.archives, .related-pages {
+ padding: 0;
+ list-style: none;
+ li {
+ border-bottom: 1px solid $border-color;
+ line-height: $core-font-size + 1rem;
+ &:last-child {
+ border-bottom: 0;
+ }
+ }
+}
+
+.related-pages {
+ li {
+ a {
+ display: block;
+ }
+ }
+ .score {
+ display: block;
+ float: right;
+ color: #999;
+ font-size: 85%
+ }
+}
+
+// Syndicate
+.syndicate {
+ a {
+ margin-bottom: 1rem;
+ }
+}
+
+// Breadcrumbs
+div#breadcrumbs {
+ padding-left: 0;
+ @include breakpoint(mobile-only) {
+ display: none;
+ }
+}
+
+// Sidebar
+#sidebar {
+ padding-left: 3rem;
+ @include breakpoint(mobile-only) {
+ padding-left: 0;
+ }
+ .sidebar-content {
+ h4 {
+ margin-bottom: 1rem;
+ }
+ p, ul {
+ margin-top: 1rem;
+ }
+ margin-bottom: $padding-vert;
+ }
+}
+
+// Pagination
+ul.pagination {
+ margin: 0 0 $padding-vert;
+ text-align: center;
+}
+
+// Prev / Next
+.prev-next {
+ margin-top: 5rem;
+ text-align: center;
+}
diff --git a/src/user/themes/antimatter/scss/template/_bullets.scss b/src/user/themes/antimatter/scss/template/_bullets.scss
new file mode 100644
index 0000000..c1762df
--- /dev/null
+++ b/src/user/themes/antimatter/scss/template/_bullets.scss
@@ -0,0 +1,60 @@
+.bullets {
+ margin: $leading-margin 0;
+ margin-left: -$leading-margin / 2;
+ margin-right: -$leading-margin / 2;
+ overflow: auto;
+}
+
+.bullet {
+ float: left;
+ padding: 0 $leading-margin / 2;
+}
+
+.two-column-bullet {
+ @include columns(2);
+ @include breakpoint(mobile-only) {
+ @include columns(1);
+ }
+}
+
+.three-column-bullet {
+ @include columns(3);
+ @include breakpoint(mobile-only) {
+ @include columns(1);
+ }
+}
+
+.four-column-bullet {
+ @include columns(4);
+ @include breakpoint(mobile-only) {
+ @include columns(1);
+ }
+}
+
+.bullet-icon {
+ float: left;
+ background: $bullet-icon-color-1;
+ padding: $bullet-icon-size / 4;
+ width: $bullet-icon-size;
+ height: $bullet-icon-size;
+ border-radius: 50%;
+ color: $white;
+ font-size: $bullet-icon-size / 2;
+ text-align: center;
+}
+
+.bullet-icon-1 {
+ background: $bullet-icon-color-1;
+}
+
+.bullet-icon-2 {
+ background: $bullet-icon-color-2;
+}
+
+.bullet-icon-3 {
+ background: $bullet-icon-color-3;
+}
+
+.bullet-content {
+ margin-left: $bullet-icon-size * 1.3;
+}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/template/_buttons.scss b/src/user/themes/antimatter/scss/template/_buttons.scss
new file mode 100644
index 0000000..2402bde
--- /dev/null
+++ b/src/user/themes/antimatter/scss/template/_buttons.scss
@@ -0,0 +1,9 @@
+.button {
+ @extend %button;
+ @include button-color($core-accent);
+}
+
+.button-secondary {
+ @extend %button;
+ @include button-color($secondary-link);
+}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/template/_core.scss b/src/user/themes/antimatter/scss/template/_core.scss
new file mode 100644
index 0000000..f9caaf3
--- /dev/null
+++ b/src/user/themes/antimatter/scss/template/_core.scss
@@ -0,0 +1,58 @@
+html, body {
+ height: 100%; // use !important to override slidebars.min.css
+}
+
+body {
+ background: $page-bg;
+ color: $core-text;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+a {
+ color: $core-accent;
+ &:hover {
+ color: darken($core-accent, 20%);
+ }
+}
+
+b, strong {
+ font-weight: $font-weight-bold
+}
+
+// Global Container
+#container {
+ min-height: 100%;
+ position: relative;
+}
+
+// Fullwidth styles
+.fullwidth {
+ #body {
+ padding-left: 0;
+ padding-right: 0;
+ }
+ #header, #breadcrumbs, .blog-header, .blog-content-item, .content-wrapper, ul.pagination, #body > .modular-row {
+ @extend .padding-horiz;
+ }
+}
+
+// Global body styling
+#body {
+ @extend .default-animation;
+ @extend .padding-horiz;
+
+ background: $page-bg;
+ padding-top: $header-height + $padding-vert;
+ padding-bottom: $footer-height + $padding-vert + 2rem;
+}
+
+// Alignment
+.left {
+ float: left;
+}
+
+.right {
+ float: right;
+}
+
diff --git a/src/user/themes/antimatter/scss/template/_custom.scss b/src/user/themes/antimatter/scss/template/_custom.scss
new file mode 100644
index 0000000..6b79579
--- /dev/null
+++ b/src/user/themes/antimatter/scss/template/_custom.scss
@@ -0,0 +1,15 @@
+// Your custom SCSS should be written here...
+
+.grav-lightslider {
+ .lSSlideOuter {
+ .lSPager.lSpg {
+ > li a {
+ z-index: 1;
+ }
+ }
+ }
+}
+
+#body > script:first-child + .grav-lightslider {
+ margin-top: -3rem;
+}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/template/_errors.scss b/src/user/themes/antimatter/scss/template/_errors.scss
new file mode 100644
index 0000000..7a1df79
--- /dev/null
+++ b/src/user/themes/antimatter/scss/template/_errors.scss
@@ -0,0 +1,17 @@
+// Error specific styling
+#error {
+ text-align: center;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 100%;
+ padding-bottom: 6rem;
+
+ h1 {
+ font-size: $core-font-size + 4.0rem;
+ }
+
+ p {
+ margin: 1rem 0;
+ }
+}
diff --git a/src/user/themes/antimatter/scss/template/_extensions.scss b/src/user/themes/antimatter/scss/template/_extensions.scss
new file mode 100644
index 0000000..6a9b1b0
--- /dev/null
+++ b/src/user/themes/antimatter/scss/template/_extensions.scss
@@ -0,0 +1,22 @@
+.default-animation {
+ @include transition(all 0.5s ease);
+}
+
+.padding-horiz {
+ padding-left: $padding-horiz;
+ padding-right: $padding-horiz;
+ @include breakpoint(desktop-only) {
+ padding-left: $padding-horiz - 3rem;
+ padding-right: $padding-horiz - 3rem;
+ }
+
+ @include breakpoint(mobile-only) {
+ padding-left: $padding-horiz - 6rem;
+ padding-right: $padding-horiz - 6rem;
+ }
+}
+
+.padding-vert {
+ padding-top: $padding-vert;
+ padding-bottom: $padding-vert;
+}
diff --git a/src/user/themes/antimatter/scss/template/_fonts.scss b/src/user/themes/antimatter/scss/template/_fonts.scss
new file mode 100644
index 0000000..3e57631
--- /dev/null
+++ b/src/user/themes/antimatter/scss/template/_fonts.scss
@@ -0,0 +1,3 @@
+// Import Google Web Fonts
+@import url(//fonts.googleapis.com/css?family=Montserrat:400|Raleway:300,400,600|Inconsolata);
+
diff --git a/src/user/themes/antimatter/scss/template/_footer.scss b/src/user/themes/antimatter/scss/template/_footer.scss
new file mode 100644
index 0000000..e3cc95f
--- /dev/null
+++ b/src/user/themes/antimatter/scss/template/_footer.scss
@@ -0,0 +1,42 @@
+// Footer styling
+#footer {
+ position: absolute;
+ background: $footer-bg;
+ height: $footer-height;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ @extend .padding-horiz;
+ color: $footer-text;
+ text-align: center;
+
+ a:hover {
+ color: #fff;
+ }
+
+ .totop {
+ position: absolute;
+ bottom: $footer-height - 1rem;
+ text-align: center;
+ left: 0;
+ right: 0;
+ span {
+ font-size: 1.7rem;
+ line-height: 2.5rem;
+ background: $footer-bg;
+ width: 3rem;
+ height: 2rem;
+ border-radius: $border-radius;
+ display: inline-block;
+ text-align: top;
+ }
+ }
+
+ p {
+ @extend %vertical-align;
+ margin: 0;
+ .fa {
+ color: #fff;
+ }
+ }
+}
diff --git a/src/user/themes/antimatter/scss/template/_forms.scss b/src/user/themes/antimatter/scss/template/_forms.scss
new file mode 100644
index 0000000..9255b4c
--- /dev/null
+++ b/src/user/themes/antimatter/scss/template/_forms.scss
@@ -0,0 +1,43 @@
+fieldset {
+ border: 1px solid $core-border-color;
+}
+
+textarea, #{$all-text-inputs}, select[multiple=multiple] {
+ background-color: white;
+ border: 1px solid $core-border-color;
+ box-shadow: $core-box-shadow;
+
+ &:hover {
+ border-color: $core-border-color-hover;
+ }
+
+ &:focus {
+ border-color: $core-border-color-focus;
+ box-shadow: $core-box-shadow-focus;
+ }
+}
+
+label {
+ @extend strong;
+}
+
+// Forms
+.form-field {
+ .required {
+ color: #F3443F;
+ font-size: $core-font-size + 2rem;
+ line-height: $core-font-size + 2rem;
+ vertical-align: top;
+ height: 1.5rem;
+ display: inline-block;
+ }
+}
+
+form {
+ .buttons {
+ text-align: center;
+ }
+ input {
+ font-weight: 400;
+ }
+}
diff --git a/src/user/themes/antimatter/scss/template/_header.scss b/src/user/themes/antimatter/scss/template/_header.scss
new file mode 100644
index 0000000..9d2ad8f
--- /dev/null
+++ b/src/user/themes/antimatter/scss/template/_header.scss
@@ -0,0 +1,231 @@
+// Header styling
+
+#header {
+ @extend .default-animation;
+ @extend .padding-horiz;
+ position: fixed;
+ z-index: 10;
+ width: 100%;
+ height: $header-height;
+ background-color: rgba(255,255,255,0.90);
+ box-shadow: 0 0.05rem 1rem rgba(0,0,0, 0.15);
+
+ // scroll based changes
+ &.scrolled {
+ height: $header-height - 2rem;
+ background-color: rgba(255,255,255,0.90) !important;
+ box-shadow: 0 0.05rem 1rem rgba(0,0,0, 0.15) !important;
+
+ #logo h3 {
+ color: $core-text !important;
+ font-size: 1.6rem !important;
+ }
+ #logo a, #navbar span {
+ color: $core-text !important;
+ }
+ #navbar a {
+ color: $core-accent !important;
+ &:hover {
+ color: darken($core-accent, 20%) !important;
+ }
+ }
+ #navbar a:before, #navbar a:after {
+ background-color: $core-accent !important;
+ }
+ }
+
+ // set heights for vertical centering
+ > .grid, #logo, #navbar {
+ height: 100%;
+ }
+
+ #logo {
+ float: left;
+ h3 {
+ @extend .default-animation;
+ @extend %vertical-align;
+ font-size: 2rem;
+ line-height: 2rem;
+ margin: 0;
+ text-transform: uppercase;
+ a {
+ color: $core-text;
+ }
+ }
+ }
+
+ #navbar {
+ font-size: $core-font-size - 0.1rem;
+ ul {
+
+ margin: 0;
+ padding: 0;
+ list-style: none;
+
+ &.navigation {
+ @extend %vertical-align;
+ display: inline-block;
+
+ float: right;
+ li {
+ float: left;
+ position: relative;
+
+ a {
+ font-family: $font-family-header;
+ display: inline-block;
+ padding: 0.3rem 0.8rem;
+
+ &:before, &:after {
+ content: "";
+ position: absolute;
+ width: 100%;
+ height: 1px;
+ bottom: 0;
+ left: 0;
+ background-color: $core-accent;
+ visibility: hidden;
+ @include transform(scaleX(0));
+ @include transition(all 0.2s ease);
+ }
+
+ &:hover:before {
+ visibility: visible;
+ @include transform(scaleX(0.75));
+ }
+
+ &.active:after {
+ top: 0;
+ visibility: visible;
+ @include transform(scaleX(0.75));
+ }
+ }
+
+ &.active {
+ a:after {
+ top: 0;
+ visibility: visible;
+ @include transform(scaleX(0.75));
+ }
+ }
+
+ // Dropdown Menu Styles
+ ul {
+ display: none;
+ padding: 0;
+ box-shadow: 0 0.05rem 1rem rgba(0,0,0, 0.15) !important;
+ }
+
+ ul ul {
+ left: 100%;
+ top: 0;
+ }
+
+
+ &:hover {
+ & > ul {
+ display: block;
+ position: absolute;
+ background: rgba($white, 0.9);
+ width: 10rem;
+ }
+
+ li {
+ float: none;
+ margin: 0;
+ padding: 0;
+
+ a {
+ padding: 0.5rem 0.8rem;
+ display: block;
+
+ &:before, &:after {
+ display: none;
+ }
+ }
+
+ &.active {
+ & > a {
+ background: $core-accent;
+ color: $white;
+ }
+ }
+ }
+ }
+ }
+ @include breakpoint(desktop-only) {
+ display: none;
+ }
+ }
+ }
+
+ .panel-activation {
+ @extend %vertical-align;
+ padding: 1rem;
+ display: none;
+ font-size: 1.8rem;
+ cursor: pointer;
+ float: right;
+ @include breakpoint(desktop-only) {
+ display: inline-block;
+ }
+ }
+
+ }
+
+}
+
+// Header Image
+.header-image {
+ &.fullwidth {
+ #body {
+ padding-left: 0;
+ padding-right: 0;
+
+ >.listing-row {
+ padding-left: $padding-horiz;
+ padding-right: $padding-horiz;
+ }
+ }
+ }
+ .listing-row:last-child {
+ margin-bottom: 2rem;
+ }
+
+ #body {
+ .flush-top {
+ margin-top: - $header-height - $padding-vert - 1.5rem;
+ padding-top: $header-height + 4rem;
+ }
+ }
+
+ #breadcrumbs {
+ margin-top: 1rem;
+ }
+
+ #header {
+ background-color: rgba($header-text,0);
+ box-shadow: none;
+
+ #logo h3, #logo a {
+ color: $header-text;
+ }
+ a, .menu-btn {
+ color: $header-text;
+ }
+ a:before, a:after {
+ background-color: rgba($header-text,0.7) !important;
+ }
+
+ #navbar ul.navigation {
+
+ ul li a {
+
+ color: $core-accent;
+ &:hover {
+ color: darken($core-accent, 20%);
+ }
+ }
+ }
+ }
+}
diff --git a/src/user/themes/antimatter/scss/template/_panel.scss b/src/user/themes/antimatter/scss/template/_panel.scss
new file mode 100644
index 0000000..b84a49d
--- /dev/null
+++ b/src/user/themes/antimatter/scss/template/_panel.scss
@@ -0,0 +1,74 @@
+$sidebar-color: #333;
+$panel-padding: 1rem;
+$panel-text: #ddd;
+
+.sb-slidebar {
+ background-color: $sidebar-color !important;
+}
+
+#panel {
+ padding-top: $panel-padding;
+ color: $panel-text;
+ .navigation {
+ list-style: none;
+ padding: 0;
+
+ li {
+ a {
+ color: $panel-text;
+ display: block;
+ padding: 0.5rem 1rem;
+ font-weight: 600;
+
+ &:hover {
+ color: lighten($panel-text,20%);
+ background-color: darken($sidebar-color,5%);
+ }
+
+ &:last-child {
+ border-bottom: 0;
+ }
+ }
+
+ &.active {
+ & > a {
+ background: #fff;
+ color: $core-text;
+ &:hover {
+ color: $core-text;
+ }
+ }
+ }
+ border-bottom: 1px solid lighten($sidebar-color,4%);
+ &:first-child {
+ border-top: 1px solid lighten($sidebar-color,4%);
+ }
+
+ ul {
+ list-style: none;
+ padding: 0;
+
+ li {
+ border: 0 !important;
+ a {
+ color: darken($panel-text, 10%);
+ padding: 0.2rem 1rem 0.2rem 2rem;
+ font-size: 0.9rem;
+ }
+ li a {
+ padding-left: 3rem;
+ li a {
+ padding-left: 4rem;
+ }
+ }
+ &.active {
+ & > a {
+ background: #ccc;
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
diff --git a/src/user/themes/antimatter/scss/template/_simplesearch.scss b/src/user/themes/antimatter/scss/template/_simplesearch.scss
new file mode 100644
index 0000000..65101c0
--- /dev/null
+++ b/src/user/themes/antimatter/scss/template/_simplesearch.scss
@@ -0,0 +1,53 @@
+.simplesearch {
+
+ h1 {
+ margin-bottom: 0;
+ }
+
+ .center {
+ text-align: center;
+ }
+
+
+ input {
+ display: inline-block;
+ max-width: 30rem;
+ font-size: 2rem;
+ }
+
+ .search-image {
+ margin-top: 1rem;
+ img {
+ border-radius: 4px;
+
+ @include breakpoint(mobile-only) {
+ display: none;
+ }
+ }
+ }
+
+ .search-item {
+ @include breakpoint(mobile-only) {
+ margin-left: 0;
+ }
+ }
+
+ .search-details {
+ float: right;
+ margin-top: -2.5rem;
+ font-weight: bold;
+ font-size: 1rem;
+ color: lighten($core-text,20%);
+
+ @include breakpoint(mobile-only) {
+ float: none;
+ margin-top: -0.2rem;
+ margin-bottom: 1rem;
+ }
+ }
+
+ hr {
+ border-bottom: 1px solid #eee;
+ }
+
+}
diff --git a/src/user/themes/antimatter/scss/template/_tables.scss b/src/user/themes/antimatter/scss/template/_tables.scss
new file mode 100644
index 0000000..215fdce
--- /dev/null
+++ b/src/user/themes/antimatter/scss/template/_tables.scss
@@ -0,0 +1,15 @@
+table {
+ border: 1px solid lighten($core-border-color,5%);
+ table-layout: auto;
+}
+
+th {
+ @extend strong;
+ background: lighten($core-border-color,10%);
+ padding: 0.5rem;
+}
+
+td {
+ padding: 0.5rem;
+ border: 1px solid lighten($core-border-color,5%);
+}
diff --git a/src/user/themes/antimatter/scss/template/_typography.scss b/src/user/themes/antimatter/scss/template/_typography.scss
new file mode 100644
index 0000000..c87dd6e
--- /dev/null
+++ b/src/user/themes/antimatter/scss/template/_typography.scss
@@ -0,0 +1,236 @@
+// Body Base
+html, body, button, input, select, textarea, .pure-g, .pure-g [class *= "pure-u"] {
+ font-family: $font-family-default;
+ font-weight: 400;
+}
+
+// Headings
+h1, h2, h3, h4, h5, h6 {
+ font-family: $font-family-header;
+ font-weight: 400;
+ text-rendering: optimizeLegibility;
+ letter-spacing: -0px;
+}
+
+h1 {
+ font-size: $h1-font-size;
+ @include breakpoint(mobile-only) {
+ font-size: 2.5rem;
+ line-height: 1.2;
+ margin-bottom: 2.5rem;
+ }
+}
+
+h2 {
+ @include breakpoint(tablet-range) {
+ font-size: $h2-font-size - .40;
+ }
+ @include breakpoint(mobile-only) {
+ font-size: $h2-font-size - .50;
+ }
+}
+
+h3 {
+ @include breakpoint(tablet-range) {
+ font-size: $h3-font-size - .40;
+ }
+ @include breakpoint(mobile-only) {
+ font-size: $h3-font-size - .50;
+ }
+}
+
+h4 {
+ @include breakpoint(tablet-range) {
+ font-size: $h4-font-size - .40;
+ }
+ @include breakpoint(mobile-only) {
+ font-size: $h4-font-size - .50;
+ }
+}
+
+h1 {
+ text-align: center;
+ letter-spacing: -3px;
+}
+
+h2 {
+ letter-spacing: -2px;
+}
+
+h3 {
+ letter-spacing: -1px;
+}
+
+h1 + h2 {
+ margin: -2rem 0 2rem 0;
+ font-size: 2rem;
+ @include breakpoint(tablet-range) {
+ font-size: 1.6rem;
+ }
+ @include breakpoint(mobile-only) {
+ font-size: 1.5rem;
+ }
+ line-height: 1;
+ text-align: center;
+ font-family: $font-family-default;
+ font-weight: 300;
+}
+
+h2 + h3 {
+ margin: 0.5rem 0 2rem 0;
+ font-size: 2rem;
+ @include breakpoint(tablet-range) {
+ font-size: 1.6rem;
+ }
+ @include breakpoint(mobile-only) {
+ font-size: 1.5rem;
+ }
+ line-height: 1;
+ text-align: center;
+ font-family: $font-family-default;
+ font-weight: 300;
+}
+
+
+// Blockquote
+blockquote {
+ border-left: 10px solid $rule-color;
+ p {
+ font-size: 1.1rem;
+ color: #999;
+ }
+ cite {
+ display: block;
+ text-align: right;
+ color: #666;
+ font-size: 1.2rem;
+ }
+}
+
+// NOTES!!!!
+blockquote > blockquote > blockquote {
+
+ margin: 0;
+
+ p {
+
+ padding: 15px;
+ display: block;
+ font-size: 1rem;
+ margin-top: 0rem;
+ margin-bottom: 0rem;
+ }
+
+ > p {
+ // Yellow
+ margin-left: -71px;
+ border-left: 10px solid $notes-info-border;
+ background: $notes-info-bg;
+ color: darken($notes-info-border,15%);
+ a {
+ color: darken($notes-info-border,25%);
+ &:hover {
+ color: lighten($notes-info-border,5%);
+ }
+ }
+ }
+
+ > blockquote > p {
+ // Red
+ margin-left: -94px;
+ border-left: 10px solid $notes-warning-border;
+ background: $notes-warning-bg;
+ color: darken($notes-warning-border,15%);
+ a {
+ color: darken($notes-warning-border,25%);
+ &:hover {
+ color: lighten($notes-warning-border,5%);
+ }
+ }
+ }
+
+ > blockquote > blockquote > p {
+ // Blue
+ margin-left: -118px;
+ border-left: 10px solid $notes-note-border;
+ background: $notes-note-bg;
+ color: darken($notes-note-border,15%);
+ a {
+ color: darken($notes-note-border,25%);
+ &:hover {
+ color: lighten($notes-note-border,5%);
+ }
+ }
+ }
+
+ > blockquote > blockquote > blockquote > p {
+ // Green
+ margin-left: -142px;
+ border-left: 10px solid $notes-success-border;
+ background: $notes-success-bg;
+ color: darken($notes-success-border,15%);
+ a {
+ color: darken($notes-success-border,25%);
+ &:hover {
+ color: lighten($notes-success-border,5%);
+ }
+ }
+ }
+
+}
+
+// Inline and Code
+code,
+kbd,
+pre,
+samp {
+ font-family: $font-family-mono;
+}
+
+code {
+ background: $code-bg;
+ color: darken($code-text,10%);
+}
+
+pre {
+ padding: 2rem;
+ background: $pre-bg;
+ border: 1px solid $core-border-color;
+ border-radius: 3px;
+ code {
+ color: $pre-text;
+ background: inherit;
+ }
+}
+
+// Extras
+hr {
+ border-bottom: 4px solid $rule-color;
+}
+
+// Page Title
+.page-title {
+ margin-top: -25px;
+ padding: 25px;
+ float: left;
+ clear: both;
+ background: $core-accent;
+ color: $white;
+}
+
+// Label
+.label {
+ vertical-align: middle;
+ background: $core-accent;
+ border-radius: 100%;
+ color: $white;
+ height: 1rem;
+ min-width: 1rem;
+ line-height: 1rem;
+ display: inline-block;
+ text-align: center;
+ font-size: $core-font-size - 0.3rem;
+ font-family: $font-family-header;
+ margin-right: 0.75rem;
+}
+
diff --git a/src/user/themes/antimatter/scss/template/modular/_all.scss b/src/user/themes/antimatter/scss/template/modular/_all.scss
new file mode 100644
index 0000000..a672afd
--- /dev/null
+++ b/src/user/themes/antimatter/scss/template/modular/_all.scss
@@ -0,0 +1,9 @@
+@import "showcase";
+@import "features";
+@import "text";
+
+.modular {
+ .modular-row:last-child {
+ margin-bottom: 2rem;
+ }
+}
diff --git a/src/user/themes/antimatter/scss/template/modular/_features.scss b/src/user/themes/antimatter/scss/template/modular/_features.scss
new file mode 100644
index 0000000..16db421
--- /dev/null
+++ b/src/user/themes/antimatter/scss/template/modular/_features.scss
@@ -0,0 +1,99 @@
+// Modular Showcase styling
+.modular {
+ .features {
+ padding: 6rem 0;
+ text-align: center;
+ @include clearfix;
+
+ h2 {
+ margin: 0;
+ line-height: 100%;
+ }
+
+ p {
+ margin: 1rem 0;
+ font-size: $core-font-size + 0.2rem;
+ @include breakpoint(mobile-only) {
+ font-size: $core-font-size;
+ }
+ }
+
+ .feature-items {
+ margin-top: 2rem;
+ @supports not (flex-wrap: wrap) {
+ overflow: hidden;
+ }
+ }
+
+ .feature {
+ display:block;
+ float: left;
+ width: 25%;
+ vertical-align: top;
+ margin-top: 2rem;
+ margin-bottom: 1rem;
+ @include breakpoint(large-mobile-range) {
+ margin-top: 1rem;
+ width: 50%;
+ }
+ @include breakpoint(small-mobile-range) {
+ margin-top: 1rem;
+ width: 100%;
+ }
+
+ i.fa {
+ font-size: 2rem;
+ color: $core-accent;
+ }
+
+ h4 {
+ margin: 0;
+ font-size: 1.1rem;
+ }
+
+ p {
+ display: inline-block;
+ font-size: $core-font-size;
+ margin: 0.2rem 0 1rem;
+ }
+ }
+
+ &.big {
+
+ text-align: center;
+
+ .feature {
+ width: 50%;
+ @include breakpoint(small-mobile-range) {
+ margin-top: 1rem;
+ width: 100%;
+ }
+ }
+
+ i.fa {
+ font-size: 3rem;
+ float: left;
+ }
+
+ .feature-content {
+ padding-right: 2rem;
+
+ &.icon-offset {
+ margin-left: 5rem;
+ }
+
+ h4 {
+ font-size: 1.3rem;
+ text-align: left;
+ }
+
+ p {
+ padding: 0;
+ text-align: left;
+ }
+ }
+ }
+
+ }
+
+}
diff --git a/src/user/themes/antimatter/scss/template/modular/_showcase.scss b/src/user/themes/antimatter/scss/template/modular/_showcase.scss
new file mode 100644
index 0000000..3bc8d34
--- /dev/null
+++ b/src/user/themes/antimatter/scss/template/modular/_showcase.scss
@@ -0,0 +1,60 @@
+// Modular Showcase styling
+.modular {
+
+ // special case for header
+ &.header-image {
+
+ #header {
+ background-color: rgba(255,255,255,0);
+ box-shadow: none;
+
+ #logo h3 {
+ color: $header-text;
+ }
+ #navbar a {
+ color: $header-text;
+ }
+ }
+ }
+
+ .showcase {
+
+ padding-top: 4rem;
+ padding-bottom: 4rem;
+ background-color: #666;
+ background-size: cover;
+ background-position: center;
+
+ text-align: center;
+ color: $header-text;
+ h1 {
+ font-size: 4rem;
+ margin-top: 0;
+ @include breakpoint(tablet-range) {
+ font-size: 3rem;
+ }
+ @include breakpoint(mobile-only) {
+ font-size: 2.5rem;
+ line-height: 1.2;
+ margin-bottom: 2.5rem;
+ }
+ }
+
+ .button {
+ @extend .default-animation;
+ color: $header-text;
+ padding: 0.7rem 2rem;
+ margin-top: 2rem;
+ background: rgba(255,255,255,0);
+ border: 1px solid $header-text;
+ border-radius: $border-radius;
+ box-shadow: none;
+ font-size: $core-font-size + 0.3rem;
+
+ &:hover {
+ background: rgba(255,255,255,0.2);
+ }
+ }
+ }
+
+}
diff --git a/src/user/themes/antimatter/scss/template/modular/_text.scss b/src/user/themes/antimatter/scss/template/modular/_text.scss
new file mode 100644
index 0000000..1450bb6
--- /dev/null
+++ b/src/user/themes/antimatter/scss/template/modular/_text.scss
@@ -0,0 +1,35 @@
+// variables
+$text-bg: #f6f6f6;
+$text-padding: 6rem;
+$image-margin: 2rem;
+
+
+// styling
+.callout {
+ background: $text-bg;
+ padding: $text-padding $content-padding;
+ @include breakpoint(desktop-only) {
+ text-align: center;
+ }
+
+ .align-left {
+ float: left;
+ margin-right: $image-margin;
+ @include breakpoint(desktop-only) {
+ float: none;
+ margin-right: 0;
+ }
+ }
+
+ .align-right {
+ float: right;
+ margin-left: $image-margin;
+ @include breakpoint(desktop-only) {
+ float: none;
+ margin-left: 0;
+ }
+ }
+ img {
+ border-radius: $border-radius;
+ }
+}
diff --git a/src/user/themes/antimatter/scss/template/modules/_base.scss b/src/user/themes/antimatter/scss/template/modules/_base.scss
new file mode 100644
index 0000000..d3760d2
--- /dev/null
+++ b/src/user/themes/antimatter/scss/template/modules/_base.scss
@@ -0,0 +1,2 @@
+// Buttons
+@import "buttons";
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/template/modules/_buttons.scss b/src/user/themes/antimatter/scss/template/modules/_buttons.scss
new file mode 100644
index 0000000..747ffaf
--- /dev/null
+++ b/src/user/themes/antimatter/scss/template/modules/_buttons.scss
@@ -0,0 +1,24 @@
+%button {
+ display: inline-block;
+ padding: 7px 20px;
+
+ &.button-small {
+ padding: 3px 10px;
+ font-size: $core-font-size - 0.1rem;
+ }
+
+}
+
+@mixin button-color($color) {
+ background: $white;
+ color: $color;
+ border: 1px solid $color;
+ border-radius: 3px;
+ &:hover {
+ background: $color;
+ color: $white;
+ }
+ &:active {
+ box-shadow: 0 1px 0 darken($color, 12%);
+ }
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/_bourbon-deprecated-upcoming.scss b/src/user/themes/antimatter/scss/vendor/bourbon/_bourbon-deprecated-upcoming.scss
new file mode 100644
index 0000000..f946b3b
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/_bourbon-deprecated-upcoming.scss
@@ -0,0 +1,8 @@
+//************************************************************************//
+// These mixins/functions are deprecated
+// They will be removed in the next MAJOR version release
+//************************************************************************//
+@mixin inline-block {
+ display: inline-block;
+ @warn "inline-block mixin is deprecated and will be removed in the next major version release";
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/_bourbon.scss b/src/user/themes/antimatter/scss/vendor/bourbon/_bourbon.scss
new file mode 100644
index 0000000..64cb6ea
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/_bourbon.scss
@@ -0,0 +1,77 @@
+// Settings
+@import "settings/prefixer";
+@import "settings/px-to-em";
+
+// Custom Helpers
+@import "helpers/convert-units";
+@import "helpers/gradient-positions-parser";
+@import "helpers/is-num";
+@import "helpers/linear-angle-parser";
+@import "helpers/linear-gradient-parser";
+@import "helpers/linear-positions-parser";
+@import "helpers/linear-side-corner-parser";
+@import "helpers/radial-arg-parser";
+@import "helpers/radial-positions-parser";
+@import "helpers/radial-gradient-parser";
+@import "helpers/render-gradients";
+@import "helpers/shape-size-stripper";
+@import "helpers/str-to-num";
+
+// Custom Functions
+@import "functions/assign";
+@import "functions/color-lightness";
+@import "functions/flex-grid";
+@import "functions/golden-ratio";
+@import "functions/grid-width";
+@import "functions/modular-scale";
+@import "functions/px-to-em";
+@import "functions/px-to-rem";
+@import "functions/strip-units";
+@import "functions/tint-shade";
+@import "functions/transition-property-name";
+@import "functions/unpack";
+
+// CSS3 Mixins
+@import "css3/animation";
+@import "css3/appearance";
+@import "css3/backface-visibility";
+@import "css3/background";
+@import "css3/background-image";
+@import "css3/border-image";
+@import "css3/border-radius";
+@import "css3/box-sizing";
+@import "css3/calc";
+@import "css3/columns";
+@import "css3/filter";
+@import "css3/flex-box";
+@import "css3/font-face";
+@import "css3/hyphens";
+@import "css3/hidpi-media-query";
+@import "css3/image-rendering";
+@import "css3/keyframes";
+@import "css3/linear-gradient";
+@import "css3/perspective";
+@import "css3/radial-gradient";
+@import "css3/transform";
+@import "css3/transition";
+@import "css3/user-select";
+@import "css3/placeholder";
+
+// Addons & other mixins
+@import "addons/button";
+@import "addons/clearfix";
+@import "addons/directional-values";
+@import "addons/ellipsis";
+@import "addons/font-family";
+@import "addons/hide-text";
+@import "addons/html5-input-types";
+@import "addons/position";
+@import "addons/prefixer";
+@import "addons/retina-image";
+@import "addons/size";
+@import "addons/timing-functions";
+@import "addons/triangle";
+@import "addons/word-wrap";
+
+// Soon to be deprecated Mixins
+@import "bourbon-deprecated-upcoming";
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/addons/_button.scss b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_button.scss
new file mode 100644
index 0000000..14a89e4
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_button.scss
@@ -0,0 +1,374 @@
+@mixin button ($style: simple, $base-color: #4294f0, $text-size: inherit, $padding: 7px 18px) {
+
+ @if type-of($style) == string and type-of($base-color) == color {
+ @include buttonstyle($style, $base-color, $text-size, $padding);
+ }
+
+ @if type-of($style) == string and type-of($base-color) == number {
+ $padding: $text-size;
+ $text-size: $base-color;
+ $base-color: #4294f0;
+
+ @if $padding == inherit {
+ $padding: 7px 18px;
+ }
+
+ @include buttonstyle($style, $base-color, $text-size, $padding);
+ }
+
+ @if type-of($style) == color and type-of($base-color) == color {
+ $base-color: $style;
+ $style: simple;
+ @include buttonstyle($style, $base-color, $text-size, $padding);
+ }
+
+ @if type-of($style) == color and type-of($base-color) == number {
+ $padding: $text-size;
+ $text-size: $base-color;
+ $base-color: $style;
+ $style: simple;
+
+ @if $padding == inherit {
+ $padding: 7px 18px;
+ }
+
+ @include buttonstyle($style, $base-color, $text-size, $padding);
+ }
+
+ @if type-of($style) == number {
+ $padding: $base-color;
+ $text-size: $style;
+ $base-color: #4294f0;
+ $style: simple;
+
+ @if $padding == #4294f0 {
+ $padding: 7px 18px;
+ }
+
+ @include buttonstyle($style, $base-color, $text-size, $padding);
+ }
+
+ &:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+ }
+}
+
+
+// Selector Style Button
+//************************************************************************//
+@mixin buttonstyle($type, $b-color, $t-size, $pad) {
+ // Grayscale button
+ @if $type == simple and $b-color == grayscale($b-color) {
+ @include simple($b-color, true, $t-size, $pad);
+ }
+
+ @if $type == shiny and $b-color == grayscale($b-color) {
+ @include shiny($b-color, true, $t-size, $pad);
+ }
+
+ @if $type == pill and $b-color == grayscale($b-color) {
+ @include pill($b-color, true, $t-size, $pad);
+ }
+
+ @if $type == flat and $b-color == grayscale($b-color) {
+ @include flat($b-color, true, $t-size, $pad);
+ }
+
+ // Colored button
+ @if $type == simple {
+ @include simple($b-color, false, $t-size, $pad);
+ }
+
+ @else if $type == shiny {
+ @include shiny($b-color, false, $t-size, $pad);
+ }
+
+ @else if $type == pill {
+ @include pill($b-color, false, $t-size, $pad);
+ }
+
+ @else if $type == flat {
+ @include flat($b-color, false, $t-size, $pad);
+ }
+}
+
+
+// Simple Button
+//************************************************************************//
+@mixin simple($base-color, $grayscale: false, $textsize: inherit, $padding: 7px 18px) {
+ $color: hsl(0, 0, 100%);
+ $border: adjust-color($base-color, $saturation: 9%, $lightness: -14%);
+ $inset-shadow: adjust-color($base-color, $saturation: -8%, $lightness: 15%);
+ $stop-gradient: adjust-color($base-color, $saturation: 9%, $lightness: -11%);
+ $text-shadow: adjust-color($base-color, $saturation: 15%, $lightness: -18%);
+
+ @if is-light($base-color) {
+ $color: hsl(0, 0, 20%);
+ $text-shadow: adjust-color($base-color, $saturation: 10%, $lightness: 4%);
+ }
+
+ @if $grayscale == true {
+ $border: grayscale($border);
+ $inset-shadow: grayscale($inset-shadow);
+ $stop-gradient: grayscale($stop-gradient);
+ $text-shadow: grayscale($text-shadow);
+ }
+
+ border: 1px solid $border;
+ border-radius: 3px;
+ box-shadow: inset 0 1px 0 0 $inset-shadow;
+ color: $color;
+ display: inline-block;
+ font-size: $textsize;
+ font-weight: bold;
+ @include linear-gradient ($base-color, $stop-gradient);
+ padding: $padding;
+ text-decoration: none;
+ text-shadow: 0 1px 0 $text-shadow;
+ background-clip: padding-box;
+
+ &:hover:not(:disabled) {
+ $base-color-hover: adjust-color($base-color, $saturation: -4%, $lightness: -5%);
+ $inset-shadow-hover: adjust-color($base-color, $saturation: -7%, $lightness: 5%);
+ $stop-gradient-hover: adjust-color($base-color, $saturation: 8%, $lightness: -14%);
+
+ @if $grayscale == true {
+ $base-color-hover: grayscale($base-color-hover);
+ $inset-shadow-hover: grayscale($inset-shadow-hover);
+ $stop-gradient-hover: grayscale($stop-gradient-hover);
+ }
+
+ box-shadow: inset 0 1px 0 0 $inset-shadow-hover;
+ cursor: pointer;
+ @include linear-gradient ($base-color-hover, $stop-gradient-hover);
+ }
+
+ &:active:not(:disabled),
+ &:focus:not(:disabled) {
+ $border-active: adjust-color($base-color, $saturation: 9%, $lightness: -14%);
+ $inset-shadow-active: adjust-color($base-color, $saturation: 7%, $lightness: -17%);
+
+ @if $grayscale == true {
+ $border-active: grayscale($border-active);
+ $inset-shadow-active: grayscale($inset-shadow-active);
+ }
+
+ border: 1px solid $border-active;
+ box-shadow: inset 0 0 8px 4px $inset-shadow-active, inset 0 0 8px 4px $inset-shadow-active;
+ }
+}
+
+
+// Shiny Button
+//************************************************************************//
+@mixin shiny($base-color, $grayscale: false, $textsize: inherit, $padding: 7px 18px) {
+ $color: hsl(0, 0, 100%);
+ $border: adjust-color($base-color, $red: -117, $green: -111, $blue: -81);
+ $border-bottom: adjust-color($base-color, $red: -126, $green: -127, $blue: -122);
+ $fourth-stop: adjust-color($base-color, $red: -79, $green: -70, $blue: -46);
+ $inset-shadow: adjust-color($base-color, $red: 37, $green: 29, $blue: 12);
+ $second-stop: adjust-color($base-color, $red: -56, $green: -50, $blue: -33);
+ $text-shadow: adjust-color($base-color, $red: -140, $green: -141, $blue: -114);
+ $third-stop: adjust-color($base-color, $red: -86, $green: -75, $blue: -48);
+
+ @if is-light($base-color) {
+ $color: hsl(0, 0, 20%);
+ $text-shadow: adjust-color($base-color, $saturation: 10%, $lightness: 4%);
+ }
+
+ @if $grayscale == true {
+ $border: grayscale($border);
+ $border-bottom: grayscale($border-bottom);
+ $fourth-stop: grayscale($fourth-stop);
+ $inset-shadow: grayscale($inset-shadow);
+ $second-stop: grayscale($second-stop);
+ $text-shadow: grayscale($text-shadow);
+ $third-stop: grayscale($third-stop);
+ }
+
+ border: 1px solid $border;
+ border-bottom: 1px solid $border-bottom;
+ border-radius: 5px;
+ box-shadow: inset 0 1px 0 0 $inset-shadow;
+ color: $color;
+ display: inline-block;
+ font-size: $textsize;
+ font-weight: bold;
+ @include linear-gradient(top, $base-color 0%, $second-stop 50%, $third-stop 50%, $fourth-stop 100%);
+ padding: $padding;
+ text-align: center;
+ text-decoration: none;
+ text-shadow: 0 -1px 1px $text-shadow;
+
+ &:hover:not(:disabled) {
+ $first-stop-hover: adjust-color($base-color, $red: -13, $green: -15, $blue: -18);
+ $second-stop-hover: adjust-color($base-color, $red: -66, $green: -62, $blue: -51);
+ $third-stop-hover: adjust-color($base-color, $red: -93, $green: -85, $blue: -66);
+ $fourth-stop-hover: adjust-color($base-color, $red: -86, $green: -80, $blue: -63);
+
+ @if $grayscale == true {
+ $first-stop-hover: grayscale($first-stop-hover);
+ $second-stop-hover: grayscale($second-stop-hover);
+ $third-stop-hover: grayscale($third-stop-hover);
+ $fourth-stop-hover: grayscale($fourth-stop-hover);
+ }
+
+ cursor: pointer;
+ @include linear-gradient(top, $first-stop-hover 0%,
+ $second-stop-hover 50%,
+ $third-stop-hover 50%,
+ $fourth-stop-hover 100%);
+ }
+
+ &:active:not(:disabled),
+ &:focus:not(:disabled) {
+ $inset-shadow-active: adjust-color($base-color, $red: -111, $green: -116, $blue: -122);
+
+ @if $grayscale == true {
+ $inset-shadow-active: grayscale($inset-shadow-active);
+ }
+
+ box-shadow: inset 0 0 20px 0 $inset-shadow-active;
+ }
+}
+
+
+// Pill Button
+//************************************************************************//
+@mixin pill($base-color, $grayscale: false, $textsize: inherit, $padding: 7px 18px) {
+ $color: hsl(0, 0, 100%);
+ $border-bottom: adjust-color($base-color, $hue: 8, $saturation: -11%, $lightness: -26%);
+ $border-sides: adjust-color($base-color, $hue: 4, $saturation: -21%, $lightness: -21%);
+ $border-top: adjust-color($base-color, $hue: -1, $saturation: -30%, $lightness: -15%);
+ $inset-shadow: adjust-color($base-color, $hue: -1, $saturation: -1%, $lightness: 7%);
+ $stop-gradient: adjust-color($base-color, $hue: 8, $saturation: 14%, $lightness: -10%);
+ $text-shadow: adjust-color($base-color, $hue: 5, $saturation: -19%, $lightness: -15%);
+
+ @if is-light($base-color) {
+ $color: hsl(0, 0, 20%);
+ $text-shadow: adjust-color($base-color, $saturation: 10%, $lightness: 4%);
+ }
+
+ @if $grayscale == true {
+ $border-bottom: grayscale($border-bottom);
+ $border-sides: grayscale($border-sides);
+ $border-top: grayscale($border-top);
+ $inset-shadow: grayscale($inset-shadow);
+ $stop-gradient: grayscale($stop-gradient);
+ $text-shadow: grayscale($text-shadow);
+ }
+
+ border: 1px solid $border-top;
+ border-color: $border-top $border-sides $border-bottom;
+ border-radius: 16px;
+ box-shadow: inset 0 1px 0 0 $inset-shadow;
+ color: $color;
+ display: inline-block;
+ font-size: $textsize;
+ font-weight: normal;
+ line-height: 1;
+ @include linear-gradient ($base-color, $stop-gradient);
+ padding: $padding;
+ text-align: center;
+ text-decoration: none;
+ text-shadow: 0 -1px 1px $text-shadow;
+ background-clip: padding-box;
+
+ &:hover:not(:disabled) {
+ $base-color-hover: adjust-color($base-color, $lightness: -4.5%);
+ $border-bottom: adjust-color($base-color, $hue: 8, $saturation: 13.5%, $lightness: -32%);
+ $border-sides: adjust-color($base-color, $hue: 4, $saturation: -2%, $lightness: -27%);
+ $border-top: adjust-color($base-color, $hue: -1, $saturation: -17%, $lightness: -21%);
+ $inset-shadow-hover: adjust-color($base-color, $saturation: -1%, $lightness: 3%);
+ $stop-gradient-hover: adjust-color($base-color, $hue: 8, $saturation: -4%, $lightness: -15.5%);
+ $text-shadow-hover: adjust-color($base-color, $hue: 5, $saturation: -5%, $lightness: -22%);
+
+ @if $grayscale == true {
+ $base-color-hover: grayscale($base-color-hover);
+ $border-bottom: grayscale($border-bottom);
+ $border-sides: grayscale($border-sides);
+ $border-top: grayscale($border-top);
+ $inset-shadow-hover: grayscale($inset-shadow-hover);
+ $stop-gradient-hover: grayscale($stop-gradient-hover);
+ $text-shadow-hover: grayscale($text-shadow-hover);
+ }
+
+ border: 1px solid $border-top;
+ border-color: $border-top $border-sides $border-bottom;
+ box-shadow: inset 0 1px 0 0 $inset-shadow-hover;
+ cursor: pointer;
+ @include linear-gradient ($base-color-hover, $stop-gradient-hover);
+ text-shadow: 0 -1px 1px $text-shadow-hover;
+ background-clip: padding-box;
+ }
+
+ &:active:not(:disabled),
+ &:focus:not(:disabled) {
+ $active-color: adjust-color($base-color, $hue: 4, $saturation: -12%, $lightness: -10%);
+ $border-active: adjust-color($base-color, $hue: 6, $saturation: -2.5%, $lightness: -30%);
+ $border-bottom-active: adjust-color($base-color, $hue: 11, $saturation: 6%, $lightness: -31%);
+ $inset-shadow-active: adjust-color($base-color, $hue: 9, $saturation: 2%, $lightness: -21.5%);
+ $text-shadow-active: adjust-color($base-color, $hue: 5, $saturation: -12%, $lightness: -21.5%);
+
+ @if $grayscale == true {
+ $active-color: grayscale($active-color);
+ $border-active: grayscale($border-active);
+ $border-bottom-active: grayscale($border-bottom-active);
+ $inset-shadow-active: grayscale($inset-shadow-active);
+ $text-shadow-active: grayscale($text-shadow-active);
+ }
+
+ background: $active-color;
+ border: 1px solid $border-active;
+ border-bottom: 1px solid $border-bottom-active;
+ box-shadow: inset 0 0 6px 3px $inset-shadow-active;
+ text-shadow: 0 -1px 1px $text-shadow-active;
+ }
+}
+
+
+
+// Flat Button
+//************************************************************************//
+@mixin flat($base-color, $grayscale: false, $textsize: inherit, $padding: 7px 18px) {
+ $color: hsl(0, 0, 100%);
+
+ @if is-light($base-color) {
+ $color: hsl(0, 0, 20%);
+ }
+
+ background-color: $base-color;
+ border-radius: 3px;
+ border: none;
+ color: $color;
+ display: inline-block;
+ font-size: inherit;
+ font-weight: bold;
+ padding: 7px 18px;
+ text-decoration: none;
+ background-clip: padding-box;
+
+ &:hover:not(:disabled){
+ $base-color-hover: adjust-color($base-color, $saturation: 4%, $lightness: 5%);
+
+ @if $grayscale == true {
+ $base-color-hover: grayscale($base-color-hover);
+ }
+
+ background-color: $base-color-hover;
+ cursor: pointer;
+ }
+
+ &:active:not(:disabled),
+ &:focus:not(:disabled) {
+ $base-color-active: adjust-color($base-color, $saturation: -4%, $lightness: -5%);
+
+ @if $grayscale == true {
+ $base-color-active: grayscale($base-color-active);
+ }
+
+ background-color: $base-color-active;
+ cursor: pointer;
+ }
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/addons/_clearfix.scss b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_clearfix.scss
new file mode 100644
index 0000000..783cfbc
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_clearfix.scss
@@ -0,0 +1,23 @@
+// Modern micro clearfix provides an easy way to contain floats without adding additional markup.
+//
+// Example usage:
+//
+// // Contain all floats within .wrapper
+// .wrapper {
+// @include clearfix;
+// .content,
+// .sidebar {
+// float : left;
+// }
+// }
+
+@mixin clearfix {
+ &:after {
+ content:"";
+ display:table;
+ clear:both;
+ }
+}
+
+// Acknowledgements
+// Beat *that* clearfix: [Thierry Koblentz](http://www.css-101.org/articles/clearfix/latest-new-clearfix-so-far.php)
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/addons/_directional-values.scss b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_directional-values.scss
new file mode 100644
index 0000000..742f103
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_directional-values.scss
@@ -0,0 +1,111 @@
+// directional-property mixins are shorthands
+// for writing properties like the following
+//
+// @include margin(null 0 10px);
+// ------
+// margin-right: 0;
+// margin-bottom: 10px;
+// margin-left: 0;
+//
+// - or -
+//
+// @include border-style(dotted null);
+// ------
+// border-top-style: dotted;
+// border-bottom-style: dotted;
+//
+// ------
+//
+// Note: You can also use false instead of null
+
+@function collapse-directionals($vals) {
+ $output: null;
+
+ $A: nth( $vals, 1 );
+ $B: if( length($vals) < 2, $A, nth($vals, 2));
+ $C: if( length($vals) < 3, $A, nth($vals, 3));
+ $D: if( length($vals) < 2, $A, nth($vals, if( length($vals) < 4, 2, 4) ));
+
+ @if $A == 0 { $A: 0 }
+ @if $B == 0 { $B: 0 }
+ @if $C == 0 { $C: 0 }
+ @if $D == 0 { $D: 0 }
+
+ @if $A == $B and $A == $C and $A == $D { $output: $A }
+ @else if $A == $C and $B == $D { $output: $A $B }
+ @else if $B == $D { $output: $A $B $C }
+ @else { $output: $A $B $C $D }
+
+ @return $output;
+}
+
+@function contains-falsy($list) {
+ @each $item in $list {
+ @if not $item {
+ @return true;
+ }
+ }
+
+ @return false;
+}
+
+@mixin directional-property($pre, $suf, $vals) {
+ // Property Names
+ $top: $pre + "-top" + if($suf, "-#{$suf}", "");
+ $bottom: $pre + "-bottom" + if($suf, "-#{$suf}", "");
+ $left: $pre + "-left" + if($suf, "-#{$suf}", "");
+ $right: $pre + "-right" + if($suf, "-#{$suf}", "");
+ $all: $pre + if($suf, "-#{$suf}", "");
+
+ $vals: collapse-directionals($vals);
+
+ @if contains-falsy($vals) {
+ @if nth($vals, 1) { #{$top}: nth($vals, 1); }
+
+ @if length($vals) == 1 {
+ @if nth($vals, 1) { #{$right}: nth($vals, 1); }
+ } @else {
+ @if nth($vals, 2) { #{$right}: nth($vals, 2); }
+ }
+
+ // prop: top/bottom right/left
+ @if length($vals) == 2 {
+ @if nth($vals, 1) { #{$bottom}: nth($vals, 1); }
+ @if nth($vals, 2) { #{$left}: nth($vals, 2); }
+
+ // prop: top right/left bottom
+ } @else if length($vals) == 3 {
+ @if nth($vals, 3) { #{$bottom}: nth($vals, 3); }
+ @if nth($vals, 2) { #{$left}: nth($vals, 2); }
+
+ // prop: top right bottom left
+ } @else if length($vals) == 4 {
+ @if nth($vals, 3) { #{$bottom}: nth($vals, 3); }
+ @if nth($vals, 4) { #{$left}: nth($vals, 4); }
+ }
+
+ // prop: top/right/bottom/left
+ } @else {
+ #{$all}: $vals;
+ }
+}
+
+@mixin margin($vals...) {
+ @include directional-property(margin, false, $vals...);
+}
+
+@mixin padding($vals...) {
+ @include directional-property(padding, false, $vals...);
+}
+
+@mixin border-style($vals...) {
+ @include directional-property(border, style, $vals...);
+}
+
+@mixin border-color($vals...) {
+ @include directional-property(border, color, $vals...);
+}
+
+@mixin border-width($vals...) {
+ @include directional-property(border, width, $vals...);
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/addons/_ellipsis.scss b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_ellipsis.scss
new file mode 100644
index 0000000..a8ea2a4
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_ellipsis.scss
@@ -0,0 +1,7 @@
+@mixin ellipsis($width: 100%) {
+ display: inline-block;
+ max-width: $width;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/addons/_font-family.scss b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_font-family.scss
new file mode 100644
index 0000000..31f5d9c
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_font-family.scss
@@ -0,0 +1,5 @@
+$georgia: Georgia, Cambria, "Times New Roman", Times, serif;
+$helvetica: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif;
+$lucida-grande: "Lucida Grande", Tahoma, Verdana, Arial, sans-serif;
+$monospace: "Bitstream Vera Sans Mono", Consolas, Courier, monospace;
+$verdana: Verdana, Geneva, sans-serif;
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/addons/_hide-text.scss b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_hide-text.scss
new file mode 100644
index 0000000..fc79438
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_hide-text.scss
@@ -0,0 +1,10 @@
+@mixin hide-text {
+ overflow: hidden;
+
+ &:before {
+ content: "";
+ display: block;
+ width: 0;
+ height: 100%;
+ }
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/addons/_html5-input-types.scss b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_html5-input-types.scss
new file mode 100644
index 0000000..9e9324a
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_html5-input-types.scss
@@ -0,0 +1,86 @@
+//************************************************************************//
+// Generate a variable ($all-text-inputs) with a list of all html5
+// input types that have a text-based input, excluding textarea.
+// http://diveintohtml5.org/forms.html
+//************************************************************************//
+$inputs-list: 'input[type="email"]',
+ 'input[type="number"]',
+ 'input[type="password"]',
+ 'input[type="search"]',
+ 'input[type="tel"]',
+ 'input[type="text"]',
+ 'input[type="url"]',
+
+ // Webkit & Gecko may change the display of these in the future
+ 'input[type="color"]',
+ 'input[type="date"]',
+ 'input[type="datetime"]',
+ 'input[type="datetime-local"]',
+ 'input[type="month"]',
+ 'input[type="time"]',
+ 'input[type="week"]';
+
+// Bare inputs
+//************************************************************************//
+$all-text-inputs: assign-inputs($inputs-list);
+
+// Hover Pseudo-class
+//************************************************************************//
+$all-text-inputs-hover: assign-inputs($inputs-list, hover);
+
+// Focus Pseudo-class
+//************************************************************************//
+$all-text-inputs-focus: assign-inputs($inputs-list, focus);
+
+
+
+// You must use interpolation on the variable:
+// #{$all-text-inputs}
+// #{$all-text-inputs-hover}
+// #{$all-text-inputs-focus}
+
+// Example
+//************************************************************************//
+// #{$all-text-inputs}, textarea {
+// border: 1px solid red;
+// }
+
+
+
+//************************************************************************//
+// Generate a variable ($all-button-inputs) with a list of all html5
+// input types that have a button-based input, excluding button.
+//************************************************************************//
+$inputs-button-list: 'input[type="button"]',
+ 'input[type="reset"]',
+ 'input[type="submit"]';
+
+// Bare inputs
+//************************************************************************//
+$all-button-inputs: assign-inputs($inputs-button-list);
+
+// Hover Pseudo-class
+//************************************************************************//
+$all-button-inputs-hover: assign-inputs($inputs-button-list, hover);
+
+// Focus Pseudo-class
+//************************************************************************//
+$all-button-inputs-focus: assign-inputs($inputs-button-list, focus);
+
+// Active Pseudo-class
+//************************************************************************//
+$all-button-inputs-active: assign-inputs($inputs-button-list, active);
+
+
+
+// You must use interpolation on the variable:
+// #{$all-button-inputs}
+// #{$all-button-inputs-hover}
+// #{$all-button-inputs-focus}
+// #{$all-button-inputs-active}
+
+// Example
+//************************************************************************//
+// #{$all-button-inputs}, button {
+// border: 1px solid red;
+// }
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/addons/_position.scss b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_position.scss
new file mode 100644
index 0000000..7de7518
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_position.scss
@@ -0,0 +1,32 @@
+@mixin position ($position: relative, $coordinates: null null null null) {
+
+ @if type-of($position) == list {
+ $coordinates: $position;
+ $position: relative;
+ }
+
+ $coordinates: unpack($coordinates);
+
+ $top: nth($coordinates, 1);
+ $right: nth($coordinates, 2);
+ $bottom: nth($coordinates, 3);
+ $left: nth($coordinates, 4);
+
+ position: $position;
+
+ @if ($top and $top == auto) or (type-of($top) == number) {
+ top: $top;
+ }
+
+ @if ($right and $right == auto) or (type-of($right) == number) {
+ right: $right;
+ }
+
+ @if ($bottom and $bottom == auto) or (type-of($bottom) == number) {
+ bottom: $bottom;
+ }
+
+ @if ($left and $left == auto) or (type-of($left) == number) {
+ left: $left;
+ }
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/addons/_prefixer.scss b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_prefixer.scss
new file mode 100644
index 0000000..c32f502
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_prefixer.scss
@@ -0,0 +1,45 @@
+//************************************************************************//
+// Example: @include prefixer(border-radius, $radii, webkit ms spec);
+//************************************************************************//
+// Variables located in /settings/_prefixer.scss
+
+@mixin prefixer ($property, $value, $prefixes) {
+ @each $prefix in $prefixes {
+ @if $prefix == webkit {
+ @if $prefix-for-webkit {
+ -webkit-#{$property}: $value;
+ }
+ }
+ @else if $prefix == moz {
+ @if $prefix-for-mozilla {
+ -moz-#{$property}: $value;
+ }
+ }
+ @else if $prefix == ms {
+ @if $prefix-for-microsoft {
+ -ms-#{$property}: $value;
+ }
+ }
+ @else if $prefix == o {
+ @if $prefix-for-opera {
+ -o-#{$property}: $value;
+ }
+ }
+ @else if $prefix == spec {
+ @if $prefix-for-spec {
+ #{$property}: $value;
+ }
+ }
+ @else {
+ @warn "Unrecognized prefix: #{$prefix}";
+ }
+ }
+}
+
+@mixin disable-prefix-for-all() {
+ $prefix-for-webkit: false !global;
+ $prefix-for-mozilla: false !global;
+ $prefix-for-microsoft: false !global;
+ $prefix-for-opera: false !global;
+ $prefix-for-spec: false !global;
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/addons/_rem.scss b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_rem.scss
new file mode 100644
index 0000000..ddd7022
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_rem.scss
@@ -0,0 +1,33 @@
+@mixin rem($property, $size, $base: $em-base) {
+ @if not unitless($base) {
+ $base: strip-units($base);
+ }
+
+ $unitless_values: ();
+ @each $num in $size {
+ @if not unitless($num) {
+ @if unit($num) == "em" {
+ $num: $num * $base;
+ }
+
+ $num: strip-units($num);
+ }
+
+ $unitless_values: append($unitless_values, $num);
+ }
+ $size: $unitless_values;
+
+ $pixel_values: ();
+ $rem_values: ();
+ @each $value in $pxval {
+ $pixel_value: $value * 1px;
+ $pixel_values: append($pixel_values, $pixel_value);
+
+ $rem_value: ($value / $base) * 1rem;
+ $rem_values: append($rem_values, $rem_value);
+ }
+
+ #{$property}: $pixel_values;
+ #{$property}: $rem_values;
+}
+
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/addons/_retina-image.scss b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_retina-image.scss
new file mode 100644
index 0000000..7931bd1
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_retina-image.scss
@@ -0,0 +1,31 @@
+@mixin retina-image($filename, $background-size, $extension: png, $retina-filename: null, $retina-suffix: _2x, $asset-pipeline: false) {
+ @if $asset-pipeline {
+ background-image: image-url("#{$filename}.#{$extension}");
+ }
+ @else {
+ background-image: url("#{$filename}.#{$extension}");
+ }
+
+ @include hidpi {
+ @if $asset-pipeline {
+ @if $retina-filename {
+ background-image: image-url("#{$retina-filename}.#{$extension}");
+ }
+ @else {
+ background-image: image-url("#{$filename}#{$retina-suffix}.#{$extension}");
+ }
+ }
+
+ @else {
+ @if $retina-filename {
+ background-image: url("#{$retina-filename}.#{$extension}");
+ }
+ @else {
+ background-image: url("#{$filename}#{$retina-suffix}.#{$extension}");
+ }
+ }
+
+ background-size: $background-size;
+
+ }
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/addons/_size.scss b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_size.scss
new file mode 100644
index 0000000..ac705e2
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_size.scss
@@ -0,0 +1,16 @@
+@mixin size($size) {
+ $height: nth($size, 1);
+ $width: $height;
+
+ @if length($size) > 1 {
+ $height: nth($size, 2);
+ }
+
+ @if $height == auto or (type-of($height) == number and not unitless($height)) {
+ height: $height;
+ }
+
+ @if $width == auto or (type-of($height) == number and not unitless($width)) {
+ width: $width;
+ }
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/addons/_timing-functions.scss b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_timing-functions.scss
new file mode 100644
index 0000000..51b2410
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_timing-functions.scss
@@ -0,0 +1,32 @@
+// CSS cubic-bezier timing functions. Timing functions courtesy of jquery.easie (github.com/jaukia/easie)
+// Timing functions are the same as demo'ed here: http://jqueryui.com/demos/effect/easing.html
+
+// EASE IN
+$ease-in-quad: cubic-bezier(0.550, 0.085, 0.680, 0.530);
+$ease-in-cubic: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+$ease-in-quart: cubic-bezier(0.895, 0.030, 0.685, 0.220);
+$ease-in-quint: cubic-bezier(0.755, 0.050, 0.855, 0.060);
+$ease-in-sine: cubic-bezier(0.470, 0.000, 0.745, 0.715);
+$ease-in-expo: cubic-bezier(0.950, 0.050, 0.795, 0.035);
+$ease-in-circ: cubic-bezier(0.600, 0.040, 0.980, 0.335);
+$ease-in-back: cubic-bezier(0.600, -0.280, 0.735, 0.045);
+
+// EASE OUT
+$ease-out-quad: cubic-bezier(0.250, 0.460, 0.450, 0.940);
+$ease-out-cubic: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+$ease-out-quart: cubic-bezier(0.165, 0.840, 0.440, 1.000);
+$ease-out-quint: cubic-bezier(0.230, 1.000, 0.320, 1.000);
+$ease-out-sine: cubic-bezier(0.390, 0.575, 0.565, 1.000);
+$ease-out-expo: cubic-bezier(0.190, 1.000, 0.220, 1.000);
+$ease-out-circ: cubic-bezier(0.075, 0.820, 0.165, 1.000);
+$ease-out-back: cubic-bezier(0.175, 0.885, 0.320, 1.275);
+
+// EASE IN OUT
+$ease-in-out-quad: cubic-bezier(0.455, 0.030, 0.515, 0.955);
+$ease-in-out-cubic: cubic-bezier(0.645, 0.045, 0.355, 1.000);
+$ease-in-out-quart: cubic-bezier(0.770, 0.000, 0.175, 1.000);
+$ease-in-out-quint: cubic-bezier(0.860, 0.000, 0.070, 1.000);
+$ease-in-out-sine: cubic-bezier(0.445, 0.050, 0.550, 0.950);
+$ease-in-out-expo: cubic-bezier(1.000, 0.000, 0.000, 1.000);
+$ease-in-out-circ: cubic-bezier(0.785, 0.135, 0.150, 0.860);
+$ease-in-out-back: cubic-bezier(0.680, -0.550, 0.265, 1.550);
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/addons/_triangle.scss b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_triangle.scss
new file mode 100644
index 0000000..573954e
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_triangle.scss
@@ -0,0 +1,83 @@
+@mixin triangle ($size, $color, $direction) {
+ height: 0;
+ width: 0;
+
+ $width: nth($size, 1);
+ $height: nth($size, length($size));
+
+ $foreground-color: nth($color, 1);
+ $background-color: if(length($color) == 2, nth($color, 2), transparent);
+
+ @if ($direction == up) or ($direction == down) or ($direction == right) or ($direction == left) {
+
+ $width: $width / 2;
+ $height: if(length($size) > 1, $height, $height/2);
+
+ @if $direction == up {
+ border-left: $width solid $background-color;
+ border-right: $width solid $background-color;
+ border-bottom: $height solid $foreground-color;
+
+ } @else if $direction == right {
+ border-top: $width solid $background-color;
+ border-bottom: $width solid $background-color;
+ border-left: $height solid $foreground-color;
+
+ } @else if $direction == down {
+ border-left: $width solid $background-color;
+ border-right: $width solid $background-color;
+ border-top: $height solid $foreground-color;
+
+ } @else if $direction == left {
+ border-top: $width solid $background-color;
+ border-bottom: $width solid $background-color;
+ border-right: $height solid $foreground-color;
+ }
+ }
+
+ @else if ($direction == up-right) or ($direction == up-left) {
+ border-top: $height solid $foreground-color;
+
+ @if $direction == up-right {
+ border-left: $width solid $background-color;
+
+ } @else if $direction == up-left {
+ border-right: $width solid $background-color;
+ }
+ }
+
+ @else if ($direction == down-right) or ($direction == down-left) {
+ border-bottom: $height solid $foreground-color;
+
+ @if $direction == down-right {
+ border-left: $width solid $background-color;
+
+ } @else if $direction == down-left {
+ border-right: $width solid $background-color;
+ }
+ }
+
+ @else if ($direction == inset-up) {
+ border-width: $height $width;
+ border-style: solid;
+ border-color: $background-color $background-color $foreground-color;
+ }
+
+ @else if ($direction == inset-down) {
+ border-width: $height $width;
+ border-style: solid;
+ border-color: $foreground-color $background-color $background-color;
+ }
+
+ @else if ($direction == inset-right) {
+ border-width: $width $height;
+ border-style: solid;
+ border-color: $background-color $background-color $background-color $foreground-color;
+ }
+
+ @else if ($direction == inset-left) {
+ border-width: $width $height;
+ border-style: solid;
+ border-color: $background-color $foreground-color $background-color $background-color;
+ }
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/addons/_word-wrap.scss b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_word-wrap.scss
new file mode 100644
index 0000000..9734a59
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/addons/_word-wrap.scss
@@ -0,0 +1,8 @@
+@mixin word-wrap($wrap: break-word) {
+ word-wrap: $wrap;
+
+ @if $wrap == break-word {
+ overflow-wrap: break-word;
+ word-break: break-all;
+ }
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/css3/_animation.scss b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_animation.scss
new file mode 100644
index 0000000..08c3dbf
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_animation.scss
@@ -0,0 +1,52 @@
+// http://www.w3.org/TR/css3-animations/#the-animation-name-property-
+// Each of these mixins support comma separated lists of values, which allows different transitions for individual properties to be described in a single style rule. Each value in the list corresponds to the value at that same position in the other properties.
+
+// Official animation shorthand property.
+@mixin animation ($animations...) {
+ @include prefixer(animation, $animations, webkit moz spec);
+}
+
+// Individual Animation Properties
+@mixin animation-name ($names...) {
+ @include prefixer(animation-name, $names, webkit moz spec);
+}
+
+
+@mixin animation-duration ($times...) {
+ @include prefixer(animation-duration, $times, webkit moz spec);
+}
+
+
+@mixin animation-timing-function ($motions...) {
+// ease | linear | ease-in | ease-out | ease-in-out
+ @include prefixer(animation-timing-function, $motions, webkit moz spec);
+}
+
+
+@mixin animation-iteration-count ($values...) {
+// infinite |
+ @include prefixer(animation-iteration-count, $values, webkit moz spec);
+}
+
+
+@mixin animation-direction ($directions...) {
+// normal | alternate
+ @include prefixer(animation-direction, $directions, webkit moz spec);
+}
+
+
+@mixin animation-play-state ($states...) {
+// running | paused
+ @include prefixer(animation-play-state, $states, webkit moz spec);
+}
+
+
+@mixin animation-delay ($times...) {
+ @include prefixer(animation-delay, $times, webkit moz spec);
+}
+
+
+@mixin animation-fill-mode ($modes...) {
+// none | forwards | backwards | both
+ @include prefixer(animation-fill-mode, $modes, webkit moz spec);
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/css3/_appearance.scss b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_appearance.scss
new file mode 100644
index 0000000..3eb16e4
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_appearance.scss
@@ -0,0 +1,3 @@
+@mixin appearance ($value) {
+ @include prefixer(appearance, $value, webkit moz ms o spec);
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/css3/_backface-visibility.scss b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_backface-visibility.scss
new file mode 100644
index 0000000..1161fe6
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_backface-visibility.scss
@@ -0,0 +1,6 @@
+//************************************************************************//
+// Backface-visibility mixin
+//************************************************************************//
+@mixin backface-visibility($visibility) {
+ @include prefixer(backface-visibility, $visibility, webkit spec);
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/css3/_background-image.scss b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_background-image.scss
new file mode 100644
index 0000000..6abe88b
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_background-image.scss
@@ -0,0 +1,42 @@
+//************************************************************************//
+// Background-image property for adding multiple background images with
+// gradients, or for stringing multiple gradients together.
+//************************************************************************//
+
+@mixin background-image($images...) {
+ $webkit-images: ();
+ $spec-images: ();
+
+ @each $image in $images {
+ $webkit-image: ();
+ $spec-image: ();
+
+ @if (type-of($image) == string) {
+ $url-str: str-slice($image, 0, 3);
+ $gradient-type: str-slice($image, 0, 6);
+
+ @if $url-str == "url" {
+ $webkit-image: $image;
+ $spec-image: $image;
+ }
+
+ @else if $gradient-type == "linear" {
+ $gradients: _linear-gradient-parser($image);
+ $webkit-image: map-get($gradients, webkit-image);
+ $spec-image: map-get($gradients, spec-image);
+ }
+
+ @else if $gradient-type == "radial" {
+ $gradients: _radial-gradient-parser($image);
+ $webkit-image: map-get($gradients, webkit-image);
+ $spec-image: map-get($gradients, spec-image);
+ }
+ }
+
+ $webkit-images: append($webkit-images, $webkit-image, comma);
+ $spec-images: append($spec-images, $spec-image, comma);
+ }
+
+ background-image: $webkit-images;
+ background-image: $spec-images;
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/css3/_background.scss b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_background.scss
new file mode 100644
index 0000000..9bce930
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_background.scss
@@ -0,0 +1,55 @@
+//************************************************************************//
+// Background property for adding multiple backgrounds using shorthand
+// notation.
+//************************************************************************//
+
+@mixin background($backgrounds...) {
+ $webkit-backgrounds: ();
+ $spec-backgrounds: ();
+
+ @each $background in $backgrounds {
+ $webkit-background: ();
+ $spec-background: ();
+ $background-type: type-of($background);
+
+ @if $background-type == string or list {
+ $background-str: if($background-type == list, nth($background, 1), $background);
+
+ $url-str: str-slice($background-str, 0, 3);
+ $gradient-type: str-slice($background-str, 0, 6);
+
+ @if $url-str == "url" {
+ $webkit-background: $background;
+ $spec-background: $background;
+ }
+
+ @else if $gradient-type == "linear" {
+ $gradients: _linear-gradient-parser("#{$background}");
+ $webkit-background: map-get($gradients, webkit-image);
+ $spec-background: map-get($gradients, spec-image);
+ }
+
+ @else if $gradient-type == "radial" {
+ $gradients: _radial-gradient-parser("#{$background}");
+ $webkit-background: map-get($gradients, webkit-image);
+ $spec-background: map-get($gradients, spec-image);
+ }
+
+ @else {
+ $webkit-background: $background;
+ $spec-background: $background;
+ }
+ }
+
+ @else {
+ $webkit-background: $background;
+ $spec-background: $background;
+ }
+
+ $webkit-backgrounds: append($webkit-backgrounds, $webkit-background, comma);
+ $spec-backgrounds: append($spec-backgrounds, $spec-background, comma);
+ }
+
+ background: $webkit-backgrounds;
+ background: $spec-backgrounds;
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/css3/_border-image.scss b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_border-image.scss
new file mode 100644
index 0000000..e338c2d
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_border-image.scss
@@ -0,0 +1,59 @@
+@mixin border-image($borders...) {
+ $webkit-borders: ();
+ $spec-borders: ();
+
+ @each $border in $borders {
+ $webkit-border: ();
+ $spec-border: ();
+ $border-type: type-of($border);
+
+ @if $border-type == string or list {
+ $border-str: if($border-type == list, nth($border, 1), $border);
+
+ $url-str: str-slice($border-str, 0, 3);
+ $gradient-type: str-slice($border-str, 0, 6);
+
+ @if $url-str == "url" {
+ $webkit-border: $border;
+ $spec-border: $border;
+ }
+
+ @else if $gradient-type == "linear" {
+ $gradients: _linear-gradient-parser("#{$border}");
+ $webkit-border: map-get($gradients, webkit-image);
+ $spec-border: map-get($gradients, spec-image);
+ }
+
+ @else if $gradient-type == "radial" {
+ $gradients: _radial-gradient-parser("#{$border}");
+ $webkit-border: map-get($gradients, webkit-image);
+ $spec-border: map-get($gradients, spec-image);
+ }
+
+ @else {
+ $webkit-border: $border;
+ $spec-border: $border;
+ }
+ }
+
+ @else {
+ $webkit-border: $border;
+ $spec-border: $border;
+ }
+
+ $webkit-borders: append($webkit-borders, $webkit-border, comma);
+ $spec-borders: append($spec-borders, $spec-border, comma);
+ }
+
+ -webkit-border-image: $webkit-borders;
+ border-image: $spec-borders;
+ border-style: solid;
+}
+
+//Examples:
+// @include border-image(url("image.png"));
+// @include border-image(url("image.png") 20 stretch);
+// @include border-image(linear-gradient(45deg, orange, yellow));
+// @include border-image(linear-gradient(45deg, orange, yellow) stretch);
+// @include border-image(linear-gradient(45deg, orange, yellow) 20 30 40 50 stretch round);
+// @include border-image(radial-gradient(top, cover, orange, yellow, orange));
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/css3/_border-radius.scss b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_border-radius.scss
new file mode 100644
index 0000000..7c17190
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_border-radius.scss
@@ -0,0 +1,22 @@
+//************************************************************************//
+// Shorthand Border-radius mixins
+//************************************************************************//
+@mixin border-top-radius($radii) {
+ @include prefixer(border-top-left-radius, $radii, spec);
+ @include prefixer(border-top-right-radius, $radii, spec);
+}
+
+@mixin border-bottom-radius($radii) {
+ @include prefixer(border-bottom-left-radius, $radii, spec);
+ @include prefixer(border-bottom-right-radius, $radii, spec);
+}
+
+@mixin border-left-radius($radii) {
+ @include prefixer(border-top-left-radius, $radii, spec);
+ @include prefixer(border-bottom-left-radius, $radii, spec);
+}
+
+@mixin border-right-radius($radii) {
+ @include prefixer(border-top-right-radius, $radii, spec);
+ @include prefixer(border-bottom-right-radius, $radii, spec);
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/css3/_box-sizing.scss b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_box-sizing.scss
new file mode 100644
index 0000000..f07e1d4
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_box-sizing.scss
@@ -0,0 +1,4 @@
+@mixin box-sizing ($box) {
+// content-box | border-box | inherit
+ @include prefixer(box-sizing, $box, webkit moz spec);
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/css3/_calc.scss b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_calc.scss
new file mode 100644
index 0000000..94d7e4c
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_calc.scss
@@ -0,0 +1,4 @@
+@mixin calc($property, $value) {
+ #{$property}: -webkit-calc(#{$value});
+ #{$property}: calc(#{$value});
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/css3/_columns.scss b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_columns.scss
new file mode 100644
index 0000000..96f601c
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_columns.scss
@@ -0,0 +1,47 @@
+@mixin columns($arg: auto) {
+// ||
+ @include prefixer(columns, $arg, webkit moz spec);
+}
+
+@mixin column-count($int: auto) {
+// auto || integer
+ @include prefixer(column-count, $int, webkit moz spec);
+}
+
+@mixin column-gap($length: normal) {
+// normal || length
+ @include prefixer(column-gap, $length, webkit moz spec);
+}
+
+@mixin column-fill($arg: auto) {
+// auto || length
+ @include prefixer(column-fill, $arg, webkit moz spec);
+}
+
+@mixin column-rule($arg) {
+// || ||
+ @include prefixer(column-rule, $arg, webkit moz spec);
+}
+
+@mixin column-rule-color($color) {
+ @include prefixer(column-rule-color, $color, webkit moz spec);
+}
+
+@mixin column-rule-style($style: none) {
+// none | hidden | dashed | dotted | double | groove | inset | inset | outset | ridge | solid
+ @include prefixer(column-rule-style, $style, webkit moz spec);
+}
+
+@mixin column-rule-width ($width: none) {
+ @include prefixer(column-rule-width, $width, webkit moz spec);
+}
+
+@mixin column-span($arg: none) {
+// none || all
+ @include prefixer(column-span, $arg, webkit moz spec);
+}
+
+@mixin column-width($length: auto) {
+// auto || length
+ @include prefixer(column-width, $length, webkit moz spec);
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/css3/_filter.scss b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_filter.scss
new file mode 100644
index 0000000..8560d77
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_filter.scss
@@ -0,0 +1,5 @@
+@mixin filter($function: none) {
+ // [
+ @include prefixer(perspective, $depth, webkit moz spec);
+}
+
+@mixin perspective-origin($value: 50% 50%) {
+ @include prefixer(perspective-origin, $value, webkit moz spec);
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/css3/_placeholder.scss b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_placeholder.scss
new file mode 100644
index 0000000..5682fd0
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_placeholder.scss
@@ -0,0 +1,8 @@
+@mixin placeholder {
+ $placeholders: ":-webkit-input" ":-moz" "-moz" "-ms-input";
+ @each $placeholder in $placeholders {
+ &:#{$placeholder}-placeholder {
+ @content;
+ }
+ }
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/css3/_radial-gradient.scss b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_radial-gradient.scss
new file mode 100644
index 0000000..7a8c376
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_radial-gradient.scss
@@ -0,0 +1,39 @@
+// Requires Sass 3.1+
+@mixin radial-gradient($G1, $G2,
+ $G3: null, $G4: null,
+ $G5: null, $G6: null,
+ $G7: null, $G8: null,
+ $G9: null, $G10: null,
+ $pos: null,
+ $shape-size: null,
+ $fallback: null) {
+
+ $data: _radial-arg-parser($G1, $G2, $pos, $shape-size);
+ $G1: nth($data, 1);
+ $G2: nth($data, 2);
+ $pos: nth($data, 3);
+ $shape-size: nth($data, 4);
+
+ $full: $G1, $G2, $G3, $G4, $G5, $G6, $G7, $G8, $G9, $G10;
+
+ // Strip deprecated cover/contain for spec
+ $shape-size-spec: _shape-size-stripper($shape-size);
+
+ // Set $G1 as the default fallback color
+ $first-color: nth($full, 1);
+ $fallback-color: nth($first-color, 1);
+
+ @if (type-of($fallback) == color) or ($fallback == "transparent") {
+ $fallback-color: $fallback;
+ }
+
+ // Add Commas and spaces
+ $shape-size: if($shape-size, '#{$shape-size}, ', null);
+ $pos: if($pos, '#{$pos}, ', null);
+ $pos-spec: if($pos, 'at #{$pos}', null);
+ $shape-size-spec: if(($shape-size-spec != ' ') and ($pos == null), '#{$shape-size-spec}, ', '#{$shape-size-spec} ');
+
+ background-color: $fallback-color;
+ background-image: -webkit-radial-gradient(unquote(#{$pos}#{$shape-size}#{$full}));
+ background-image: unquote("radial-gradient(#{$shape-size-spec}#{$pos-spec}#{$full})");
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/css3/_transform.scss b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_transform.scss
new file mode 100644
index 0000000..8cc3596
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_transform.scss
@@ -0,0 +1,15 @@
+@mixin transform($property: none) {
+// none |
+ @include prefixer(transform, $property, webkit moz ms o spec);
+}
+
+@mixin transform-origin($axes: 50%) {
+// x-axis - left | center | right | length | %
+// y-axis - top | center | bottom | length | %
+// z-axis - length
+ @include prefixer(transform-origin, $axes, webkit moz ms o spec);
+}
+
+@mixin transform-style ($style: flat) {
+ @include prefixer(transform-style, $style, webkit moz ms o spec);
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/css3/_transition.scss b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_transition.scss
new file mode 100644
index 0000000..5ad4c0a
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_transition.scss
@@ -0,0 +1,77 @@
+// Shorthand mixin. Supports multiple parentheses-deliminated values for each variable.
+// Example: @include transition (all 2s ease-in-out);
+// @include transition (opacity 1s ease-in 2s, width 2s ease-out);
+// @include transition-property (transform, opacity);
+
+@mixin transition ($properties...) {
+ // Fix for vendor-prefix transform property
+ $needs-prefixes: false;
+ $webkit: ();
+ $moz: ();
+ $spec: ();
+
+ // Create lists for vendor-prefixed transform
+ @each $list in $properties {
+ @if nth($list, 1) == "transform" {
+ $needs-prefixes: true;
+ $list1: -webkit-transform;
+ $list2: -moz-transform;
+ $list3: ();
+
+ @each $var in $list {
+ $list3: join($list3, $var);
+
+ @if $var != "transform" {
+ $list1: join($list1, $var);
+ $list2: join($list2, $var);
+ }
+ }
+
+ $webkit: append($webkit, $list1);
+ $moz: append($moz, $list2);
+ $spec: append($spec, $list3);
+ }
+
+ // Create lists for non-prefixed transition properties
+ @else {
+ $webkit: append($webkit, $list, comma);
+ $moz: append($moz, $list, comma);
+ $spec: append($spec, $list, comma);
+ }
+ }
+
+ @if $needs-prefixes {
+ -webkit-transition: $webkit;
+ -moz-transition: $moz;
+ transition: $spec;
+ }
+ @else {
+ @if length($properties) >= 1 {
+ @include prefixer(transition, $properties, webkit moz spec);
+ }
+
+ @else {
+ $properties: all 0.15s ease-out 0s;
+ @include prefixer(transition, $properties, webkit moz spec);
+ }
+ }
+}
+
+@mixin transition-property ($properties...) {
+ -webkit-transition-property: transition-property-names($properties, 'webkit');
+ -moz-transition-property: transition-property-names($properties, 'moz');
+ transition-property: transition-property-names($properties, false);
+}
+
+@mixin transition-duration ($times...) {
+ @include prefixer(transition-duration, $times, webkit moz spec);
+}
+
+@mixin transition-timing-function ($motions...) {
+// ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier()
+ @include prefixer(transition-timing-function, $motions, webkit moz spec);
+}
+
+@mixin transition-delay ($times...) {
+ @include prefixer(transition-delay, $times, webkit moz spec);
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/css3/_user-select.scss b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_user-select.scss
new file mode 100644
index 0000000..1380aa8
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/css3/_user-select.scss
@@ -0,0 +1,3 @@
+@mixin user-select($arg: none) {
+ @include prefixer(user-select, $arg, webkit moz ms spec);
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/functions/_assign.scss b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_assign.scss
new file mode 100644
index 0000000..9a1db93
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_assign.scss
@@ -0,0 +1,11 @@
+@function assign-inputs($inputs, $pseudo: null) {
+ $list : ();
+
+ @each $input in $inputs {
+ $input: unquote($input);
+ $input: if($pseudo, $input + ":" + $pseudo, $input);
+ $list: append($list, $input, comma);
+ }
+
+ @return $list;
+}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/functions/_color-lightness.scss b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_color-lightness.scss
new file mode 100644
index 0000000..8c6df4e
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_color-lightness.scss
@@ -0,0 +1,13 @@
+// Programatically determines whether a color is light or dark
+// Returns a boolean
+// More details here http://robots.thoughtbot.com/closer-look-color-lightness
+
+@function is-light($hex-color) {
+ $-local-red: red(rgba($hex-color, 1.0));
+ $-local-green: green(rgba($hex-color, 1.0));
+ $-local-blue: blue(rgba($hex-color, 1.0));
+
+ $-local-lightness: ($-local-red * 0.2126 + $-local-green * 0.7152 + $-local-blue * 0.0722) / 255;
+
+ @return $-local-lightness > .6;
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/functions/_flex-grid.scss b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_flex-grid.scss
new file mode 100644
index 0000000..3bbd866
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_flex-grid.scss
@@ -0,0 +1,39 @@
+// Flexible grid
+@function flex-grid($columns, $container-columns: $fg-max-columns) {
+ $width: $columns * $fg-column + ($columns - 1) * $fg-gutter;
+ $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter;
+ @return percentage($width / $container-width);
+}
+
+// Flexible gutter
+@function flex-gutter($container-columns: $fg-max-columns, $gutter: $fg-gutter) {
+ $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter;
+ @return percentage($gutter / $container-width);
+}
+
+// The $fg-column, $fg-gutter and $fg-max-columns variables must be defined in your base stylesheet to properly use the flex-grid function.
+// This function takes the fluid grid equation (target / context = result) and uses columns to help define each.
+//
+// The calculation presumes that your column structure will be missing the last gutter:
+//
+// -- column -- gutter -- column -- gutter -- column
+//
+// $fg-column: 60px; // Column Width
+// $fg-gutter: 25px; // Gutter Width
+// $fg-max-columns: 12; // Total Columns For Main Container
+//
+// div {
+// width: flex-grid(4); // returns (315px / 995px) = 31.65829%;
+// margin-left: flex-gutter(); // returns (25px / 995px) = 2.51256%;
+//
+// p {
+// width: flex-grid(2, 4); // returns (145px / 315px) = 46.031746%;
+// float: left;
+// margin: flex-gutter(4); // returns (25px / 315px) = 7.936508%;
+// }
+//
+// blockquote {
+// float: left;
+// width: flex-grid(2, 4); // returns (145px / 315px) = 46.031746%;
+// }
+// }
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/functions/_golden-ratio.scss b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_golden-ratio.scss
new file mode 100644
index 0000000..463d14a
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_golden-ratio.scss
@@ -0,0 +1,3 @@
+@function golden-ratio($value, $increment) {
+ @return modular-scale($value, $increment, $golden)
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/functions/_grid-width.scss b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_grid-width.scss
new file mode 100644
index 0000000..8e63d83
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_grid-width.scss
@@ -0,0 +1,13 @@
+@function grid-width($n) {
+ @return $n * $gw-column + ($n - 1) * $gw-gutter;
+}
+
+// The $gw-column and $gw-gutter variables must be defined in your base stylesheet to properly use the grid-width function.
+//
+// $gw-column: 100px; // Column Width
+// $gw-gutter: 40px; // Gutter Width
+//
+// div {
+// width: grid-width(4); // returns 520px;
+// margin-left: $gw-gutter; // returns 40px;
+// }
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/functions/_modular-scale.scss b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_modular-scale.scss
new file mode 100644
index 0000000..afc59eb
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_modular-scale.scss
@@ -0,0 +1,66 @@
+// Scaling Variables
+$golden: 1.618;
+$minor-second: 1.067;
+$major-second: 1.125;
+$minor-third: 1.2;
+$major-third: 1.25;
+$perfect-fourth: 1.333;
+$augmented-fourth: 1.414;
+$perfect-fifth: 1.5;
+$minor-sixth: 1.6;
+$major-sixth: 1.667;
+$minor-seventh: 1.778;
+$major-seventh: 1.875;
+$octave: 2;
+$major-tenth: 2.5;
+$major-eleventh: 2.667;
+$major-twelfth: 3;
+$double-octave: 4;
+
+@function modular-scale($value, $increment, $ratio) {
+ $v1: nth($value, 1);
+ $v2: nth($value, length($value));
+ $value: $v1;
+
+ // scale $v2 to just above $v1
+ @while $v2 > $v1 {
+ $v2: ($v2 / $ratio); // will be off-by-1
+ }
+ @while $v2 < $v1 {
+ $v2: ($v2 * $ratio); // will fix off-by-1
+ }
+
+ // check AFTER scaling $v2 to prevent double-counting corner-case
+ $double-stranded: $v2 > $v1;
+
+ @if $increment > 0 {
+ @for $i from 1 through $increment {
+ @if $double-stranded and ($v1 * $ratio) > $v2 {
+ $value: $v2;
+ $v2: ($v2 * $ratio);
+ } @else {
+ $v1: ($v1 * $ratio);
+ $value: $v1;
+ }
+ }
+ }
+
+ @if $increment < 0 {
+ // adjust $v2 to just below $v1
+ @if $double-stranded {
+ $v2: ($v2 / $ratio);
+ }
+
+ @for $i from $increment through -1 {
+ @if $double-stranded and ($v1 / $ratio) < $v2 {
+ $value: $v2;
+ $v2: ($v2 / $ratio);
+ } @else {
+ $v1: ($v1 / $ratio);
+ $value: $v1;
+ }
+ }
+ }
+
+ @return $value;
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/functions/_px-to-em.scss b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_px-to-em.scss
new file mode 100644
index 0000000..4832245
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_px-to-em.scss
@@ -0,0 +1,13 @@
+// Convert pixels to ems
+// eg. for a relational value of 12px write em(12) when the parent is 16px
+// if the parent is another value say 24px write em(12, 24)
+
+@function em($pxval, $base: $em-base) {
+ @if not unitless($pxval) {
+ $pxval: strip-units($pxval);
+ }
+ @if not unitless($base) {
+ $base: strip-units($base);
+ }
+ @return ($pxval / $base) * 1em;
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/functions/_px-to-rem.scss b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_px-to-rem.scss
new file mode 100644
index 0000000..96b244e
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_px-to-rem.scss
@@ -0,0 +1,15 @@
+// Convert pixels to rems
+// eg. for a relational value of 12px write rem(12)
+// Assumes $em-base is the font-size of
+
+@function rem($pxval) {
+ @if not unitless($pxval) {
+ $pxval: strip-units($pxval);
+ }
+
+ $base: $em-base;
+ @if not unitless($base) {
+ $base: strip-units($base);
+ }
+ @return ($pxval / $base) * 1rem;
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/functions/_strip-units.scss b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_strip-units.scss
new file mode 100644
index 0000000..6afc6e6
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_strip-units.scss
@@ -0,0 +1,5 @@
+// Srtips the units from a value. e.g. 12px -> 12
+
+@function strip-units($val) {
+ @return ($val / ($val * 0 + 1));
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/functions/_tint-shade.scss b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_tint-shade.scss
new file mode 100644
index 0000000..f717200
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_tint-shade.scss
@@ -0,0 +1,9 @@
+// Add percentage of white to a color
+@function tint($color, $percent){
+ @return mix(white, $color, $percent);
+}
+
+// Add percentage of black to a color
+@function shade($color, $percent){
+ @return mix(black, $color, $percent);
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/functions/_transition-property-name.scss b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_transition-property-name.scss
new file mode 100644
index 0000000..54cd422
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_transition-property-name.scss
@@ -0,0 +1,22 @@
+// Return vendor-prefixed property names if appropriate
+// Example: transition-property-names((transform, color, background), moz) -> -moz-transform, color, background
+//************************************************************************//
+@function transition-property-names($props, $vendor: false) {
+ $new-props: ();
+
+ @each $prop in $props {
+ $new-props: append($new-props, transition-property-name($prop, $vendor), comma);
+ }
+
+ @return $new-props;
+}
+
+@function transition-property-name($prop, $vendor: false) {
+ // put other properties that need to be prefixed here aswell
+ @if $vendor and $prop == transform {
+ @return unquote('-'+$vendor+'-'+$prop);
+ }
+ @else {
+ @return $prop;
+ }
+}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/functions/_unpack.scss b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_unpack.scss
new file mode 100644
index 0000000..3775963
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/functions/_unpack.scss
@@ -0,0 +1,17 @@
+// Convert shorthand to the 4-value syntax
+
+@function unpack($shorthand) {
+ @if length($shorthand) == 1 {
+ @return nth($shorthand, 1) nth($shorthand, 1) nth($shorthand, 1) nth($shorthand, 1);
+ }
+ @else if length($shorthand) == 2 {
+ @return nth($shorthand, 1) nth($shorthand, 2) nth($shorthand, 1) nth($shorthand, 2);
+ }
+ @else if length($shorthand) == 3 {
+ @return nth($shorthand, 1) nth($shorthand, 2) nth($shorthand, 3) nth($shorthand, 2);
+ }
+ @else {
+ @return $shorthand;
+ }
+}
+
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_convert-units.scss b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_convert-units.scss
new file mode 100644
index 0000000..3443db3
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_convert-units.scss
@@ -0,0 +1,15 @@
+//************************************************************************//
+// Helper function for str-to-num fn.
+// Source: http://sassmeister.com/gist/9647408
+//************************************************************************//
+@function _convert-units($number, $unit) {
+ $strings: 'px' 'cm' 'mm' '%' 'ch' 'pica' 'in' 'em' 'rem' 'pt' 'pc' 'ex' 'vw' 'vh' 'vmin' 'vmax', 'deg', 'rad', 'grad', 'turn';
+ $units: 1px 1cm 1mm 1% 1ch 1pica 1in 1em 1rem 1pt 1pc 1ex 1vw 1vh 1vmin 1vmax, 1deg, 1rad, 1grad, 1turn;
+ $index: index($strings, $unit);
+
+ @if not $index {
+ @warn "Unknown unit `#{$unit}`.";
+ @return false;
+ }
+ @return $number * nth($units, $index);
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_gradient-positions-parser.scss b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_gradient-positions-parser.scss
new file mode 100644
index 0000000..07d30b6
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_gradient-positions-parser.scss
@@ -0,0 +1,13 @@
+@function _gradient-positions-parser($gradient-type, $gradient-positions) {
+ @if $gradient-positions
+ and ($gradient-type == linear)
+ and (type-of($gradient-positions) != color) {
+ $gradient-positions: _linear-positions-parser($gradient-positions);
+ }
+ @else if $gradient-positions
+ and ($gradient-type == radial)
+ and (type-of($gradient-positions) != color) {
+ $gradient-positions: _radial-positions-parser($gradient-positions);
+ }
+ @return $gradient-positions;
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_is-num.scss b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_is-num.scss
new file mode 100644
index 0000000..71459e1
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_is-num.scss
@@ -0,0 +1,8 @@
+//************************************************************************//
+// Helper for linear-gradient-parser
+//************************************************************************//
+@function _is-num($char) {
+ $values: '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' 0 1 2 3 4 5 6 7 8 9;
+ $index: index($values, $char);
+ @return if($index, true, false);
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_linear-angle-parser.scss b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_linear-angle-parser.scss
new file mode 100644
index 0000000..e0401ed
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_linear-angle-parser.scss
@@ -0,0 +1,25 @@
+// Private function for linear-gradient-parser
+@function _linear-angle-parser($image, $first-val, $prefix, $suffix) {
+ $offset: null;
+ $unit-short: str-slice($first-val, str-length($first-val) - 2, str-length($first-val));
+ $unit-long: str-slice($first-val, str-length($first-val) - 3, str-length($first-val));
+
+ @if ($unit-long == "grad") or
+ ($unit-long == "turn") {
+ $offset: if($unit-long == "grad", -100grad * 3, -0.75turn);
+ }
+
+ @else if ($unit-short == "deg") or
+ ($unit-short == "rad") {
+ $offset: if($unit-short == "deg", -90 * 3, 1.6rad);
+ }
+
+ @if $offset {
+ $num: _str-to-num($first-val);
+
+ @return (
+ webkit-image: -webkit- + $prefix + ($offset - $num) + $suffix,
+ spec-image: $image
+ );
+ }
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_linear-gradient-parser.scss b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_linear-gradient-parser.scss
new file mode 100644
index 0000000..12bcdcd
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_linear-gradient-parser.scss
@@ -0,0 +1,41 @@
+@function _linear-gradient-parser($image) {
+ $image: unquote($image);
+ $gradients: ();
+ $start: str-index($image, "(");
+ $end: str-index($image, ",");
+ $first-val: str-slice($image, $start + 1, $end - 1);
+
+ $prefix: str-slice($image, 0, $start);
+ $suffix: str-slice($image, $end, str-length($image));
+
+ $has-multiple-vals: str-index($first-val, " ");
+ $has-single-position: unquote(_position-flipper($first-val) + "");
+ $has-angle: _is-num(str-slice($first-val, 0, 0));
+
+ @if $has-multiple-vals {
+ $gradients: _linear-side-corner-parser($image, $first-val, $prefix, $suffix, $has-multiple-vals);
+ }
+
+ @else if $has-single-position != "" {
+ $pos: unquote($has-single-position + "");
+
+ $gradients: (
+ webkit-image: -webkit- + $image,
+ spec-image: $prefix + "to " + $pos + $suffix
+ );
+ }
+
+ @else if $has-angle {
+ // Rotate degree for webkit
+ $gradients: _linear-angle-parser($image, $first-val, $prefix, $suffix);
+ }
+
+ @else {
+ $gradients: (
+ webkit-image: -webkit- + $image,
+ spec-image: $image
+ );
+ }
+
+ @return $gradients;
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_linear-positions-parser.scss b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_linear-positions-parser.scss
new file mode 100644
index 0000000..d26383e
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_linear-positions-parser.scss
@@ -0,0 +1,61 @@
+@function _linear-positions-parser($pos) {
+ $type: type-of(nth($pos, 1));
+ $spec: null;
+ $degree: null;
+ $side: null;
+ $corner: null;
+ $length: length($pos);
+ // Parse Side and corner positions
+ @if ($length > 1) {
+ @if nth($pos, 1) == "to" { // Newer syntax
+ $side: nth($pos, 2);
+
+ @if $length == 2 { // eg. to top
+ // Swap for backwards compatability
+ $degree: _position-flipper(nth($pos, 2));
+ }
+ @else if $length == 3 { // eg. to top left
+ $corner: nth($pos, 3);
+ }
+ }
+ @else if $length == 2 { // Older syntax ("top left")
+ $side: _position-flipper(nth($pos, 1));
+ $corner: _position-flipper(nth($pos, 2));
+ }
+
+ @if ("#{$side} #{$corner}" == "left top") or ("#{$side} #{$corner}" == "top left") {
+ $degree: _position-flipper(#{$side}) _position-flipper(#{$corner});
+ }
+ @else if ("#{$side} #{$corner}" == "right top") or ("#{$side} #{$corner}" == "top right") {
+ $degree: _position-flipper(#{$side}) _position-flipper(#{$corner});
+ }
+ @else if ("#{$side} #{$corner}" == "right bottom") or ("#{$side} #{$corner}" == "bottom right") {
+ $degree: _position-flipper(#{$side}) _position-flipper(#{$corner});
+ }
+ @else if ("#{$side} #{$corner}" == "left bottom") or ("#{$side} #{$corner}" == "bottom left") {
+ $degree: _position-flipper(#{$side}) _position-flipper(#{$corner});
+ }
+ $spec: to $side $corner;
+ }
+ @else if $length == 1 {
+ // Swap for backwards compatability
+ @if $type == string {
+ $degree: $pos;
+ $spec: to _position-flipper($pos);
+ }
+ @else {
+ $degree: -270 - $pos; //rotate the gradient opposite from spec
+ $spec: $pos;
+ }
+ }
+ $degree: unquote($degree + ",");
+ $spec: unquote($spec + ",");
+ @return $degree $spec;
+}
+
+@function _position-flipper($pos) {
+ @return if($pos == left, right, null)
+ if($pos == right, left, null)
+ if($pos == top, bottom, null)
+ if($pos == bottom, top, null);
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_linear-side-corner-parser.scss b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_linear-side-corner-parser.scss
new file mode 100644
index 0000000..86ad88f
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_linear-side-corner-parser.scss
@@ -0,0 +1,31 @@
+// Private function for linear-gradient-parser
+@function _linear-side-corner-parser($image, $first-val, $prefix, $suffix, $has-multiple-vals) {
+ $val-1: str-slice($first-val, 0, $has-multiple-vals - 1 );
+ $val-2: str-slice($first-val, $has-multiple-vals + 1, str-length($first-val));
+ $val-3: null;
+ $has-val-3: str-index($val-2, " ");
+
+ @if $has-val-3 {
+ $val-3: str-slice($val-2, $has-val-3 + 1, str-length($val-2));
+ $val-2: str-slice($val-2, 0, $has-val-3 - 1);
+ }
+
+ $pos: _position-flipper($val-1) _position-flipper($val-2) _position-flipper($val-3);
+ $pos: unquote($pos + "");
+
+ // Use old spec for webkit
+ @if $val-1 == "to" {
+ @return (
+ webkit-image: -webkit- + $prefix + $pos + $suffix,
+ spec-image: $image
+ );
+ }
+
+ // Bring the code up to spec
+ @else {
+ @return (
+ webkit-image: -webkit- + $image,
+ spec-image: $prefix + "to " + $pos + $suffix
+ );
+ }
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_radial-arg-parser.scss b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_radial-arg-parser.scss
new file mode 100644
index 0000000..a3a3704
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_radial-arg-parser.scss
@@ -0,0 +1,69 @@
+@function _radial-arg-parser($G1, $G2, $pos, $shape-size) {
+ @each $value in $G1, $G2 {
+ $first-val: nth($value, 1);
+ $pos-type: type-of($first-val);
+ $spec-at-index: null;
+
+ // Determine if spec was passed to mixin
+ @if type-of($value) == list {
+ $spec-at-index: if(index($value, at), index($value, at), false);
+ }
+ @if $spec-at-index {
+ @if $spec-at-index > 1 {
+ @for $i from 1 through ($spec-at-index - 1) {
+ $shape-size: $shape-size nth($value, $i);
+ }
+ @for $i from ($spec-at-index + 1) through length($value) {
+ $pos: $pos nth($value, $i);
+ }
+ }
+ @else if $spec-at-index == 1 {
+ @for $i from ($spec-at-index + 1) through length($value) {
+ $pos: $pos nth($value, $i);
+ }
+ }
+ $G1: null;
+ }
+
+ // If not spec calculate correct values
+ @else {
+ @if ($pos-type != color) or ($first-val != "transparent") {
+ @if ($pos-type == number)
+ or ($first-val == "center")
+ or ($first-val == "top")
+ or ($first-val == "right")
+ or ($first-val == "bottom")
+ or ($first-val == "left") {
+
+ $pos: $value;
+
+ @if $pos == $G1 {
+ $G1: null;
+ }
+ }
+
+ @else if
+ ($first-val == "ellipse")
+ or ($first-val == "circle")
+ or ($first-val == "closest-side")
+ or ($first-val == "closest-corner")
+ or ($first-val == "farthest-side")
+ or ($first-val == "farthest-corner")
+ or ($first-val == "contain")
+ or ($first-val == "cover") {
+
+ $shape-size: $value;
+
+ @if $value == $G1 {
+ $G1: null;
+ }
+
+ @else if $value == $G2 {
+ $G2: null;
+ }
+ }
+ }
+ }
+ }
+ @return $G1, $G2, $pos, $shape-size;
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_radial-gradient-parser.scss b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_radial-gradient-parser.scss
new file mode 100644
index 0000000..6dde50f
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_radial-gradient-parser.scss
@@ -0,0 +1,50 @@
+@function _radial-gradient-parser($image) {
+ $image: unquote($image);
+ $gradients: ();
+ $start: str-index($image, "(");
+ $end: str-index($image, ",");
+ $first-val: str-slice($image, $start + 1, $end - 1);
+
+ $prefix: str-slice($image, 0, $start);
+ $suffix: str-slice($image, $end, str-length($image));
+
+ $is-spec-syntax: str-index($first-val, "at");
+
+ @if $is-spec-syntax and $is-spec-syntax > 1 {
+ $keyword: str-slice($first-val, 1, $is-spec-syntax - 2);
+ $pos: str-slice($first-val, $is-spec-syntax + 3, str-length($first-val));
+ $pos: append($pos, $keyword, comma);
+
+ $gradients: (
+ webkit-image: -webkit- + $prefix + $pos + $suffix,
+ spec-image: $image
+ )
+ }
+
+ @else if $is-spec-syntax == 1 {
+ $pos: str-slice($first-val, $is-spec-syntax + 3, str-length($first-val));
+
+ $gradients: (
+ webkit-image: -webkit- + $prefix + $pos + $suffix,
+ spec-image: $image
+ )
+ }
+
+ @else if str-index($image, "cover") or str-index($image, "contain") {
+ @warn "Radial-gradient needs to be updated to conform to latest spec.";
+
+ $gradients: (
+ webkit-image: null,
+ spec-image: $image
+ )
+ }
+
+ @else {
+ $gradients: (
+ webkit-image: -webkit- + $image,
+ spec-image: $image
+ )
+ }
+
+ @return $gradients;
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_radial-positions-parser.scss b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_radial-positions-parser.scss
new file mode 100644
index 0000000..6a5b477
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_radial-positions-parser.scss
@@ -0,0 +1,18 @@
+@function _radial-positions-parser($gradient-pos) {
+ $shape-size: nth($gradient-pos, 1);
+ $pos: nth($gradient-pos, 2);
+ $shape-size-spec: _shape-size-stripper($shape-size);
+
+ $pre-spec: unquote(if($pos, "#{$pos}, ", null))
+ unquote(if($shape-size, "#{$shape-size},", null));
+ $pos-spec: if($pos, "at #{$pos}", null);
+
+ $spec: "#{$shape-size-spec} #{$pos-spec}";
+
+ // Add comma
+ @if ($spec != ' ') {
+ $spec: "#{$spec},"
+ }
+
+ @return $pre-spec $spec;
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_render-gradients.scss b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_render-gradients.scss
new file mode 100644
index 0000000..5765676
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_render-gradients.scss
@@ -0,0 +1,26 @@
+// User for linear and radial gradients within background-image or border-image properties
+
+@function _render-gradients($gradient-positions, $gradients, $gradient-type, $vendor: false) {
+ $pre-spec: null;
+ $spec: null;
+ $vendor-gradients: null;
+ @if $gradient-type == linear {
+ @if $gradient-positions {
+ $pre-spec: nth($gradient-positions, 1);
+ $spec: nth($gradient-positions, 2);
+ }
+ }
+ @else if $gradient-type == radial {
+ $pre-spec: nth($gradient-positions, 1);
+ $spec: nth($gradient-positions, 2);
+ }
+
+ @if $vendor {
+ $vendor-gradients: -#{$vendor}-#{$gradient-type}-gradient(#{$pre-spec} $gradients);
+ }
+ @else if $vendor == false {
+ $vendor-gradients: "#{$gradient-type}-gradient(#{$spec} #{$gradients})";
+ $vendor-gradients: unquote($vendor-gradients);
+ }
+ @return $vendor-gradients;
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_shape-size-stripper.scss b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_shape-size-stripper.scss
new file mode 100644
index 0000000..ee5eda4
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_shape-size-stripper.scss
@@ -0,0 +1,10 @@
+@function _shape-size-stripper($shape-size) {
+ $shape-size-spec: null;
+ @each $value in $shape-size {
+ @if ($value == "cover") or ($value == "contain") {
+ $value: null;
+ }
+ $shape-size-spec: "#{$shape-size-spec} #{$value}";
+ }
+ @return $shape-size-spec;
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_str-to-num.scss b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_str-to-num.scss
new file mode 100644
index 0000000..b3d6168
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/helpers/_str-to-num.scss
@@ -0,0 +1,50 @@
+//************************************************************************//
+// Helper function for linear/radial-gradient-parsers.
+// Source: http://sassmeister.com/gist/9647408
+//************************************************************************//
+@function _str-to-num($string) {
+ // Matrices
+ $strings: '0' '1' '2' '3' '4' '5' '6' '7' '8' '9';
+ $numbers: 0 1 2 3 4 5 6 7 8 9;
+
+ // Result
+ $result: 0;
+ $divider: 0;
+ $minus: false;
+
+ // Looping through all characters
+ @for $i from 1 through str-length($string) {
+ $character: str-slice($string, $i, $i);
+ $index: index($strings, $character);
+
+ @if $character == '-' {
+ $minus: true;
+ }
+
+ @else if $character == '.' {
+ $divider: 1;
+ }
+
+ @else {
+ @if not $index {
+ $result: if($minus, $result * -1, $result);
+ @return _convert-units($result, str-slice($string, $i));
+ }
+
+ $number: nth($numbers, $index);
+
+ @if $divider == 0 {
+ $result: $result * 10;
+ }
+
+ @else {
+ // Move the decimal dot to the left
+ $divider: $divider * 10;
+ $number: $number / $divider;
+ }
+
+ $result: $result + $number;
+ }
+ }
+ @return if($minus, $result * -1, $result);
+}
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/settings/_prefixer.scss b/src/user/themes/antimatter/scss/vendor/bourbon/settings/_prefixer.scss
new file mode 100644
index 0000000..ecab49f
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/settings/_prefixer.scss
@@ -0,0 +1,6 @@
+// Variable settings for /addons/prefixer.scss
+$prefix-for-webkit: true !default;
+$prefix-for-mozilla: true !default;
+$prefix-for-microsoft: true !default;
+$prefix-for-opera: true !default;
+$prefix-for-spec: true !default; // required for keyframe mixin
diff --git a/src/user/themes/antimatter/scss/vendor/bourbon/settings/_px-to-em.scss b/src/user/themes/antimatter/scss/vendor/bourbon/settings/_px-to-em.scss
new file mode 100644
index 0000000..f2f9a3e
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/bourbon/settings/_px-to-em.scss
@@ -0,0 +1 @@
+$em-base: 16px !default;
diff --git a/src/user/themes/antimatter/scss/vendor/color-schemer/_color-schemer.scss b/src/user/themes/antimatter/scss/vendor/color-schemer/_color-schemer.scss
new file mode 100644
index 0000000..469c697
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/color-schemer/_color-schemer.scss
@@ -0,0 +1,31 @@
+@import "blend-modes";
+
+// Defaults
+$cs-primary : #f00 !default;
+$cs-scheme : mono !default; // mono, complement, triad, tetrad, analogic, accented-analogic
+$cs-hue-offset : 30 !default;
+$cs-brightness-offset : false !default;
+$cs-color-model : rgb !default; // rgb, ryb
+$cs-colorblind : normal !default;
+$cs-harmonize-mode : null !default;
+$cs-harmonize-color : $cs-primary !default;
+$cs-harmonize-amount : 10% !default;
+
+// Partials
+@import "color-schemer/interpolation";
+@import "color-schemer/cmyk";
+@import "color-schemer/ryb";
+@import "color-schemer/colorblind";
+@import "color-schemer/equalize";
+@import "color-schemer/mix";
+@import "color-schemer/tint-shade";
+@import "color-schemer/color-adjustments";
+@import "color-schemer/harmonize";
+@import "color-schemer/color-schemer";
+
+@import "color-schemer/comparison";
+
+@import "color-schemer/mixins";
+
+// Tell other files that this is loaded.
+$color-schemer-loaded : true;
diff --git a/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_cmyk.scss b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_cmyk.scss
new file mode 100644
index 0000000..847115e
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_cmyk.scss
@@ -0,0 +1,14 @@
+@function cmyk($cyan, $magenta, $yellow, $black) {
+
+ // Get the color values out of white
+ $cyan : mix(cyan , white, $cyan );
+ $magenta : mix(magenta, white, $magenta);
+ $yellow : mix(yellow , white, $yellow );
+ $black : mix(black , white, $black );
+
+ // Subtract the colors from white
+ $color: white - invert($cyan) - invert($magenta) - invert($yellow) - invert($black);
+
+
+ @return $color;
+}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_color-adjustments.scss b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_color-adjustments.scss
new file mode 100644
index 0000000..6028b49
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_color-adjustments.scss
@@ -0,0 +1,30 @@
+// RGB functions
+@function set-red($color, $red) {
+ @return rgba($red, green($color), blue($color), alpha($color));
+}
+
+@function set-green($color, $green) {
+ @return rgba(red($color), $green, blue($color), alpha($color));
+}
+
+@function set-blue($color, $blue) {
+ @return rgba(red($color), green($color), $blue, alpha($color));
+}
+
+
+// HSL Functions
+@function set-hue($color, $hue) {
+ @return hsla($hue, saturation($color), lightness($color), alpha($color));
+}
+
+@function set-saturation($color, $saturation) {
+ @return hsla(hue($color), $saturation, lightness($color), alpha($color));
+}
+
+@function set-lightness($color, $lightness) {
+ @return hsla(hue($color), saturation($color), $lightness, alpha($color));
+}
+
+@function set-alpha($color, $alpha) {
+ @return hsla(hue($color), saturation($color), lightness($color), $alpha);
+}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_color-schemer.scss b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_color-schemer.scss
new file mode 100644
index 0000000..c092734
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_color-schemer.scss
@@ -0,0 +1,208 @@
+// brightness and hue offsets are based on the lightness and saturation of the color
+// unless defined otherwise.
+@function cs-brightness-offset($cs-brightness-offset) {
+ @if $cs-brightness-offset == false {
+ // find the difference between lightness
+ @return lightness($cs-primary) - lightness(invert($cs-primary));
+ }
+ @else {
+ @return $cs-brightness-offset;
+ }
+}
+
+// Harmonized or Unaltered Color
+@function clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount) {
+ @if $cs-harmonize-mode != null {
+ @return cs-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ } @else {
+ @return $color;
+ }
+}
+
+// Primary color
+@function cs-primary($cs-primary:$cs-primary, $cs-scheme:$cs-scheme, $cs-hue-offset:$cs-hue-offset, $cs-brightness-offset:$cs-brightness-offset, $cs-harmonize-mode:$cs-harmonize-mode, $cs-harmonize-color:$cs-harmonize-color, $cs-harmonize-amount:$cs-harmonize-amount) {
+ @return clean-or-harmonize($cs-primary, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+}
+
+// Secondary color scheme
+@function cs-secondary($cs-primary:$cs-primary, $cs-scheme:$cs-scheme, $cs-hue-offset:$cs-hue-offset, $cs-brightness-offset:$cs-brightness-offset, $cs-harmonize-mode:$cs-harmonize-mode, $cs-harmonize-color:$cs-harmonize-color, $cs-harmonize-amount:$cs-harmonize-amount) {
+ $cs-brightness-offset: cs-brightness-offset($cs-brightness-offset);
+
+ // mono
+ @if $cs-scheme == mono {
+ @if $cs-brightness-offset < 0 {
+ $color: lighten($cs-primary, abs($cs-brightness-offset));
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+ @else {
+ $color: darken($cs-primary, abs($cs-brightness-offset));
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+ }
+
+ // complement
+ @if $cs-scheme == complement {
+ @if $cs-color-model == ryb {
+ $color: ryb-complement($cs-primary);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+ @else {
+ $color: complement($cs-primary);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+ }
+
+ // triad
+ @if $cs-scheme == triad {
+ @if $cs-color-model == ryb {
+ $color: ryb-adjust-hue(ryb-complement($cs-primary), $cs-hue-offset);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+ @else {
+ $color: adjust-hue(complement($cs-primary), $cs-hue-offset);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+ }
+
+ // tetrad
+ @if $cs-scheme == tetrad {
+ @if $cs-color-model == ryb {
+ $color: ryb-adjust-hue($cs-primary, $cs-hue-offset);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+ @else {
+ $color: adjust-hue($cs-primary, $cs-hue-offset);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+ }
+
+ // analogic
+ @if $cs-scheme == analogic or $cs-scheme == accented-analogic {
+ @if $cs-color-model == ryb {
+ $color: ryb-adjust-hue($cs-primary, $cs-hue-offset);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+ @else {
+ $color: adjust-hue($cs-primary, $cs-hue-offset);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+ }
+}
+
+// Tertiary color scheme
+@function cs-tertiary($cs-primary:$cs-primary, $cs-scheme:$cs-scheme, $cs-hue-offset:$cs-hue-offset, $cs-brightness-offset:$cs-brightness-offset, $cs-harmonize-mode:$cs-harmonize-mode, $cs-harmonize-color:$cs-harmonize-color, $cs-harmonize-amount:$cs-harmonize-amount) {
+ $cs-brightness-offset: cs-brightness-offset($cs-brightness-offset);
+
+ // mono
+ @if $cs-scheme == mono {
+ $color: mix(cs-primary(), cs-secondary());
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+
+ // complement
+ @if $cs-scheme == complement {
+ $color: equalize($cs-primary);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+
+ // triad
+ @if $cs-scheme == triad {
+ @if $cs-color-model == ryb {
+ $color: ryb-adjust-hue(ryb-complement($cs-primary), $cs-hue-offset * -1);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+ @else {
+ $color: adjust-hue(complement($cs-primary), $cs-hue-offset * -1);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+ }
+
+ // tetrad
+ @if $cs-scheme == tetrad {
+ @if $cs-color-model == ryb {
+ $color: ryb-complement($cs-primary);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+ @else {
+ $color: complement($cs-primary);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+ }
+
+ // analogic
+ @if $cs-scheme == analogic or $cs-scheme == accented-analogic {
+ @if $cs-color-model == ryb {
+ $color: ryb-adjust-hue($cs-primary, $cs-hue-offset * -1);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+ @else {
+ $color: adjust-hue($cs-primary, $cs-hue-offset * -1);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+ }
+
+ // accented-analogic
+ @if $cs-scheme == accented-analogic {
+ @if $cs-color-model == ryb {
+ $color: ryb-complement($cs-primary);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+ @else {
+ $color: complement($cs-primary);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+ }
+}
+
+// Quadrary color scheme
+@function cs-quadrary($cs-primary:$cs-primary, $cs-scheme:$cs-scheme, $cs-hue-offset:$cs-hue-offset, $cs-brightness-offset:$cs-brightness-offset, $cs-harmonize-mode:$cs-harmonize-mode, $cs-harmonize-color:$cs-harmonize-color, $cs-harmonize-amount:$cs-harmonize-amount) {
+ $cs-brightness-offset: cs-brightness-offset($cs-brightness-offset);
+
+ // mono
+ @if $cs-scheme == mono {
+ $color: equalize($cs-primary);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+
+ // complement
+ @if $cs-scheme == complement {
+ $color: equalize(ryb-complement($cs-primary));
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+
+ // triad
+ @if $cs-scheme == triad {
+ $color: equalize($cs-primary);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+
+ // tetrad
+ @if $cs-scheme == tetrad {
+ @if $cs-color-model == ryb {
+ $color: ryb-adjust-hue(ryb-complement($cs-primary), $cs-hue-offset);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+ @else {
+ $color: adjust-hue(complement($cs-primary), $cs-hue-offset);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+ }
+
+ // analogic
+ @if $cs-scheme == analogic {
+ $color: equalize($cs-primary);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+
+ // accented-analogic
+ @if $cs-scheme == accented-analogic {
+ @if $cs-color-model == ryb {
+ $color: ryb-complement($cs-primary);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+ @else {
+ $color: complement($cs-primary);
+ @return clean-or-harmonize($color, $cs-harmonize-color, $cs-harmonize-mode, $cs-harmonize-amount);
+ }
+ }
+}
diff --git a/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_colorblind.scss b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_colorblind.scss
new file mode 100644
index 0000000..b509183
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_colorblind.scss
@@ -0,0 +1,29 @@
+@function cs-colorblind($color, $mode: $cs-colorblind) {
+
+ // Refrence: http://www.w3.org/TR/AERT#color-contrast
+
+ // Deuteranopia
+ @if $mode == deuteranopia {
+ @return $color;
+ }
+
+ // Protanopia
+ @if $mode == protanopia {
+ @return $color;
+ }
+
+ // Tritanopia
+ @if $mode == tritanopia {
+ @return $color;
+ }
+
+
+ // Return color if no color blind mode.
+ @else {
+ @return $color;
+ }
+}
+
+@function cs-cb($color, $mode: $cs-colorblind) {
+ @return cs-colorblind($color, $mode);
+}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_comparison.scss b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_comparison.scss
new file mode 100644
index 0000000..84ed665
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_comparison.scss
@@ -0,0 +1,15 @@
+//////////////////////////////
+// Color Is Dark
+//
+// Checks to see if the input color is a dark color taking into account both lightness and hue.
+// Suitable for determining, for instance, if a background should have a dark or light text color.
+// @return true/false (boolean)
+//////////////////////////////
+
+@function cs-is-dark($color) {
+ @if (lightness($color) < 60% and (hue($color) >= 210 or hue($color) <= 27)) or (lightness($color) <= 32%) {
+ @return true;
+ } @else {
+ @return false;
+ }
+}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_equalize.scss b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_equalize.scss
new file mode 100644
index 0000000..d043bc8
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_equalize.scss
@@ -0,0 +1,5 @@
+// Color equalize credit to Mason Wendell:
+// https://github.com/canarymason/The-Coding-Designers-Survival-Kit/blob/master/sass/partials/lib/variables/_color_schemes.sass
+@function equalize($color) {
+ @return hsl(hue($color), 100%, 50%);
+}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_harmonize.scss b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_harmonize.scss
new file mode 100644
index 0000000..719b43d
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_harmonize.scss
@@ -0,0 +1,59 @@
+@function cs-harmonize($background, $foreground: $cs-harmonize-color, $mode: $cs-harmonize-mode, $amount: $cs-harmonize-amount) {
+ $blend: null;
+ @if ($mode == normal) {
+ $blend: blend-normal($foreground, $background); }
+ @else if ($mode == multiply) {
+ $blend: blend-multiply($foreground, $background); }
+ @else if ($mode == lighten) {
+ $blend: blend-lighten($foreground, $background); }
+ @else if ($mode == darken) {
+ $blend: blend-darken($foreground, $background); }
+ @else if ($mode == darkercolor) {
+ $blend: blend-darkercolor($foreground, $background); }
+ @else if ($mode == lightercolor) {
+ $blend: blend-lightercolor($foreground, $background); }
+ @else if ($mode == lineardodge) {
+ $blend: blend-lineardodge($foreground, $background); }
+ @else if ($mode == linearburn) {
+ $blend: blend-linearburn($foreground, $background); }
+ @else if ($mode == difference) {
+ $blend: blend-difference($foreground, $background); }
+ @else if ($mode == screen) {
+ $blend: blend-screen($foreground, $background); }
+ @else if ($mode == exclusion) {
+ $blend: blend-exclusion($foreground, $background); }
+ @else if ($mode == overlay) {
+ $blend: blend-overlay($foreground, $background); }
+ @else if ($mode == softlight) {
+ $blend: blend-softlight($foreground, $background); }
+ @else if ($mode == hardlight) {
+ $blend: blend-hardlight($foreground, $background); }
+ @else if ($mode == colordodge) {
+ $blend: blend-colordodge($foreground, $background); }
+ @else if ($mode == colorburn) {
+ $blend: blend-colorburn($foreground, $background); }
+ @else if ($mode == linearlight) {
+ $blend: blend-linearlight($foreground, $background); }
+ @else if ($mode == vividlight) {
+ $blend: blend-vividlight($foreground, $background); }
+ @else if ($mode == pinlight) {
+ $blend: blend-pinlight($foreground, $background); }
+ @else if ($mode == hardmix) {
+ $blend: blend-hardmix($foreground, $background); }
+ @else if ($mode == colorblend) {
+ $blend: blend-colorblend($foreground, $background); }
+ @else if ($mode == dissolve) {
+ $blend: blend-dissolve($foreground, $background); }
+ @else if ($mode == divide) {
+ $blend: blend-divide($foreground, $background); }
+ @else if ($mode == hue) {
+ $blend: blend-hue($foreground, $background); }
+ @else if ($mode == luminosity) {
+ $blend: blend-luminosity($foreground, $background); }
+ @else if ($mode == saturation) {
+ $blend: blend-saturation($foreground, $background); }
+ @else if ($mode == subtract) {
+ $blend: blend-subtract($foreground, $background); }
+ $mixed: mix($blend, $background, $amount);
+ @return $mixed;
+}
diff --git a/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_interpolation.scss b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_interpolation.scss
new file mode 100644
index 0000000..2ec182e
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_interpolation.scss
@@ -0,0 +1,34 @@
+@function cs-interpolate($value, $units: 360, $stops: $ryb-interpolation) {
+
+ // Loop numbers out of scale back into the scale.
+ @while $value >= 360 {
+ $value: $value - 360;
+ }
+ @while $value < 0 {
+ $value: $value + 360;
+ }
+
+ // Find out how many units in each stop
+ $cs-color-deg: $units / length($stops);
+
+ // Count through stops
+ $cs-deg-count: $cs-color-deg;
+ $cs-stop-count: 1;
+
+ // Add the first stop to the end so it will be
+ // interpolated with the last stop.
+ $stops: append($stops, nth($stops, 1));
+
+ // Start interpolating
+ @for $i from 0 through length($stops) {
+ @if $value < $cs-deg-count {
+ @return cs-mix(nth($stops, $cs-stop-count + 1), nth($stops, $cs-stop-count), abs(percentage(($cs-deg-count - $value) / $cs-color-deg) - 100 ), $model: rgb);
+ }
+
+ // If the value is not in this stop, loop up to another stop.
+ @else {
+ $cs-deg-count: $cs-deg-count + $cs-color-deg;
+ $cs-stop-count: $cs-stop-count + 1
+ }
+ }
+}
diff --git a/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_mix.scss b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_mix.scss
new file mode 100644
index 0000000..4d3a68f
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_mix.scss
@@ -0,0 +1,40 @@
+@function cs-mix($color1, $color2, $percent: 50%, $model: $cs-color-model) {
+
+ $decimal : abs($percent - 100%) / 100%;
+ $hue-offset : ();
+
+ @if $model == rgb {
+ $hue-offset : (hue($color1) - hue($color2)) * $decimal;
+ @if (hue($color1) - hue($color2)) * .5 < -90deg {
+ $hue-offset : (hue($color1) + 360deg - hue($color2)) * $decimal;
+ }
+ @if (hue($color1) - hue($color2)) * .5 > 90deg {
+ $hue-offset : (hue($color1) - 360deg - hue($color2)) * $decimal;
+ }
+ }
+
+ @if $model == ryb {
+ $hue-offset : (ryb-hue($color1) - ryb-hue($color2)) * $decimal;
+ @if (ryb-hue($color1) - ryb-hue($color2)) * .5 < -90deg {
+ $hue-offset : (ryb-hue($color1) + 360deg - ryb-hue($color2)) * $decimal;
+ }
+ @if (ryb-hue($color1) - ryb-hue($color2)) * .5 > 90deg {
+ $hue-offset : (ryb-hue($color1) - 360deg - ryb-hue($color2)) * $decimal;
+ }
+ }
+
+ $saturation-offset : (saturation($color1) - saturation($color2)) * $decimal;
+ $lightness-offset : (lightness($color1) - lightness($color2)) * $decimal;
+
+ @if $model == ryb {
+ $color1: ryb-adjust-hue($color1, $hue-offset * -1);
+ }
+ @else {
+ $color1: adjust-hue($color1, $hue-offset * -1);
+ }
+
+ $color1: set-saturation($color1, saturation($color1) - $saturation-offset);
+ $color1: set-lightness($color1, lightness($color1) - $lightness-offset);
+
+ @return $color1;
+}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_mixins.scss b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_mixins.scss
new file mode 100644
index 0000000..7e3a8f4
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_mixins.scss
@@ -0,0 +1,29 @@
+////////////////////////////////////////////
+// From Jina Bolton and Eric Meyer -- http://codepen.io/jina/pen/iosjp
+@function cs-stripes($position, $colors) {
+ $colors: if(type-of($colors) != 'list', compact($colors), $colors);
+ $gradient: ();
+ $width: 100% / length($colors);
+
+ @for $i from 1 through length($colors) {
+ $pop: nth($colors,$i);
+ $new: $pop ($width * ($i - 1)), $pop ($width * $i);
+ $gradient: join($gradient, $new, comma);
+ }
+
+ @return linear-gradient($position, $gradient);
+}
+
+////////////////////////////////////////////
+// Color tester
+
+@mixin cs-test($colors, $height: 2em, $element: "body:before") {
+ #{$element} {
+ content: "";
+ display: block;
+ height: $height;
+ @include background(cs-stripes(left, ($colors)));
+ position: relative;
+ z-index: 999999999999;
+ }
+}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_ryb.scss b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_ryb.scss
new file mode 100644
index 0000000..1a6de0e
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_ryb.scss
@@ -0,0 +1,76 @@
+$ryb-interpolation: #FF0000 #FF4900 #FF7400 #FF9200 #FFAA00 #FFBF00 #FFD300 #FFE800 #FFFF00 #CCF600 #9FEE00 #67E300 #00CC00 #00AF64 #009999 #0B61A4 #1240AB #1B1BB3 #3914AF #530FAD #7109AA #A600A6 #CD0074 #E40045;
+
+// RYB color interpolation
+@function find-ryb($hue) {
+
+ // remove units on $hue
+ @if unit($hue) == deg { $hue: $hue / 1deg; }
+
+ // return an interpolated hue
+ @return hue(cs-interpolate($hue));
+}
+
+// Find the RYB hue instead of RGB hue of a color.
+
+// map of the RYB offset
+$ryb-offset: 0 1 2 3 5 6 7 8 9 10 11 13 14 15 16 17 18 19 19 20 21 21 22 23 23 24 25 25 26 27 27 28 28 29 29 30 30 31 31 32 32 32 33 33 34 34 35 35 35 36 36 37 37 37 38 38 38 39 39 40 40 40 41 41 41 42 42 42 43 43 43 44 44 44 45 45 45 46 46 46 47 47 47 47 48 48 48 49 49 49 50 50 50 51 51 51 52 52 52 53 53 53 54 54 54 55 55 55 56 56 56 57 57 57 58 58 59 59 59 60 60 61 61 62 63 63 64 65 65 66 67 68 68 69 70 70 71 72 72 73 73 74 75 75 76 77 77 78 79 79 80 81 82 82 83 84 85 86 87 88 88 89 90 91 92 93 95 96 98 100 102 104 105 107 109 111 113 115 116 118 120 122 125 127 129 131 134 136 138 141 143 145 147 150 152 154 156 158 159 161 163 165 166 168 170 171 173 175 177 178 180 182 184 185 187 189 191 192 194 196 198 199 201 203 205 206 207 208 209 210 212 213 214 215 216 217 218 219 220 221 222 223 224 226 227 228 229 230 232 233 234 235 236 238 239 240 241 242 243 244 245 246 247 248 249 250 251 251 252 253 254 255 256 257 257 258 259 260 260 261 262 263 264 264 265 266 267 268 268 269 270 271 272 273 274 274 275 276 277 278 279 280 282 283 284 286 287 289 290 292 293 294 296 297 299 300 302 303 305 307 309 310 312 314 316 317 319 321 323 324 326 327 328 329 330 331 332 333 334 336 337 338 339 340 341 342 343 344 345 347 348 349 350 352 353 354 355 356 358 359 360;
+
+// loop through the map to find the matching hue.
+@function ryb-hue($color) {
+ @for $i from 1 through length($ryb-offset) {
+ @if nth($ryb-offset, $i) > hue($color) {
+ @return $i - 2deg;
+ }
+ }
+}
+
+// Changes the hue of a color.
+@function ryb-adjust-hue($color, $degrees) {
+
+ // Convert precentag to degrees.
+ @if unit($degrees) == "%" {
+ $degrees: 360 * ($degrees / 100%);
+ }
+
+ // Start at the current hue and loop in the adjustment.
+ $hue-adjust: (ryb-hue($color) + $degrees) / 1deg;
+
+ @return hsl(hue(cs-interpolate($hue-adjust)), saturation($color), lightness($color));
+}
+
+@function ryba($red, $yellow, $blue, $alpha) {
+ $hue: 0;
+ $saturation: 0;
+ $lightness: percentage(($red + $yellow + $blue) / (255 * 3));
+ @if $red == $yellow and $yellow == $blue {
+ @return hsla(0, 0, $lightness, $alpha);
+ }
+ @if $red >= $yellow and $red >= $blue {
+ $hue: 0;
+ }
+ @elseif $yellow >= $red and $yellow >= $blue {
+ $hue: 360 / 3;
+ }
+ @elseif $blue >= $red and $blue >= $yellow {
+ $hue: 360 / 3 * 2;
+ }
+ @return hsla(hue(cs-interpolate($hue)), 100%, 50%, 1);
+}
+
+@function ryb($red, $yellow, $blue) {
+ @return ryba($red, $yellow, $blue, 1);
+}
+
+@function set-ryb-hue($color, $hue) {
+ @return hsla(hue(cs-interpolate($hue)), saturation($color), lightness($color), alpha($color));
+}
+
+// Returns the complement of a color.
+@function ryb-complement($color) {
+ @return ryb-adjust-hue($color, 180deg);
+}
+
+// Returns the inverse of a color.
+@function ryb-invert($color) {
+ @return ryb-adjust-hue(hsl(hue($color), saturation(invert($color)), lightness(invert($color))), 180deg);
+}
\ No newline at end of file
diff --git a/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_tint-shade.scss b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_tint-shade.scss
new file mode 100644
index 0000000..d1198d0
--- /dev/null
+++ b/src/user/themes/antimatter/scss/vendor/color-schemer/color-schemer/_tint-shade.scss
@@ -0,0 +1,9 @@
+// Add percentage of white to a color
+@function tint($color, $percent) {
+ @return mix(white, $color, $percent);
+}
+
+// Add percentage of black to a color
+@function shade($color, $percent) {
+ @return mix(black, $color, $percent);
+}
diff --git a/src/user/themes/antimatter/templates/blog.html.twig b/src/user/themes/antimatter/templates/blog.html.twig
new file mode 100644
index 0000000..d36d20f
--- /dev/null
+++ b/src/user/themes/antimatter/templates/blog.html.twig
@@ -0,0 +1,38 @@
+{% embed 'partials/base.html.twig' %}
+
+ {% set collection = page.collection() %}
+
+ {% block content %}
+ {% set blog_image = page.media.images|first.grayscale().contrast(20).brightness(-100).colorize(-35,81,122) %}
+
+ {% if blog_image %}
+