diff --git a/.gitignore b/.gitignore index 7fb4e41872d43dd376c674e9557029efa52b7677..f0ecf7b3277f6fc4d0c9d36bb34af5a7e77148a9 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,4 @@ TAGS .bash_history .idea .composer - +**/.sass-cache/ \ No newline at end of file diff --git a/local/alpha/config/vufind/DAIA.ini b/local/alpha/config/vufind/DAIA.ini index f2b0c6f49ed83319e3d8d6da3e2606d562f06f77..5428ab9655e03e0235236617fc8fbc387e013950 100644 --- a/local/alpha/config/vufind/DAIA.ini +++ b/local/alpha/config/vufind/DAIA.ini @@ -20,10 +20,3 @@ relative_path = ../../../config/vufind/DAIA.ini ; ;##################### DO NOT DELETE THIS HEADER #################### ;#################################################################### - -;[DAIA] -; refer to http://data.ub.uni-leipzig.de/ldinfo for setting up specific DAIA-urls -;baseUrl = http://data.ub.uni-leipzig.de/item/DE-15/finc/ - -; DAIATheca -; http://139.18.19.238:8080/DaiaThecaMssql/ \ No newline at end of file diff --git a/local/config/vufind/DAIA.ini b/local/config/vufind/DAIA.ini index aad984c296a382b231ad5b5b73fcc300acc9bd44..b2f2ab16c944d82164d62a3a8ebd237e63d7691c 100644 --- a/local/config/vufind/DAIA.ini +++ b/local/config/vufind/DAIA.ini @@ -2,16 +2,7 @@ ; http://gbv.github.io/daiaspec/daia.html#query-api ; ; The settings in the [DAIA] section will be used for all DAIA requests. -; The name of this section got refactored with VuFind 2.4, although the old -; configuration using the [Global] section still works, it should be replaced -; with the new [DAIA] section. -; Note: Settings for daiaResponseFormat and daiaIdPrefix are not supported if -; a pre VuFind 2.4 configuration with the [Global] section is used. -; i.e.: -; [Global] -; baseUrl = [your DAIA server base url] -; daiaIdPrefix = [this setting will have no effect] -; daiaResponseFormat = [this setting will have no effect] +; The name of this section got refactored with VuFind 2.4. ; ; A default DAIA call looks like this: ; https://daia.myuniversity.edu/?id=ppn:12345678&format=json @@ -23,6 +14,11 @@ ; daiaResponseFormat = json ; +[DAIA] +; The base URL for the DAIA webservice. +;baseUrl = http://139.18.19.238:9080/daialibero/daia/ +;baseUrl = http://139.18.19.238:9080/daiatheca/daia/ + ; The prefix prepended to the VuFind record Id resulting in the document URI ; used for the DAIA request (default = ppn:) (the prefix usually defines the ; field which the DAIA server uses for the loookup - e.g. ppn: or isbn:). @@ -31,10 +27,21 @@ ; Set the requested DAIA response format: xml (default), json ;daiaResponseFormat = xml -[Global] -; The base URL for the DAIA webservice. -; refer to http://data.ub.uni-leipzig.de/ldinfo for setting up specific DAIA-urls -baseUrl = http://data.ub.uni-leipzig.de/item/ISIL/identifier/ +; Set multiQuery to true if your DAIA webservice supports queries with multiple +; ids (cf. http://gbv.github.io/daiaspec/daia.html#query-api). +; Default is false. +;multiQuery = false + +; If daiaContentTypes are set, the DAIA driver checks the Content-Type +; line in the DAIA response HTTP header for the configured values. If +; daiaContentTypes is not set, Content-Type HTTP header is NOT checked. +; +; expected Content-Types for DAIA XML format: +; (seperate multiple values by commata, for example: +; daiaContentTypes['xml'] = "application/xml, text/xml" +daiaContentTypes['xml'] = "application/xml" -; DAIATheca -; http://139.18.19.238:8080/DaiaThecaMssql/ \ No newline at end of file +; expected Content-Types for DAIA JSON format: +; (seperate multiple values by commata, for example: +; daiaContentTypes['xml'] = "application/json, application/javascript" +daiaContentTypes['json'] = "application/json" diff --git a/local/config/vufind/config.ini b/local/config/vufind/config.ini index 03ef9b8561b4ad25035c6e95c24c51a0051084ee..8d72c947b9c52a0397c4a4c1f6ca21b1d1f776cd 100644 --- a/local/config/vufind/config.ini +++ b/local/config/vufind/config.ini @@ -578,7 +578,7 @@ noCoverAvailableImage = images/noCover2.gif ; includes notes on improving the accuracy of Wikipedia retrievals. ; Note for Windows users: If using Wikipedia, you may need to increase your Apache ; heap size settings. For details, see: http://vufind.org/jira/browse/VUFIND-630 -authors = Wikipedia +;authors = Wikipedia ; You can look up your secret key by logging into http://aws.amazon.com and clicking ; "Access Identifiers" under "Your Account". diff --git a/local/config/vufind/searches.ini b/local/config/vufind/searches.ini index 733e90b6b9f495b6817699c40c000b5876cef688..98e2b81fe723c94c78ddc107e88c7a261dbddeb0 100644 --- a/local/config/vufind/searches.ini +++ b/local/config/vufind/searches.ini @@ -455,7 +455,7 @@ sort = "last_indexed desc" ; http://vufind.org/wiki/vufind2:autosuggesters [Autocomplete] ; Set this to false to disable all autocomplete behavior -enabled = true +enabled = false ; This handler will be used for all search types not covered by [Autocomplete_Types] default_handler = Solr diff --git a/local/dev/config/vufind/DAIA.ini.sample b/local/dev/config/vufind/DAIA.ini.sample index c8ae05ca19f1ef2afc15f7f03db88fc8c6c39e6d..01b53f0a6269adda904c4322500ffefd3cdf0895 100644 --- a/local/dev/config/vufind/DAIA.ini.sample +++ b/local/dev/config/vufind/DAIA.ini.sample @@ -20,10 +20,3 @@ relative_path = ../../../config/vufind/DAIA.ini ; ;##################### DO NOT DELETE THIS HEADER #################### ;#################################################################### - -;[DAIA] -; refer to http://data.ub.uni-leipzig.de/ldinfo for setting up specific DAIA-urls -;baseUrl = http://data.ub.uni-leipzig.de/item/DE-15/finc/ - -; DAIATheca -; http://139.18.19.238:8080/DaiaThecaMssql/ \ No newline at end of file diff --git a/module/finc/config/module.config.php b/module/finc/config/module.config.php index 136f130a7377b004a411511afda6c2397b1fe585..32e518147a2081b8c70a2105519337df0f764578 100644 --- a/module/finc/config/module.config.php +++ b/module/finc/config/module.config.php @@ -12,16 +12,15 @@ $config = [ 'ils_driver' => [ 'factories' => [ 'fincils' => 'finc\ILS\Driver\Factory::getFincILS', - ], - 'invokables' => [ - 'daia' => 'finc\ILS\Driver\DAIA', - 'paia' => 'finc\ILS\Driver\PAIA', + 'daia' => 'finc\ILS\Driver\Factory::getDAIA', + 'paia' => 'finc\ILS\Driver\Factory::getPAIA', ], ], 'recorddriver' => [ 'factories' => [ 'solrdefault' => 'finc\RecordDriver\Factory::getSolrDefault', 'solrmarc' => 'finc\RecordDriver\Factory::getSolrMarc', + 'solrmarcfinc' => 'finc\RecordDriver\Factory::getSolrMarcFinc', 'solrmarcremote' => 'finc\RecordDriver\Factory::getSolrMarcRemote', 'solrmarcremotefinc' => 'finc\RecordDriver\Factory::getSolrMarcRemoteFinc', 'solrai' => 'finc\RecordDriver\Factory::getSolrAI', diff --git a/module/finc/src/finc/ILS/Driver/DAIA.php b/module/finc/src/finc/ILS/Driver/DAIA.php index cd6c0bb1e39170a741ee45a668e2efab68a4841a..20032518fcd9faf556b6ada91b62ea896e619590 100644 --- a/module/finc/src/finc/ILS/Driver/DAIA.php +++ b/module/finc/src/finc/ILS/Driver/DAIA.php @@ -81,12 +81,40 @@ class DAIA extends \VuFind\ILS\Driver\AbstractBase implements protected $multiQuery = false; /** - * DAIA legacySupport flag + * acceptable ContentTypes delivered by DAIA server + * in HTTP header * - * @var boolean - * @deprecated Will be removed in the next driver version + * @var array */ - protected $legacySupport = false; + protected $contentTypesResponse; + + /** + * ContentTypes to use in PAIA HTTP requests + * in HTTP header + * + * @var array + */ + protected $contentTypesRequest = [ + "xml" => "application/xml", + "json" => "application/json", + ]; + + /** + * Date converter object + * + * @var \VuFind\Date\Converter + */ + protected $dateConverter; + + /** + * Constructor + * + * @param \VuFind\Date\Converter $converter Date converter + */ + public function __construct(\VuFind\Date\Converter $converter) + { + $this->dateConverter = $converter; + } /** * Initialize the driver. @@ -99,13 +127,6 @@ class DAIA extends \VuFind\ILS\Driver\AbstractBase implements */ public function init() { - // DAIA.ini sections changed, therefore move old [Global] section to - // new [DAIA] section as fallback - if (isset($this->config['Global']) && !isset($this->config['DAIA'])) { - $this->config['DAIA'] = $this->config['Global']; - $this->legacySupport = true; - } - if (isset($this->config['DAIA']['baseUrl'])) { $this->baseUrl = $this->config['DAIA']['baseUrl']; } else { @@ -130,6 +151,11 @@ class DAIA extends \VuFind\ILS\Driver\AbstractBase implements } else { $this->debug("No multiQuery setting found, using default: false"); } + if (isset($this->config['DAIA']['daiaContentTypes'])) { + $this->contentTypesResponse = $this->config['DAIA']['daiaContentTypes']; + } else { + $this->debug("No ContentTypes for response defined. Accepting any."); + } } /** @@ -177,27 +203,20 @@ class DAIA extends \VuFind\ILS\Driver\AbstractBase implements */ public function getStatus($id) { - if ($this->checkForILSTestId($id)) { - return []; - } - - if ($this->legacySupport) { - // we are in legacySupport mode, so use the deprecated - // getXMLStatus() method - return $this->getXMLStatus($id); - } else { - // let's retrieve the DAIA document by URI + // let's retrieve the DAIA document by URI + try { $rawResult = $this->doHTTPRequest($this->generateURI($id)); - if ($rawResult != false) { - // extract the DAIA document for the current id from the - // HTTPRequest's result - $doc = $this->extractDaiaDoc($id, $rawResult); - if (!is_null($doc)) { - // parse the extracted DAIA document and return the status info - return $this->parseDaiaDoc($id, $doc); - } + // extract the DAIA document for the current id from the + // HTTPRequest's result + $doc = $this->extractDaiaDoc($id, $rawResult); + if (!is_null($doc)) { + // parse the extracted DAIA document and return the status info + return $this->parseDaiaDoc($id, $doc); } + } catch (ILSException $e) { + $this->debug($e->getMessage()); } + return []; } @@ -208,14 +227,12 @@ class DAIA extends \VuFind\ILS\Driver\AbstractBase implements * collection of records. * As the DAIA Query API supports querying multiple ids simultaneously * (all ids divided by "|") getStatuses(ids) would call getStatus(id) only - * once, id containing the list of ids to be retrieved. Apart from the - * legacySupport this would cause some trouble as the list of ids does not - * necessarily correspond to the VuFind Record-id. Therefore getStatuses(ids) - * has its own logic for multiQuery-support and performs the HTTPRequest - * itself, retrieving one DAIA response for all ids and uses helper - * functions to split this one response into documents corresponding to the - * queried ids. - * If multiQueries are not supported, getStatus(id) is used. + * once, id containing the list of ids to be retrieved. This would cause some + * trouble as the list of ids does not necessarily correspond to the VuFind + * Record-id. Therefore getStatuses(ids) has its own logic for multiQuery-support + * and performs the HTTPRequest itself, retrieving one DAIA response for all ids + * and uses helper functions to split this one response into documents + * corresponding to the queried ids. * * @param array $ids The array of record ids to retrieve the status for * @@ -225,39 +242,41 @@ class DAIA extends \VuFind\ILS\Driver\AbstractBase implements { $status = []; - if ($this->legacySupport) { - // we are in legacySupport mode, so use the deprecated - // getXMLStatus() method for each id - foreach ($ids as $id) { - $status[] = $this->getXMLShortStatus($id); - } - } else { + try { if ($this->multiQuery) { // perform one DAIA query with multiple URIs - $rawResult = $this->doHTTPRequest($this->generateMultiURIs($ids)); - if ($rawResult != false) { - // now we need to reestablish the key-value pair id=>document as - // the id used in VuFind can differ from the document-URI - // (depending on how the URI is generated) - foreach ($ids as $id) { - // it is assumed that each DAIA document has a unique URI, - // so get the document with the corresponding id - $doc = $this->extractDaiaDoc($id, $rawResult); - if (!is_null($doc)) { - // a document with the corresponding id exists, which - // means we got status information for that record - $status[] = $this->parseDaiaDoc($id, $doc); - } - unset($doc); + $rawResult = $this + ->doHTTPRequest($this->generateMultiURIs($ids)); + // the id used in VuFind can differ from the document-URI + // (depending on how the URI is generated) + foreach ($ids as $id) { + // it is assumed that each DAIA document has a unique URI, + // so get the document with the corresponding id + $doc = $this->extractDaiaDoc($id, $rawResult); + if (!is_null($doc)) { + // a document with the corresponding id exists, which + // means we got status information for that record + $status[] = $this->parseDaiaDoc($id, $doc); } + unset($doc); } } else { - // multiQuery is not supported, so retrieve DAIA documents by - // performing getStatus(id) for all ids + // multiQuery is not supported, so retrieve DAIA documents one by + // one foreach ($ids as $id) { - $status[] = $this->getStatus($id); + $rawResult = $this->doHTTPRequest($this->generateURI($id)); + // extract the DAIA document for the current id from the + // HTTPRequest's result + $doc = $this->extractDaiaDoc($id, $rawResult); + if (!is_null($doc)) { + // parse the extracted DAIA document and save the status + // info + $status[] = $this->parseDaiaDoc($id, $doc); + } } } + } catch (ILSException $e) { + $this->debug($e->getMessage()); } return $status; } @@ -306,14 +325,9 @@ class DAIA extends \VuFind\ILS\Driver\AbstractBase implements */ protected function doHTTPRequest($id) { - $contentTypes = [ - "xml" => "application/xml", - "json" => "application/json", - ]; - $http_headers = [ - "Content-type: " . $contentTypes[$this->daiaResponseFormat], - "Accept: " . $contentTypes[$this->daiaResponseFormat], + "Content-type: " . $this->contentTypesRequest[$this->daiaResponseFormat], + "Accept: " . $this->contentTypesRequest[$this->daiaResponseFormat], ]; $params = [ @@ -322,49 +336,53 @@ class DAIA extends \VuFind\ILS\Driver\AbstractBase implements ]; try { - if ($this->legacySupport) { - // HttpRequest for DAIA legacy support as all - // the parameters are contained in the baseUrl - $result = $this->httpService->get( - $this->baseUrl . $id, - [], null, $http_headers - ); - } else { - $result = $this->httpService->get( - $this->baseUrl, - $params, null, $http_headers - ); - } + $result = $this->httpService->get( + $this->baseUrl, + $params, null, $http_headers + ); } catch (\Exception $e) { - throw new ILSException($e->getMessage()); + throw new ILSException( + 'HTTP request exited with Exception ' . $e->getMessage() . + ' for record: ' . $id + ); } if (!$result->isSuccess()) { - // throw ILSException disabled as this will be shown in VuFind-Frontend - //throw new ILSException('HTTP error ' . $result->getStatusCode() . - // ' retrieving status for record: ' . $id); - // write to Debug instead - $this->debug( + throw new ILSException( 'HTTP status ' . $result->getStatusCode() . ' received, retrieving availability information for record: ' . $id ); - // return false as DAIA request failed - return false; } // check if result matches daiaResponseFormat - if (!preg_match( - "/^" . - str_replace("/", "\/", $contentTypes[$this->daiaResponseFormat]) . - "(\s*)(\;.*)?/", - strtolower($result->getHeaders()->get("ContentType")->getFieldValue()) - )) { - throw new ILSException( - "DAIA-ResponseFormat not supported. Received: " . - $result->getHeaders()->get("ContentType")->getFieldValue() . " - " . - "Expected: " . $contentTypes[$this->daiaResponseFormat] - ); + if ($this->contentTypesResponse != null) { + if ($this->contentTypesResponse[$this->daiaResponseFormat]) { + $contentTypesResponse = array_map( + 'trim', + explode( + ",", + $this->contentTypesResponse[$this->daiaResponseFormat] + ) + ); + list($responseMediaType, $responseEncoding) = array_pad( + explode( + ";", + $result->getHeaders()->get("ContentType")->getFieldValue(), + 2 + ), + 2, + null + ); // workaround to avoid notices if encoding is not set in header + if (!in_array(trim($responseMediaType), $contentTypesResponse)) { + throw new ILSException( + "DAIA-ResponseFormat not supported. Received: " . + $responseMediaType . " - " . + "Expected: " . + $this->contentTypesResponse[$this->daiaResponseFormat] + ); + } + } } return ($result->getBody()); @@ -381,11 +399,7 @@ class DAIA extends \VuFind\ILS\Driver\AbstractBase implements */ protected function generateURI($id) { - if ($this->legacySupport) { - return $id; - } else { - return $this->daiaIdPrefix . $id; - } + return $this->daiaIdPrefix . $id; } /** @@ -430,11 +444,9 @@ class DAIA extends \VuFind\ILS\Driver\AbstractBase implements * compatible array of status information. * Supported types are: * - array (for JSON results) - * - DOMNode (for XML results) * * @param string $id Record Id corresponding to the DAIA document - * @param mixed $daiaDoc The DAIA document, supported types are array and - * DOMNode + * @param mixed $daiaDoc The DAIA document, only array is supported * * @return array An array with status information for the record * @throws ILSException @@ -443,8 +455,6 @@ class DAIA extends \VuFind\ILS\Driver\AbstractBase implements { if (is_array($daiaDoc)) { return $this->parseDaiaArray($id, $daiaDoc); - } elseif (is_subclass_of($daiaDoc, "DOMNode")) { - return $this->parseDaiaDom($id, $daiaDoc); } else { throw new ILSException( 'Unsupported document type (did not match Array or DOMNode).' @@ -468,38 +478,18 @@ class DAIA extends \VuFind\ILS\Driver\AbstractBase implements */ protected function extractDaiaDoc($id, $daiaResponse) { - + $docs = []; if ($this->daiaResponseFormat == 'xml') { try { - $docs = new DOMDocument(); - $docs->loadXML($daiaResponse); - // get all the DAIA documents - $doc = $docs->getElementsByTagName("document"); - if (!is_null($doc) && $this->multiQuery) { - // now loop through the found DAIA documents - for ($i = 0; $i < $doc->length; $i++) { - $attr = $doc->item($i)->attributes; - // DAIA documents should use URIs as value for id - $nodeValue = $attr->getNamedItem("id")->nodeValue; - if ($nodeValue == $this->generateURI($id)) { - // we've found the document element with the - // matching URI - return $doc->item($i); - } - } - } elseif (!is_null($doc)) { - // as multiQuery is not enabled we can be sure that the - // DAIA response only contains one document. - return $doc->item(0); - } - // no (id matching) document element found - return null; + $docs = $this->convertDaiaXmlToJson($daiaResponse); } catch (\Exception $e) { throw new ILSException($e->getMessage()); } - } elseif ($this->daiaResponseFormat == 'json') { $docs = json_decode($daiaResponse, true); + } + + if (count($docs)) { // do DAIA documents exist? if (array_key_exists("document", $docs) && $this->multiQuery) { // now loop through the found DAIA documents @@ -524,6 +514,83 @@ class DAIA extends \VuFind\ILS\Driver\AbstractBase implements } } + /** + * Converts a DAIA XML response to an array identical with a DAIA JSON response + * for the sent query. + * + * @param string $daiaResponse Response in XML format from DAIA service + * + * @return mixed + */ + protected function convertDaiaXmlToJson($daiaResponse) + { + $dom = new DOMDocument(); + $dom->loadXML($daiaResponse); + + // prepare DOMDocument as json_encode does not support save attributes if + // elements have values (see http://stackoverflow.com/a/20506281/2115462) + $prepare = function ($domNode) use (&$prepare) { + foreach ($domNode->childNodes as $node) { + if ($node->hasChildNodes()) { + $prepare($node); + } else { + if ($domNode->hasAttributes() && strlen($domNode->nodeValue)) { + if (trim($node->textContent)) { + $domNode->setAttribute("content", $node->textContent); + } + $node->nodeValue = ""; + } + } + } + }; + $prepare($dom); + + // now let json_encode/decode convert XML into an array + $daiaArray = json_decode( + json_encode(simplexml_load_string($dom->saveXML())), + true + ); + + // merge @attributes fields in parent array + $merge = function ($array) use (&$merge) { + foreach ($array as $key => $value) { + if (is_array($value)) { + $value = $merge($value); + } + if ($key === "@attributes") { + $array = array_merge($array, $value); + unset($array[$key]); + } else { + $array[$key] = $value; + } + } + return $array; + }; + $daiaArray = $merge($daiaArray); + + // restructure the array, moving single elements to their parent's index [0] + $restructure = function ($array) use (&$restructure) { + $elements = ["document", "item", "available", "unavailable"]; + foreach ($array as $key => $value) { + if (is_array($value)) { + $value = $restructure($value); + } + if (in_array($key, $elements, true) + && !isset($array[$key][0]) + ) { + unset($array[$key]); + $array[$key][] = $value; + } else { + $array[$key] = $value; + } + } + return $array; + }; + $daiaArray = $restructure($daiaArray); + + return $daiaArray; + } + /** * Parse an array with DAIA status information. * @@ -541,12 +608,12 @@ class DAIA extends \VuFind\ILS\Driver\AbstractBase implements $doc_id = $daiaArray["id"]; } if (array_key_exists("href", $daiaArray)) { - // url of the document + // url of the document (not needed for VuFind) $doc_href = $daiaArray["href"]; } if (array_key_exists("message", $daiaArray)) { - // array of messages with language code and content - $doc_message = $daiaArray["message"]; + // log messages for debugging + $this->logMessages($daiaArray['message'], "document"); } // if one or more items exist, iterate and build result-item if (array_key_exists("item", $daiaArray)) { @@ -555,27 +622,22 @@ class DAIA extends \VuFind\ILS\Driver\AbstractBase implements $result_item = []; $result_item["id"] = $id; $result_item["item_id"] = $item["id"]; - $result_item["ilslink"] = $doc_href; - $number++; // count items - $result_item["number"] = $number; + // custom DAIA field used in getHoldLink() + $result_item["ilslink"] + = (isset($item['href']) ? $item['href'] : $doc_href); + // count items + $number++; + $result_item["number"] = $this->getItemNumber($item, $number); // set default value for barcode - $result_item["barcode"] = "1"; + $result_item["barcode"] = $this->getItemBarcode($item); // set default value for reserve - $result_item["reserve"] = "N"; + $result_item["reserve"] = $this->getItemReserveStatus($item); // get callnumber - if (isset($item["label"])) { - $result_item["callnumber"] = $item["label"]; - } else { - $result_item["callnumber"] = "Unknown"; - } + $result_item["callnumber"] = $this->getItemCallnumber($item); // get location - if (isset($item["storage"]["content"])) { - $result_item["location"] = $item["storage"]["content"]; - } else { - $result_item["location"] = "Unknown"; - } + $result_item["location"] = $this->getItemLocation($item); // status and availability will be calculated in own function - $result_item = $this->calculateStatus($item)+$result_item; + $result_item = $this->getItemStatus($item)+$result_item; // add result_item to the result array $result[] = $result_item; } // end iteration on item @@ -585,299 +647,52 @@ class DAIA extends \VuFind\ILS\Driver\AbstractBase implements } /** - * Parse a DOMNode Object with DAIA status information. - * - * @param string $id Record id for the DAIA array. - * @param DOMNode $daiaDom DOMNode object with raw DAIA status information. - * - * @return array Array with VuFind compatible status information. - */ - protected function parseDaiaDom($id, $daiaDom) - { - $itemlist = $daiaDom->getElementsByTagName('item'); - $ilslink = ''; - if ($daiaDom->attributes->getNamedItem('href') !== null) { - $ilslink = $daiaDom->attributes - ->getNamedItem('href')->nodeValue; - } - $emptyResult = [ - 'callnumber' => '-', - 'availability' => '0', - 'number' => 1, - 'reserve' => 'No', - 'duedate' => '', - 'queue' => '', - 'delay' => '', - 'barcode' => 'No samples', - 'status' => '', - 'id' => $id, - 'location' => '', - 'ilslink' => $ilslink, - 'label' => 'No samples' - ]; - for ($c = 0; $itemlist->item($c) !== null; $c++) { - $result = [ - 'callnumber' => '', - 'availability' => '0', - 'number' => ($c+1), - 'reserve' => 'No', - 'duedate' => '', - 'queue' => '', - 'delay' => '', - 'barcode' => 1, - 'status' => '', - 'id' => $id, - 'item_id' => '', - 'recallhref' => '', - 'location' => '', - 'location.id' => '', - 'location.href' => '', - 'label' => '', - 'notes' => [], - ]; - if ($itemlist->item($c)->attributes->getNamedItem('id') !== null) { - $result['item_id'] = $itemlist->item($c)->attributes - ->getNamedItem('id')->nodeValue; - } - if ($itemlist->item($c)->attributes->getNamedItem('href') !== null) { - $result['recallhref'] = $itemlist->item($c)->attributes - ->getNamedItem('href')->nodeValue; - } - $departmentElements = $itemlist->item($c) - ->getElementsByTagName('department'); - if ($departmentElements->length > 0) { - if ($departmentElements->item(0)->nodeValue) { - $result['location'] - = $departmentElements->item(0)->nodeValue; - $result['location.id'] = $departmentElements - ->item(0)->attributes->getNamedItem('id')->nodeValue; - $result['location.href'] = $departmentElements - ->item(0)->attributes->getNamedItem('href')->nodeValue; - } - } - $storageElements - = $itemlist->item($c)->getElementsByTagName('storage'); - if ($storageElements->length > 0) { - if ($storageElements->item(0)->nodeValue) { - $result['location'] = $storageElements->item(0)->nodeValue; - //$result['location.id'] = $storageElements->item(0) - // ->attributes->getNamedItem('id')->nodeValue; - $href = $storageElements->item(0)->attributes - ->getNamedItem('href'); - if ($href !== null) { - //href attribute is recommended but not mandatory - $result['location.href'] = $storageElements->item(0) - ->attributes->getNamedItem('href')->nodeValue; - } - //$result['barcode'] = $result['location.id']; - } - } - $barcodeElements - = $itemlist->item($c)->getElementsByTagName('identifier'); - if ($barcodeElements->length > 0) { - if ($barcodeElements->item(0)->nodeValue) { - $result['barcode'] = $barcodeElements->item(0)->nodeValue; - } - } - $labelElements = $itemlist->item($c)->getElementsByTagName('label'); - if ($labelElements->length > 0) { - if ($labelElements->item(0)->nodeValue) { - $result['label'] = $labelElements->item(0)->nodeValue; - $result['callnumber'] - = urldecode($labelElements->item(0)->nodeValue); - } - } - $messageElements - = $itemlist->item($c)->getElementsByTagName('message'); - if ($messageElements->length > 0) { - for ($m = 0; $messageElements->item($m) !== null; $m++) { - $errno = $messageElements->item($m)->attributes - ->getNamedItem('errno')->nodeValue; - if ($errno === '404') { - $result['status'] = 'missing'; - } else if ($this->logger) { - $lang = $messageElements->item($m)->attributes - ->getNamedItem('lang')->nodeValue; - $logString = "[DAIA] message for {$lang}: " - . $messageElements->item($m)->nodeValue; - $this->debug($logString); - } - } - } - - //$loanAvail = 0; - //$loanExp = 0; - //$presAvail = 0; - //$presExp = 0; - - $unavailableElements = $itemlist->item($c) - ->getElementsByTagName('unavailable'); - if ($unavailableElements->item(0) !== null) { - for ($n = 0; $unavailableElements->item($n) !== null; $n++) { - $service = $unavailableElements->item($n)->attributes - ->getNamedItem('service'); - $expectedNode = $unavailableElements->item($n)->attributes - ->getNamedItem('expected'); - $queueNode = $unavailableElements->item($n)->attributes - ->getNamedItem('queue'); - if ($service !== null) { - $service = $service->nodeValue; - if ($service === 'presentation') { - $result['presentation.availability'] = '0'; - $result['presentation_availability'] = '0'; - if ($expectedNode !== null) { - $result['presentation.duedate'] - = $expectedNode->nodeValue; - } - if ($queueNode !== null) { - $result['presentation.queue'] - = $queueNode->nodeValue; - } - $result['availability'] = '0'; - } elseif ($service === 'loan') { - $result['loan.availability'] = '0'; - $result['loan_availability'] = '0'; - if ($expectedNode !== null) { - $result['loan.duedate'] - = $expectedNode->nodeValue; - } - if ($queueNode !== null) { - $result['loan.queue'] = $queueNode->nodeValue; - } - $result['availability'] = '0'; - } elseif ($service === 'interloan') { - $result['interloan.availability'] = '0'; - if ($expectedNode !== null) { - $result['interloan.duedate'] - = $expectedNode->nodeValue; - } - if ($queueNode !== null) { - $result['interloan.queue'] - = $queueNode->nodeValue; - } - $result['availability'] = '0'; - } elseif ($service === 'openaccess') { - $result['openaccess.availability'] = '0'; - if ($expectedNode !== null) { - $result['openaccess.duedate'] - = $expectedNode->nodeValue; - } - if ($queueNode !== null) { - $result['openaccess.queue'] - = $queueNode->nodeValue; - } - $result['availability'] = '0'; - } - } - // TODO: message/limitation - if ($expectedNode !== null) { - $result['duedate'] = $expectedNode->nodeValue; - } - if ($queueNode !== null) { - $result['queue'] = $queueNode->nodeValue; - } - } - } - - $availableElements = $itemlist->item($c) - ->getElementsByTagName('available'); - if ($availableElements->item(0) !== null) { - for ($n = 0; $availableElements->item($n) !== null; $n++) { - $service = $availableElements->item($n)->attributes - ->getNamedItem('service'); - $delayNode = $availableElements->item($n)->attributes - ->getNamedItem('delay'); - if ($service !== null) { - $service = $service->nodeValue; - if ($service === 'presentation') { - $result['presentation.availability'] = '1'; - $result['presentation_availability'] = '1'; - if ($delayNode !== null) { - $result['presentation.delay'] - = $delayNode->nodeValue; - } - $result['availability'] = '1'; - } elseif ($service === 'loan') { - $result['loan.availability'] = '1'; - $result['loan_availability'] = '1'; - if ($delayNode !== null) { - $result['loan.delay'] = $delayNode->nodeValue; - } - $result['availability'] = '1'; - } elseif ($service === 'interloan') { - $result['interloan.availability'] = '1'; - if ($delayNode !== null) { - $result['interloan.delay'] - = $delayNode->nodeValue; - } - $result['availability'] = '1'; - } elseif ($service === 'openaccess') { - $result['openaccess.availability'] = '1'; - if ($delayNode !== null) { - $result['openaccess.delay'] - = $delayNode->nodeValue; - } - $result['availability'] = '1'; - } - } - // TODO: message/limitation - if ($delayNode !== null) { - $result['delay'] = $delayNode->nodeValue; - } - } - } - // document has no availability elements, so set availability - // and barcode to -1 - if ($availableElements->item(0) === null - && $unavailableElements->item(0) === null - ) { - $result['availability'] = '-1'; - $result['barcode'] = '-1'; - } - $result['ilslink'] = $ilslink; - $status[] = $result; - /* $status = "available"; - if (loanAvail) return 0; - if (presAvail) { - if (loanExp) return 1; - return 2; - } - if (loanExp) return 3; - if (presExp) return 4; - return 5; - */ - } - if (count($status) === 0) { - $status[] = $emptyResult; - } - - return $status; - } - - /** - * Calculate Status and Availability of an item - * - * If availability is false the string of status will be shown in vufind + * Returns an array with status information for provided item. * - * @param string $item json DAIA item + * @param array $item Array with DAIA item data * - * @return array("status"=>"only for VIPs" ... ) + * @return array */ - protected function calculateStatus($item) + protected function getItemStatus($item) { $availability = false; $status = ''; // status cannot be null as this will crash the translator $duedate = null; + $availableLink = ''; + $queue = ''; if (array_key_exists("available", $item)) { - // check if item is loanable or presentation - foreach ($item["available"] as $available) { - // attribute service can be set once or not - if (isset($available["service"])) { - if ($available["service"] == "loan") { + if (count($item['available']) === 1) { + $availability = true; + } else { + // check if item is loanable or presentation + foreach ($item["available"] as $available) { + // attribute service can be set once or not + if (isset($available["service"]) + && in_array( + $available['service'], + ['loan', 'presentation', 'openaccess'] + ) + ) { + // set item available if service is loan, presentation or + // openaccess $availability = true; + if ($available['service'] == "loan" + && isset($available['service']['href']) + ) { + // save the link to the ils if we have a href for loan + // service + $availableLink = $available['service']['href']; + } } - if ($available["service"] == "presentation") { - $availability = true; + + // use limitation element for status string + if (isset($available['limitation'])) { + $status = $this->getItemLimitation($available['limitation']); + } + + // log messages for debugging + if (isset($available['message'])) { + $this->logMessages($available['message'], "item->available"); } } } @@ -885,456 +700,158 @@ class DAIA extends \VuFind\ILS\Driver\AbstractBase implements if (array_key_exists("unavailable", $item)) { foreach ($item["unavailable"] as $unavailable) { // attribute service can be set once or not - if (isset($unavailable["service"])) { - if ($unavailable["service"] == "loan") { - $status = "dummy text"; + if (isset($unavailable["service"]) + && in_array( + $unavailable['service'], + ['loan', 'presentation', 'openaccess'] + ) + ) { + if ($unavailable['service'] == "loan" + && isset($unavailable['service']['href']) + ) { + //save the link to the ils if we have a href for loan service + } + + // use limitation element for status string + if (isset($unavailable['limitation'])) { + $status = $this + ->getItemLimitation($unavailable['limitation']); } } // attribute expected is mandatory for unavailable element if (isset($unavailable["expected"])) { - $duedate = $unavailable["expected"]; + $duedate = $this->dateConverter + ->convertToDisplayDate("Y-m-d", $unavailable['expected']); + } + + // attribute queue can be set + if (isset($unavailable["queue"])) { + $queue = $unavailable["queue"]; + } + + // log messages for debugging + if (isset($unavailable['message'])) { + $this->logMessages($unavailable['message'], 'item->unavailable'); } } } - return (["status" => $status, - "availability" => $availability, - "duedate" => $duedate]); + + /*'availability' => '0', + 'status' => '', // string - needs to be computed from availability info + 'duedate' => '', // if checked_out else null + 'returnDate' => '', // false if not recently returned(?) + 'requests_placed' => '', // total number of placed holds + 'is_holdable' => false, // place holding possible?*/ + + if (!empty($availableLink)) { + $return['ilslink'] = $availableLink; + } + + $return["status"] = $status; + $return["availability"] = $availability; + $return["duedate"] = $duedate; + $return["requests_placed"] = $queue; + + return $return; } /** - * Flatten a DAIA response to an array of holding information. + * Returns the value for "number" in VuFind getStatus/getHolding array * - * @param string $id Document to look up. + * @param array $item Array with DAIA item data + * @param int $counter Integer counting items as alternative return value * - * @return array - * - * @deprecated Only kept for legacySupport + * @return mixed */ - protected function getXMLStatus($id) + protected function getItemNumber($item, $counter) { - $daia = new DOMDocument(); - $response = $this->doHTTPRequest($id); - if ($response) { - $daia->loadXML($response); - } - // get Availability information from DAIA - $documentlist = $daia->getElementsByTagName('document'); - - // handle empty DAIA response - if ($documentlist->length == 0 - && $daia->getElementsByTagName("message") != null - ) { - // analyse the message for the error handling and debugging - } + return $counter; + } - $status = []; - for ($b = 0; $documentlist->item($b) !== null; $b++) { - $itemlist = $documentlist->item($b)->getElementsByTagName('item'); - $ilslink = ''; - if ($documentlist->item($b)->attributes->getNamedItem('href') !== null) { - $ilslink = $documentlist->item($b)->attributes - ->getNamedItem('href')->nodeValue; - } - $emptyResult = [ - 'callnumber' => '-', - 'availability' => '0', - 'number' => 1, - 'reserve' => 'No', - 'duedate' => '', - 'queue' => '', - 'delay' => '', - 'barcode' => 'No samples', - 'status' => '', - 'id' => $id, - 'location' => '', - 'ilslink' => $ilslink, - 'label' => 'No samples' - ]; - for ($c = 0; $itemlist->item($c) !== null; $c++) { - $result = [ - 'callnumber' => '', - 'availability' => '0', - 'number' => ($c+1), - 'reserve' => 'No', - 'duedate' => '', - 'queue' => '', - 'delay' => '', - 'barcode' => 1, - 'status' => '', - 'id' => $id, - 'item_id' => '', - 'recallhref' => '', - 'location' => '', - 'location.id' => '', - 'location.href' => '', - 'label' => '', - 'notes' => [], - ]; - if ($itemlist->item($c)->attributes->getNamedItem('id') !== null) { - $result['item_id'] = $itemlist->item($c)->attributes - ->getNamedItem('id')->nodeValue; - } - if ($itemlist->item($c)->attributes->getNamedItem('href') !== null) { - $result['recallhref'] = $itemlist->item($c)->attributes - ->getNamedItem('href')->nodeValue; - } - $departmentElements = $itemlist->item($c) - ->getElementsByTagName('department'); - if ($departmentElements->length > 0) { - if ($departmentElements->item(0)->nodeValue) { - $result['location'] - = $departmentElements->item(0)->nodeValue; - $result['location.id'] = $departmentElements - ->item(0)->attributes->getNamedItem('id')->nodeValue; - $result['location.href'] = $departmentElements - ->item(0)->attributes->getNamedItem('href')->nodeValue; - } - } - $storageElements - = $itemlist->item($c)->getElementsByTagName('storage'); - if ($storageElements->length > 0) { - if ($storageElements->item(0)->nodeValue) { - $result['location'] = $storageElements->item(0)->nodeValue; - //$result['location.id'] = $storageElements->item(0) - // ->attributes->getNamedItem('id')->nodeValue; - $href = $storageElements->item(0)->attributes - ->getNamedItem('href'); - if ($href !== null) { - //href attribute is recommended but not mandatory - $result['location.href'] = $storageElements->item(0) - ->attributes->getNamedItem('href')->nodeValue; - } - //$result['barcode'] = $result['location.id']; - } - } - $barcodeElements - = $itemlist->item($c)->getElementsByTagName('identifier'); - if ($barcodeElements->length > 0) { - if ($barcodeElements->item(0)->nodeValue) { - $result['barcode'] = $barcodeElements->item(0)->nodeValue; - } - } - $labelElements = $itemlist->item($c)->getElementsByTagName('label'); - if ($labelElements->length > 0) { - if ($labelElements->item(0)->nodeValue) { - $result['label'] = $labelElements->item(0)->nodeValue; - $result['callnumber'] - = urldecode($labelElements->item(0)->nodeValue); - } - } - $messageElements - = $itemlist->item($c)->getElementsByTagName('message'); - if ($messageElements->length > 0) { - for ($m = 0; $messageElements->item($m) !== null; $m++) { - $errno = $messageElements->item($m)->attributes - ->getNamedItem('errno')->nodeValue; - if ($errno === '404') { - $result['status'] = 'missing'; - } else if ($this->logger) { - $lang = $messageElements->item($m)->attributes - ->getNamedItem('lang')->nodeValue; - $logString = "[DAIA] message for {$lang}: " - . $messageElements->item($m)->nodeValue; - $this->debug($logString); - } - } - } + /** + * Returns the value for "barcode" in VuFind getStatus/getHolding array + * + * @param array $item Array with DAIA item data + * + * @return string + */ + protected function getItemBarcode($item) + { + return "1"; + } - //$loanAvail = 0; - //$loanExp = 0; - //$presAvail = 0; - //$presExp = 0; + /** + * Returns the value for "reserve" in VuFind getStatus/getHolding array + * + * @param array $item Array with DAIA item data + * + * @return string + */ + protected function getItemReserveStatus($item) + { + return "N"; + } - $unavailableElements = $itemlist->item($c) - ->getElementsByTagName('unavailable'); - if ($unavailableElements->item(0) !== null) { - for ($n = 0; $unavailableElements->item($n) !== null; $n++) { - $service = $unavailableElements->item($n)->attributes - ->getNamedItem('service'); - $expectedNode = $unavailableElements->item($n)->attributes - ->getNamedItem('expected'); - $queueNode = $unavailableElements->item($n)->attributes - ->getNamedItem('queue'); - if ($service !== null) { - $service = $service->nodeValue; - if ($service === 'presentation') { - $result['presentation.availability'] = '0'; - $result['presentation_availability'] = '0'; - if ($expectedNode !== null) { - $result['presentation.duedate'] - = $expectedNode->nodeValue; - } - if ($queueNode !== null) { - $result['presentation.queue'] - = $queueNode->nodeValue; - } - $result['availability'] = '0'; - } elseif ($service === 'loan') { - $result['loan.availability'] = '0'; - $result['loan_availability'] = '0'; - if ($expectedNode !== null) { - $result['loan.duedate'] - = $expectedNode->nodeValue; - } - if ($queueNode !== null) { - $result['loan.queue'] = $queueNode->nodeValue; - } - $result['availability'] = '0'; - } elseif ($service === 'interloan') { - $result['interloan.availability'] = '0'; - if ($expectedNode !== null) { - $result['interloan.duedate'] - = $expectedNode->nodeValue; - } - if ($queueNode !== null) { - $result['interloan.queue'] - = $queueNode->nodeValue; - } - $result['availability'] = '0'; - } elseif ($service === 'openaccess') { - $result['openaccess.availability'] = '0'; - if ($expectedNode !== null) { - $result['openaccess.duedate'] - = $expectedNode->nodeValue; - } - if ($queueNode !== null) { - $result['openaccess.queue'] - = $queueNode->nodeValue; - } - $result['availability'] = '0'; - } - } - // TODO: message/limitation - if ($expectedNode !== null) { - $result['duedate'] = $expectedNode->nodeValue; - } - if ($queueNode !== null) { - $result['queue'] = $queueNode->nodeValue; - } - } - } + /** + * Returns the value for "callnumber" in VuFind getStatus/getHolding array + * + * @param array $item Array with DAIA item data + * + * @return string + */ + protected function getItemCallnumber($item) + { + return array_key_exists("label", $item) + ? $item['label'] + : "Unknown"; + } - $availableElements = $itemlist->item($c) - ->getElementsByTagName('available'); - if ($availableElements->item(0) !== null) { - for ($n = 0; $availableElements->item($n) !== null; $n++) { - $service = $availableElements->item($n)->attributes - ->getNamedItem('service'); - $delayNode = $availableElements->item($n)->attributes - ->getNamedItem('delay'); - if ($service !== null) { - $service = $service->nodeValue; - if ($service === 'presentation') { - $result['presentation.availability'] = '1'; - $result['presentation_availability'] = '1'; - if ($delayNode !== null) { - $result['presentation.delay'] - = $delayNode->nodeValue; - } - $result['availability'] = '1'; - } elseif ($service === 'loan') { - $result['loan.availability'] = '1'; - $result['loan_availability'] = '1'; - if ($delayNode !== null) { - $result['loan.delay'] = $delayNode->nodeValue; - } - $result['availability'] = '1'; - } elseif ($service === 'interloan') { - $result['interloan.availability'] = '1'; - if ($delayNode !== null) { - $result['interloan.delay'] - = $delayNode->nodeValue; - } - $result['availability'] = '1'; - } elseif ($service === 'openaccess') { - $result['openaccess.availability'] = '1'; - if ($delayNode !== null) { - $result['openaccess.delay'] - = $delayNode->nodeValue; - } - $result['availability'] = '1'; - } - } - // TODO: message/limitation - if ($delayNode !== null) { - $result['delay'] = $delayNode->nodeValue; - } - } - } - // document has no availability elements, so set availability - // and barcode to -1 - if ($availableElements->item(0) === null - && $unavailableElements->item(0) === null - ) { - $result['availability'] = '-1'; - $result['barcode'] = '-1'; - } - $result['ilslink'] = $ilslink; - $status[] = $result; - /* $status = "available"; - if (loanAvail) return 0; - if (presAvail) { - if (loanExp) return 1; - return 2; - } - if (loanExp) return 3; - if (presExp) return 4; - return 5; - */ - } - if (count($status) === 0) { - $status[] = $emptyResult; - } + /** + * Returns the value for "location" in VuFind getStatus/getHolding array + * + * @param array $item Array with DAIA item data + * + * @return string + */ + protected function getItemLocation($item) + { + if (isset($item['storage']) + && array_key_exists('content', $item['storage']) + ) { + return $item['storage']['content']; } - return $status; + return "Unknown"; } /** - * Return an abbreviated set of status information. + * Returns the evaluated value of the provided limitation element * - * @param string $id The record id to retrieve the status for + * @param array $limitation Array with DAIA limitation data * - * @return mixed On success, an associative array with the following keys: - * id, availability (boolean), status, location, reserve, callnumber, duedate, - * number + * @return string + */ + protected function getItemLimitation($limitation) + { + return (isset($limitation['content']) ? $limitation['content'] : ''); + } + + /** + * Logs content of message elements in DAIA response for debugging * - * @deprecated Only kept for legacySupport + * @param array $messages Array with message elements to be logged + * @param string $context Description of current message context + * + * @return void */ - public function getXMLShortStatus($id) + protected function logMessages($messages, $context) { - $daia = new DOMDocument(); - $response = $this->doHTTPRequest($id); - if ($response) { - $daia->loadXML($response); - } - // get Availability information from DAIA - $itemlist = $daia->getElementsByTagName('item'); - $label = "Unknown"; - $storage = "Unknown"; - $presenceOnly = '1'; - $holding = []; - for ($c = 0; $itemlist->item($c) !== null; $c++) { - $earliest_href = ''; - $storageElements = $itemlist->item($c)->getElementsByTagName('storage'); - if ($storageElements->item(0) && $storageElements->item(0)->nodeValue) { - if ($storageElements->item(0)->nodeValue === 'Internet') { - $href = $storageElements->item(0)->attributes - ->getNamedItem('href')->nodeValue; - $storage = '<a href="' . $href . '">' . $href . '</a>'; - } else { - $storage = $storageElements->item(0)->nodeValue; - } - } - $labelElements = $itemlist->item($c)->getElementsByTagName('label'); - if ($labelElements->item(0)->nodeValue) { - $label = $labelElements->item(0)->nodeValue; - } - $availableElements = $itemlist->item($c) - ->getElementsByTagName('available'); - if ($availableElements->item(0) !== null) { - $availability = 1; - $status = 'Available'; - $href = $availableElements->item(0)->attributes - ->getNamedItem('href'); - if ($href !== null) { - $earliest_href = $href->nodeValue; - } - for ($n = 0; $availableElements->item($n) !== null; $n++) { - $svc = $availableElements->item($n)->getAttribute('service'); - if ($svc === 'loan') { - $presenceOnly = '0'; - } - // $status .= ' ' . $svc; - } - } else { - $leanable = 1; - $unavailableElements = $itemlist->item($c) - ->getElementsByTagName('unavailable'); - if ($unavailableElements->item(0) !== null) { - $earliest = []; - $queue = []; - $hrefs = []; - for ($n = 0; $unavailableElements->item($n) !== null; $n++) { - $unavailHref = $unavailableElements->item($n)->attributes - ->getNamedItem('href'); - if ($unavailHref !== null) { - $hrefs['item' . $n] = $unavailHref->nodeValue; - } - $expectedNode = $unavailableElements->item($n)->attributes - ->getNamedItem('expected'); - if ($expectedNode !== null) { - //$duedate = $expectedNode->nodeValue; - //$duedate_arr = explode('-', $duedate); - //$duedate_timestamp = mktime( - // '0', '0', '0', $duedate_arr[1], $duedate_arr[2], - // $duedate_arr[0] - //); - //array_push($earliest, array( - // 'expected' => $expectedNode->nodeValue, - // 'recall' => $unavailHref->nodeValue); - //array_push($earliest, $expectedNode->nodeValue); - $earliest['item' . $n] = $expectedNode->nodeValue; - } else { - array_push($earliest, "0"); - } - $queueNode = $unavailableElements->item($n)->attributes - ->getNamedItem('queue'); - if ($queueNode !== null) { - $queue['item' . $n] = $queueNode->nodeValue; - } else { - array_push($queue, "0"); - } - } - } - if (count($earliest) > 0) { - arsort($earliest); - $earliest_counter = 0; - foreach ($earliest as $earliest_key => $earliest_value) { - if ($earliest_counter === 0) { - $earliest_duedate = $earliest_value; - $earliest_href = isset($hrefs[$earliest_key]) - ? $hrefs[$earliest_key] : ''; - $earliest_queue = isset($queue[$earliest_key]) - ? $queue[$earliest_key] : ''; - } - $earliest_counter = 1; - } - } else { - $leanable = 0; - } - $messageElements = $itemlist->item($c) - ->getElementsByTagName('message'); - if ($messageElements->length > 0) { - $errno = $messageElements->item(0)->attributes - ->getNamedItem('errno')->nodeValue; - if ($errno === '404') { - $status = 'missing'; - } - } - if (!isset($status)) { - $status = 'Unavailable'; - } - $availability = 0; - } - $reserve = 'N'; - if (isset($earliest_queue) && $earliest_queue > 0) { - $reserve = 'Y'; + foreach ($messages as $message) { + if (isset($message['content'])) { + $this->debug( + "Message in DAIA response (" . (string) $context . "): " . + $message['content'] + ); } - $holding[] = [ - 'availability' => $availability, - 'id' => $id, - 'status' => isset($status) ? "$status" : '', - 'location' => isset($storage) ? "$storage" : '', - 'reserve' => isset($reserve) ? $reserve : '', - 'queue' => isset($earliest_queue) ? $earliest_queue : '', - 'callnumber' => isset($label) ? "$label" : '', - 'duedate' => isset($earliest_duedate) ? $earliest_duedate : '', - 'leanable' => isset($leanable) ? $leanable : '', - 'recallhref' => isset($earliest_href) ? $earliest_href : '', - 'number' => ($c+1), - 'presenceOnly' => isset($presenceOnly) ? $presenceOnly : '', - ]; } - return $holding; } } \ No newline at end of file diff --git a/module/finc/src/finc/ILS/Driver/Factory.php b/module/finc/src/finc/ILS/Driver/Factory.php index a9c36c434de7fda4ca3382138df3bf943b8f7f15..2c7f3bf9d6d6790b8686a50439653b336ae6b3f7 100644 --- a/module/finc/src/finc/ILS/Driver/Factory.php +++ b/module/finc/src/finc/ILS/Driver/Factory.php @@ -50,9 +50,38 @@ class Factory public static function getFincILS(ServiceManager $sm) { return new FincILS( + $sm->getServiceLocator()->get('VuFind\DateConverter'), $sm->getServiceLocator()->get('VuFind\RecordLoader'), $sm->getServiceLocator()->get('VuFind\Config')->get('config') ); } + /** + * Factory for DAIA driver. + * + * @param ServiceManager $sm Service manager. + * + * @return DAIA + */ + public static function getDAIA(ServiceManager $sm) + { + return new DAIA( + $sm->getServiceLocator()->get('VuFind\DateConverter') + ); + } + + /** + * Factory for PAIA driver. + * + * @param ServiceManager $sm Service manager. + * + * @return PAIA + */ + public static function getPAIA(ServiceManager $sm) + { + return new PAIA( + $sm->getServiceLocator()->get('VuFind\DateConverter') + ); + } + } \ No newline at end of file diff --git a/module/finc/src/finc/ILS/Driver/FincILS.php b/module/finc/src/finc/ILS/Driver/FincILS.php index a0fe764d17789536e41c02166477274734edd56b..a06e9ee1360004b1dba3a110a0bae39f806200ce 100644 --- a/module/finc/src/finc/ILS/Driver/FincILS.php +++ b/module/finc/src/finc/ILS/Driver/FincILS.php @@ -70,6 +70,13 @@ class FincILS extends PAIA implements LoggerAwareInterface */ protected $recordLoader; + /** + * Date converter object + * + * @var \VuFind\Date\Converter + */ + protected $dateConverter; + /** * Main Config * @@ -80,12 +87,15 @@ class FincILS extends PAIA implements LoggerAwareInterface /** * Constructor * - * @param \VuFind\Record\Loader $loader Record loader - * @param \Zend\Config\Config $mainConfig VuFind main configuration (omit for + * @param \VuFind\Date\Converter $converter Date converter + * @param \VuFind\Record\Loader $loader Record loader + * @param \Zend\Config\Config $mainConfig VuFind main configuration (omit for * built-in defaults) */ - public function __construct(\VuFind\Record\Loader $loader, $mainConfig = null) - { + public function __construct(\VuFind\Date\Converter $converter, + \VuFind\Record\Loader $loader, $mainConfig = null + ) { + $this->dateConverter = $converter; $this->recordLoader = $loader; $this->mainConfig = $mainConfig; } @@ -103,49 +113,25 @@ class FincILS extends PAIA implements LoggerAwareInterface { parent::init(); - // due to section naming changes in DAIA.ini switch legacySupport - if ($this->legacySupport) { - // set the ILS-specific recordId for interaction with ILS + // set the ILS-specific recordId for interaction with ILS - // get the ILS-specific identifier - if (!isset($this->config['Global']['ilsIdentifier'])) { - $this->debug( - "No ILS-specific identifier configured, setting ilsIdentifier=default." - ); - $this->ilsIdentifier = "default"; - } else { - $this->ilsIdentifier = $this->config['Global']['ilsIdentifier']; - } - - // get ISIL from config if ILS-specific recordId is barcode for - // interaction with ILS - if (!isset($this->mainConfig['InstitutionInfo']['isil'])) { - $this->debug("No ISIL defined in section InstitutionInfo in config.ini."); - $this->isil = []; - } else { - $this->isil = $this->mainConfig['InstitutionInfo']['isil']->toArray(); - } + // get the ILS-specific identifier + if (!isset($this->config['DAIA']['ilsIdentifier'])) { + $this->debug( + "No ILS-specific identifier configured, setting ilsIdentifier=default." + ); + $this->ilsIdentifier = "default"; } else { - // set the ILS-specific recordId for interaction with ILS - - // get the ILS-specific identifier - if (!isset($this->config['DAIA']['ilsIdentifier'])) { - $this->debug( - "No ILS-specific identifier configured, setting ilsIdentifier=default." - ); - $this->ilsIdentifier = "default"; - } else { - $this->ilsIdentifier = $this->config['DAIA']['ilsIdentifier']; - } + $this->ilsIdentifier = $this->config['DAIA']['ilsIdentifier']; + } - // get ISIL from config if ILS-specific recordId is barcode for - // interaction with ILS - if (!isset($this->mainConfig['InstitutionInfo']['isil'])) { - $this->debug("No ISIL defined in section InstitutionInfo in config.ini."); - $this->isil = []; - } else { - $this->isil = $this->mainConfig['InstitutionInfo']['isil']->toArray(); - } + // get ISIL from config if ILS-specific recordId is barcode for + // interaction with ILS + if (!isset($this->mainConfig['InstitutionInfo']['isil'])) { + $this->debug("No ISIL defined in section InstitutionInfo in config.ini."); + $this->isil = []; + } else { + $this->isil = $this->mainConfig['InstitutionInfo']['isil']->toArray(); } $this->_testILSConnections(); @@ -357,25 +343,19 @@ class FincILS extends PAIA implements LoggerAwareInterface { try { // test DAIA service - $this->httpService->get( - substr( - $this->baseUrl, - 0, - strrpos($this->baseUrl, "/", strrpos($this->baseUrl, "/")) - ) + preg_match( + "/^(http[s:\/0-9\.]*(:[0-9]*)?\/[a-z]*)/", + $this->baseUrl, + $daiaMatches ); + $this->httpService->get($daiaMatches[1]); // test PAIA service - $this->httpService->get( - substr( - $this->paiaURL, - 0, - strrpos( - $this->paiaURL, - "/", - strrpos($this->paiaURL, "/", strrpos($this->paiaURL, "/")) - ) - ) + preg_match( + "/^(http[s:\/0-9\.]*(:[0-9]*)?\/[a-z]*)/", + $this->paiaURL, + $paiaMatches ); + $this->httpService->get($paiaMatches[1]); } catch (\Exception $e) { throw new ILSException($e->getMessage()); } diff --git a/module/finc/src/finc/ILS/Driver/PAIA.php b/module/finc/src/finc/ILS/Driver/PAIA.php index fe6e2ed8e550a60a6228eb14f068dd6c95c34684..b436d6c2ec9d45fa224d889070d1bccd16369b77 100644 --- a/module/finc/src/finc/ILS/Driver/PAIA.php +++ b/module/finc/src/finc/ILS/Driver/PAIA.php @@ -4,7 +4,8 @@ * * PHP version 5 * - * Copyright (C) Oliver Goldschmidt, Magda Roos, Till Kinstler 2013, 2014. + * Copyright (C) Oliver Goldschmidt, Magda Roos, Till Kinstler, André Lahmann 2013, + * 2014, 2015. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -73,7 +74,7 @@ class PAIA extends DAIA implements parent::init(); if (!(isset($this->config['PAIA']['baseUrl']))) { - throw new ILSException('PAIA/URL configuration needs to be set.'); + throw new ILSException('PAIA/baseUrl configuration needs to be set.'); } $this->paiaURL = $this->config['PAIA']['baseUrl']; @@ -303,10 +304,10 @@ class PAIA extends DAIA implements ]; } else { $details[$item_id] = [ - 'success' => false, - 'new_date' => $element['endtime'], - 'item_id' => 0, - 'sysMessage' => 'Request rejected' + 'success' => false, + 'new_date' => $element['endtime'], + 'item_id' => 0, + 'sysMessage' => 'Request rejected' ]; } } @@ -835,7 +836,7 @@ class PAIA extends DAIA implements $http_headers = [ 'Authorization' => 'Bearer ' .$access_token, 'Content-type' => 'application/json; charset=UTF-8', - ]; + ]; try { $result = $this->httpService->get( @@ -931,7 +932,6 @@ class PAIA extends DAIA implements "scope" => "read_patron read_fees read_items write_items change_password" ]; $login_response = $this->_postit('/auth/login', $post_data); - $json_start = strpos($login_response, '{'); $json_response = substr($login_response, $json_start); $array_response = json_decode($json_response, true); @@ -984,4 +984,4 @@ class PAIA extends DAIA implements return $this->parseUserDetails($patron, $user_response); } -} \ No newline at end of file +} diff --git a/module/finc/src/finc/RecordDriver/Factory.php b/module/finc/src/finc/RecordDriver/Factory.php index f99c665b40d3bc659d90f5237692200c188c4ba3..b37c8e1a2627e9ca059dae77856a2c537636c143 100644 --- a/module/finc/src/finc/RecordDriver/Factory.php +++ b/module/finc/src/finc/RecordDriver/Factory.php @@ -86,7 +86,7 @@ class Factory * * @param ServiceManager $sm Service manager. * - * @return SolrMarc + * @return SolrMarcRemote */ public static function getSolrMarcRemote(ServiceManager $sm) { @@ -125,7 +125,7 @@ class Factory * * @param ServiceManager $sm Service manager. * - * @return SolrMarc + * @return SolrMarcRemoteFinc */ public static function getSolrMarcRemoteFinc(ServiceManager $sm) { @@ -142,4 +142,27 @@ class Factory $driver->attachSearchService($sm->getServiceLocator()->get('VuFind\Search')); return $driver; } + + /** + * Factory for SolrMarcFinc record driver. + * + * @param ServiceManager $sm Service manager. + * + * @return SolrMarcFinc + */ + public static function getSolrMarcFinc(ServiceManager $sm) + { + $driver = new SolrMarcFinc( + $sm->getServiceLocator()->get('VuFind\Config')->get('config'), + null, + $sm->getServiceLocator()->get('VuFind\Config')->get('searches') + ); + $driver->attachILS( + $sm->getServiceLocator()->get('VuFind\ILSConnection'), + $sm->getServiceLocator()->get('VuFind\ILSHoldLogic'), + $sm->getServiceLocator()->get('VuFind\ILSTitleHoldLogic') + ); + $driver->attachSearchService($sm->getServiceLocator()->get('VuFind\Search')); + return $driver; + } } diff --git a/module/finc/src/finc/RecordDriver/SolrDefault.php b/module/finc/src/finc/RecordDriver/SolrDefault.php index c59ce94d19046772c339c624b09e216d38f2dfba..f619e72812bdc8e46ba0d0f03c92309c23f16b8d 100644 --- a/module/finc/src/finc/RecordDriver/SolrDefault.php +++ b/module/finc/src/finc/RecordDriver/SolrDefault.php @@ -31,7 +31,7 @@ * @SuppressWarnings(PHPMD.ExcessivePublicCount) */ namespace finc\RecordDriver; -use VuFindSearch\ParamBag; +use Zend\Log\LoggerAwareInterface as LoggerAwareInterface; /** * finc specific model for Solr records based on the stock @@ -47,527 +47,9 @@ use VuFindSearch\ParamBag; * @link http://vufind.org/wiki/vufind2:record_drivers Wiki * @SuppressWarnings(PHPMD.ExcessivePublicCount) */ -class SolrDefault extends \VuFind\RecordDriver\SolrDefault +class SolrDefault extends \VuFind\RecordDriver\SolrDefault implements + LoggerAwareInterface { - - /** - * Return the custom index field local_heading if indexExtension is set. - * If indexExtension is set local_heading_{indexExtension} is returned, - * if local_heading_{indexExtesion} is empty, - * local_heading_facet_{indexExtension} is returned. - * - * @return array Containing local_heading_[facet_]{indexExtension} fields. - * @access public - */ - public function getLocalHeading() { - - $array = []; - - if (isset($this->mainConfig->Site->indexExtension)) { - $array = isset($this->fields['local_heading_' . ($this->mainConfig->Site->indexExtension)]) ? - $this->fields['local_heading_' . ($this->mainConfig->Site->indexExtension)] : []; - // Use local_heading_facet field if local_heading field delivers no results at first - if (count($array) == 0) { - $array = isset($this->fields['local_heading_facet_' . ($this->mainConfig->Site->indexExtension)]) ? - $this->fields['local_heading_facet_' . ($this->mainConfig->Site->indexExtension)] : []; - } - } - return $array; - } - - /** - * Controller to decide when local format field of a library should be - * retrieved from marc. Pass through method for PrimoCentral - * - * Public method for tuf to display format at search modul. - * - * @internal This method should be dropped or renamed (getStandardFormat()) - * as it is only a wrapper for the custom method getFormat() which - * in turn behaves as the stock getFormats() method. - * - * @deprecated No need for this wrapper in custom SolrDefault - * - * @return array - * @access public - */ - public function getLocalFormat() - { - return $this->getFormat(); - } - - /** - * Get back the standardizied format field of Solr index. - * - * @deprecated Should also be possible to be dropped (@see getLocalFormat()) - * - * @return array - */ - public function getFormat() - { - return isset($this->fields['format']) ? $this->fields['format'] : []; - } - - /** - * Get an array of all the formats associated with the record. If indexExtension - * is set and generalFormats is disabled in config.ini return the field - * format_{indexExtension}, format otherwise. - * - * @return array Array with formats associated with the record. - */ - public function getFormats() - { - // check if general 'format' index field should be used - $isGeneralFormat = (isset($this->mainConfig->Site->generalFormats) - && true == $this->mainConfig->Site->generalFormats) - ? true : false; - // check if there's an extension defined for the library depended format - // index field - $isExtension = (isset($this->mainConfig->Site->indexExtension)) - ? true : false; - - $format = (false === $isGeneralFormat && true === $isExtension) - ? 'format_' . $this->mainConfig->Site->indexExtension : 'format' ; - - return isset($this->fields[$format]) ? $this->fields[$format] : []; - } - - /** - * Gets ansigel date of the record - * - * @return string - */ - public function getDateIsil() - { - // check if there's an extension defined for the library depended format - // index field - $isExtension = (isset($this->mainConfig->CustomIndex->indexExtension)) - ? true : false; - - $date = (true === $isExtension) - ? 'date_' . $this->mainConfig->CustomIndex->indexExtension : '' ; - - return isset($this->fields[$date]) ? $this->fields[$date] : ''; - } - - - /** - * Get the formats for displaying the icons. Renders the format information to - * a specific css class. - * There are two setups possible. If combinedIcons sets to true at config.ini - * all format values will be concatenated to one string; if it's false only - * the first vlaue will be taken. - * - * @internal Should be moved out of RecordDriver (Controller/View?) - * @todo Should be moved out of RecordDriver (Controller/View?) - * - * @return array - */ -/* protected function getFormatIcon() - { - global $configArray; - - $format = $this->getFormats(); - // check which method to build the css class is chosen - if (isset($this->mainConfig->Site->combinedIcons) && true == $this->mainConfig->Site->combinedIcons) { - // sort it - sort($format, SORT_LOCALE_STRING); - return strtolower(implode('', $format)); - // otherwise take the first format - } else { - if (isset($this->fields['multipart_set'])) { - switch ($this->fields['multipart_set']) { - case 'a': return 'sets'; - case 'b': break; //return 'part-related'; - case 'c': break; //return 'part-not-related'; - } - } - //echo "<pre>"; print_r($format); echo "</pre>"; - return $format[0]; - } - }*/ - - /** - * Get the source id of the record. - * - * @return string - * @access public - */ - public function getSourceID() - { - return isset($this->fields['source_id']) ? - $this->fields['source_id'] : ''; - } - - /** - * Get the GND of an author. - * - * @return array - */ - public function getAuthorId() - { - return isset($this->fields['author_id']) ? - $this->fields['author_id'] : []; - } - - /** - * Combined fields of author data. - * - * @todo Check whether static call of getCorporateAuthor is necessary - * - * @return array - * @link https://intern.finc.info/issues/1866 - */ - public function getCombinedAuthors() - { - $retval = []; - - if ($this->getPrimaryAuthor() != '') { - $original = ''; - if ($this->getPrimaryAuthorOrig() != '') { - $original = $this->getPrimaryAuthorOrig(); - } - $retval[] = ($original == '') ? $this->getPrimaryAuthor() - : $this->getPrimaryAuthor() . ' (' . $original . ')'; - } elseif ( self::getCorporateAuthor() != '' ) { - $retval[] = self::getCorporateAuthor(); - } elseif (count($this->getSecondaryAuthors()) > 0) { - foreach ($this->getSecondaryAuthors() as $val) { - $retval[] = $val; - } - } elseif (count($this->getCorporateSecondaryAuthors()) > 0) { - foreach ($this->getCorporateSecondaryAuthors() as $val) { - $retval[] = $val; - } - } - - return $retval; - } - - /** - * Get the original author of the record. - * - * @return string - */ - public function getPrimaryAuthorOrig() - { - return isset($this->fields['author_orig']) ? - $this->_filterAuthorDates($this->fields['author_orig']) : ''; - } - - /** - * Get the main author of the record. - * - * @return string - * @deprecated - */ - public function getPrimaryAuthorRaw() - { - return isset($this->fields['author']) ? - $this->_removeAuthorDates($this->fields['author']) : ''; - } - - /** - * Get the main corporate author (if any) for the record. - * - * @return string - * @access public - */ - public function getCorporateAuthor() - { - return isset($this->fields['author_corp']) ? - $this->fields['author_corp'] : ''; - } - - /** - * Get the secondary corporate authors (if any) for the record. - * - * @return array - */ - public function getCorporateSecondaryAuthors() - { - return isset($this->fields['author_corp2']) ? - $this->fields['author_corp2'] : []; - } - - /** - * Get the field-value identified by $string - * - * @param string $string Name of field - * - * @return string - */ - public function getILSIdentifier($string) - { - return (isset($this->fields[$string]) ? $this->fields[$string] : ''); - } - - /** - * Get an array of all ISMNs associated with the record (may be empty). - * - * @return array - */ - public function getISMNs() - { - return isset($this->fields['ismn']) && is_array($this->fields['ismn']) ? - $this->fields['ismn'] : []; - } - - /** - * Get the eISSN from a record. - * - * @return array - */ - public function getEISSNs() - { - return []; - } - - /** - * Get an array of newer titles for the record. - * - * @return array - */ - public function getNewTitles() - { - return isset($this->fields['title_new']) ? - $this->fields['title_new'] : []; - } - - /** - * After giving a record ids as e.g. ppn of the BSZ check if a record exists. - * This method can be used to indicate a direct link than to form a general - * look for query. - * - * @param array $rids Array of record ids to test. - * - * @return int mixed If success return at least one finc id otherwise null. - */ - protected function addFincIDToRecord ( $array ) - { - // record ids - $rids = []; - // return array - $retval = []; - - // check if array contain record_ids and collect it as an array to - // use only one solr request for all - if (isset($array) && is_array($array)) { - foreach ($array as $line) { - if (isset($line['record_id'])) { - $rids[] = $line['record_id']; - } - } - } - - // build the query: - if (count($rids) == 1) { - // single query: - $value = '"'. $rids[0] .'"'; - } elseif (count($rids) > 1) { - // multi query: - $value = '(' . implode(' OR ', $rids) . ')'; - } else { - return $array; - } - $query = new \VuFindSearch\Query\Query( - 'record_id:'. $value - ); - //echo '</pre>'; print_r($query); echo '</pre>'; - - $bag = new ParamBag(); - $bag->set('fl', 'id,record_id'); - $records = $this->searchService - ->search('Solr', $query, 0, count($rids), $bag); - - $records = $records->getRecords(); - if (isset($records) - && !empty($records) - ) { - foreach ($records as $record) { - $retval[$record->getRID()] = $record->getUniqueID(); - } - } - - // write back in array - foreach ($array as &$val) { - if (isset($val['record_id'])) { - if (isset($retval[($val['record_id'])])) { - $val['id'] = $retval[($val['record_id'])]; - } - } - } - unset($val); - - return $array; - } - - /** - * Get percentage of relevance of a title. First implementaion for TUBAF. - * - * @return float Percentage of Score / Maximum Score rounded by 5. - * @link https://intern.finc.info/issues/1908 - */ - public function getRelevance() { - - $score = isset($this->fields['score']) ? $this->fields['score'] : 0; - $maxScore = isset($this->fields['score_maximum']) ? $this->fields['score_maximum'] : 0; - - if ($score == 0 || $maxScore == 0) { - return 0; - } - return round( ($score / $maxScore) , 5); - } - - /** - * Get RVK classifcation number from Solr index. - * - * @return string - */ - public function getRvk() { - return isset($this->fields['rvk_facet']) ? - $this->fields['rvk_facet'] : ''; - } - - /** - * Get special record_id of libero system. - * - * @todo refactor to a more meaningful name? - * - * @return string - */ - public function getRID() - { - return isset($this->fields['record_id']) ? - $this->fields['record_id'] : ''; - } - - /** - * Get the original title of the record. - * - * @return string - */ - public function getTitleOrig() - { - return isset($this->fields['title_orig']) ? - $this->fields['title_orig'] : ''; - } - - /** - * Get the GND of topic. - * - * @return array - */ - public function getTopicId() - { - return isset($this->fields['topic_id']) ? - $this->fields['topic_id'] : []; - } - - /** - * Get alternatives series titles as array. - * - * @return array - */ - public function getSeriesAlternative() - { - if (isset($this->fields['series2']) && !empty($this->fields['series2'])) { - return $this->fields['series2']; - } - return []; - } - - /** - * Get alternatives series titles as array. - * - * @return array - */ - public function getSeriesOrig() - { - if (isset($this->fields['series_orig']) && !empty($this->fields['series_orig'])) { - return $this->fields['series_orig']; - } - return []; - } - - /** - * Gets sorted publication date as string - * - * @return string - */ - public function getPublishDateSort() - { - return isset($this->fields['publishDateSort']) ? - $this->fields['publishDateSort'] : ''; - } - - /** - * Get the item's place of publication. - * - * @return array - */ - public function getPlacesOfPublication() - { - return isset($this->fields['publishPlace']) ? - $this->fields['publishPlace'] : []; - } - - /** - * Get specific marc information about additional items. Unflexible solution - * for UBL only implemented. - * - * @return array - * @access protected - * @link https://intern.finc.info/fincproject/issues/1315 - */ - public function getAdditionals() - { - return []; - } - - /** - * Check if Additional Items exists. Realized for instance of UBL only. - * - * @return boolean True if additional items exists. - * @access public - * @link https://intern.finc.info/fincproject/issues/1315 - */ - public function hasAdditionalItems() - { - $array = $this->getAdditionals(); - return (is_array($array) && count($array) > 0) ? true : false; - } - - /** - * Filter author data for author year of birth and death - * to give a better mark up. - * - * @param string $authordata - * - * @return strings - */ - private function _filterAuthorDates( $authordata ) - { - if (preg_match('/^(\s|.*)(\d{4})\s?-?\s?(\d{4})?$/Uu',$authordata, $match)) { - return (isset($match[3])) - ? $match[1] .' *'. $match[2] . '-†'. $match[3] - : $match[1] .' *'. $match[2] . '-'; - } - return $authordata; - } - - /** - * Remove author dates if exists. - * - * @param string authordata - * - * @return strings - * @deprecated - */ - private function _removeAuthorDates( $authordata ) - { - if (preg_match('/^(\s|.*)\s(fl.\s|d.\s|ca.\s)*\s?(\d{4})\??(\sor\s\d\d?)?\s?(-|–)?\s?(ca.\s|after\s)?(\d{1,4})?(.|,)?$/Uu',$authordata, $match)) { - return (isset($match[1])) ? $match[1] : $authordata; - } - return $authordata; - } + use \VuFind\Log\LoggerAwareTrait; + use SolrDefaultFincTrait; } diff --git a/module/finc/src/finc/RecordDriver/SolrDefaultFincTrait.php b/module/finc/src/finc/RecordDriver/SolrDefaultFincTrait.php new file mode 100644 index 0000000000000000000000000000000000000000..dac4fbcac97cf0d73f02b344c6bdf313c1b302f2 --- /dev/null +++ b/module/finc/src/finc/RecordDriver/SolrDefaultFincTrait.php @@ -0,0 +1,574 @@ +<?php +/** + * finc specific model for Solr records based on the stock + * VuFind\RecordDriver\SolrDefault + * + * PHP version 5 + * + * Copyright (C) Leipzig University Library 2015. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * @category VuFind2 + * @package RecordDrivers + * @author André Lahmann <lahmann@ub.uni-leipzig.de> + * @author Gregor Gawol <gawol@ub.uni-leipzig.de> + * @author Frank Morgner <morgnerf@ub.uni-leipzig.de> + * @author Ulf Seltmann <seltmann@ub.uni-leipzig.de> + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link http://vufind.org/wiki/vufind2:record_drivers Wiki + * @SuppressWarnings(PHPMD.ExcessivePublicCount) + */ +namespace finc\RecordDriver; +use VuFindSearch\ParamBag; + +/** + * finc specific model for Solr records based on the stock + * VuFind\RecordDriver\SolrDefault + * + * @category VuFind2 + * @package RecordDrivers + * @author André Lahmann <lahmann@ub.uni-leipzig.de> + * @author Gregor Gawol <gawol@ub.uni-leipzig.de> + * @author Frank Morgner <morgnerf@ub.uni-leipzig.de> + * @author Ulf Seltmann <seltmann@ub.uni-leipzig.de> + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link http://vufind.org/wiki/vufind2:record_drivers Wiki + * @SuppressWarnings(PHPMD.ExcessivePublicCount) + */ +trait SolrDefaultFincTrait +{ + + /** + * Return the custom index field local_heading if indexExtension is set. + * If indexExtension is set local_heading_{indexExtension} is returned, + * if local_heading_{indexExtesion} is empty, + * local_heading_facet_{indexExtension} is returned. + * + * @return array Containing local_heading_[facet_]{indexExtension} fields. + * @access public + */ + public function getLocalHeading() { + + $array = []; + + if (isset($this->mainConfig->Site->indexExtension)) { + $array = isset($this->fields['local_heading_' . ($this->mainConfig->Site->indexExtension)]) ? + $this->fields['local_heading_' . ($this->mainConfig->Site->indexExtension)] : []; + // Use local_heading_facet field if local_heading field delivers no results at first + if (count($array) == 0) { + $array = isset($this->fields['local_heading_facet_' . ($this->mainConfig->Site->indexExtension)]) ? + $this->fields['local_heading_facet_' . ($this->mainConfig->Site->indexExtension)] : []; + } + } + return $array; + } + + /** + * Controller to decide when local format field of a library should be + * retrieved from marc. Pass through method for PrimoCentral + * + * Public method for tuf to display format at search modul. + * + * @internal This method should be dropped or renamed (getStandardFormat()) + * as it is only a wrapper for the custom method getFormat() which + * in turn behaves as the stock getFormats() method. + * + * @deprecated No need for this wrapper in custom SolrDefault + * + * @return array + * @access public + */ + public function getLocalFormat() + { + return $this->getFormat(); + } + + /** + * Get back the standardizied format field of Solr index. + * + * @deprecated Should also be possible to be dropped (@see getLocalFormat()) + * + * @return array + */ + public function getFormat() + { + return isset($this->fields['format']) ? $this->fields['format'] : []; + } + + /** + * Get an array of all the formats associated with the record. If indexExtension + * is set and generalFormats is disabled in config.ini return the field + * format_{indexExtension}, format otherwise. + * + * @return array Array with formats associated with the record. + */ + public function getFormats() + { + // check if general 'format' index field should be used + $isGeneralFormat = (isset($this->mainConfig->Site->generalFormats) + && true == $this->mainConfig->Site->generalFormats) + ? true : false; + // check if there's an extension defined for the library depended format + // index field + $isExtension = (isset($this->mainConfig->Site->indexExtension)) + ? true : false; + + $format = (false === $isGeneralFormat && true === $isExtension) + ? 'format_' . $this->mainConfig->Site->indexExtension : 'format' ; + + return isset($this->fields[$format]) ? $this->fields[$format] : []; + } + + /** + * Gets ansigel date of the record + * + * @return string + */ + public function getDateIsil() + { + // check if there's an extension defined for the library depended format + // index field + $isExtension = (isset($this->mainConfig->CustomIndex->indexExtension)) + ? true : false; + + $date = (true === $isExtension) + ? 'date_' . $this->mainConfig->CustomIndex->indexExtension : '' ; + + return isset($this->fields[$date]) ? $this->fields[$date] : ''; + } + + + /** + * Get the formats for displaying the icons. Renders the format information to + * a specific css class. + * There are two setups possible. If combinedIcons sets to true at config.ini + * all format values will be concatenated to one string; if it's false only + * the first vlaue will be taken. + * + * @internal Should be moved out of RecordDriver (Controller/View?) + * @todo Should be moved out of RecordDriver (Controller/View?) + * + * @return array + */ +/* protected function getFormatIcon() + { + global $configArray; + + $format = $this->getFormats(); + // check which method to build the css class is chosen + if (isset($this->mainConfig->Site->combinedIcons) && true == $this->mainConfig->Site->combinedIcons) { + // sort it + sort($format, SORT_LOCALE_STRING); + return strtolower(implode('', $format)); + // otherwise take the first format + } else { + if (isset($this->fields['multipart_set'])) { + switch ($this->fields['multipart_set']) { + case 'a': return 'sets'; + case 'b': break; //return 'part-related'; + case 'c': break; //return 'part-not-related'; + } + } + //echo "<pre>"; print_r($format); echo "</pre>"; + return $format[0]; + } + }*/ + + /** + * Get the source id of the record. + * + * @return string + * @access public + */ + public function getSourceID() + { + return isset($this->fields['source_id']) ? + $this->fields['source_id'] : ''; + } + + /** + * Get the GND of an author. + * + * @return array + */ + public function getAuthorId() + { + return isset($this->fields['author_id']) ? + $this->fields['author_id'] : []; + } + + /** + * Combined fields of author data. + * + * @todo Check whether static call of getCorporateAuthor is necessary + * + * @return array + * @link https://intern.finc.info/issues/1866 + */ + public function getCombinedAuthors() + { + $retval = []; + + if ($this->getPrimaryAuthor() != '') { + $original = ''; + if ($this->getPrimaryAuthorOrig() != '') { + $original = $this->getPrimaryAuthorOrig(); + } + $retval[] = ($original == '') ? $this->getPrimaryAuthor() + : $this->getPrimaryAuthor() . ' (' . $original . ')'; + } elseif ( self::getCorporateAuthor() != '' ) { + $retval[] = self::getCorporateAuthor(); + } elseif (count($this->getSecondaryAuthors()) > 0) { + foreach ($this->getSecondaryAuthors() as $val) { + $retval[] = $val; + } + } elseif (count($this->getCorporateSecondaryAuthors()) > 0) { + foreach ($this->getCorporateSecondaryAuthors() as $val) { + $retval[] = $val; + } + } + + return $retval; + } + + /** + * Get the original author of the record. + * + * @return string + */ + public function getPrimaryAuthorOrig() + { + return isset($this->fields['author_orig']) ? + $this->_filterAuthorDates($this->fields['author_orig']) : ''; + } + + /** + * Get the main author of the record. + * + * @return string + * @deprecated + */ + public function getPrimaryAuthorRaw() + { + return isset($this->fields['author']) ? + $this->_removeAuthorDates($this->fields['author']) : ''; + } + + /** + * Get the main corporate author (if any) for the record. + * + * @return string + * @access public + */ + public function getCorporateAuthor() + { + return isset($this->fields['author_corp']) ? + $this->fields['author_corp'] : ''; + } + + /** + * Get the secondary corporate authors (if any) for the record. + * + * @return array + */ + public function getCorporateSecondaryAuthors() + { + return isset($this->fields['author_corp2']) ? + $this->fields['author_corp2'] : []; + } + + /** + * Get the field-value identified by $string + * + * @param string $string Name of field + * + * @return string + */ + public function getILSIdentifier($string) + { + return (isset($this->fields[$string]) ? $this->fields[$string] : ''); + } + + /** + * Get an array of all ISMNs associated with the record (may be empty). + * + * @return array + */ + public function getISMNs() + { + return isset($this->fields['ismn']) && is_array($this->fields['ismn']) ? + $this->fields['ismn'] : []; + } + + /** + * Get the eISSN from a record. + * + * @return array + */ + public function getEISSNs() + { + return []; + } + + /** + * Get an array of newer titles for the record. + * + * @return array + */ + public function getNewTitles() + { + return isset($this->fields['title_new']) ? + $this->fields['title_new'] : []; + } + + /** + * After giving a record ids as e.g. ppn of the BSZ check if a record exists. + * This method can be used to indicate a direct link than to form a general + * look for query. + * + * @param array $rids Array of record ids to test. + * + * @return int mixed If success return at least one finc id otherwise null. + */ + protected function addFincIDToRecord ( $array ) + { + // record ids + $rids = []; + // return array + $retval = []; + + // check if array contain record_ids and collect it as an array to + // use only one solr request for all + if (isset($array) && is_array($array)) { + foreach ($array as $line) { + if (isset($line['record_id'])) { + $rids[] = $line['record_id']; + } + } + } + + // build the query: + if (count($rids) == 1) { + // single query: + $value = '"'. $rids[0] .'"'; + } elseif (count($rids) > 1) { + // multi query: + $value = '(' . implode(' OR ', $rids) . ')'; + } else { + return $array; + } + $query = new \VuFindSearch\Query\Query( + 'record_id:'. $value + ); + //echo '</pre>'; print_r($query); echo '</pre>'; + + $bag = new ParamBag(); + $bag->set('fl', 'id,record_id'); + $records = $this->searchService + ->search('Solr', $query, 0, count($rids), $bag); + + $records = $records->getRecords(); + if (isset($records) + && !empty($records) + ) { + foreach ($records as $record) { + $retval[$record->getRID()] = $record->getUniqueID(); + } + } + + // write back in array + foreach ($array as &$val) { + if (isset($val['record_id'])) { + if (isset($retval[($val['record_id'])])) { + $val['id'] = $retval[($val['record_id'])]; + } + } + } + unset($val); + + return $array; + } + + /** + * Get percentage of relevance of a title. First implementaion for TUBAF. + * + * @return float Percentage of Score / Maximum Score rounded by 5. + * @link https://intern.finc.info/issues/1908 + */ + public function getRelevance() + { + + $score = isset($this->fields['score']) ? $this->fields['score'] : 0; + $maxScore = isset($this->fields['score_maximum']) ? $this->fields['score_maximum'] : 0; + + if ($score == 0 || $maxScore == 0) { + return 0; + } + return round( ($score / $maxScore) , 5); + } + + /** + * Get RVK classifcation number from Solr index. + * + * @return string + */ + public function getRvk() { + return isset($this->fields['rvk_facet']) ? + $this->fields['rvk_facet'] : ''; + } + + /** + * Get special record_id of libero system. + * + * @todo refactor to a more meaningful name? + * + * @return string + */ + public function getRID() + { + return isset($this->fields['record_id']) ? + $this->fields['record_id'] : ''; + } + + /** + * Get the original title of the record. + * + * @return string + */ + public function getTitleOrig() + { + return isset($this->fields['title_orig']) ? + $this->fields['title_orig'] : ''; + } + + /** + * Get the GND of topic. + * + * @return array + */ + public function getTopicId() + { + return isset($this->fields['topic_id']) ? + $this->fields['topic_id'] : []; + } + + /** + * Get alternatives series titles as array. + * + * @return array + */ + public function getSeriesAlternative() + { + if (isset($this->fields['series2']) && !empty($this->fields['series2'])) { + return $this->fields['series2']; + } + return []; + } + + /** + * Get alternatives series titles as array. + * + * @return array + */ + public function getSeriesOrig() + { + if (isset($this->fields['series_orig']) && !empty($this->fields['series_orig'])) { + return $this->fields['series_orig']; + } + return []; + } + + /** + * Gets sorted publication date as string + * + * @return string + */ + public function getPublishDateSort() + { + return isset($this->fields['publishDateSort']) ? + $this->fields['publishDateSort'] : ''; + } + + /** + * Get the item's place of publication. + * + * @return array + */ + public function getPlacesOfPublication() + { + return isset($this->fields['publishPlace']) ? + $this->fields['publishPlace'] : []; + } + + /** + * Get specific marc information about additional items. Unflexible solution + * for UBL only implemented. + * + * @return array + * @access protected + * @link https://intern.finc.info/fincproject/issues/1315 + */ + public function getAdditionals() + { + return []; + } + + /** + * Check if Additional Items exists. Realized for instance of UBL only. + * + * @return boolean True if additional items exists. + * @access public + * @link https://intern.finc.info/fincproject/issues/1315 + */ + public function hasAdditionalItems() + { + $array = $this->getAdditionals(); + return (is_array($array) && count($array) > 0) ? true : false; + } + + /** + * Filter author data for author year of birth and death + * to give a better mark up. + * + * @param string $authordata + * + * @return strings + */ + private function _filterAuthorDates( $authordata ) + { + if (preg_match('/^(\s|.*)(\d{4})\s?-?\s?(\d{4})?$/Uu',$authordata, $match)) { + return (isset($match[3])) + ? $match[1] .' *'. $match[2] . '-†'. $match[3] + : $match[1] .' *'. $match[2] . '-'; + } + return $authordata; + } + + /** + * Remove author dates if exists. + * + * @param string authordata + * + * @return strings + * @deprecated + */ + private function _removeAuthorDates( $authordata ) + { + if (preg_match('/^(\s|.*)\s(fl.\s|d.\s|ca.\s)*\s?(\d{4})\??(\sor\s\d\d?)?\s?(-|–)?\s?(ca.\s|after\s)?(\d{1,4})?(.|,)?$/Uu',$authordata, $match)) { + return (isset($match[1])) ? $match[1] : $authordata; + } + return $authordata; + } +} diff --git a/module/finc/src/finc/RecordDriver/SolrMarcFinc.php b/module/finc/src/finc/RecordDriver/SolrMarcFinc.php new file mode 100644 index 0000000000000000000000000000000000000000..593d00a7f4a9dcf4d35599560c68b97d3ab2037f --- /dev/null +++ b/module/finc/src/finc/RecordDriver/SolrMarcFinc.php @@ -0,0 +1,110 @@ +<?php +/** + * finc specific model for MARC records with a fullrecord in Solr. + * + * PHP version 5 + * + * Copyright (C) Leipzig University Library 2015. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * @category VuFind2 + * @package RecordDrivers + * @author André Lahmann <lahmann@ub.uni-leipzig.de> + * @author Gregor Gawol <gawol@ub.uni-leipzig.de> + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link http://vufind.org/wiki/vufind2:record_drivers Wiki + */ +namespace finc\RecordDriver; + +/** + * finc specific model for MARC records with a fullrecord in Solr. + * + * @category VuFind2 + * @package RecordDrivers + * @author André Lahmann <lahmann@ub.uni-leipzig.de> + * @author Gregor Gawol <gawol@ub.uni-leipzig.de> + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link http://vufind.org/wiki/vufind2:record_drivers Wiki + */ +class SolrMarcFinc extends SolrMarc +{ + use SolrMarcFincTrait; + + /** + * pattern to identify bsz + */ + const BSZ_PATTERN = '/^(\(DE-576\))(\d+)(\w|)/'; + + /** + * List of isil of institution + * + * @var string ISIL of this instance's library + */ + protected $isil = []; + + /** + * Local marc field of institution participated in Finc. + * + * @var string|null + * @link https://intern.finc.info/fincproject/projects/finc-intern/wiki/FincMARC_-_Erweiterung_von_MARC21_f%C3%BCr_finc + */ + protected $localMarcFieldOfLibrary = null; + + /** + * Constructor + * + * @param \Zend\Config\Config $mainConfig VuFind main configuration (omit for + * built-in defaults) + * @param \Zend\Config\Config $recordConfig Record-specific configuration file + * (omit to use $mainConfig as $recordConfig) + * @param \Zend\Config\Config $searchSettings Search-specific configuration file + */ + public function __construct($mainConfig = null, $recordConfig = null, + $searchSettings = null + ) + { + parent::__construct($mainConfig, $recordConfig, $searchSettings); + + if (isset($mainConfig->InstitutionInfo->isil) + && count($mainConfig->InstitutionInfo->isil) > 0 + ) { + $this->isil = $this->mainConfig->InstitutionInfo->isil->toArray(); + } else { + $this->debug('InstitutionInfo setting: isil is missing.'); + } + + if (isset($this->mainConfig->CustomSite->namespace)) { + // map for marc fields + $map = [ + 'che' => '971', + 'hgb' => '979', + 'hfbk' => '978', + 'hfm' => '977', + 'hmt' => '970', + 'htw' => '973', + 'htwk' => '974', + 'tuf' => '972', + 'ubl' => '969', + 'zit' => '976', + 'zwi' => '975', + ]; + $this->localMarcFieldOfLibrary + = isset($map[$this->mainConfig->CustomSite->namespace]) ? + $map[$this->mainConfig->CustomSite->namespace] : null; + } else { + $this->debug('Namespace setting for localMarcField is missing.'); + } + } +} \ No newline at end of file diff --git a/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php b/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php new file mode 100644 index 0000000000000000000000000000000000000000..a211e0fd48f730c3032d8ae9ac72a7d4e2d8920c --- /dev/null +++ b/module/finc/src/finc/RecordDriver/SolrMarcFincTrait.php @@ -0,0 +1,894 @@ +<?php +/** + * finc specific model for MARC records with a fullrecord in Solr. + * + * PHP version 5 + * + * Copyright (C) Leipzig University Library 2015. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * @category VuFind2 + * @package RecordDrivers + * @author André Lahmann <lahmann@ub.uni-leipzig.de> + * @author Gregor Gawol <gawol@ub.uni-leipzig.de> + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link http://vufind.org/wiki/vufind2:record_drivers Wiki + */ +namespace finc\RecordDriver; + +/** + * finc specific model for MARC records with a fullrecord in Solr. + * + * @category VuFind2 + * @package RecordDrivers + * @author André Lahmann <lahmann@ub.uni-leipzig.de> + * @author Gregor Gawol <gawol@ub.uni-leipzig.de> + * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License + * @link http://vufind.org/wiki/vufind2:record_drivers Wiki + */ +trait SolrMarcFincTrait +{ + /** + * Return an array of associative URL arrays with one or more of the following + * keys: + * + * <li> + * <ul>desc: URL description text to display (optional)</ul> + * <ul>url: fully-formed URL (required if 'route' is absent)</ul> + * <ul>route: VuFind route to build URL with (required if 'url' is absent)</ul> + * <ul>routeParams: Parameters for route (optional)</ul> + * <ul>queryString: Query params to append after building route (optional)</ul> + * </li> + * + * @return array + */ + public function getURLs() + { + $retVal = []; + + // Which fields/subfields should we check for URLs? + $fieldsToCheck = [ + '856' => ['u'], // Standard URL + '555' => ['a'] // Cumulative index/finding aids + ]; + + foreach ($fieldsToCheck as $field => $subfields) { + $urls = $this->getMarcRecord()->getFields($field); + if ($urls) { + foreach ($urls as $url) { + $isil = $url->getSubfield('9'); + + $isISIL = false; + + if ($isil) { + $isil = $isil->getData(); + if (true === in_array($isil, $this->isil)) { + $isISIL = true; + } + } else { + $isISIL = true; + } + + if ($isISIL) { + // Is there an address in the current field? + $address = $url->getSubfield('u'); + if ($address) { + $address = $address->getData(); + + $tmpArr = []; + // Is there a description? If not, just use the URL itself. + foreach (['y', '3', 'z', 'x'] as $current) { + $desc = $url->getSubfield($current); + if ($desc) { + $desc = $desc->getData(); + $tmpArr[] = $desc; + } + } + $tmpArr = array_unique($tmpArr); + $desc = implode(', ', $tmpArr); + + if (empty($desc)) { + $desc = $address; + } + + // If url doesn't exist as key so far write to return variable. + if (!in_array(['url' => $address, 'desc' => $desc], $retVal)) { + $retVal[] = ['url' => $address, 'desc' => $desc]; + } + } + } + } + } + } + return $retVal; + } + + /** + * Return the local callnumber. + * + * @todo Optimization by removing of prefixed isils + * + * @return array Return fields. + * @access public + * @link https://intern.finc.info/issues/2639 + */ + public function getLocalCallnumber() + { + $array = []; + + if (isset($this->fields['itemdata'])) { + $itemdata = json_decode($this->fields['itemdata'], true); + if (count($itemdata) > 0) { + // error_log('Test: '. print_r($this->fields['itemdata'], true)); + $i = 0; + foreach ($this->isil as $isil) { + if (isset($itemdata[$isil])) { + foreach ($itemdata[$isil] as $val) { + $array[$i]['barcode'] = '(' . $isil . ')' . $val['bc']; + $array[$i]['callnumber'] = '(' . $isil . ')' . $val['cn']; + $i++; + } + } // end if + } // end foreach + } // end if + } // end if + return $array; + } + + /** + * Get local callnumbers of a special library. + * + * @return array + * @access protected + */ + protected function getLocalCallnumbersByLibrary() + { + $array = []; + $callnumbers = []; + + if (isset($this->fields['itemdata'])) { + $itemdata = json_decode($this->fields['itemdata'], true); + if (count($itemdata) > 0) { + $i = 0; + foreach ($this->isil as $isil) { + if (isset($itemdata[$isil])) { + foreach ($itemdata[$isil] as $val) { + // exclude equal callnumbers + if (false == in_array($val['cn'], $callnumbers)) { + $array[$i]['callnumber'] = $val['cn']; + $array[$i]['location'] = $isil; + $callnumbers[] = $val['cn']; + $i++; + } + } // end foreach + } // end if + } // end foreach + } // end if + } // end if + unset($callnumbers); + return $array; + } + + /** + * Get the special local call number; for the moment only used by the + * university library of Freiberg at finc marc 972i. + * + * @return string + * @access protected + */ + protected function getLocalGivenCallnumber() + { + $retval = []; + $arrSignatur = $this->getFieldArray($this->localMarcFieldOfLibrary, ['i']); + + foreach ($arrSignatur as $signatur) { + foreach ($this->isil as $code) { + if (0 < preg_match('/^\('.$code.'\)/', $signatur)) { + $retval[] = preg_replace('/^\('.$code.'\)/', '', $signatur); + } + } + } + return $retval; + } + + /** + * Get an array of supplements and special issue entry. + * + * @link http://www.loc.gov/marc/bibliographic/bd770.html + * @return array + * @access protected + */ + protected function getSupplements() + { + //return $this->_getFieldArray('770', array('i','t')); // has been originally 'd','h','n','x' but only 'i' and 't' for ubl requested; + $array = []; + $supplement = $this->getMarcRecord()->getFields('770'); + // if not return void value + if (!$supplement) { + return $array; + } // end if + + foreach ($supplement as $key => $line) { + $array[$key]['pretext'] = ($line->getSubfield('i')) + ? $line->getSubfield('i')->getData() : ''; + $array[$key]['text'] = ($line->getSubfield('t')) + ? $line->getSubfield('t')->getData() : ''; + // get ppns of bsz + $linkFields = $line->getSubfields('w'); + foreach ($linkFields as $current) { + $text = $current->getData(); + // Extract parenthetical prefixes: + if (preg_match(self::BSZ_PATTERN, $text, $matches)) { + //$id = $this->checkIfRecordExists($matches[2]); + //if ($id != null) { + $array[$key]['record_id'] = $matches[2].$matches[3]; + //} + //break; + } + } // end foreach + } // end foreach + + return $this->addFincIDToRecord($array); + } + + /** + * Special method to extracting the index of German prints of the marc21 + * field 024 indicator 8 subfield a + * + * @return array + * @access protected + * @link https://intern.finc.info/fincproject/issues/1442 + */ + protected function getIndexOfGermanPrints() + { + // define a false indicator + $lookfor_indicator = '8'; + $retval = []; + + $fields = $this->getMarcRecord()->getFields('024'); + if (!$fields) { + return null; + } + foreach ($fields as $field) { + // ->getIndicator(position) + $subjectrow = $field->getIndicator('1'); + if ($subjectrow == $lookfor_indicator) { + if ($subfield = $field->getSubfield('a')) { + if (preg_match('/^VD/i', $subfield->getData()) > 0) { + $retval[] = $subfield->getData(); + } + } + } + } + // echo "<pre>"; print_r($retval); echo "</pre>"; + return $retval; + } + + /** + * Get an array of instrumentation notes taken from the local data + * of the Petrucci music library subfield 590b + * + * @return array + * @access protected + */ + protected function getInstrumentation() + { + return $this->getFieldArray('590', ['b']); + } + + /** + * Get the ISSN from a record. + * + * @return array + * @access protected + * @link https://intern.finc.info/fincproject/issues/969 description + */ + protected function getISSN() + { + return $this->getFieldArray('022', ['a']); + } + + /** + * Get the ISSN from a the parallel title of a record. + * + * @return array + * @access protected + * @link https://intern.finc.info/fincproject/issues/969 description + */ + protected function getISSNsParallelTitles() + { + return $this->getFieldArray('029', ['a']); + } + + /** + * Get an array of information about Journal holdings realised for the + * special needs of University library of Chemnitz. MAB fields 720. + * + * @return array + * @access public + * @link https://intern.finc.info/fincproject/issues/338 + */ + public function getJournalHoldings() + { + $retval = []; + $match = []; + + // Get ID and connect to catalog + //$catalog = ConnectionManager::connectToCatalog(); + //$terms = $catalog->getConfig('OrderJournalTerms'); + + $fields = $this->getMarcRecord()->getFields('971'); + if (!$fields) { + return []; + } + + $key = 0; + foreach ($fields as $field) { + /*if ($subfield = $field->getSubfield('j')) { + preg_match('/\(.*\)(.*)/', $subfield->getData(), $match); + $retval[$key]['callnumber'] = trim($match[1]); + }*/ + if ($subfield = $field->getSubfield('k')) { + preg_match('/(.*)##(.*)##(.*)/', trim($subfield->getData()), $match); + $retval[$key]['callnumber'] = trim($match[1]); + $retval[$key]['holdings'] = trim($match[2]); + $retval[$key]['footnote'] = trim($match[3]); + // deprecated check if a certain wording exist + // $retval[$key]['is_holdable'] = (in_array(trim($match[3]), $terms['terms'])) ? 1 : 0; + // if subfield k exists so make journal holdable + $retval[$key]['is_holdable'] = 1; + + if (count($this->getBarcode()) == 1) { + $current = $this->getBarcode(); + $barcode = $current[0]; + } else { + $barcode = ''; + } + // deprecated check if a certain wording exist + // $retval[$key]['link'] = (in_array(trim($match[3]), $terms['terms'])) ? '/Record/' . $this->getUniqueID() .'/HoldJournalCHE?callnumber=' . urlencode($retval[$key]['callnumber']) .'&barcode=' . $barcode : ''; + // if subfield k exists so make journal holdable + $retval[$key]['link'] = '/Record/' . $this->getUniqueID() .'/HoldJournalCHE?callnumber=' . urlencode($retval[$key]['callnumber']) .'&barcode=' . $barcode; + //var_dump($retval[$key]['is_holdable'], $terms); + $key++; + } + + } + return $retval; + } + + /** + * Return a local access number for call number. + * Marc field depends on library e.g. 975 for WHZ. + * Seems to be very extraordinary special case. + * + * @return array + * @access protected + * @link https://intern.finc.info/issues/1302 + */ + protected function getLocalAccessNumber() + { + if (null != $this->localMarcFieldOfLibrary) { + return $this->getFieldArray($this->localMarcFieldOfLibrary, ['o']); + } + return []; + } + + /** + * Get all local class subjects. First realization for HGB. + * + * @return array + * @access protected + * @link https://intern.finc.info/issues/2626 + */ + protected function getLocalClassSubjects() + { + $array = []; + $classsubjects = $this->getMarcRecord()->getFields('979'); + // if not return void value + if (!$classsubjects) { + return $array; + } // end if + foreach ($classsubjects as $key => $line) { + // if subfield with class subjects exists + if ($line->getSubfield('f')) { + // get class subjects + $array[$key]['nb'] = $line->getSubfield('f')->getData(); + } // end if subfield a + if ($line->getSubfield('9')) { + $array[$key]['data'] = $line->getSubfield('9')->getData(); + /* $tmp = $line->getSubfield('9')->getData(); + $tmpArray = array(); + $data = explode(',', $tmp); + if(is_array($data) && (count($data) > 0)) { + foreach ($data as $value) { + $tmpArray[] = $value; + } + } + if(count($tmpArray) > 0) { + $array[$key]['data'] = $tmpArray; + } else { + $array[$key]['data'] = $data; + }*/ + } + } // end foreach + return $array; + } + + + /** + * Returning local format field of a library using an consortial defined + * field with subfield $c. Marc field depends on library e.g. 970 for HMT or + * 972 for TUBAF + * + * @return array + * @access protected + */ + public function getLocalFormat() + { + if (null != $this->localMarcFieldOfLibrary) { + if (count($localformat = $this->getFieldArray($this->localMarcFieldOfLibrary, ['c'])) > 0) { + foreach ($localformat as &$line) { + if ($line != "") { + $line = trim('local_format_' . strtolower($line)); + } + } + unset($line); + return $localformat; + } + } + return []; + } + + /** + * Return a local notice via an consortial defined field with subfield $k. + * Marc field depends on library e.g. 970 for HMT or 972 for TUBAF. + * + * @return array + * @access protected + * @link https://intern.finc.info/fincproject/issues/1308 + */ + protected function getLocalNotice() + { + if (null != $this->localMarcFieldOfLibrary) { + return $this->getFieldArray($this->localMarcFieldOfLibrary, ['k']); + } + return []; + } + + /** + * Get an array of musical heading based on a swb field + * at the marc field. + * + * @return mixed null if there's no field or array with results + * @access protected + */ + protected function getMusicHeading() + { + $retval = []; + + $fields = $this->getMarcRecord()->getFields('937'); + if (!$fields) { + return null; + } + foreach ($fields as $key => $field) { + if ($d = $field->getSubfield('d')) { + $retval[$key][] = $d->getData(); + } + if ($e = $field->getSubfield('e')) { + $retval[$key][] = $e->getData(); + } + if ($f = $field->getSubfield('f')) { + $retval[$key][] = $f->getData(); + } + } + return $retval; + } + + /** + * Get notice of a title representing a special case of University + * library of Chemnitz: MAB field 999l + * + * @return string + * @access protected + */ + protected function getNotice() + { + return $this->getFirstFieldValue('971', ['l']); + } + + /** + * Get an array of style/genre of a piece taken from the local data + * of the Petrucci music library subfield 590a + * + * @return array + * @access protected + */ + protected function getPieceStyle() + { + return $this->getFieldArray('590', ['a']); + } + + /** + * Get specific marc information about parallel editions. Unflexible solution + * for HMT only implemented. + * + * @todo More flexible implementation + * + * @return array + * @access protected + * @link https://intern.finc.info/issues/4327 + */ + protected function getParallelEditions() + { + $array = []; + $fields = ['775']; + $i = 0; + + foreach ($fields as $field) { + + $related = $this->getMarcRecord()->getFields($field); + // if no entry break it + if ($related) { + foreach ($related as $key => $line) { + // check if subfields i or t exist. if yes do a record. + if ($line->getSubfield('i') || $line->getSubfield('t')) { + $array[$i]['identifier'] = ($line->getSubfield('i')) + ? $line->getSubfield('i')->getData() : ''; + $array[$i]['text'] = ($line->getSubfield('t')) + ? $line->getSubfield('t')->getData() : ''; + // get ppns of bsz + $linkFields = $line->getSubfields('w'); + if (is_array($linkFields) && count($linkFields) > 0) { + foreach ($linkFields as $current) { + $text = $current->getData(); + // Extract parenthetical prefixes: + if (preg_match(self::BSZ_PATTERN, $text, $matches)) { + $array[$key]['record_id'] = $matches[2].$matches[3]; + } + } // end foreach + } // end if + $i++; + } // end if + } // end foreach + } + } + return $this->addFincIDToRecord($array); + } + + /** + * Get an array of previous titles for the record. + * + * @todo use HttpService for URL query + * @todo change currency service + * @todo pass prices by euro currency + * + * @return string + * @access protected + */ + public function getPrice() + { + $currency = $this->getFirstFieldValue('365', ['c']); + $price = $this->getFirstFieldValue('365', ['b']); + if (!empty($currency) && !empty($price) ) { + // if possible convert it in euro + if (is_array($converted = + json_decode(str_replace( + ['lhs','rhs','error','icc'], + ['"lhs"','"rhs"','"error"','"icc"'], + file_get_contents("http://www.google.com/ig/calculator?q=".$price.$currency."=?EUR") + ),true) + )) { + if(empty($converted['error'])){ + $rhs = explode(' ', trim($converted['rhs'])); + return money_format('%.2n', $rhs[0]); + } + } + return $currency . " ". $price; + } + return ""; + } + + /** + * Get the provenience of a title. + * + * @return array + * @access protected + */ + protected function getProvenience() + { + return $this->getFieldArray('561', ['a']); + } + + /** + * Checked if an title is ordered by the library using an consortial defined + * field with subfield $m. Marc field depends on library e.g. 970 for HMT or + * 972 for TUBAF + * + * @return bool + * @access protected + */ + protected function getPurchaseInformation() + { + if (null != $this->localMarcFieldOfLibrary) { + if ($this->getFirstFieldValue($this->localMarcFieldOfLibrary, ['m']) == 'e') { + return true; + } + } + return false; + } + + /** + * Get a short list of series for ISBD citation style + * + * @return array + * @access protected + * @link http://www.loc.gov/marc/bibliographic/bd830.html + * @link https://intern.finc.info/fincproject/issues/457 + */ + protected function getSeriesWithVolume() + { + return $this->getFieldArray('830', ['a', 'v'], false); + } + + /** + * Get local classification of UDK. + * + * @todo Check if method is used by other institution than HTWK. + * + * @return array + * @access protected + * @link https://intern.finc.info/fincproject/issues/1135 + */ + protected function getUDKs() + { + $array = []; + if (null != $this->localMarcFieldOfLibrary) { + + $udk = $this->getMarcRecord()->getFields($this->localMarcFieldOfLibrary); + // if not return void value + if (!$udk) { + return $array; + } // end if + + foreach ($udk as $key => $line) { + // if subfield with udk exists + if ($line->getSubfield('f')) { + // get udk + $array[$key]['index'] = $line->getSubfield('f')->getData(); + // get udk notation + // fixes by update of File_MARC to version 0.8.0 + // @link https://intern.finc.info/issues/2068 + /* + if ($notation = $line->getSubfield('n')) { + // get first value + $array[$key]['notation'][] = $notation->getData(); + // iteration over udk notation + while ($record = $notation->next()) { + $array[$key]['notation'][] = $record->getData(); + $notation = $record; + } + } // end if subfield n + unset($notation); + */ + if ($record = $line->getSubfields('n')) { + // iteration over rvk notation + foreach ($record as $field) { + $array[$key]['notation'][] = $field->getData(); + } + } // end if subfield n + } // end if subfield f + } // end foreach + } + //error_log(print_r($array, true)); + return $array; + } + + /** + * Get addional entries for personal names. + * + * @return array + * @access protected + * @link http://www.loc.gov/marc/bibliographic/bd700.html + */ + protected function getAdditionalAuthors() + { + // result array to return + $retval = []; + + $results = $this->getMarcRecord()->getFields('700'); + if (!$results) { + return $retval; + } + + foreach ($results as $key => $line) { + $retval[$key]['name'] = ($line->getSubfield('a')) + ? $line->getSubfield('a')->getData() : ''; + $retval[$key]['dates'] = ($line->getSubfield('d')) + ? $line->getSubfield('d')->getData() : ''; + $retval[$key]['relator'] = ($line->getSubfield('e')) + ? $line->getSubfield('e')->getData() : ''; + } + // echo "<pre>"; print_r($retval); echo "</pre>"; + return $retval; + } + + /** + * Get specific marc information about additional items. Unflexible solution + * for UBL only implemented. + * + * @return array + * @access protected + * @link https://intern.finc.info/fincproject/issues/1315 + */ + public function getAdditionals() + { + $array = []; + $fields = ['770','775','776']; + $i = 0; + + foreach ($fields as $field) { + + $related = $this->getMarcRecord()->getFields($field); + // if no entry break it + if ($related) { + foreach ($related as $key => $line) { + // check if subfields i or t exist. if yes do a record. + if ($line->getSubfield('i') || $line->getSubfield('t')) { + $array[$i]['identifier'] = ($line->getSubfield('i')) + ? $line->getSubfield('i')->getData() : ''; + $array[$i]['text'] = ($line->getSubfield('t')) + ? $line->getSubfield('t')->getData() : ''; + // get ppns of bsz + $linkFields = $line->getSubfields('w'); + if (is_array($linkFields) && count($linkFields) > 0) { + foreach ($linkFields as $current) { + $text = $current->getData(); + // Extract parenthetical prefixes: + if (preg_match(self::BSZ_PATTERN, $text, $matches)) { + $array[$i]['record_id'] = $matches[2].$matches[3]; + } + } // end foreach + } // end if + $i++; + } // end if + } // end foreach + } + } + + return $this->addFincIDToRecord($array); + } + + /** + * Special method to extracting the data of the marc21 field 689 of the + * the bsz heading subjects chains. + * + * @return array + * @access protected + */ + protected function getAllSubjectHeadingsExtended() + { + // define a false indicator + $firstindicator = 'x'; + $retval = []; + + $fields = $this->getMarcRecord()->getFields('689'); + if (!$fields) { + return null; + } + foreach ($fields as $field) { + $subjectrow = $field->getIndicator('1'); + if ($subjectrow != $firstindicator) { + $key = (isset($key) ? $key +1 : 0); + $firstindicator = $subjectrow; + } + if ($subfield = $field->getSubfield('a')) { + $retval[$key]['subject'][] = $subfield->getData(); + } + if ($subfield = $field->getSubfield('t')) { + $retval[$key]['subject'][] = $subfield->getData(); + } + if ($subfield = $field->getSubfield('9')) { + $retval[$key]['subsubject'] = $subfield->getData(); + } + } + return $retval; + } + + /** + * Return all barcode of finc marc 983 $a at full marc record. + * + * @todo Method seems erroneous. Bugfixin needed. + * + * @return array List of barcodes. + * @access protected + * @deprecated + */ + protected function getBarcode() + { + + $barcodes = []; + + //$driver = ConnectionManager::connectToCatalog(); + $libraryCodes = $this->searchesConfig->LibrarayGroup; + + // get barcodes from marc + $barcodes = $this->getFieldArray('983', ['a']); + + if (!isset($libraryCodes->libraries)) { + return $barcodes; + } else { + if (count($barcodes) > 0) { + $codes = explode(",", $libraryCodes->libraries); + $match = []; + $retval = []; + foreach ($barcodes as $barcode) { + if (preg_match('/^\((.*)\)(.*)$/', trim($barcode), $match)); + if ( in_array($match[1], $codes) ) { + $retval[] = $match[2]; + } + } // end foreach + if (count($retval) > 0 ) { + return $retval; + } + } + } + return []; + } + + /** + * Get the catalogue or opus number of a title. Implemented + * for petrucci music library. + * + * @return array + * @access protected + */ + protected function getCatalogueNumber() + { + return $this->getFieldArray('245', ['b']); + } + + /** + * Get an array of content notes. + * + * @return array + * @access protected + */ + protected function getContentNote() + { + return $this->getFieldArray('505', ['t']); + } + + /** + * Get dissertation notes for the record. + * + * @return array + * @access protected + */ + protected function getDissertationNote() + { + return $this->getFieldArray('502', ['a']); + } + + /** + * Get id of related items + * + * @return string + * @access protected + */ + protected function getRelatedItems() + { + return $this->getFirstFieldValue('776', ['z']); + } +} diff --git a/module/finc/src/finc/RecordDriver/SolrMarcRemoteFinc.php b/module/finc/src/finc/RecordDriver/SolrMarcRemoteFinc.php index 245896733e7d3fdb977dfb5f550698b4a5546818..ce8fe5b4f26cd4e768af0af4ee81e5e71a8e0ef6 100644 --- a/module/finc/src/finc/RecordDriver/SolrMarcRemoteFinc.php +++ b/module/finc/src/finc/RecordDriver/SolrMarcRemoteFinc.php @@ -42,6 +42,7 @@ namespace finc\RecordDriver; */ class SolrMarcRemoteFinc extends SolrMarcRemote { + use SolrMarcFincTrait; /** * Pattern to identify bsz @@ -81,7 +82,7 @@ class SolrMarcRemoteFinc extends SolrMarcRemote if (isset($mainConfig->InstitutionInfo->isil) && count($mainConfig->InstitutionInfo->isil) > 0 ) { - $this->isil = $this->mainConfig->InstitutionInfo->isil; + $this->isil = $this->mainConfig->InstitutionInfo->isil->toArray(); } else { $this->debug('InstitutionInfo setting: isil is missing.'); } @@ -108,856 +109,4 @@ class SolrMarcRemoteFinc extends SolrMarcRemote $this->debug('Namespace setting for localMarcField is missing.'); } } - - /** - * Return an array of associative URL arrays with one or more of the following - * keys: - * - * <li> - * <ul>desc: URL description text to display (optional)</ul> - * <ul>url: fully-formed URL (required if 'route' is absent)</ul> - * <ul>route: VuFind route to build URL with (required if 'url' is absent)</ul> - * <ul>routeParams: Parameters for route (optional)</ul> - * <ul>queryString: Query params to append after building route (optional)</ul> - * </li> - * - * @return array - */ - public function getURLs() - { - $retVal = []; - - // Which fields/subfields should we check for URLs? - $fieldsToCheck = [ - '856' => ['u'], // Standard URL - '555' => ['a'] // Cumulative index/finding aids - ]; - - foreach ($fieldsToCheck as $field => $subfields) { - $urls = $this->getMarcRecord()->getFields($field); - if ($urls) { - foreach ($urls as $url) { - $isil = $url->getSubfield('9'); - - $isISIL = false; - - if ($isil) { - $isil = $isil->getData(); - if (true === in_array($isil, $this->isil->toArray())) { - $isISIL = true; - } - } else { - $isISIL = true; - } - - if ($isISIL) { - // Is there an address in the current field? - $address = $url->getSubfield('u'); - if ($address) { - $address = $address->getData(); - - $tmpArr = []; - // Is there a description? If not, just use the URL itself. - foreach (['y', '3', 'z', 'x'] as $current) { - $desc = $url->getSubfield($current); - if ($desc) { - $desc = $desc->getData(); - $tmpArr[] = $desc; - } - } - $tmpArr = array_unique($tmpArr); - $desc = implode(', ', $tmpArr); - - if (empty($desc)) { - $desc = $address; - } - - // If url doesn't exist as key so far write to return variable. - if (!in_array(['url' => $address, 'desc' => $desc], $retVal)) { - $retVal[] = ['url' => $address, 'desc' => $desc]; - } - } - } - } - } - } - return $retVal; - } - - /** - * Return the local callnumber. - * - * @todo Optimization by removing of prefixed isils - * - * @return array Return fields. - * @access public - * @link https://intern.finc.info/issues/2639 - */ - public function getLocalCallnumber() - { - $array = []; - - if (isset($this->fields['itemdata'])) { - $itemdata = json_decode($this->fields['itemdata'], true); - if (count($itemdata) > 0) { - // error_log('Test: '. print_r($this->fields['itemdata'], true)); - $i = 0; - foreach ($this->isil as $isil) { - if (isset($itemdata[$isil])) { - foreach ($itemdata[$isil] as $val) { - $array[$i]['barcode'] = '(' . $isil . ')' . $val['bc']; - $array[$i]['callnumber'] = '(' . $isil . ')' . $val['cn']; - $i++; - } - } // end if - } // end foreach - } // end if - } // end if - return $array; - } - - /** - * Get local callnumbers of a special library. - * - * @return array - * @access protected - */ - protected function getLocalCallnumbersByLibrary() - { - $array = []; - $callnumbers = []; - - if (isset($this->fields['itemdata'])) { - $itemdata = json_decode($this->fields['itemdata'], true); - if (count($itemdata) > 0) { - $i = 0; - foreach ($this->isil as $isil) { - if (isset($itemdata[$isil])) { - foreach ($itemdata[$isil] as $val) { - // exclude equal callnumbers - if (false == in_array($val['cn'], $callnumbers)) { - $array[$i]['callnumber'] = $val['cn']; - $array[$i]['location'] = $isil; - $callnumbers[] = $val['cn']; - $i++; - } - } // end foreach - } // end if - } // end foreach - } // end if - } // end if - unset($callnumbers); - return $array; - } - - /** - * Get the special local call number; for the moment only used by the - * university library of Freiberg at finc marc 972i. - * - * @return string - * @access protected - */ - protected function getLocalGivenCallnumber() - { - $retval = []; - $arrSignatur = $this->getFieldArray($this->localMarcFieldOfLibrary, ['i']); - - foreach ($arrSignatur as $signatur) { - foreach ($this->isil as $code) { - if (0 < preg_match('/^\('.$code.'\)/', $signatur)) { - $retval[] = preg_replace('/^\('.$code.'\)/', '', $signatur); - } - } - } - return $retval; - } - - /** - * Get an array of supplements and special issue entry. - * - * @link http://www.loc.gov/marc/bibliographic/bd770.html - * @return array - * @access protected - */ - protected function getSupplements() - { - //return $this->_getFieldArray('770', array('i','t')); // has been originally 'd','h','n','x' but only 'i' and 't' for ubl requested; - $array = []; - $supplement = $this->getMarcRecord()->getFields('770'); - // if not return void value - if (!$supplement) { - return $array; - } // end if - - foreach ($supplement as $key => $line) { - $array[$key]['pretext'] = ($line->getSubfield('i')) - ? $line->getSubfield('i')->getData() : ''; - $array[$key]['text'] = ($line->getSubfield('t')) - ? $line->getSubfield('t')->getData() : ''; - // get ppns of bsz - $linkFields = $line->getSubfields('w'); - foreach ($linkFields as $current) { - $text = $current->getData(); - // Extract parenthetical prefixes: - if (preg_match(self::BSZ_PATTERN, $text, $matches)) { - //$id = $this->checkIfRecordExists($matches[2]); - //if ($id != null) { - $array[$key]['record_id'] = $matches[2].$matches[3]; - //} - //break; - } - } // end foreach - } // end foreach - - return $this->addFincIDToRecord($array); - } - - /** - * Special method to extracting the index of German prints of the marc21 - * field 024 indicator 8 subfield a - * - * @return array - * @access protected - * @link https://intern.finc.info/fincproject/issues/1442 - */ - protected function getIndexOfGermanPrints() - { - // define a false indicator - $lookfor_indicator = '8'; - $retval = []; - - $fields = $this->getMarcRecord()->getFields('024'); - if (!$fields) { - return null; - } - foreach ($fields as $field) { - // ->getIndicator(position) - $subjectrow = $field->getIndicator('1'); - if ($subjectrow == $lookfor_indicator) { - if ($subfield = $field->getSubfield('a')) { - if (preg_match('/^VD/i', $subfield->getData()) > 0) { - $retval[] = $subfield->getData(); - } - } - } - } - // echo "<pre>"; print_r($retval); echo "</pre>"; - return $retval; - } - - /** - * Get an array of instrumentation notes taken from the local data - * of the Petrucci music library subfield 590b - * - * @return array - * @access protected - */ - protected function getInstrumentation() - { - return $this->getFieldArray('590', ['b']); - } - - /** - * Get the ISSN from a record. - * - * @return array - * @access protected - * @link https://intern.finc.info/fincproject/issues/969 description - */ - protected function getISSN() - { - return $this->getFieldArray('022', ['a']); - } - - /** - * Get the ISSN from a the parallel title of a record. - * - * @return array - * @access protected - * @link https://intern.finc.info/fincproject/issues/969 description - */ - protected function getISSNsParallelTitles() - { - return $this->getFieldArray('029', ['a']); - } - - /** - * Get an array of information about Journal holdings realised for the - * special needs of University library of Chemnitz. MAB fields 720. - * - * @return array - * @access public - * @link https://intern.finc.info/fincproject/issues/338 - */ - public function getJournalHoldings() - { - $retval = []; - $match = []; - - // Get ID and connect to catalog - //$catalog = ConnectionManager::connectToCatalog(); - //$terms = $catalog->getConfig('OrderJournalTerms'); - - $fields = $this->getMarcRecord()->getFields('971'); - if (!$fields) { - return []; - } - - $key = 0; - foreach ($fields as $field) { - /*if ($subfield = $field->getSubfield('j')) { - preg_match('/\(.*\)(.*)/', $subfield->getData(), $match); - $retval[$key]['callnumber'] = trim($match[1]); - }*/ - if ($subfield = $field->getSubfield('k')) { - preg_match('/(.*)##(.*)##(.*)/', trim($subfield->getData()), $match); - $retval[$key]['callnumber'] = trim($match[1]); - $retval[$key]['holdings'] = trim($match[2]); - $retval[$key]['footnote'] = trim($match[3]); - // deprecated check if a certain wording exist - // $retval[$key]['is_holdable'] = (in_array(trim($match[3]), $terms['terms'])) ? 1 : 0; - // if subfield k exists so make journal holdable - $retval[$key]['is_holdable'] = 1; - - if (count($this->getBarcode()) == 1) { - $current = $this->getBarcode(); - $barcode = $current[0]; - } else { - $barcode = ''; - } - // deprecated check if a certain wording exist - // $retval[$key]['link'] = (in_array(trim($match[3]), $terms['terms'])) ? '/Record/' . $this->getUniqueID() .'/HoldJournalCHE?callnumber=' . urlencode($retval[$key]['callnumber']) .'&barcode=' . $barcode : ''; - // if subfield k exists so make journal holdable - $retval[$key]['link'] = '/Record/' . $this->getUniqueID() .'/HoldJournalCHE?callnumber=' . urlencode($retval[$key]['callnumber']) .'&barcode=' . $barcode; - //var_dump($retval[$key]['is_holdable'], $terms); - $key++; - } - - } - return $retval; - } - - /** - * Return a local access number for call number. - * Marc field depends on library e.g. 975 for WHZ. - * Seems to be very extraordinary special case. - * - * @return array - * @access protected - * @link https://intern.finc.info/issues/1302 - */ - protected function getLocalAccessNumber() - { - if (null != $this->localMarcFieldOfLibrary) { - return $this->getFieldArray($this->localMarcFieldOfLibrary, ['o']); - } - return []; - } - - /** - * Get all local class subjects. First realization for HGB. - * - * @return array - * @access protected - * @link https://intern.finc.info/issues/2626 - */ - protected function getLocalClassSubjects() - { - $array = []; - $classsubjects = $this->getMarcRecord()->getFields('979'); - // if not return void value - if (!$classsubjects) { - return $array; - } // end if - foreach ($classsubjects as $key => $line) { - // if subfield with class subjects exists - if ($line->getSubfield('f')) { - // get class subjects - $array[$key]['nb'] = $line->getSubfield('f')->getData(); - } // end if subfield a - if ($line->getSubfield('9')) { - $array[$key]['data'] = $line->getSubfield('9')->getData(); - /* $tmp = $line->getSubfield('9')->getData(); - $tmpArray = array(); - $data = explode(',', $tmp); - if(is_array($data) && (count($data) > 0)) { - foreach ($data as $value) { - $tmpArray[] = $value; - } - } - if(count($tmpArray) > 0) { - $array[$key]['data'] = $tmpArray; - } else { - $array[$key]['data'] = $data; - }*/ - } - } // end foreach - return $array; - } - - - /** - * Returning local format field of a library using an consortial defined - * field with subfield $c. Marc field depends on library e.g. 970 for HMT or - * 972 for TUBAF - * - * @return array - * @access protected - */ - public function getLocalFormat() - { - if (null != $this->localMarcFieldOfLibrary) { - if (count($localformat = $this->getFieldArray($this->localMarcFieldOfLibrary, ['c'])) > 0) { - foreach ($localformat as &$line) { - if ($line != "") { - $line = trim('local_format_' . strtolower($line)); - } - } - unset($line); - return $localformat; - } - } - return []; - } - - /** - * Return a local notice via an consortial defined field with subfield $k. - * Marc field depends on library e.g. 970 for HMT or 972 for TUBAF. - * - * @return array - * @access protected - * @link https://intern.finc.info/fincproject/issues/1308 - */ - protected function getLocalNotice() - { - if (null != $this->localMarcFieldOfLibrary) { - return $this->getFieldArray($this->localMarcFieldOfLibrary, ['k']); - } - return []; - } - - /** - * Get an array of musical heading based on a swb field - * at the marc field. - * - * @return mixed null if there's no field or array with results - * @access protected - */ - protected function getMusicHeading() - { - $retval = []; - - $fields = $this->getMarcRecord()->getFields('937'); - if (!$fields) { - return null; - } - foreach ($fields as $key => $field) { - if ($d = $field->getSubfield('d')) { - $retval[$key][] = $d->getData(); - } - if ($e = $field->getSubfield('e')) { - $retval[$key][] = $e->getData(); - } - if ($f = $field->getSubfield('f')) { - $retval[$key][] = $f->getData(); - } - } - return $retval; - } - - /** - * Get notice of a title representing a special case of University - * library of Chemnitz: MAB field 999l - * - * @return string - * @access protected - */ - protected function getNotice() - { - return $this->getFirstFieldValue('971', ['l']); - } - - /** - * Get an array of style/genre of a piece taken from the local data - * of the Petrucci music library subfield 590a - * - * @return array - * @access protected - */ - protected function getPieceStyle() - { - return $this->getFieldArray('590', ['a']); - } - - /** - * Get specific marc information about parallel editions. Unflexible solution - * for HMT only implemented. - * - * @todo More flexible implementation - * - * @return array - * @access protected - * @link https://intern.finc.info/issues/4327 - */ - protected function getParallelEditions() - { - $array = []; - $fields = ['775']; - $i = 0; - - foreach ($fields as $field) { - - $related = $this->getMarcRecord()->getFields($field); - // if no entry break it - if ($related) { - foreach ($related as $key => $line) { - // check if subfields i or t exist. if yes do a record. - if ($line->getSubfield('i') || $line->getSubfield('t')) { - $array[$i]['identifier'] = ($line->getSubfield('i')) - ? $line->getSubfield('i')->getData() : ''; - $array[$i]['text'] = ($line->getSubfield('t')) - ? $line->getSubfield('t')->getData() : ''; - // get ppns of bsz - $linkFields = $line->getSubfields('w'); - if (is_array($linkFields) && count($linkFields) > 0) { - foreach ($linkFields as $current) { - $text = $current->getData(); - // Extract parenthetical prefixes: - if (preg_match(self::BSZ_PATTERN, $text, $matches)) { - $array[$key]['record_id'] = $matches[2].$matches[3]; - } - } // end foreach - } // end if - $i++; - } // end if - } // end foreach - } - } - return $this->addFincIDToRecord($array); - } - - /** - * Get an array of previous titles for the record. - * - * @todo use HttpService for URL query - * @todo change currency service - * @todo pass prices by euro currency - * - * @return string - * @access protected - */ - public function getPrice() - { - $currency = $this->getFirstFieldValue('365', ['c']); - $price = $this->getFirstFieldValue('365', ['b']); - if (!empty($currency) && !empty($price) ) { - // if possible convert it in euro - if (is_array($converted = - json_decode(str_replace( - ['lhs','rhs','error','icc'], - ['"lhs"','"rhs"','"error"','"icc"'], - file_get_contents("http://www.google.com/ig/calculator?q=".$price.$currency."=?EUR") - ),true) - )) { - if(empty($converted['error'])){ - $rhs = explode(' ', trim($converted['rhs'])); - return money_format('%.2n', $rhs[0]); - } - } - return $currency . " ". $price; - } - return ""; - } - - /** - * Get the provenience of a title. - * - * @return array - * @access protected - */ - protected function getProvenience() - { - return $this->getFieldArray('561', ['a']); - } - - /** - * Checked if an title is ordered by the library using an consortial defined - * field with subfield $m. Marc field depends on library e.g. 970 for HMT or - * 972 for TUBAF - * - * @return bool - * @access protected - */ - protected function getPurchaseInformation() - { - if (null != $this->localMarcFieldOfLibrary) { - if ($this->getFirstFieldValue($this->localMarcFieldOfLibrary, ['m']) == 'e') { - return true; - } - } - return false; - } - - /** - * Get a short list of series for ISBD citation style - * - * @return array - * @access protected - * @link http://www.loc.gov/marc/bibliographic/bd830.html - * @link https://intern.finc.info/fincproject/issues/457 - */ - protected function getSeriesWithVolume() - { - return $this->getFieldArray('830', ['a', 'v'], false); - } - - /** - * Get local classification of UDK. - * - * @todo Check if method is used by other institution than HTWK. - * - * @return array - * @access protected - * @link https://intern.finc.info/fincproject/issues/1135 - */ - protected function getUDKs() - { - $array = []; - if (null != $this->localMarcFieldOfLibrary) { - - $udk = $this->getMarcRecord()->getFields($this->localMarcFieldOfLibrary); - // if not return void value - if (!$udk) { - return $array; - } // end if - - foreach ($udk as $key => $line) { - // if subfield with udk exists - if ($line->getSubfield('f')) { - // get udk - $array[$key]['index'] = $line->getSubfield('f')->getData(); - // get udk notation - // fixes by update of File_MARC to version 0.8.0 - // @link https://intern.finc.info/issues/2068 - /* - if ($notation = $line->getSubfield('n')) { - // get first value - $array[$key]['notation'][] = $notation->getData(); - // iteration over udk notation - while ($record = $notation->next()) { - $array[$key]['notation'][] = $record->getData(); - $notation = $record; - } - } // end if subfield n - unset($notation); - */ - if ($record = $line->getSubfields('n')) { - // iteration over rvk notation - foreach ($record as $field) { - $array[$key]['notation'][] = $field->getData(); - } - } // end if subfield n - } // end if subfield f - } // end foreach - } - //error_log(print_r($array, true)); - return $array; - } - - /** - * Get addional entries for personal names. - * - * @return array - * @access protected - * @link http://www.loc.gov/marc/bibliographic/bd700.html - */ - protected function getAdditionalAuthors() - { - // result array to return - $retval = []; - - $results = $this->getMarcRecord()->getFields('700'); - if (!$results) { - return $retval; - } - - foreach ($results as $key => $line) { - $retval[$key]['name'] = ($line->getSubfield('a')) - ? $line->getSubfield('a')->getData() : ''; - $retval[$key]['dates'] = ($line->getSubfield('d')) - ? $line->getSubfield('d')->getData() : ''; - $retval[$key]['relator'] = ($line->getSubfield('e')) - ? $line->getSubfield('e')->getData() : ''; - } - // echo "<pre>"; print_r($retval); echo "</pre>"; - return $retval; - } - - /** - * Get specific marc information about additional items. Unflexible solution - * for UBL only implemented. - * - * @return array - * @access protected - * @link https://intern.finc.info/fincproject/issues/1315 - */ - public function getAdditionals() - { - $array = []; - $fields = ['770','775','776']; - $i = 0; - - foreach ($fields as $field) { - - $related = $this->getMarcRecord()->getFields($field); - // if no entry break it - if ($related) { - foreach ($related as $key => $line) { - // check if subfields i or t exist. if yes do a record. - if ($line->getSubfield('i') || $line->getSubfield('t')) { - $array[$i]['identifier'] = ($line->getSubfield('i')) - ? $line->getSubfield('i')->getData() : ''; - $array[$i]['text'] = ($line->getSubfield('t')) - ? $line->getSubfield('t')->getData() : ''; - // get ppns of bsz - $linkFields = $line->getSubfields('w'); - if (is_array($linkFields) && count($linkFields) > 0) { - foreach ($linkFields as $current) { - $text = $current->getData(); - // Extract parenthetical prefixes: - if (preg_match(self::BSZ_PATTERN, $text, $matches)) { - $array[$i]['record_id'] = $matches[2].$matches[3]; - } - } // end foreach - } // end if - $i++; - } // end if - } // end foreach - } - } - - return $this->addFincIDToRecord($array); - } - - /** - * Special method to extracting the data of the marc21 field 689 of the - * the bsz heading subjects chains. - * - * @return array - * @access protected - */ - protected function getAllSubjectHeadingsExtended() - { - // define a false indicator - $firstindicator = 'x'; - $retval = []; - - $fields = $this->getMarcRecord()->getFields('689'); - if (!$fields) { - return null; - } - foreach ($fields as $field) { - $subjectrow = $field->getIndicator('1'); - if ($subjectrow != $firstindicator) { - $key = (isset($key) ? $key +1 : 0); - $firstindicator = $subjectrow; - } - if ($subfield = $field->getSubfield('a')) { - $retval[$key]['subject'][] = $subfield->getData(); - } - if ($subfield = $field->getSubfield('t')) { - $retval[$key]['subject'][] = $subfield->getData(); - } - if ($subfield = $field->getSubfield('9')) { - $retval[$key]['subsubject'] = $subfield->getData(); - } - } - return $retval; - } - - /** - * Return all barcode of finc marc 983 $a at full marc record. - * - * @todo Method seems erroneous. Bugfixin needed. - * - * @return array List of barcodes. - * @access protected - * @deprecated - */ - protected function getBarcode() - { - - $barcodes = []; - - //$driver = ConnectionManager::connectToCatalog(); - $libraryCodes = $this->searchesConfig->LibrarayGroup; - - // get barcodes from marc - $barcodes = $this->getFieldArray('983', ['a']); - - if (!isset($libraryCodes->libraries)) { - return $barcodes; - } else { - if (count($barcodes) > 0) { - $codes = explode(",", $libraryCodes->libraries); - $match = []; - $retval = []; - foreach ($barcodes as $barcode) { - if (preg_match('/^\((.*)\)(.*)$/', trim($barcode), $match)); - if ( in_array($match[1], $codes) ) { - $retval[] = $match[2]; - } - } // end foreach - if (count($retval) > 0 ) { - return $retval; - } - } - } - return []; - } - - /** - * Get the catalogue or opus number of a title. Implemented - * for petrucci music library. - * - * @return array - * @access protected - */ - protected function getCatalogueNumber() - { - return $this->getFieldArray('245', ['b']); - } - - /** - * Get an array of content notes. - * - * @return array - * @access protected - */ - protected function getContentNote() - { - return $this->getFieldArray('505', ['t']); - } - - /** - * Get dissertation notes for the record. - * - * @return array - * @access protected - */ - protected function getDissertationNote() - { - return $this->getFieldArray('502', ['a']); - } - - /** - * Get id of related items - * - * @return string - * @access protected - */ - protected function getRelatedItems() - { - return $this->getFirstFieldValue('776', ['z']); - } } diff --git a/themes/foundation5/scss/foundation.scss b/themes/foundation5/scss/foundation.scss new file mode 100644 index 0000000000000000000000000000000000000000..41bb47e1685171d0fc8e3b9845134ae6181458b6 --- /dev/null +++ b/themes/foundation5/scss/foundation.scss @@ -0,0 +1,42 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +// Behold, here are all the Foundation components. +@import 'foundation/components/grid'; +@import 'foundation/components/accordion'; +@import 'foundation/components/alert-boxes'; +@import 'foundation/components/block-grid'; +@import 'foundation/components/breadcrumbs'; +@import 'foundation/components/button-groups'; +@import 'foundation/components/buttons'; +@import 'foundation/components/clearing'; +@import 'foundation/components/dropdown'; +@import 'foundation/components/dropdown-buttons'; +@import 'foundation/components/flex-video'; +@import 'foundation/components/forms'; +@import 'foundation/components/icon-bar'; +@import 'foundation/components/inline-lists'; +@import 'foundation/components/joyride'; +@import 'foundation/components/keystrokes'; +@import 'foundation/components/labels'; +@import 'foundation/components/magellan'; +@import 'foundation/components/orbit'; +@import 'foundation/components/pagination'; +@import 'foundation/components/panels'; +@import 'foundation/components/pricing-tables'; +@import 'foundation/components/progress-bars'; +@import 'foundation/components/range-slider'; +@import 'foundation/components/reveal'; +@import 'foundation/components/side-nav'; +@import 'foundation/components/split-buttons'; +@import 'foundation/components/sub-nav'; +@import 'foundation/components/switches'; +@import 'foundation/components/tables'; +@import 'foundation/components/tabs'; +@import 'foundation/components/thumbs'; +@import 'foundation/components/tooltips'; +@import 'foundation/components/top-bar'; +@import 'foundation/components/type'; +@import 'foundation/components/offcanvas'; +@import 'foundation/components/visibility'; diff --git a/themes/foundation5/scss/foundation/_functions.scss b/themes/foundation5/scss/foundation/_functions.scss new file mode 100644 index 0000000000000000000000000000000000000000..a63b920dde733d913bd49f44247a48888775d358 --- /dev/null +++ b/themes/foundation5/scss/foundation/_functions.scss @@ -0,0 +1,156 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +// This is the default html and body font-size for the base rem value. +$rem-base: 16px !default; + +// IMPORT ONCE +// We use this to prevent styles from being loaded multiple times for components that rely on other components. +$modules: () !default; + +@mixin exports($name) { + // Import from global scope + $modules: $modules !global; + // Check if a module is already on the list + $module_index: index($modules, $name); + @if (($module_index == null) or ($module_index == false)) { + $modules: append($modules, $name) !global; + @content; + } +} + +// +// @functions +// + + +// RANGES +// We use these functions to define ranges for various things, like media queries. +@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); +} + +// STRIP UNIT +// It strips the unit of measure and returns it +@function strip-unit($num) { + @return $num / ($num * 0 + 1); +} + +// TEXT INPUT TYPES + +@function text-inputs( $types: all, $selector: input ) { + + $return: (); + + $all-text-input-types: + text + password + date + datetime + datetime-local + month + week + email + number + search + tel + time + url + color + textarea; + + @if $types == all { $types: $all-text-input-types; } + + @each $type in $types { + @if $type == textarea { + @if $selector == input { + $return: append($return, unquote('#{$type}'), comma) + } @else { + $return: append($return, unquote('#{$type}#{$selector}'), comma) + } + } @else { + $return: append($return, unquote('#{$selector}[type="#{$type}"]'), comma) + } + } + + @return $return; + +} + +// CONVERT TO REM +@function convert-to-rem($value, $base-value: $rem-base) { + $value: strip-unit($value) / strip-unit($base-value) * 1rem; + @if ($value == 0rem) { $value: 0; } // Turn 0rem into 0 + @return $value; +} + +@function data($attr) { + @if $namespace { + @return '[data-' + $namespace + '-' + $attr + ']'; + } + + @return '[data-' + $attr + ']'; +} + +// REM CALC + +// New Syntax, allows to optionally calculate on a different base value to counter compounding effect of rem's. +// Call with 1, 2, 3 or 4 parameters, 'px' is not required but supported: +// +// rem-calc(10 20 30px 40); +// +// Space delimited, if you want to delimit using comma's, wrap it in another pair of brackets +// +// rem-calc((10, 20, 30, 40px)); +// +// Optionally call with a different base (eg: 8px) to calculate rem. +// +// rem-calc(16px 32px 48px, 8px); +// +// If you require to comma separate your list +// +// rem-calc((16px, 32px, 48), 8px); + +@function rem-calc($values, $base-value: $rem-base) { + $max: length($values); + + @if $max == 1 { @return convert-to-rem(nth($values, 1), $base-value); } + + $remValues: (); + @for $i from 1 through $max { + $remValues: append($remValues, convert-to-rem(nth($values, $i), $base-value)); + } + @return $remValues; +} + + +@function em-calc($values) { + $remValues: rem-calc($values); + + $max: length($remValues); + + @if $max == 1 { @return strip-unit(nth($remValues, 1)) * 1em; } + + $emValues: (); + @for $i from 1 through $max { + $emValues: append($emValues, strip-unit(nth($remValues, $i)) * 1em); + } + @return $emValues; +} + + +// Deprecated: OLD EM CALC +@function emCalc($values) { + @return em-calc($values); +} diff --git a/themes/foundation5/scss/foundation/_settings.scss b/themes/foundation5/scss/foundation/_settings.scss new file mode 100644 index 0000000000000000000000000000000000000000..e4b3e92da00e95d60a91235181b4fbfc1d982317 --- /dev/null +++ b/themes/foundation5/scss/foundation/_settings.scss @@ -0,0 +1,1486 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +// + +// Table of Contents +// Foundation Settings +// +// a. Base +// b. Grid +// c. Global +// d. Media Query Ranges +// e. Typography +// 01. Accordion +// 02. Alert Boxes +// 03. Block Grid +// 04. Breadcrumbs +// 05. Buttons +// 06. Button Groups +// 07. Clearing +// 08. Dropdown +// 09. Dropdown Buttons +// 10. Flex Video +// 11. Forms +// 12. Icon Bar +// 13. Inline Lists +// 14. Joyride +// 15. Keystrokes +// 16. Labels +// 17. Magellan +// 18. Off-canvas +// 19. Orbit +// 20. Pagination +// 21. Panels +// 22. Pricing Tables +// 23. Progress Bar +// 24. Range Slider +// 25. Reveal +// 26. Side Nav +// 27. Split Buttons +// 28. Sub Nav +// 29. Switch +// 30. Tables +// 31. Tabs +// 32. Thumbnails +// 33. Tooltips +// 34. Top Bar +// 36. Visibility Classes + +// a. Base +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// This is the default html and body font-size for the base rem value. +// $rem-base: 16px; + +// Allows the use of rem-calc() or lower-bound() in your settings +@import 'foundation/functions'; + +// The default font-size is set to 100% of the browser style sheet (usually 16px) +// for compatibility with browser-based text zoom or user-set defaults. + +// Since the typical default browser font-size is 16px, that makes the calculation for grid size. +// If you want your base font-size to be different and not have it affect the grid breakpoints, +// set $rem-base to $base-font-size and make sure $base-font-size is a px value. +// $base-font-size: 100%; + +// The $base-font-size is 100% while $base-line-height is 150% +// $base-line-height: 150%; + +// We use this to control whether or not CSS classes come through in the gem files. +$include-html-classes: true; +// $include-print-styles: true; +$include-html-global-classes: $include-html-classes; + +// b. Grid +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-grid-classes: $include-html-classes; +// $include-xl-html-grid-classes: false; + +// $row-width: rem-calc(1000); +// $total-columns: 12; +// $column-gutter: rem-calc(30); + +// c. Global +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// We use these to define default font stacks +// $font-family-sans-serif: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif; +// $font-family-serif: Georgia, Cambria, "Times New Roman", Times, serif; +// $font-family-monospace: Consolas, "Liberation Mono", Courier, monospace; + +// We use these to define default font weights +// $font-weight-normal: normal; +// $font-weight-bold: bold; + +// $white : #FFFFFF; +// $ghost : #FAFAFA; +// $snow : #F9F9F9; +// $vapor : #F6F6F6; +// $white-smoke : #F5F5F5; +// $silver : #EFEFEF; +// $smoke : #EEEEEE; +// $gainsboro : #DDDDDD; +// $iron : #CCCCCC; +// $base : #AAAAAA; +// $aluminum : #999999; +// $jumbo : #888888; +// $monsoon : #777777; +// $steel : #666666; +// $charcoal : #555555; +// $tuatara : #444444; +// $oil : #333333; +// $jet : #222222; +// $black : #000000; + +// We use these as default colors throughout +// $primary-color: #008CBA; +// $secondary-color: #e7e7e7; +// $alert-color: #f04124; +// $success-color: #43AC6A; +// $warning-color: #f08a24; +// $info-color: #a0d3e8; + +// We use these to control various global styles +// $body-bg: $white; +// $body-font-color: $jet; +// $body-font-family: $font-family-sans-serif; +// $body-font-weight: $font-weight-normal; +// $body-font-style: normal; + +// We use this to control font-smoothing +// $font-smoothing: antialiased; + +// We use these to control text direction settings +// $text-direction: ltr; +// $opposite-direction: right; +// $default-float: left; +// $last-child-float: $opposite-direction; + +// We use these to make sure border radius matches unless we want it different. +// $global-radius: 3px; +// $global-rounded: 1000px; + +// We use these to control inset shadow shiny edges and depressions. +// $shiny-edge-size: 0 1px 0; +// $shiny-edge-color: rgba($white, .5); +// $shiny-edge-active-color: rgba($black, .2); + +// d. Media Query Ranges +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $small-breakpoint: em-calc(640); +// $medium-breakpoint: em-calc(1024); +// $large-breakpoint: em-calc(1440); +// $xlarge-breakpoint: em-calc(1920); + +// $small-range: (0, $small-breakpoint); +// $medium-range: ($small-breakpoint + em-calc(1), $medium-breakpoint); +// $large-range: ($medium-breakpoint + em-calc(1), $large-breakpoint); +// $xlarge-range: ($large-breakpoint + em-calc(1), $xlarge-breakpoint); +// $xxlarge-range: ($xlarge-breakpoint + em-calc(1), em-calc(99999999)); + +// $screen: "only screen"; + +// $landscape: "#{$screen} and (orientation: landscape)"; +// $portrait: "#{$screen} and (orientation: portrait)"; + +// $small-up: $screen; +// $small-only: "#{$screen} and (max-width: #{upper-bound($small-range)})"; + +// $medium-up: "#{$screen} and (min-width:#{lower-bound($medium-range)})"; +// $medium-only: "#{$screen} and (min-width:#{lower-bound($medium-range)}) and (max-width:#{upper-bound($medium-range)})"; + +// $large-up: "#{$screen} and (min-width:#{lower-bound($large-range)})"; +// $large-only: "#{$screen} and (min-width:#{lower-bound($large-range)}) and (max-width:#{upper-bound($large-range)})"; + +// $xlarge-up: "#{$screen} and (min-width:#{lower-bound($xlarge-range)})"; +// $xlarge-only: "#{$screen} and (min-width:#{lower-bound($xlarge-range)}) and (max-width:#{upper-bound($xlarge-range)})"; + +// $xxlarge-up: "#{$screen} and (min-width:#{lower-bound($xxlarge-range)})"; +// $xxlarge-only: "#{$screen} and (min-width:#{lower-bound($xxlarge-range)}) and (max-width:#{upper-bound($xxlarge-range)})"; + +// $retina: ( +// "#{$screen} and (-webkit-min-device-pixel-ratio: 2)", +// "#{$screen} and (min--moz-device-pixel-ratio: 2)", +// "#{$screen} and (-o-min-device-pixel-ratio: 2/1)", +// "#{$screen} and (min-device-pixel-ratio: 2)", +// "#{$screen} and (min-resolution: 192dpi)", +// "#{$screen} and (min-resolution: 2dppx)" +// ); + +// Legacy +// $small: $medium-up; +// $medium: $medium-up; +// $large: $large-up; + +// We use this as cursors values for enabling the option of having custom cursors in the whole site's stylesheet +// $cursor-crosshair-value: crosshair; +// $cursor-default-value: default; +// $cursor-disabled-value: not-allowed; +// $cursor-pointer-value: pointer; +// $cursor-help-value: help; +// $cursor-text-value: text; + +// e. Typography +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-type-classes: $include-html-classes; + +// We use these to control header font styles +// $header-font-family: $body-font-family; +// $header-font-weight: $font-weight-normal; +// $header-font-style: normal; +// $header-font-color: $jet; +// $header-line-height: 1.4; +// $header-top-margin: .2rem; +// $header-bottom-margin: .5rem; +// $header-text-rendering: optimizeLegibility; + +// We use these to control header font sizes +// $h1-font-size: rem-calc(44); +// $h2-font-size: rem-calc(37); +// $h3-font-size: rem-calc(27); +// $h4-font-size: rem-calc(23); +// $h5-font-size: rem-calc(18); +// $h6-font-size: 1rem; + +// We use these to control header size reduction on small screens +// $h1-font-reduction: rem-calc(10); +// $h2-font-reduction: rem-calc(10); +// $h3-font-reduction: rem-calc(5); +// $h4-font-reduction: rem-calc(5); +// $h5-font-reduction: 0; +// $h6-font-reduction: 0; + +// These control how subheaders are styled. +// $subheader-line-height: 1.4; +// $subheader-font-color: scale-color($header-font-color, $lightness: 35%); +// $subheader-font-weight: $font-weight-normal; +// $subheader-top-margin: .2rem; +// $subheader-bottom-margin: .5rem; + +// A general <small> styling +// $small-font-size: 60%; +// $small-font-color: scale-color($header-font-color, $lightness: 35%); + +// We use these to style paragraphs +// $paragraph-font-family: inherit; +// $paragraph-font-weight: $font-weight-normal; +// $paragraph-font-size: 1rem; +// $paragraph-line-height: 1.6; +// $paragraph-margin-bottom: rem-calc(20); +// $paragraph-aside-font-size: rem-calc(14); +// $paragraph-aside-line-height: 1.35; +// $paragraph-aside-font-style: italic; +// $paragraph-text-rendering: optimizeLegibility; + +// We use these to style <code> tags +// $code-color: $oil; +// $code-font-family: $font-family-monospace; +// $code-font-weight: $font-weight-normal; +// $code-background-color: scale-color($secondary-color, $lightness: 70%); +// $code-border-size: 1px; +// $code-border-style: solid; +// $code-border-color: scale-color($code-background-color, $lightness: -10%); +// $code-padding: rem-calc(2) rem-calc(5) rem-calc(1); + +// We use these to style anchors +// $anchor-text-decoration: none; +// $anchor-text-decoration-hover: none; +// $anchor-font-color: $primary-color; +// $anchor-font-color-hover: scale-color($anchor-font-color, $lightness: -14%); + +// We use these to style the <hr> element +// $hr-border-width: 1px; +// $hr-border-style: solid; +// $hr-border-color: $gainsboro; +// $hr-margin: rem-calc(20); + +// We use these to style lists +// $list-font-family: $paragraph-font-family; +// $list-font-size: $paragraph-font-size; +// $list-line-height: $paragraph-line-height; +// $list-margin-bottom: $paragraph-margin-bottom; +// $list-style-position: outside; +// $list-side-margin: 1.1rem; +// $list-ordered-side-margin: 1.4rem; +// $list-side-margin-no-bullet: 0; +// $list-nested-margin: rem-calc(20); +// $definition-list-header-weight: $font-weight-bold; +// $definition-list-header-margin-bottom: .3rem; +// $definition-list-margin-bottom: rem-calc(12); + +// We use these to style blockquotes +// $blockquote-font-color: scale-color($header-font-color, $lightness: 35%); +// $blockquote-padding: rem-calc(9 20 0 19); +// $blockquote-border: 1px solid $gainsboro; +// $blockquote-cite-font-size: rem-calc(13); +// $blockquote-cite-font-color: scale-color($header-font-color, $lightness: 23%); +// $blockquote-cite-link-color: $blockquote-cite-font-color; + +// Acronym styles +// $acronym-underline: 1px dotted $gainsboro; + +// We use these to control padding and margin +// $microformat-padding: rem-calc(10 12); +// $microformat-margin: rem-calc(0 0 20 0); + +// We use these to control the border styles +// $microformat-border-width: 1px; +// $microformat-border-style: solid; +// $microformat-border-color: $gainsboro; + +// We use these to control full name font styles +// $microformat-fullname-font-weight: $font-weight-bold; +// $microformat-fullname-font-size: rem-calc(15); + +// We use this to control the summary font styles +// $microformat-summary-font-weight: $font-weight-bold; + +// We use this to control abbr padding +// $microformat-abbr-padding: rem-calc(0 1); + +// We use this to control abbr font styles +// $microformat-abbr-font-weight: $font-weight-bold; +// $microformat-abbr-font-decoration: none; + +// 01. Accordion +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-accordion-classes: $include-html-classes; + +// $accordion-navigation-padding: rem-calc(16); +// $accordion-navigation-bg-color: $silver; +// $accordion-navigation-hover-bg-color: scale-color($accordion-navigation-bg-color, $lightness: -5%); +// $accordion-navigation-active-bg-color: scale-color($accordion-navigation-bg-color, $lightness: -3%); +// $accordion-navigation-font-color: $jet; +// $accordion-navigation-font-size: rem-calc(16); +// $accordion-navigation-font-family: $body-font-family; + +// $accordion-content-padding: ($column-gutter/2); +// $accordion-content-active-bg-color: $white; + +// 02. Alert Boxes +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-alert-classes: $include-html-classes; + +// We use this to control alert padding. +// $alert-padding-top: rem-calc(14); +// $alert-padding-default-float: $alert-padding-top; +// $alert-padding-opposite-direction: $alert-padding-top + rem-calc(10); +// $alert-padding-bottom: $alert-padding-top; + +// We use these to control text style. +// $alert-font-weight: $font-weight-normal; +// $alert-font-size: rem-calc(13); +// $alert-font-color: $white; +// $alert-font-color-alt: scale-color($secondary-color, $lightness: -66%); + +// We use this for close hover effect. +// $alert-function-factor: -14%; + +// We use these to control border styles. +// $alert-border-style: solid; +// $alert-border-width: 1px; +// $alert-border-color: scale-color($primary-color, $lightness: $alert-function-factor); +// $alert-bottom-margin: rem-calc(20); + +// We use these to style the close buttons +// $alert-close-color: $oil; +// $alert-close-top: 50%; +// $alert-close-position: rem-calc(4); +// $alert-close-font-size: rem-calc(22); +// $alert-close-opacity: .3; +// $alert-close-opacity-hover: .5; +// $alert-close-padding: 9px 6px 4px; +// $alert-close-background: inherit; + +// We use this to control border radius +// $alert-radius: $global-radius; + +// $alert-transition-speed: 300ms; +// $alert-transition-ease: ease-out; + +// 03. Block Grid +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-block-grid-classes: $include-html-classes; +// $include-xl-html-block-grid-classes: false; + +// We use this to control the maximum number of block grid elements per row +// $block-grid-elements: 12; +// $block-grid-default-spacing: rem-calc(20); + +// $align-block-grid-to-grid: false; +// @if $align-block-grid-to-grid {$block-grid-default-spacing: $column-gutter;} + +// Enables media queries for block-grid classes. Set to false if writing semantic HTML. +// $block-grid-media-queries: true; + +// 04. Breadcrumbs +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-nav-classes: $include-html-classes; + +// We use this to set the background color for the breadcrumb container. +// $crumb-bg: scale-color($secondary-color, $lightness: 55%); + +// We use these to set the padding around the breadcrumbs. +// $crumb-padding: rem-calc(9 14 9); +// $crumb-side-padding: rem-calc(12); + +// We use these to control border styles. +// $crumb-function-factor: -10%; +// $crumb-border-size: 1px; +// $crumb-border-style: solid; +// $crumb-border-color: scale-color($crumb-bg, $lightness: $crumb-function-factor); +// $crumb-radius: $global-radius; + +// We use these to set various text styles for breadcrumbs. +// $crumb-font-size: rem-calc(11); +// $crumb-font-color: $primary-color; +// $crumb-font-color-current: $oil; +// $crumb-font-color-unavailable: $aluminum; +// $crumb-font-transform: uppercase; +// $crumb-link-decor: underline; + +// We use these to control the slash between breadcrumbs +// $crumb-slash-color: $base; +// $crumb-slash: "/"; + +// 05. Buttons +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-button-classes: $include-html-classes; + +// We use these to build padding for buttons. +// $button-tny: rem-calc(10); +// $button-sml: rem-calc(14); +// $button-med: rem-calc(16); +// $button-lrg: rem-calc(18); + +// We use this to control the display property. +// $button-display: inline-block; +// $button-margin-bottom: rem-calc(20); + +// We use these to control button text styles. +// $button-font-family: $body-font-family; +// $button-font-color: $white; +// $button-font-color-alt: $oil; +// $button-font-tny: rem-calc(11); +// $button-font-sml: rem-calc(13); +// $button-font-med: rem-calc(16); +// $button-font-lrg: rem-calc(20); +// $button-font-weight: $font-weight-normal; +// $button-font-align: center; + +// We use these to control various hover effects. +// $button-function-factor: -20%; + +// We use these to control button border styles. +// $button-border-width: 0; +// $button-border-style: solid; +// $button-bg-color: $primary-color; +// $button-bg-hover: scale-color($button-bg-color, $lightness: $button-function-factor); +// $button-border-color: $button-bg-hover; +// $secondary-button-bg-hover: scale-color($secondary-color, $lightness: $button-function-factor); +// $secondary-button-border-color: $secondary-button-bg-hover; +// $success-button-bg-hover: scale-color($success-color, $lightness: $button-function-factor); +// $success-button-border-color: $success-button-bg-hover; +// $alert-button-bg-hover: scale-color($alert-color, $lightness: $button-function-factor); +// $alert-button-border-color: $alert-button-bg-hover; +// $warning-button-bg-hover: scale-color($warning-color, $lightness: $button-function-factor); +// $warning-button-border-color: $warning-button-bg-hover; +// $info-button-bg-hover: scale-color($info-color, $lightness: $button-function-factor); +// $info-button-border-color: $info-button-bg-hover; + +// We use this to set the default radius used throughout the core. +// $button-radius: $global-radius; +// $button-round: $global-rounded; + +// We use this to set default opacity and cursor for disabled buttons. +// $button-disabled-opacity: .7; +// $button-disabled-cursor: $cursor-default-value; + +// 06. Button Groups +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-button-classes: $include-html-classes; + +// Sets the margin for the right side by default, and the left margin if right-to-left direction is used +// $button-bar-margin-opposite: rem-calc(10); +// $button-group-border-width: 1px; + +// 07. Clearing +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-clearing-classes: $include-html-classes; + +// We use these to set the background colors for parts of Clearing. +// $clearing-bg: $oil; +// $clearing-caption-bg: $clearing-bg; +// $clearing-carousel-bg: rgba(51,51,51,0.8); +// $clearing-img-bg: $clearing-bg; + +// We use these to style the close button +// $clearing-close-color: $iron; +// $clearing-close-size: 30px; + +// We use these to style the arrows +// $clearing-arrow-size: 12px; +// $clearing-arrow-color: $clearing-close-color; + +// We use these to style captions +// $clearing-caption-font-color: $iron; +// $clearing-caption-font-size: .875em; +// $clearing-caption-padding: 10px 30px 20px; + +// We use these to make the image and carousel height and style +// $clearing-active-img-height: 85%; +// $clearing-carousel-height: 120px; +// $clearing-carousel-thumb-width: 120px; +// $clearing-carousel-thumb-active-border: 1px solid rgb(255,255,255); + +// 08. Dropdown +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-dropdown-classes: $include-html-classes; + +// We use these to controls height and width styles. +// $f-dropdown-max-width: 200px; +// $f-dropdown-height: auto; +// $f-dropdown-max-height: none; + +// Used for bottom position +// $f-dropdown-margin-top: 2px; + +// Used for right position +// $f-dropdown-margin-left: $f-dropdown-margin-top; + +// Used for left position +// $f-dropdown-margin-right: $f-dropdown-margin-top; + +// Used for top position +// $f-dropdown-margin-bottom: $f-dropdown-margin-top; + +// We use this to control the background color +// $f-dropdown-bg: $white; + +// We use this to set the border styles for dropdowns. +// $f-dropdown-border-style: solid; +// $f-dropdown-border-width: 1px; +// $f-dropdown-border-color: scale-color($white, $lightness: -20%); + +// We use these to style the triangle pip. +// $f-dropdown-triangle-size: 6px; +// $f-dropdown-triangle-color: $white; +// $f-dropdown-triangle-side-offset: 10px; + +// We use these to control styles for the list elements. +// $f-dropdown-list-style: none; +// $f-dropdown-font-color: $charcoal; +// $f-dropdown-font-size: rem-calc(14); +// $f-dropdown-list-padding: rem-calc(5, 10); +// $f-dropdown-line-height: rem-calc(18); +// $f-dropdown-list-hover-bg: $smoke; +// $dropdown-mobile-default-float: 0; + +// We use this to control the styles for when the dropdown has custom content. +// $f-dropdown-content-padding: rem-calc(20); + +// Default radius for dropdown. +// $f-dropdown-radius: $global-radius; + + +// 09. Dropdown Buttons +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-button-classes: $include-html-classes; + +// We use these to set the color of the pip in dropdown buttons +// $dropdown-button-pip-color: $white; +// $dropdown-button-pip-color-alt: $oil; + +// We use these to set the size of the pip in dropdown buttons +// $button-pip-tny: rem-calc(6); +// $button-pip-sml: rem-calc(7); +// $button-pip-med: rem-calc(9); +// $button-pip-lrg: rem-calc(11); + +// We use these to style tiny dropdown buttons +// $dropdown-button-padding-tny: $button-pip-tny * 7; +// $dropdown-button-pip-size-tny: $button-pip-tny; +// $dropdown-button-pip-opposite-tny: $button-pip-tny * 3; +// $dropdown-button-pip-top-tny: (-$button-pip-tny / 2) + rem-calc(1); + +// We use these to style small dropdown buttons +// $dropdown-button-padding-sml: $button-pip-sml * 7; +// $dropdown-button-pip-size-sml: $button-pip-sml; +// $dropdown-button-pip-opposite-sml: $button-pip-sml * 3; +// $dropdown-button-pip-top-sml: (-$button-pip-sml / 2) + rem-calc(1); + +// We use these to style medium dropdown buttons +// $dropdown-button-padding-med: $button-pip-med * 6 + rem-calc(3); +// $dropdown-button-pip-size-med: $button-pip-med - rem-calc(3); +// $dropdown-button-pip-opposite-med: $button-pip-med * 2.5; +// $dropdown-button-pip-top-med: (-$button-pip-med / 2) + rem-calc(2); + +// We use these to style large dropdown buttons +// $dropdown-button-padding-lrg: $button-pip-lrg * 5 + rem-calc(3); +// $dropdown-button-pip-size-lrg: $button-pip-lrg - rem-calc(6); +// $dropdown-button-pip-opposite-lrg: $button-pip-lrg * 2.5; +// $dropdown-button-pip-top-lrg: (-$button-pip-lrg / 2) + rem-calc(3); + +// 10. Flex Video +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-media-classes: $include-html-classes; + +// We use these to control video container padding and margins +// $flex-video-padding-top: rem-calc(25); +// $flex-video-padding-bottom: 67.5%; +// $flex-video-margin-bottom: rem-calc(16); + +// We use this to control widescreen bottom padding +// $flex-video-widescreen-padding-bottom: 56.34%; + +// 11. Forms +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-form-classes: $include-html-classes; + +// We use this to set the base for lots of form spacing and positioning styles +// $form-spacing: rem-calc(16); + +// We use these to style the labels in different ways +// $form-label-pointer: pointer; +// $form-label-font-size: rem-calc(14); +// $form-label-font-weight: $font-weight-normal; +// $form-label-line-height: 1.5; +// $form-label-font-color: scale-color($black, $lightness: 30%); +// $form-label-small-transform: capitalize; +// $form-label-bottom-margin: 0; +// $input-font-family: inherit; +// $input-font-color: rgba(0,0,0,0.75); +// $input-font-size: rem-calc(14); +// $input-bg-color: $white; +// $input-focus-bg-color: scale-color($white, $lightness: -2%); +// $input-border-color: scale-color($white, $lightness: -20%); +// $input-focus-border-color: scale-color($white, $lightness: -40%); +// $input-border-style: solid; +// $input-border-width: 1px; +// $input-border-radius: $global-radius; +// $input-disabled-bg: $gainsboro; +// $input-disabled-cursor: $cursor-default-value; +// $input-box-shadow: inset 0 1px 2px rgba(0,0,0,0.1); +// $input-include-glowing-effect: false; + +// We use these to style the fieldset border and spacing. +// $fieldset-border-style: solid; +// $fieldset-border-width: 1px; +// $fieldset-border-color: $gainsboro; +// $fieldset-padding: rem-calc(20); +// $fieldset-margin: rem-calc(18 0); + +// We use these to style the legends when you use them +// $legend-bg: $white; +// $legend-font-weight: $font-weight-bold; +// $legend-padding: rem-calc(0 3); + +// We use these to style the prefix and postfix input elements +// $input-prefix-bg: scale-color($white, $lightness: -5%); +// $input-prefix-border-color: scale-color($white, $lightness: -20%); +// $input-prefix-border-size: 1px; +// $input-prefix-border-type: solid; +// $input-prefix-overflow: hidden; +// $input-prefix-font-color: $oil; +// $input-prefix-font-color-alt: $white; + +// We use this setting to turn on/off HTML5 number spinners (the up/down arrows) +// $input-number-spinners: true; + +// We use these to style the error states for inputs and labels +// $input-error-message-padding: rem-calc(6 9 9); +// $input-error-message-top: -1px; +// $input-error-message-font-size: rem-calc(12); +// $input-error-message-font-weight: $font-weight-normal; +// $input-error-message-font-style: italic; +// $input-error-message-font-color: $white; +// $input-error-message-bg-color: $alert-color; +// $input-error-message-font-color-alt: $oil; + +// We use this to style the glowing effect of inputs when focused +// $glowing-effect-fade-time: .45s; +// $glowing-effect-color: $input-focus-border-color; + +// We use this to style the transition when inputs are focused and when the glowing effect is disabled. +// $input-transition-fade-time: 0.15s; +// $input-transition-fade-timing-function: linear; + +// Select variables +// $select-bg-color: $ghost; +// $select-hover-bg-color: scale-color($select-bg-color, $lightness: -3%); + + +// 12. Icon Bar +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// We use these to style the icon-bar and items +// $icon-bar-bg: $oil; +// $icon-bar-font-color: $white; +// $icon-bar-font-color-hover: $icon-bar-font-color; +// $icon-bar-font-size: 1rem; +// $icon-bar-hover-color: $primary-color; +// $icon-bar-icon-color: $white; +// $icon-bar-icon-color-hover: $icon-bar-icon-color; +// $icon-bar-icon-size: 1.875rem; +// $icon-bar-image-width: 1.875rem; +// $icon-bar-image-height: 1.875rem; +// $icon-bar-active-color: $primary-color; +// $icon-bar-item-padding: 1.25rem; + +// We use this to set default opacity and cursor for disabled icons. +// $icon-bar-disabled-opacity: .7; + +// 13. Inline Lists +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-inline-list-classes: $include-html-classes; + +// We use this to control the margins and padding of the inline list. +// $inline-list-top-margin: 0; +// $inline-list-opposite-margin: 0; +// $inline-list-bottom-margin: rem-calc(17); +// $inline-list-default-float-margin: rem-calc(-22); +// $inline-list-default-float-list-margin: rem-calc(22); + +// $inline-list-padding: 0; + +// We use this to control the overflow of the inline list. +// $inline-list-overflow: hidden; + +// We use this to control the list items +// $inline-list-display: block; + +// We use this to control any elements within list items +// $inline-list-children-display: block; + +// 14. Joyride +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-joyride-classes: $include-html-classes; + +// Controlling default Joyride styles +// $joyride-tip-bg: $oil; +// $joyride-tip-default-width: 300px; +// $joyride-tip-padding: rem-calc(18 20 24); +// $joyride-tip-border: solid 1px $charcoal; +// $joyride-tip-radius: 4px; +// $joyride-tip-position-offset: 22px; + +// Here, we're setting the tip font styles +// $joyride-tip-font-color: $white; +// $joyride-tip-font-size: rem-calc(14); +// $joyride-tip-header-weight: $font-weight-bold; + +// This changes the nub size +// $joyride-tip-nub-size: 10px; + +// This adjusts the styles for the timer when its enabled +// $joyride-tip-timer-width: 50px; +// $joyride-tip-timer-height: 3px; +// $joyride-tip-timer-color: $steel; + +// This changes up the styles for the close button +// $joyride-tip-close-color: $monsoon; +// $joyride-tip-close-size: 24px; +// $joyride-tip-close-weight: $font-weight-normal; + +// When Joyride is filling the screen, we use this style for the bg +// $joyride-screenfill: rgba(0,0,0,0.5); + +// 15. Keystrokes +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-keystroke-classes: $include-html-classes; + +// We use these to control text styles. +// $keystroke-font: "Consolas", "Menlo", "Courier", monospace; +// $keystroke-font-size: inherit; +// $keystroke-font-color: $jet; +// $keystroke-font-color-alt: $white; +// $keystroke-function-factor: -7%; + +// We use this to control keystroke padding. +// $keystroke-padding: rem-calc(2 4 0); + +// We use these to control background and border styles. +// $keystroke-bg: scale-color($white, $lightness: $keystroke-function-factor); +// $keystroke-border-style: solid; +// $keystroke-border-width: 1px; +// $keystroke-border-color: scale-color($keystroke-bg, $lightness: $keystroke-function-factor); +// $keystroke-radius: $global-radius; + +// 16. Labels +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-label-classes: $include-html-classes; + +// We use these to style the labels +// $label-padding: rem-calc(4 8 4); +// $label-radius: $global-radius; + +// We use these to style the label text +// $label-font-sizing: rem-calc(11); +// $label-font-weight: $font-weight-normal; +// $label-font-color: $oil; +// $label-font-color-alt: $white; +// $label-font-family: $body-font-family; + +// 17. Magellan +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-magellan-classes: $include-html-classes; + +// $magellan-bg: $white; +// $magellan-padding: 10px; + +// 18. Off-canvas +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// Off Canvas Tab Bar Variables +// $include-html-off-canvas-classes: $include-html-classes; + +// $tabbar-bg: $oil; +// $tabbar-height: rem-calc(45); +// $tabbar-icon-width: $tabbar-height; +// $tabbar-line-height: $tabbar-height; +// $tabbar-color: $white; +// $tabbar-middle-padding: 0 rem-calc(10); + +// Off Canvas Divider Styles +// $tabbar-left-section-border: solid 1px scale-color($tabbar-bg, $lightness: -50%); +// $tabbar-right-section-border: $tabbar-left-section-border; + + +// Off Canvas Tab Bar Headers +// $tabbar-header-color: $white; +// $tabbar-header-weight: $font-weight-bold; +// $tabbar-header-line-height: $tabbar-height; +// $tabbar-header-margin: 0; + +// Off Canvas Menu Variables +// $off-canvas-width: rem-calc(250); +// $off-canvas-bg: $oil; +// $off-canvas-bg-hover: scale-color($tabbar-bg, $lightness: -30%); +// $off-canvas-bg-active: scale-color($tabbar-bg, $lightness: -30%); + +// Off Canvas Menu List Variables +// $off-canvas-label-padding: .3rem rem-calc(15); +// $off-canvas-label-color: $aluminum; +// $off-canvas-label-text-transform: uppercase; +// $off-canvas-label-font-size: rem-calc(12); +// $off-canvas-label-font-weight: $font-weight-bold; +// $off-canvas-label-bg: $tuatara; +// $off-canvas-label-border-top: 1px solid scale-color($off-canvas-label-bg, $lightness: 14%); +// $off-canvas-label-border-bottom: none; +// $off-canvas-label-margin:0; +// $off-canvas-link-padding: rem-calc(10, 15); +// $off-canvas-link-color: rgba($white, .7); +// $off-canvas-link-border-bottom: 1px solid scale-color($off-canvas-bg, $lightness: -25%); +// $off-canvas-back-bg: #444; +// $off-canvas-back-border-top: $off-canvas-label-border-top; +// $off-canvas-back-border-bottom: $off-canvas-label-border-bottom; +// $off-canvas-back-hover-bg: scale-color($off-canvas-back-bg, $lightness: -30%); +// $off-canvas-back-hover-border-top: 1px solid scale-color($off-canvas-label-bg, $lightness: 14%); +// $off-canvas-back-hover-border-bottom: none; + +// Off Canvas Menu Icon Variables +// $tabbar-menu-icon-color: $white; +// $tabbar-menu-icon-hover: scale-color($tabbar-menu-icon-color, $lightness: -30%); + +// $tabbar-menu-icon-text-indent: rem-calc(35); +// $tabbar-menu-icon-width: $tabbar-icon-width; +// $tabbar-menu-icon-height: $tabbar-height; +// $tabbar-menu-icon-padding: 0; + +// $tabbar-hamburger-icon-width: rem-calc(16); +// $tabbar-hamburger-icon-left: false; +// $tabbar-hamburger-icon-top: false; +// $tabbar-hamburger-icon-thickness: 1px; +// $tabbar-hamburger-icon-gap: 6px; + +// Off Canvas Back-Link Overlay +// $off-canvas-overlay-transition: background 300ms ease; +// $off-canvas-overlay-cursor: pointer; +// $off-canvas-overlay-box-shadow: -4px 0 4px rgba($black, .5), 4px 0 4px rgba($black, .5); +// $off-canvas-overlay-background: rgba($white, .2); +// $off-canvas-overlay-background-hover: rgba($white, .05); + +// Transition Variables +// $menu-slide: "transform 500ms ease"; + +// 19. Orbit +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-orbit-classes: $include-html-classes; + +// We use these to control the caption styles +// $orbit-container-bg: none; +// $orbit-caption-bg: rgba(51,51,51, .8); +// $orbit-caption-font-color: $white; +// $orbit-caption-font-size: rem-calc(14); +// $orbit-caption-position: "bottom"; // Supported values: "bottom", "under" +// $orbit-caption-padding: rem-calc(10 14); +// $orbit-caption-height: auto; + +// We use these to control the left/right nav styles +// $orbit-nav-bg: transparent; +// $orbit-nav-bg-hover: rgba(0,0,0,0.3); +// $orbit-nav-arrow-color: $white; +// $orbit-nav-arrow-color-hover: $white; + +// We use these to control the timer styles +// $orbit-timer-bg: rgba(255,255,255,0.3); +// $orbit-timer-show-progress-bar: true; + +// We use these to control the bullet nav styles +// $orbit-bullet-nav-color: $iron; +// $orbit-bullet-nav-color-active: $aluminum; +// $orbit-bullet-radius: rem-calc(9); + +// We use these to controls the style of slide numbers +// $orbit-slide-number-bg: rgba(0,0,0,0); +// $orbit-slide-number-font-color: $white; +// $orbit-slide-number-padding: rem-calc(5); + +// Graceful Loading Wrapper and preloader +// $wrapper-class: "slideshow-wrapper"; +// $preloader-class: "preloader"; + +// Hide controls on small +// $orbit-nav-hide-for-small: true; +// $orbit-bullet-hide-for-small: true; +// $orbit-timer-hide-for-small: true; + +// 20. Pagination +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-pagination-classes: $include-html-classes; + +// We use these to control the pagination container +// $pagination-height: rem-calc(24); +// $pagination-margin: rem-calc(-5); + +// We use these to set the list-item properties +// $pagination-li-float: $default-float; +// $pagination-li-height: rem-calc(24); +// $pagination-li-font-color: $jet; +// $pagination-li-font-size: rem-calc(14); +// $pagination-li-margin: rem-calc(5); + +// We use these for the pagination anchor links +// $pagination-link-pad: rem-calc(1 10 1); +// $pagination-link-font-color: $aluminum; +// $pagination-link-active-bg: scale-color($white, $lightness: -10%); + +// We use these for disabled anchor links +// $pagination-link-unavailable-cursor: default; +// $pagination-link-unavailable-font-color: $aluminum; +// $pagination-link-unavailable-bg-active: transparent; + +// We use these for currently selected anchor links +// $pagination-link-current-background: $primary-color; +// $pagination-link-current-font-color: $white; +// $pagination-link-current-font-weight: $font-weight-bold; +// $pagination-link-current-cursor: default; +// $pagination-link-current-active-bg: $primary-color; + +// 21. Panels +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-panel-classes: $include-html-classes; + +// We use these to control the background and border styles +// $panel-bg: scale-color($white, $lightness: -5%); +// $panel-border-style: solid; +// $panel-border-size: 1px; +// $callout-panel-bg: scale-color($primary-color, $lightness: 94%); + +// We use this % to control how much we darken things on hover +// $panel-border-color: scale-color($panel-bg, $lightness: -11%); + +// We use these to set default inner padding and bottom margin +// $panel-margin-bottom: rem-calc(20); +// $panel-padding: rem-calc(20); + +// We use these to set default font colors +// $panel-font-color: $oil; +// $panel-font-color-alt: $white; + +// $panel-header-adjust: true; +// $callout-panel-link-color: $primary-color; +// $callout-panel-link-color-hover: scale-color($callout-panel-link-color, $lightness: -14%); + +// 22. Pricing Tables +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-pricing-classes: $include-html-classes; + +// We use this to control the border color +// $price-table-border: solid 1px $gainsboro; + +// We use this to control the bottom margin of the pricing table +// $price-table-margin-bottom: rem-calc(20); + +// We use these to control the title styles +// $price-title-bg: $oil; +// $price-title-padding: rem-calc(15 20); +// $price-title-align: center; +// $price-title-color: $smoke; +// $price-title-weight: $font-weight-normal; +// $price-title-size: rem-calc(16); +// $price-title-font-family: $body-font-family; + +// We use these to control the price styles +// $price-money-bg: $vapor; +// $price-money-padding: rem-calc(15 20); +// $price-money-align: center; +// $price-money-color: $oil; +// $price-money-weight: $font-weight-normal; +// $price-money-size: rem-calc(32); +// $price-money-font-family: $body-font-family; + + +// We use these to control the description styles +// $price-bg: $white; +// $price-desc-color: $monsoon; +// $price-desc-padding: rem-calc(15); +// $price-desc-align: center; +// $price-desc-font-size: rem-calc(12); +// $price-desc-weight: $font-weight-normal; +// $price-desc-line-height: 1.4; +// $price-desc-bottom-border: dotted 1px $gainsboro; + +// We use these to control the list item styles +// $price-item-color: $oil; +// $price-item-padding: rem-calc(15); +// $price-item-align: center; +// $price-item-font-size: rem-calc(14); +// $price-item-weight: $font-weight-normal; +// $price-item-bottom-border: dotted 1px $gainsboro; + +// We use these to control the CTA area styles +// $price-cta-bg: $white; +// $price-cta-align: center; +// $price-cta-padding: rem-calc(20 20 0); + +// 23. Progress Bar +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-media-classes: $include-html-classes; + +// We use this to set the progress bar height +// $progress-bar-height: rem-calc(25); +// $progress-bar-color: $vapor; + +// We use these to control the border styles +// $progress-bar-border-color: scale-color($white, $lightness: 20%); +// $progress-bar-border-size: 1px; +// $progress-bar-border-style: solid; +// $progress-bar-border-radius: $global-radius; + +// We use these to control the margin & padding +// $progress-bar-margin-bottom: rem-calc(10); + +// We use these to set the meter colors +// $progress-meter-color: $primary-color; +// $progress-meter-secondary-color: $secondary-color; +// $progress-meter-success-color: $success-color; +// $progress-meter-alert-color: $alert-color; + +// 24. Range Slider +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-range-slider-classes: $include-html-classes; + +// These variables define the slider bar styles +// $range-slider-bar-width: 100%; +// $range-slider-bar-height: rem-calc(16); + +// $range-slider-bar-border-width: 1px; +// $range-slider-bar-border-style: solid; +// $range-slider-bar-border-color: $gainsboro; +// $range-slider-radius: $global-radius; +// $range-slider-round: $global-rounded; +// $range-slider-bar-bg-color: $ghost; +// $range-slider-active-segment-bg-color: scale-color($secondary-color, $lightness: -1%); + +// Vertical bar styles +// $range-slider-vertical-bar-width: rem-calc(16); +// $range-slider-vertical-bar-height: rem-calc(200); + +// These variables define the slider handle styles +// $range-slider-handle-width: rem-calc(32); +// $range-slider-handle-height: rem-calc(22); +// $range-slider-handle-position-top: rem-calc(-5); +// $range-slider-handle-bg-color: $primary-color; +// $range-slider-handle-border-width: 1px; +// $range-slider-handle-border-style: solid; +// $range-slider-handle-border-color: none; +// $range-slider-handle-radius: $global-radius; +// $range-slider-handle-round: $global-rounded; +// $range-slider-handle-bg-hover-color: scale-color($primary-color, $lightness: -12%); +// $range-slider-handle-cursor: pointer; + +// $range-slider-disabled-opacity: .7; +// $range-slider-disabled-cursor: $cursor-disabled-value; + +// 25. Reveal +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-reveal-classes: $include-html-classes; + +// We use these to control the style of the reveal overlay. +// $reveal-overlay-bg: rgba($black, .45); +// $reveal-overlay-bg-old: $black; + +// We use these to control the style of the modal itself. +// $reveal-modal-bg: $white; +// $reveal-position-top: rem-calc(100); +// $reveal-default-width: 80%; +// $reveal-max-width: $row-width; +// $reveal-modal-padding: rem-calc(20); +// $reveal-box-shadow: 0 0 10px rgba($black,.4); + +// We use these to style the reveal close button +// $reveal-close-font-size: rem-calc(40); +// $reveal-close-top: rem-calc(10); +// $reveal-close-side: rem-calc(22); +// $reveal-close-color: $base; +// $reveal-close-weight: $font-weight-bold; + +// We use this to set the default radius used throughout the core. +// $reveal-radius: $global-radius; +// $reveal-round: $global-rounded; + +// We use these to control the modal border +// $reveal-border-style: solid; +// $reveal-border-width: 1px; +// $reveal-border-color: $steel; + +// $reveal-modal-class: "reveal-modal"; +// $close-reveal-modal-class: "close-reveal-modal"; + +// 26. Side Nav +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-nav-classes: $include-html-classes; + +// We use this to control padding. +// $side-nav-padding: rem-calc(14 0); + +// We use these to control list styles. +// $side-nav-list-type: none; +// $side-nav-list-position: outside; +// $side-nav-list-margin: rem-calc(0 0 7 0); + +// We use these to control link styles. +// $side-nav-link-color: $primary-color; +// $side-nav-link-color-active: scale-color($side-nav-link-color, $lightness: 30%); +// $side-nav-link-color-hover: scale-color($side-nav-link-color, $lightness: 30%); +// $side-nav-link-bg-hover: hsla(0, 0, 0, .025); +// $side-nav-link-margin: 0; +// $side-nav-link-padding: rem-calc(7 14); +// $side-nav-font-size: rem-calc(14); +// $side-nav-font-weight: $font-weight-normal; +// $side-nav-font-weight-active: $side-nav-font-weight; +// $side-nav-font-family: $body-font-family; +// $side-nav-font-family-active: $side-nav-font-family; + +// We use these to control heading styles. +// $side-nav-heading-color: $side-nav-link-color; +// $side-nav-heading-font-size: $side-nav-font-size; +// $side-nav-heading-font-weight: bold; +// $side-nav-heading-text-transform: uppercase; + +// We use these to control border styles +// $side-nav-divider-size: 1px; +// $side-nav-divider-style: solid; +// $side-nav-divider-color: scale-color($white, $lightness: 10%); + +// 27. Split Buttons +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-button-classes: $include-html-classes; + +// We use these to control different shared styles for Split Buttons +// $split-button-function-factor: 10%; +// $split-button-pip-color: $white; +// $split-button-span-border-color: rgba(255,255,255,0.5); +// $split-button-pip-color-alt: $oil; +// $split-button-active-bg-tint: rgba(0,0,0,0.1); + +// We use these to control tiny split buttons +// $split-button-padding-tny: $button-pip-tny * 10; +// $split-button-span-width-tny: $button-pip-tny * 6; +// $split-button-pip-size-tny: $button-pip-tny; +// $split-button-pip-top-tny: $button-pip-tny * 2; +// $split-button-pip-default-float-tny: rem-calc(-6); + +// We use these to control small split buttons +// $split-button-padding-sml: $button-pip-sml * 10; +// $split-button-span-width-sml: $button-pip-sml * 6; +// $split-button-pip-size-sml: $button-pip-sml; +// $split-button-pip-top-sml: $button-pip-sml * 1.5; +// $split-button-pip-default-float-sml: rem-calc(-6); + +// We use these to control medium split buttons +// $split-button-padding-med: $button-pip-med * 9; +// $split-button-span-width-med: $button-pip-med * 5.5; +// $split-button-pip-size-med: $button-pip-med - rem-calc(3); +// $split-button-pip-top-med: $button-pip-med * 1.5; +// $split-button-pip-default-float-med: rem-calc(-6); + +// We use these to control large split buttons +// $split-button-padding-lrg: $button-pip-lrg * 8; +// $split-button-span-width-lrg: $button-pip-lrg * 5; +// $split-button-pip-size-lrg: $button-pip-lrg - rem-calc(6); +// $split-button-pip-top-lrg: $button-pip-lrg + rem-calc(5); +// $split-button-pip-default-float-lrg: rem-calc(-6); + +// 28. Sub Nav +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-nav-classes: $include-html-classes; + +// We use these to control margin and padding +// $sub-nav-list-margin: rem-calc(-4 0 18); +// $sub-nav-list-padding-top: rem-calc(4); + +// We use this to control the definition +// $sub-nav-font-family: $body-font-family; +// $sub-nav-font-size: rem-calc(14); +// $sub-nav-font-color: $aluminum; +// $sub-nav-font-weight: $font-weight-normal; +// $sub-nav-text-decoration: none; +// $sub-nav-padding: rem-calc(3 16); +// $sub-nav-border-radius: 3px; +// $sub-nav-font-color-hover: scale-color($sub-nav-font-color, $lightness: -25%); + + +// We use these to control the active item styles + +// $sub-nav-active-font-weight: $font-weight-normal; +// $sub-nav-active-bg: $primary-color; +// $sub-nav-active-bg-hover: scale-color($sub-nav-active-bg, $lightness: -14%); +// $sub-nav-active-color: $white; +// $sub-nav-active-padding: $sub-nav-padding; +// $sub-nav-active-cursor: default; + +// $sub-nav-item-divider: ""; +// $sub-nav-item-divider-margin: rem-calc(12); + +// 29. Switch +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-form-classes: $include-html-classes; + +// Controlling background color for the switch container +// $switch-bg: $gainsboro; + +// We use these to control the switch heights for our default classes +// $switch-height-tny: 1.5rem; +// $switch-height-sml: 1.75rem; +// $switch-height-med: 2rem; +// $switch-height-lrg: 2.5rem; +// $switch-bottom-margin: 1.5rem; + +// We use these to style the switch-paddle +// $switch-paddle-bg: $white; +// $switch-paddle-transition-speed: .15s; +// $switch-paddle-transition-ease: ease-out; +// $switch-active-color: $primary-color; + +// 30. Tables +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-table-classes: $include-html-classes; + +// These control the background color for the table and even rows +// $table-bg: $white; +// $table-even-row-bg: $snow; + +// These control the table cell border style +// $table-border-style: solid; +// $table-border-size: 1px; +// $table-border-color: $gainsboro; + +// These control the table head styles +// $table-head-bg: $white-smoke; +// $table-head-font-size: rem-calc(14); +// $table-head-font-color: $jet; +// $table-head-font-weight: $font-weight-bold; +// $table-head-padding: rem-calc(8 10 10); + +// These control the table foot styles +// $table-foot-bg: $table-head-bg; +// $table-foot-font-size: $table-head-font-size; +// $table-foot-font-color: $table-head-font-color; +// $table-foot-font-weight: $table-head-font-weight; +// $table-foot-padding: $table-head-padding; + +// These control the caption +// $table-caption-bg: transparent; +// $table-caption-font-color: $table-head-font-color; +// $table-caption-font-size: rem-calc(16); +// $table-caption-font-weight: bold; + +// These control the row padding and font styles +// $table-row-padding: rem-calc(9 10); +// $table-row-font-size: rem-calc(14); +// $table-row-font-color: $jet; +// $table-line-height: rem-calc(18); + +// These are for controlling the layout, display and margin of tables +// $table-layout: auto; +// $table-display: table-cell; +// $table-margin-bottom: rem-calc(20); + + +// 31. Tabs +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-tabs-classes: $include-html-classes; + +// $tabs-navigation-padding: rem-calc(16); +// $tabs-navigation-bg-color: $silver; +// $tabs-navigation-active-bg-color: $white; +// $tabs-navigation-hover-bg-color: scale-color($tabs-navigation-bg-color, $lightness: -6%); +// $tabs-navigation-font-color: $jet; +// $tabs-navigation-active-font-color: $tabs-navigation-font-color; +// $tabs-navigation-font-size: rem-calc(16); +// $tabs-navigation-font-family: $body-font-family; + +// $tabs-content-margin-bottom: rem-calc(24); +// $tabs-content-padding: ($column-gutter/2); + +// $tabs-vertical-navigation-margin-bottom: 1.25rem; + +// 32. Thumbnails +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-media-classes: $include-html-classes; + +// We use these to control border styles +// $thumb-border-style: solid; +// $thumb-border-width: 4px; +// $thumb-border-color: $white; +// $thumb-box-shadow: 0 0 0 1px rgba($black,.2); +// $thumb-box-shadow-hover: 0 0 6px 1px rgba($primary-color,0.5); + +// Radius and transition speed for thumbs +// $thumb-radius: $global-radius; +// $thumb-transition-speed: 200ms; + +// 33. Tooltips +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-tooltip-classes: $include-html-classes; + +// $has-tip-border-bottom: dotted 1px $iron; +// $has-tip-font-weight: $font-weight-bold; +// $has-tip-font-color: $oil; +// $has-tip-border-bottom-hover: dotted 1px scale-color($primary-color, $lightness: -55%); +// $has-tip-font-color-hover: $primary-color; +// $has-tip-cursor-type: help; + +// $tooltip-padding: rem-calc(12); +// $tooltip-bg: $oil; +// $tooltip-font-size: rem-calc(14); +// $tooltip-font-weight: $font-weight-normal; +// $tooltip-font-color: $white; +// $tooltip-line-height: 1.3; +// $tooltip-close-font-size: rem-calc(10); +// $tooltip-close-font-weight: $font-weight-normal; +// $tooltip-close-font-color: $monsoon; +// $tooltip-font-size-sml: rem-calc(14); +// $tooltip-radius: $global-radius; +// $tooltip-rounded: $global-rounded; +// $tooltip-pip-size: 5px; +// $tooltip-max-width: 300px; + +// 34. Top Bar +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-top-bar-classes: $include-html-classes; + +// Background color for the top bar +// $topbar-bg-color: $oil; +// $topbar-bg: $topbar-bg-color; + +// Height and margin +// $topbar-height: rem-calc(45); +// $topbar-margin-bottom: 0; + +// Controlling the styles for the title in the top bar +// $topbar-title-weight: $font-weight-normal; +// $topbar-title-font-size: rem-calc(17); + +// Set the link colors and styles for top-level nav +// $topbar-link-color: $white; +// $topbar-link-color-hover: $white; +// $topbar-link-color-active: $white; +// $topbar-link-color-active-hover: $white; +// $topbar-link-weight: $font-weight-normal; +// $topbar-link-font-size: rem-calc(13); +// $topbar-link-hover-lightness: -10%; // Darken by 10% +// $topbar-link-bg: $topbar-bg; +// $topbar-link-bg-hover: $jet; +// $topbar-link-bg-color-hover: $charcoal; +// $topbar-link-bg-active: $primary-color; +// $topbar-link-bg-active-hover: scale-color($primary-color, $lightness: -14%); +// $topbar-link-font-family: $body-font-family; +// $topbar-link-text-transform: none; +// $topbar-link-padding: ($topbar-height / 3); +// $topbar-back-link-size: rem-calc(18); +// $topbar-link-dropdown-padding: rem-calc(20); +// $topbar-button-font-size: .75rem; +// $topbar-button-top: 7px; + +// Style the top bar dropdown elements +// $topbar-dropdown-bg: $oil; +// $topbar-dropdown-link-color: $white; +// $topbar-dropdown-link-color-hover: $topbar-link-color-hover; +// $topbar-dropdown-link-bg: $oil; +// $topbar-dropdown-link-bg-hover: $jet; +// $topbar-dropdown-link-weight: $font-weight-normal; +// $topbar-dropdown-toggle-size: 5px; +// $topbar-dropdown-toggle-color: $white; +// $topbar-dropdown-toggle-alpha: .4; + +// $topbar-dropdown-label-color: $monsoon; +// $topbar-dropdown-label-text-transform: uppercase; +// $topbar-dropdown-label-font-weight: $font-weight-bold; +// $topbar-dropdown-label-font-size: rem-calc(10); +// $topbar-dropdown-label-bg: $oil; + +// Top menu icon styles +// $topbar-menu-link-transform: uppercase; +// $topbar-menu-link-font-size: rem-calc(13); +// $topbar-menu-link-weight: $font-weight-bold; +// $topbar-menu-link-color: $white; +// $topbar-menu-icon-color: $white; +// $topbar-menu-link-color-toggled: $jumbo; +// $topbar-menu-icon-color-toggled: $jumbo; +// $topbar-menu-icon-position: $opposite-direction; // Change to $default-float for a left menu icon + +// Transitions and breakpoint styles +// $topbar-transition-speed: 300ms; +// Using rem-calc for the below breakpoint causes issues with top bar +// $topbar-breakpoint: #{lower-bound($medium-range)}; // Change to 9999px for always mobile layout +// $topbar-media-query: "#{$screen} and (min-width:#{lower-bound($topbar-breakpoint)})"; + +// Top-bar input styles +// $topbar-input-height: rem-calc(28); + +// Divider Styles +// $topbar-divider-border-bottom: solid 1px scale-color($topbar-bg-color, $lightness: 13%); +// $topbar-divider-border-top: solid 1px scale-color($topbar-bg-color, $lightness: -50%); + +// Sticky Class +// $topbar-sticky-class: ".sticky"; +// $topbar-arrows: true; //Set false to remove the triangle icon from the menu item +// $topbar-dropdown-arrows: true; //Set false to remove the \00bb >> text from dropdown subnavigation li// + +// 36. Visibility Classes +// - - - - - - - - - - - - - - - - - - - - - - - - - + +// $include-html-visibility-classes: $include-html-classes; +// $include-accessibility-classes: true; +// $include-table-visibility-classes: true; +// $include-legacy-visibility-classes: true; diff --git a/themes/foundation5/scss/foundation/components/_accordion.scss b/themes/foundation5/scss/foundation/components/_accordion.scss new file mode 100644 index 0000000000000000000000000000000000000000..de4a5ea518a3816f1f716e3fc0f0f27e53face5b --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_accordion.scss @@ -0,0 +1,157 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// @variables +// + +$include-html-accordion-classes: $include-html-classes !default; + +$accordion-navigation-padding: rem-calc(16) !default; +$accordion-navigation-bg-color: $silver !default; +$accordion-navigation-hover-bg-color: scale-color($accordion-navigation-bg-color, $lightness: -5%) !default; +$accordion-navigation-active-bg-color: scale-color($accordion-navigation-bg-color, $lightness: -3%) !default; +$accordion-navigation-font-color: $jet !default; +$accordion-navigation-font-size: rem-calc(16) !default; +$accordion-navigation-font-family: $body-font-family !default; + +$accordion-content-padding: ($column-gutter/2) !default; +$accordion-content-active-bg-color: $white !default; + + +// Mixin: accordion-container() +// Decription: Responsible for the container component of accordions, generating styles relating to a margin of zero and a clearfix +// Explicit Dependencies: a clearfix mixin *is* defined. +// Implicit Dependencies: None + +@mixin accordion-container() { + @include clearfix; + margin-bottom: 0; +} + +// Mixin: accordion-navigation( $bg, $hover-bg, $active-bg, $padding, $active_class, $font-color, $font-size, $font-family) { +// @params $bg-color: [ color or string ]: Specify the background color for the navigation element +// @params $hover-bg-color [ color or string ]: Specify the background color for the navigation element when hovered +// @params $active-bg [ color or string ]: Specify the background color for the navigation element when clicked and not released. +// @params $active_class [ string ]: Specify the class name used to keep track of which accordion tab should be visible +// @params $font-color [ color or string ]: Color of the font for accordion +// @params $font-size [ number ]: Specifiy the font-size of the text inside the navigation element +// @params $font-family [ string ]: Specify the font family for the text of the navigation of the accorion + +@mixin accordion-navigation( $bg: $accordion-navigation-bg-color, $hover-bg: $accordion-navigation-hover-bg-color, $active-bg: $accordion-navigation-active-bg-color, $padding: $accordion-navigation-padding, $active_class: 'active', $font-color: $accordion-navigation-font-color, $font-size: $accordion-navigation-font-size, $font-family: $accordion-navigation-font-family ) { + display: block; + margin-bottom: 0 !important; + @if type-of($active_class) != "string" { + @warn "`#{$active_class}` isn't a valid string. A valid string is needed to correctly be interpolated as a CSS class. CSS classes cannot start with a number or consist of only numbers. CSS will not be generated for the active state of this navigation component." + } + @else { + &.#{ $active_class } > a { + background: $active-bg; + } + } + > a { + background: $bg; + color: $font-color; + @if type-of($padding) != number { + @warn "`#{$padding}` was read as #{type-of($padding)}"; + @if $accordion-navigation-padding != null { + @warn "#{$padding} was read as a #{type-of($padding)}"; + @warn "`#{$padding}` isn't a valid number. $accordion-navigation-padding (#{$accordion-navigation-padding}) will be used instead.)"; + padding: $accordion-navigation-padding; + } + @else { + @warn "`#{$padding}` isn't a valid number and $accordion-navigation-padding is missing. A value of `null` is returned to not output an invalid value for padding"; + padding: null; + } + } + @else { + padding: $padding; + } + display: block; + font-family: $font-family; + @if type-of($font-size) != number { + @warn "`#{$font-size}` was read as a #{type-of($font-size)}"; + @if $accordion-navigation-font-size != null { + @warn "`#{$font-size}` is not a valid number. The value of $accordion-navigation-font-size will be used instead (#{$accordion-navigation-font-size})."; + font-size: $accordion-navigation-font-size; + } + @else{ + @warn "`#{$font-size}` is not a valid number and the default value of $accordion-navigation-font-size is not defined. A value of `null` will be returned to not generate an invalid value for font-size."; + font-size: null; + + } + } + @else { + font-size: $font-size; + } + &:hover { + background: $hover-bg; + } + } +} + +// Mixin: accordion-content($bg, $padding, $active-class) +// @params $padding [ number ]: Padding for the content of the container +// @params $bg [ color ]: Background color for the content when it's visible +// @params $active_class [ string ]: Class name used to keep track of which accordion tab should be visible. + +@mixin accordion-content($bg: $accordion-content-active-bg-color, $padding: $accordion-content-padding, $active_class: 'active') { + display: none; + @if type-of($padding) != "number" { + @warn "#{$padding} was read as a #{type-of($padding)}"; + @if $accordion-content-padding != null { + @warn "`#{$padding}` isn't a valid number. $accordion-content-padding used instead"; + padding: $accordion-content-padding; + } @else { + @warn "`#{$padding}` isn't a valid number and the default value of $accordion-content-padding is not defined. A value of `null` is returned to not output an invalid value for padding."; + padding: null; + } + } @else { + padding: $padding; + } + + @if type-of($active_class) != "string" { + @warn "`#{$active_class}` isn't a valid string. A valid string is needed to correctly be interpolated as a CSS class. CSS classes cannot start with a number or consist of only numbers. CSS will not be generated for the active state of the content. " + } + @else { + &.#{$active_class} { + background: $bg; + display: block; + } + } +} + +@include exports("accordion") { + @if $include-html-accordion-classes { + .accordion { + @include clearfix; + margin-bottom: 0; + .accordion-navigation, dd { + display: block; + margin-bottom: 0 !important; + &.active > a { background: $accordion-navigation-active-bg-color; } + > a { + background: $accordion-navigation-bg-color; + color: $accordion-navigation-font-color; + display: block; + font-family: $accordion-navigation-font-family; + font-size: $accordion-navigation-font-size; + padding: $accordion-navigation-padding; + &:hover { background: $accordion-navigation-hover-bg-color; } + } + + > .content { + display: none; + padding: $accordion-content-padding; + &.active { + background: $accordion-content-active-bg-color; + display: block; + } + } + } + } + } +} diff --git a/themes/foundation5/scss/foundation/components/_alert-boxes.scss b/themes/foundation5/scss/foundation/components/_alert-boxes.scss new file mode 100644 index 0000000000000000000000000000000000000000..c1d56d80293b98be8374a5fe80dab35e1afeba50 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_alert-boxes.scss @@ -0,0 +1,128 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// Alert Box Variables +// +$include-html-alert-classes: $include-html-classes !default; + +// We use this to control alert padding. +$alert-padding-top: rem-calc(14) !default; +$alert-padding-default-float: $alert-padding-top !default; +$alert-padding-opposite-direction: $alert-padding-top + rem-calc(10) !default; +$alert-padding-bottom: $alert-padding-top !default; + +// We use these to control text style. +$alert-font-weight: $font-weight-normal !default; +$alert-font-size: rem-calc(13) !default; +$alert-font-color: $white !default; +$alert-font-color-alt: scale-color($secondary-color, $lightness: -66%) !default; + +// We use this for close hover effect. +$alert-function-factor: -14% !default; + +// We use these to control border styles. +$alert-border-style: solid !default; +$alert-border-width: 1px !default; +$alert-border-color: scale-color($primary-color, $lightness: $alert-function-factor) !default; +$alert-bottom-margin: rem-calc(20) !default; + +// We use these to style the close buttons +$alert-close-color: $oil !default; +$alert-close-top: 50% !default; +$alert-close-position: rem-calc(4) !default; +$alert-close-font-size: rem-calc(22) !default; +$alert-close-opacity: .3 !default; +$alert-close-opacity-hover: .5 !default; +$alert-close-padding: 0 6px 4px !default; +$alert-close-background: inherit !default; + +// We use this to control border radius +$alert-radius: $global-radius !default; + +$alert-transition-speed: 300ms !default; +$alert-transition-ease: ease-out !default; + +// +// Alert Mixins +// + +// We use this mixin to create a default alert base. +@mixin alert-base { + border-style: $alert-border-style; + border-width: $alert-border-width; + display: block; + font-size: $alert-font-size; + font-weight: $alert-font-weight; + margin-bottom: $alert-bottom-margin; + padding: $alert-padding-top $alert-padding-opposite-direction $alert-padding-bottom $alert-padding-default-float; + position: relative; + @include single-transition(opacity, $alert-transition-speed, $alert-transition-ease) +} + +// We use this mixin to add alert styles +// +// $bg - The background of the alert. Default: $primary-color. +@mixin alert-style($bg:$primary-color) { + + // This finds the lightness percentage of the background color. + $bg-lightness: lightness($bg); + + // We control which background color and border come through. + background-color: $bg; + border-color: scale-color($bg, $lightness: $alert-function-factor); + + // We control the text color for you based on the background color. + @if $bg-lightness > 70% { color: $alert-font-color-alt; } + @else { color: $alert-font-color; } + +} + +// We use this to create the close button. +@mixin alert-close { + #{$opposite-direction}: $alert-close-position; + background: $alert-close-background; + color: $alert-close-color; + font-size: $alert-close-font-size; + line-height: .9; + margin-top: -($alert-close-font-size / 2); + opacity: $alert-close-opacity; + padding: $alert-close-padding; + position: absolute; + top: $alert-close-top; + &:hover, + &:focus { opacity: $alert-close-opacity-hover; } +} + +// We use this to quickly create alerts with a single mixin. +// +// $bg - Background of alert. Default: $primary-color. +// $radius - Radius of alert box. Default: false. +@mixin alert($bg:$primary-color, $radius:false) { + @include alert-base; + @include alert-style($bg); + @include radius($radius); +} + +@include exports("alert-box") { + @if $include-html-alert-classes { + .alert-box { + @include alert; + + .close { @include alert-close; } + + &.radius { @include radius($alert-radius); } + &.round { @include radius($global-rounded); } + + &.success { @include alert-style($success-color); } + &.alert { @include alert-style($alert-color); } + &.secondary { @include alert-style($secondary-color); } + &.warning { @include alert-style($warning-color); } + &.info { @include alert-style($info-color); } + &.alert-close { opacity: 0} + } + } +} diff --git a/themes/foundation5/scss/foundation/components/_block-grid.scss b/themes/foundation5/scss/foundation/components/_block-grid.scss new file mode 100644 index 0000000000000000000000000000000000000000..a923e764b70e275282bf498874d5dc806f36502e --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_block-grid.scss @@ -0,0 +1,133 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// Block Grid Variables +// +$include-html-block-grid-classes: $include-html-classes !default; +$include-xl-html-block-grid-classes: false !default; + +// We use this to control the maximum number of block grid elements per row +$block-grid-elements: 12 !default; +$block-grid-default-spacing: rem-calc(20) !default; + +$align-block-grid-to-grid: false !default; +@if $align-block-grid-to-grid { + $block-grid-default-spacing: $column-gutter; +} + +// Enables media queries for block-grid classes. Set to false if writing semantic HTML. +$block-grid-media-queries: true !default; + +// +// Block Grid Mixins +// + +// Create a custom block grid +// +// $per-row - # of items to display per row. Default: false. +// $spacing - # of ems to use as padding on each block item. Default: rem-calc(20). +// $include-spacing - Adds padding to our list item. Default: true. +// $base-style - Apply a base style to block grid. Default: true. +@mixin block-grid( + $per-row:false, + $spacing:$block-grid-default-spacing, + $include-spacing:true, + $base-style:true) { + + @if $base-style { + display: block; + padding: 0; + @if $align-block-grid-to-grid { + margin: 0; + } @else { + margin: 0 (-$spacing/2); + } + @include clearfix; + + > li { + display: block; + float: $default-float; + height: auto; + @if $include-spacing { + padding: 0 ($spacing/2) $spacing; + } + } + } + + @if $per-row { + > li { + list-style: none; + @if $include-spacing { + padding: 0 ($spacing/2) $spacing; + } + width: 100%/$per-row; + + &:nth-of-type(1n) { clear: none; } + &:nth-of-type(#{$per-row}n+1) { clear: both; } + @if $align-block-grid-to-grid { + @include block-grid-aligned($per-row, $spacing); + } + } + } +} + +@mixin block-grid-aligned($per-row, $spacing) { + @for $i from 1 through $block-grid-elements { + @if $per-row >= $i { + $grid-column: '+' + $i; + @if $per-row == $i { + $grid-column: ''; + } + &:nth-of-type(#{$per-row}n#{unquote($grid-column)}) { + padding-left: ($spacing - (($spacing / $per-row) * ($per-row - ($i - 1)))); + padding-right: ($spacing - (($spacing / $per-row) * $i)); + } + } + } +} + +// Generate presentational markup for block grid. +// +// $size - Name of class to use, i.e. "large" will generate .large-block-grid-1, .large-block-grid-2, etc. +@mixin block-grid-html-classes($size, $include-spacing) { + @for $i from 1 through $block-grid-elements { + .#{$size}-block-grid-#{($i)} { + @include block-grid($i, $block-grid-default-spacing, $include-spacing, false); + } + } +} + +@include exports("block-grid") { + @if $include-html-block-grid-classes { + + [class*="block-grid-"] { @include block-grid; } + + @if $block-grid-media-queries { + @media #{$small-up} { + @include block-grid-html-classes($size:small, $include-spacing:false); + } + + @media #{$medium-up} { + @include block-grid-html-classes($size:medium, $include-spacing:false); + } + + @media #{$large-up} { + @include block-grid-html-classes($size:large, $include-spacing:false); + } + + @if $include-xl-html-block-grid-classes { + @media #{$xlarge-up} { + @include block-grid-html-classes($size:xlarge, $include-spacing:false); + } + + @media #{$xxlarge-up} { + @include block-grid-html-classes($size:xxlarge, $include-spacing:false); + } + } + } + } +} diff --git a/themes/foundation5/scss/foundation/components/_breadcrumbs.scss b/themes/foundation5/scss/foundation/components/_breadcrumbs.scss new file mode 100644 index 0000000000000000000000000000000000000000..5f55a4eb8ec463d36f3952dd622e760f471c19d3 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_breadcrumbs.scss @@ -0,0 +1,131 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// Breadcrumb Variables +// +$include-html-nav-classes: $include-html-classes !default; + +// We use this to set the background color for the breadcrumb container. +$crumb-bg: scale-color($secondary-color, $lightness: 55%) !default; + +// We use these to set the padding around the breadcrumbs. +$crumb-padding: rem-calc(9 14 9) !default; +$crumb-side-padding: rem-calc(12) !default; + +// We use these to control border styles. +$crumb-function-factor: -10% !default; +$crumb-border-size: 1px !default; +$crumb-border-style: solid !default; +$crumb-border-color: scale-color($crumb-bg, $lightness: $crumb-function-factor) !default; +$crumb-radius: $global-radius !default; + +// We use these to set various text styles for breadcrumbs. +$crumb-font-size: rem-calc(11) !default; +$crumb-font-color: $primary-color !default; +$crumb-font-color-current: $oil !default; +$crumb-font-color-unavailable: $aluminum !default; +$crumb-font-transform: uppercase !default; +$crumb-link-decor: underline !default; + +// We use these to control the slash between breadcrumbs +$crumb-slash-color: $base !default; +$crumb-slash: "/" !default; + +// +// Breadcrumb Mixins +// + +// We use this mixin to create a container around our breadcrumbs +@mixin crumb-container { + border-style: $crumb-border-style; + border-width: $crumb-border-size; + display: block; + list-style: none; + margin-#{$default-float}: 0; + overflow: hidden; + padding: $crumb-padding; + + // We control which background color and border come through. + background-color: $crumb-bg; + border-color: $crumb-border-color; +} + +// We use this mixin to create breadcrumb styles from list items. +@mixin crumbs { + + // A normal state will make the links look and act like clickable breadcrumbs. + color: $crumb-font-color; + float: $default-float; + font-size: $crumb-font-size; + line-height: $crumb-font-size; + margin: 0; + text-transform: $crumb-font-transform; + + &:hover a, &:focus a { text-decoration: $crumb-link-decor; } + + a { + color: $crumb-font-color; + } + + // Current is for the link of the current page + &.current { + color: $crumb-font-color-current; + cursor: $cursor-default-value; + a { + color: $crumb-font-color-current; + cursor: $cursor-default-value; + } + + &:hover, &:hover a, + &:focus, &:focus a { text-decoration: none; } + } + + // Unavailable removed color and link styles so it looks inactive. + &.unavailable { + color: $crumb-font-color-unavailable; + a { color: $crumb-font-color-unavailable; } + + &:hover, + &:hover a, + &:focus, + a:focus { + color: $crumb-font-color-unavailable; + cursor: $cursor-disabled-value; + text-decoration: none; + } + } + + &:before { + color: $crumb-slash-color; + content: "#{$crumb-slash}"; + margin: 0 $crumb-side-padding; + position: relative; + top: 1px; + } + + &:first-child:before { + content: " "; + margin: 0; + } +} + +@include exports("breadcrumbs") { + @if $include-html-nav-classes { + .breadcrumbs { + @include crumb-container; + @include radius($crumb-radius); + + > * { + @include crumbs; + } + } + /* Accessibility - hides the forward slash */ + [aria-label="breadcrumbs"] [aria-hidden="true"]:after { + content: "/"; + } + } +} diff --git a/themes/foundation5/scss/foundation/components/_button-groups.scss b/themes/foundation5/scss/foundation/components/_button-groups.scss new file mode 100644 index 0000000000000000000000000000000000000000..fd39fdaec1e05a4e3d8a4edc52fa8d75a65e3a37 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_button-groups.scss @@ -0,0 +1,207 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; +@import 'buttons'; + +// +// Button Group Variables +// +$include-html-button-classes: $include-html-classes !default; + +// Sets the margin for the right side by default, and the left margin if right-to-left direction is used +$button-bar-margin-opposite: rem-calc(10) !default; +$button-group-border-width: 1px !default; + +// +// Button Group Mixins +// + +// We use this to add styles for a button group container +@mixin button-group-container($styles:true, $float:false) { + @if $styles { + list-style: none; + margin: 0; + #{$default-float}: 0; + @include clearfix(); + } + @if $float { + float: #{$default-float}; + margin-#{$opposite-direction}: $button-bar-margin-opposite; + & div { overflow: hidden; } + } +} + +// We use this to control styles for button groups +@mixin button-group-style($radius:false, $even:false, $float:false, $orientation:horizontal) { + + > button, .button { + border-#{$default-float}: $button-group-border-width solid; + border-color: rgba(255, 255, 255, .5); + } + + &:first-child { + button, .button { + border-#{$default-float}: 0; + } + } + + $button-group-display: list-item; + $button-group-margin: 0; + + // We use this to control the flow, or remove those styles completely. + @if $float { + $button-group-display: list-item; + $button-group-margin: 0; + float: $float; + // Make sure the first child doesn't get the negative margin. + &:first-child { margin-#{$default-float}: 0; } + } + @else { + $button-group-display: inline-block; + $button-group-margin: 0 -2px; + } + + @if $orientation == vertical { + $button-group-display: block; + $button-group-margin: 0; + > button, .button { + border-color: rgba(255, 255, 255, .5); + border-left-width: 0; + border-top: $button-group-border-width solid; + display: block; + margin:0; + } + > button { + width: 100%; + } + + &:first-child { + button, .button { + border-top: 0; + } + } + } + + display: $button-group-display; + margin: $button-group-margin; + + + // We use these to control left and right radius on first/last buttons in the group. + @if $radius == true { + &, + > a, + > button, + > .button { @include radius(0); } + &:first-child, + &:first-child > a, + &:first-child > button, + &:first-child > .button { + @if $orientation == vertical { + @include side-radius(top, $button-radius); + } + @else { + @include side-radius($default-float, $button-radius); + } + } + &:last-child, + &:last-child > a, + &:last-child > button, + &:last-child > .button { + @if $orientation == vertical { + @include side-radius(bottom, $button-radius); + } + @else { + @include side-radius($opposite-direction, $button-radius); + } + } + } + @else if $radius { + &, + > a, + > button, + > .button { @include radius(0); } + &:first-child, + &:first-child > a, + &:first-child > button, + &:first-child > .button { + @if $orientation == vertical { + @include side-radius(top, $radius); + } + @else { + @include side-radius($default-float, $radius); + } + } + &:last-child, + &:last-child > a, + &:last-child > button, + &:last-child > .button { + @if $orientation == vertical { + @include side-radius(bottom, $radius); + } + @else { + @include side-radius($opposite-direction, $radius); + } + } + } + + // We use this to make the buttons even width across their container + @if $even { + width: percentage((100/$even) / 100); + button, .button { width: 100%; } + } +} + +@include exports("button-group") { + @if $include-html-button-classes { + .button-group { @include button-group-container; + + @for $i from 2 through 8 { + &.even-#{$i} li { @include button-group-style($even:$i, $float:null); } + } + + > li { @include button-group-style(); } + + &.stack { + > li { @include button-group-style($orientation:vertical); float: none; } + } + + &.stack-for-small { + > li { + @include button-group-style($orientation:horizontal); + @media #{$small-only} { + @include button-group-style($orientation:vertical); + } + } + } + + &.radius > * { @include button-group-style($radius:$button-radius, $float:null); } + &.radius.stack > * { @include button-group-style($radius:$button-radius, $float:null, $orientation:vertical); } + &.radius.stack-for-small > * { + @media #{$medium-up} { + @include button-group-style($radius:$button-radius, $orientation:horizontal); + } + @media #{$small-only} { + @include button-group-style($radius:$button-radius, $orientation:vertical); + } + } + + &.round > * { @include button-group-style($radius:$button-round, $float:null); } + &.round.stack > * { @include button-group-style($radius:$button-med, $float:null, $orientation:vertical); } + &.round.stack-for-small > * { + @media #{$medium-up} { + @include button-group-style($radius:$button-round, $orientation:horizontal); + } + @media #{$small-only} { + @include button-group-style($radius:$button-med, $orientation:vertical); + } + } + } + + .button-bar { + @include clearfix; + .button-group { @include button-group-container($styles:false, $float:true); } + } + } +} diff --git a/themes/foundation5/scss/foundation/components/_buttons.scss b/themes/foundation5/scss/foundation/components/_buttons.scss new file mode 100644 index 0000000000000000000000000000000000000000..4069b2397f81e864879d169ad9001c52b6cd65ea --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_buttons.scss @@ -0,0 +1,256 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// @variables +// +$include-html-button-classes: $include-html-classes !default; + +// We use these to build padding for buttons. +$button-tny: rem-calc(10) !default; +$button-sml: rem-calc(14) !default; +$button-med: rem-calc(16) !default; +$button-lrg: rem-calc(18) !default; + +// We use this to control the display property. +$button-display: inline-block !default; +$button-margin-bottom: rem-calc(20) !default; + +// We use these to control button text styles. +$button-font-family: $body-font-family !default; +$button-font-color: $white !default; +$button-font-color-alt: $oil !default; +$button-font-tny: rem-calc(11) !default; +$button-font-sml: rem-calc(13) !default; +$button-font-med: rem-calc(16) !default; +$button-font-lrg: rem-calc(20) !default; +$button-font-weight: $font-weight-normal !default; +$button-font-align: center !default; + +// We use these to control various hover effects. +$button-function-factor: -20% !default; + +// We use these to control button border styles. +$button-border-width: 0 !default; +$button-border-style: solid !default; +$button-bg-color: $primary-color !default; +$button-bg-hover: scale-color($button-bg-color, $lightness: $button-function-factor) !default; +$button-border-color: $button-bg-hover !default; +$secondary-button-bg-hover: scale-color($secondary-color, $lightness: $button-function-factor) !default; +$secondary-button-border-color: $secondary-button-bg-hover !default; +$success-button-bg-hover: scale-color($success-color, $lightness: $button-function-factor) !default; +$success-button-border-color: $success-button-bg-hover !default; +$alert-button-bg-hover: scale-color($alert-color, $lightness: $button-function-factor) !default; +$alert-button-border-color: $alert-button-bg-hover !default; +$warning-button-bg-hover: scale-color($warning-color, $lightness: $button-function-factor) !default; +$warning-button-border-color: $warning-button-bg-hover !default; +$info-button-bg-hover: scale-color($info-color, $lightness: $button-function-factor) !default; +$info-button-border-color: $info-button-bg-hover !default; + +// We use this to set the default radius used throughout the core. +$button-radius: $global-radius !default; +$button-round: $global-rounded !default; + +// We use this to set default opacity and cursor for disabled buttons. +$button-disabled-opacity: .7 !default; +$button-disabled-cursor: $cursor-default-value !default; + + +// +// @MIXIN +// +// We use this mixin to create a default button base. +// +// $style - Sets base styles. Can be set to false. Default: true. +// $display - Used to control display property. Default: $button-display || inline-block + +@mixin button-base($style:true, $display:$button-display) { + @if $style { + -webkit-appearance: none; + -moz-appearance: none; + border-radius:0; + border-style: $button-border-style; + border-width: $button-border-width; + cursor: $cursor-pointer-value; + font-family: $button-font-family; + font-weight: $button-font-weight; + line-height: normal; + margin: 0 0 $button-margin-bottom; + position: relative; + text-align: $button-font-align; + text-decoration: none; + } + @if $display { display: $display; } +} + +// @MIXIN +// +// We use this mixin to add button size styles +// +// $padding - Used to build padding for buttons Default: $button-med ||= rem-calc(12) +// $full-width - We can set $full-width:true to remove side padding extend width - Default: false + +@mixin button-size($padding:$button-med, $full-width:false) { + + // We control which padding styles come through, + // these can be turned off by setting $padding:false + @if $padding { + padding: $padding ($padding * 2) ($padding + rem-calc(1)) ($padding * 2); + // We control the font-size based on mixin input. + @if $padding == $button-med { font-size: $button-font-med; } + @else if $padding == $button-tny { font-size: $button-font-tny; } + @else if $padding == $button-sml { font-size: $button-font-sml; } + @else if $padding == $button-lrg { font-size: $button-font-lrg; } + } + + // We can set $full-width:true to remove side padding extend width. + @if $full-width { + // We still need to check if $padding is set. + @if $padding { + padding-bottom: $padding + rem-calc(1); + padding-top: $padding; + } @else if $padding == false { + padding-bottom:0; + padding-top:0; + } + padding-left: 0; + padding-right: 0; + width: 100%; + } +} + +// @MIXIN +// +// we use this mixin to create the button hover and border colors + +// @MIXIN +// +// We use this mixin to add button color styles +// +// $bg - Background color. We can set $bg:false for a transparent background. Default: $primary-color. +// $radius - If true, set to button radius which is $button-radius || explicitly set radius amount in px (ex. $radius:10px). Default: false +// $disabled - We can set $disabled:true to create a disabled transparent button. Default: false +// $bg-hover - Button Hover Background Color. Default: $button-bg-hover +// $border-color - Button Border Color. Default: $button-border-color +@mixin button-style($bg:$button-bg-color, $radius:false, $disabled:false, $bg-hover:null, $border-color:null) { + + // We control which background styles are used, + // these can be removed by setting $bg:false + @if $bg { + + @if $bg-hover == null { + $bg-hover: if($bg == $button-bg-color, $button-bg-hover, scale-color($bg, $lightness: $button-function-factor)); + } + + @if $border-color == null { + $border-color: if($bg == $button-bg-color, $button-border-color, scale-color($bg, $lightness: $button-function-factor)); + } + + // This find the lightness percentage of the background color. + $bg-lightness: lightness($bg); + $bg-hover-lightness: lightness($bg-hover); + + background-color: $bg; + border-color: $border-color; + &:hover, + &:focus { background-color: $bg-hover; } + + // We control the text color for you based on the background color. + color: if($bg-lightness > 70%, $button-font-color-alt, $button-font-color); + + &:hover, + &:focus { + color: if($bg-hover-lightness > 70%, $button-font-color-alt, $button-font-color); + } + } + + // We can set $disabled:true to create a disabled transparent button. + @if $disabled { + box-shadow: none; + cursor: $button-disabled-cursor; + opacity: $button-disabled-opacity; + &:hover, + &:focus { background-color: $bg; } + } + + // We can control how much button radius is used. + @if $radius == true { @include radius($button-radius); } + @else if $radius { @include radius($radius); } + +} + +// @MIXIN +// +// We use this to quickly create buttons with a single mixin. As @jaredhardy puts it, "the kitchen sink mixin" +// +// $padding - Used to build padding for buttons Default: $button-med ||= rem-calc(12) +// $bg - Primary color set in settings file. Default: $button-bg. +// $radius - If true, set to button radius which is $global-radius || explicitly set radius amount in px (ex. $radius:10px). Default:false. +// $full-width - We can set $full-width:true to remove side padding extend width. Default:false. +// $disabled - We can set $disabled:true to create a disabled transparent button. Default:false. +// $is-prefix - Not used? Default:false. +// $bg-hover - Button Hover Color - Default null - see button-style mixin +// $border-color - Button Border Color - Default null - see button-style mixin +// $transition - We can control whether or not to include the background-color transition property - Default:true. +@mixin button($padding:$button-med, $bg:$button-bg-color, $radius:false, $full-width:false, $disabled:false, $is-prefix:false, $bg-hover:null, $border-color:null, $transition: true) { + @include button-base; + @include button-size($padding, $full-width); + @include button-style($bg, $radius, $disabled, $bg-hover, $border-color); + + @if $transition { + @include single-transition(background-color); + } +} + + +@include exports("button") { + @if $include-html-button-classes { + + // Default styles applied outside of media query + button, .button { + @include button-base; + @include button-size; + @include button-style; + + @include single-transition(background-color); + + &.secondary { @include button-style($bg:$secondary-color, $bg-hover:$secondary-button-bg-hover, $border-color:$secondary-button-border-color); } + &.success { @include button-style($bg:$success-color, $bg-hover:$success-button-bg-hover, $border-color:$success-button-border-color); } + &.alert { @include button-style($bg:$alert-color, $bg-hover:$alert-button-bg-hover, $border-color:$alert-button-border-color); } + &.warning { @include button-style($bg:$warning-color, $bg-hover:$warning-button-bg-hover, $border-color:$warning-button-border-color); } + &.info { @include button-style($bg:$info-color, $bg-hover:$info-button-bg-hover, $border-color:$info-button-border-color); } + + &.large { @include button-size($padding:$button-lrg); } + &.small { @include button-size($padding:$button-sml); } + &.tiny { @include button-size($padding:$button-tny); } + &.expand { @include button-size($padding:null, $full-width:true); } + + &.left-align { text-align: left; text-indent: rem-calc(12); } + &.right-align { text-align: right; padding-right: rem-calc(12); } + + &.radius { @include button-style($bg:false, $radius:true); } + &.round { @include button-style($bg:false, $radius:$button-round); } + + &.disabled, &[disabled] { @include button-style($bg:$button-bg-color, $disabled:true, $bg-hover:$button-bg-hover, $border-color:$button-border-color); + &.secondary { @include button-style($bg:$secondary-color, $disabled:true, $bg-hover:$secondary-button-bg-hover, $border-color:$secondary-button-border-color); } + &.success { @include button-style($bg:$success-color, $disabled:true, $bg-hover:$success-button-bg-hover, $border-color:$success-button-border-color); } + &.alert { @include button-style($bg:$alert-color, $disabled:true, $bg-hover:$alert-button-bg-hover, $border-color:$alert-button-border-color); } + &.warning { @include button-style($bg:$warning-color, $disabled:true, $bg-hover:$warning-button-bg-hover, $border-color:$warning-button-border-color); } + &.info { @include button-style($bg:$info-color, $disabled:true, $bg-hover:$info-button-bg-hover, $border-color:$info-button-border-color); } + } + } + + //firefox 2px fix + button::-moz-focus-inner {border:0; padding:0;} + + @media #{$medium-up} { + button, .button { + @include button-base($style:false, $display:inline-block); + @include button-size($padding:false, $full-width:false); + } + } + } +} diff --git a/themes/foundation5/scss/foundation/components/_clearing.scss b/themes/foundation5/scss/foundation/components/_clearing.scss new file mode 100644 index 0000000000000000000000000000000000000000..e58966a415699c9193466fb20c6cd327d5c6a9b5 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_clearing.scss @@ -0,0 +1,260 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// @variables +// +$include-html-clearing-classes: $include-html-classes !default; + +// We use these to set the background colors for parts of Clearing. +$clearing-bg: $oil !default; +$clearing-caption-bg: $clearing-bg !default; +$clearing-carousel-bg: rgba(51,51,51,0.8) !default; +$clearing-img-bg: $clearing-bg !default; + +// We use these to style the close button +$clearing-close-color: $iron !default; +$clearing-close-size: 30px !default; + +// We use these to style the arrows +$clearing-arrow-size: 12px !default; +$clearing-arrow-color: $clearing-close-color !default; + +// We use these to style captions +$clearing-caption-font-color: $iron !default; +$clearing-caption-font-size: .875em !default; +$clearing-caption-padding: 10px 30px 20px !default; + +// We use these to make the image and carousel height and style +$clearing-active-img-height: 85% !default; +$clearing-carousel-height: 120px !default; +$clearing-carousel-thumb-width: 120px !default; +$clearing-carousel-thumb-active-border: 1px solid rgb(255,255,255) !default; + +@include exports("clearing") { + @if $include-html-clearing-classes { + // We decided to not create a mixin for Clearing because it relies + // on predefined classes and structure to work properly. + // The variables above should give enough control. + + /* Clearing Styles */ + .clearing-thumbs, #{data('clearing')} { + @include clearfix; + list-style: none; + margin-#{$default-float}: 0; + margin-bottom: 0; + + li { + float: $default-float; + margin-#{$opposite-direction}: 10px; + } + + &[class*="block-grid-"] li { + margin-#{$opposite-direction}: 0; + } + } + + .clearing-blackout { + background: $clearing-bg; + height: 100%; + position: fixed; + top: 0; + width: 100%; + z-index: 998; + #{$default-float}: 0; + + .clearing-close { display: block; } + } + + .clearing-container { + height: 100%; + margin: 0; + overflow: hidden; + position: relative; + z-index: 998; + } + + .clearing-touch-label { + color: $base; + font-size: .6em; + left: 50%; + position: absolute; + top: 50%; + } + + .visible-img { + height: 95%; + position: relative; + + img { + position: absolute; + #{$default-float}: 50%; + top: 50%; + @if $default-float == left { + -webkit-transform: translateY(-50%) translateX(-50%); + -moz-transform: translateY(-50%) translateX(-50%); + -ms-transform: translateY(-50%) translateX(-50%); + -o-transform: translateY(-50%) translateX(-50%); + transform: translateY(-50%) translateX(-50%); + } + @else { + -webkit-transform: translateY(-50%) translateX(50%); + -moz-transform: translateY(-50%) translateX(50%); + -ms-transform: translateY(-50%) translateX(50%); + -o-transform: translateY(-50%) translateX(50%); + transform: translateY(-50%) translateX(50%); + }; + max-height: 100%; + max-width: 100%; + } + } + + .clearing-caption { + background: $clearing-caption-bg; + bottom: 0; + color: $clearing-caption-font-color; + font-size: $clearing-caption-font-size; + line-height: 1.3; + margin-bottom: 0; + padding: $clearing-caption-padding; + position: absolute; + text-align: center; + width: 100%; + #{$default-float}: 0; + } + + .clearing-close { + color: $clearing-close-color; + display: none; + font-size: $clearing-close-size; + line-height: 1; + padding-#{$default-float}: 20px; + padding-top: 10px; + z-index: 999; + + &:hover, + &:focus { color: $iron; } + } + + .clearing-assembled .clearing-container { height: 100%; + .carousel > ul { display: none; } + } + + // If you want to show a lightbox, but only have a single image come through as the thumbnail + .clearing-feature li { + display: none; + &.clearing-featured-img { + display: block; + } + } + + // Large screen overrides + @media #{$medium-up} { + .clearing-main-prev, + .clearing-main-next { + height: 100%; + position: absolute; + top: 0; + width: 40px; + > span { + border: solid $clearing-arrow-size; + display: block; + height: 0; + position: absolute; + top: 50%; + width: 0; + &:hover { opacity: .8; } + } + } + .clearing-main-prev { + #{$default-float}: 0; + > span { + #{$default-float}: 5px; + border-color: transparent; + border-#{$opposite-direction}-color: $clearing-arrow-color; + } + } + .clearing-main-next { + #{$opposite-direction}: 0; + > span { + border-color: transparent; + border-#{$default-float}-color: $clearing-arrow-color; + } + } + + .clearing-main-prev.disabled, + .clearing-main-next.disabled { opacity: .3; } + + .clearing-assembled .clearing-container { + + .carousel { + background: $clearing-carousel-bg; + height: $clearing-carousel-height; + margin-top: 10px; + text-align: center; + + > ul { + display: inline-block; + z-index: 999; + height: 100%; + position: relative; + float: none; + + li { + clear: none; + cursor: $cursor-pointer-value; + display: block; + float: $default-float; + margin-#{$opposite-direction}: 0; + min-height: inherit; + opacity: .4; + overflow: hidden; + padding: 0; + position: relative; + width: $clearing-carousel-thumb-width; + + &.fix-height { + img { + height: 100%; + max-width: none; + } + } + + a.th { + border: none; + box-shadow: none; + display: block; + } + + img { + cursor: $cursor-pointer-value !important; + width: 100% !important; + } + + &.visible { opacity: 1; } + &:hover { opacity: .8; } + } + } + } + + .visible-img { + background: $clearing-img-bg; + height: $clearing-active-img-height; + overflow: hidden; + } + } + + .clearing-close { + padding-#{$default-float}: 0; + padding-top: 0; + position: absolute; + top: 10px; + #{$opposite-direction}: 20px; + } + } + + } +} diff --git a/themes/foundation5/scss/foundation/components/_dropdown-buttons.scss b/themes/foundation5/scss/foundation/components/_dropdown-buttons.scss new file mode 100644 index 0000000000000000000000000000000000000000..1dc92d1eb1c8fbd7ba7a417ed3de34320f3b680d --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_dropdown-buttons.scss @@ -0,0 +1,130 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// @variables +// +$include-html-button-classes: $include-html-classes !default; + +// We use these to set the color of the pip in dropdown buttons +$dropdown-button-pip-color: $white !default; +$dropdown-button-pip-color-alt: $oil !default; + +// We use these to set the size of the pip in dropdown buttons +$button-pip-tny: rem-calc(6) !default; +$button-pip-sml: rem-calc(7) !default; +$button-pip-med: rem-calc(9) !default; +$button-pip-lrg: rem-calc(11) !default; + +// We use these to style tiny dropdown buttons +$dropdown-button-padding-tny: $button-pip-tny * 7 !default; +$dropdown-button-pip-size-tny: $button-pip-tny !default; +$dropdown-button-pip-opposite-tny: $button-pip-tny * 3 !default; +$dropdown-button-pip-top-tny: (-$button-pip-tny / 2) + rem-calc(1) !default; + +// We use these to style small dropdown buttons +$dropdown-button-padding-sml: $button-pip-sml * 7 !default; +$dropdown-button-pip-size-sml: $button-pip-sml !default; +$dropdown-button-pip-opposite-sml: $button-pip-sml * 3 !default; +$dropdown-button-pip-top-sml: (-$button-pip-sml / 2) + rem-calc(1) !default; + +// We use these to style medium dropdown buttons +$dropdown-button-padding-med: $button-pip-med * 6 + rem-calc(3) !default; +$dropdown-button-pip-size-med: $button-pip-med - rem-calc(3) !default; +$dropdown-button-pip-opposite-med: $button-pip-med * 2.5 !default; +$dropdown-button-pip-top-med: (-$button-pip-med / 2) + rem-calc(2) !default; + +// We use these to style large dropdown buttons +$dropdown-button-padding-lrg: $button-pip-lrg * 5 + rem-calc(3) !default; +$dropdown-button-pip-size-lrg: $button-pip-lrg - rem-calc(6) !default; +$dropdown-button-pip-opposite-lrg: $button-pip-lrg * 2.5 !default; +$dropdown-button-pip-top-lrg: (-$button-pip-lrg / 2) + rem-calc(3) !default; + +// @mixins +// +// Dropdown Button Mixin +// +// We use this mixin to build off of the button mixin and add dropdown button styles +// +// $padding - Determines the size of button you're working with. Default: medium. Options [tiny, small, medium, large] +// $pip-color - Color of the little triangle that points to the dropdown. Default: $white. +// $base-style - Add in base-styles. This can be set to false. Default:true + +@mixin dropdown-button($padding:medium, $pip-color:$dropdown-button-pip-color, $base-style:true) { + + // We add in base styles, but they can be negated by setting to 'false'. + @if $base-style { + position: relative; + + // This creates the base styles for the triangle pip + &::after { + border-color: $dropdown-button-pip-color transparent transparent transparent; + border-style: solid; + content: ""; + display: block; + height: 0; + position: absolute; + top: 50%; + width: 0; + } + } + + // If we're dealing with tiny buttons, use these styles + @if $padding == tiny { + padding-#{$opposite-direction}: $dropdown-button-padding-tny; + &:after { + border-width: $dropdown-button-pip-size-tny; + #{$opposite-direction}: $dropdown-button-pip-opposite-tny; + margin-top: $dropdown-button-pip-top-tny; + } + } + + // If we're dealing with small buttons, use these styles + @if $padding == small { + padding-#{$opposite-direction}: $dropdown-button-padding-sml; + &::after { + border-width: $dropdown-button-pip-size-sml; + #{$opposite-direction}: $dropdown-button-pip-opposite-sml; + margin-top: $dropdown-button-pip-top-sml; + } + } + + // If we're dealing with default (medium) buttons, use these styles + @if $padding == medium { + padding-#{$opposite-direction}: $dropdown-button-padding-med; + &::after { + border-width: $dropdown-button-pip-size-med; + #{$opposite-direction}: $dropdown-button-pip-opposite-med; + margin-top: $dropdown-button-pip-top-med; + } + } + + // If we're dealing with large buttons, use these styles + @if $padding == large { + padding-#{$opposite-direction}: $dropdown-button-padding-lrg; + &::after { + border-width: $dropdown-button-pip-size-lrg; + #{$opposite-direction}: $dropdown-button-pip-opposite-lrg; + margin-top: $dropdown-button-pip-top-lrg; + } + } + + // We can control the pip color. We didn't use logic in this case, just set it and forget it. + @if $pip-color { + &::after { border-color: $pip-color transparent transparent transparent; } + } +} + +@include exports("dropdown-button") { + @if $include-html-button-classes { + .dropdown.button, button.dropdown { @include dropdown-button; + &.tiny { @include dropdown-button(tiny, $base-style:false); } + &.small { @include dropdown-button(small, $base-style:false); } + &.large { @include dropdown-button(large, $base-style:false); } + &.secondary:after { border-color: $dropdown-button-pip-color-alt transparent transparent transparent; } + } + } +} diff --git a/themes/foundation5/scss/foundation/components/_dropdown.scss b/themes/foundation5/scss/foundation/components/_dropdown.scss new file mode 100644 index 0000000000000000000000000000000000000000..ff1a6ec0ccfc7f0fb6ec34bfdcc3a8850f83f783 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_dropdown.scss @@ -0,0 +1,268 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// @variables +// +$include-html-dropdown-classes: $include-html-classes !default; + +// We use these to controls height and width styles. +$f-dropdown-max-width: 200px !default; +$f-dropdown-height: auto !default; +$f-dropdown-max-height: none !default; + +// Used for bottom position +$f-dropdown-margin-top: 2px !default; + +// Used for right position +$f-dropdown-margin-left: $f-dropdown-margin-top !default; + +// Used for left position +$f-dropdown-margin-right: $f-dropdown-margin-top !default; + +// Used for top position +$f-dropdown-margin-bottom: $f-dropdown-margin-top !default; + +// We use this to control the background color +$f-dropdown-bg: $white !default; + +// We use this to set the border styles for dropdowns. +$f-dropdown-border-style: solid !default; +$f-dropdown-border-width: 1px !default; +$f-dropdown-border-color: scale-color($white, $lightness: -20%) !default; + +// We use these to style the triangle pip. +$f-dropdown-triangle-size: 6px !default; +$f-dropdown-triangle-color: $white !default; +$f-dropdown-triangle-side-offset: 10px !default; + +// We use these to control styles for the list elements. +$f-dropdown-list-style: none !default; +$f-dropdown-font-color: $charcoal !default; +$f-dropdown-font-size: rem-calc(14) !default; +$f-dropdown-list-padding: rem-calc(5, 10) !default; +$f-dropdown-line-height: rem-calc(18) !default; +$f-dropdown-list-hover-bg: $smoke !default; +$dropdown-mobile-default-float: 0 !default; + +// We use this to control the styles for when the dropdown has custom content. +$f-dropdown-content-padding: rem-calc(20) !default; + +// Default radius for dropdown. +$f-dropdown-radius: $global-radius !default; + +// +// @mixins +// +// +// NOTE: Make default max-width change between list and content types. Can add more width with classes, maybe .small, .medium, .large, etc.; +// We use this to style the dropdown container element. +// $content-list - Sets list-style. Default: list. Options: [list, content] +// $triangle - Sets if dropdown has triangle. Default:true. +// $max-width - Default: $f-dropdown-max-width || 200px. +@mixin dropdown-container($content:list, $triangle:true, $max-width:$f-dropdown-max-width) { + display: none; + left: -9999px; + list-style: $f-dropdown-list-style; + margin-#{$default-float}: 0; + position: absolute; + + &.open { + display: block; + } + + > *:first-child { margin-top: 0; } + > *:last-child { margin-bottom: 0; } + + @if $content == list { + background: $f-dropdown-bg; + border: $f-dropdown-border-style $f-dropdown-border-width $f-dropdown-border-color; + font-size: $f-dropdown-font-size; + height: $f-dropdown-height; + max-height: $f-dropdown-max-height; + width: 100%; + z-index: 89; + } + @else if $content == content { + background: $f-dropdown-bg; + border: $f-dropdown-border-style $f-dropdown-border-width $f-dropdown-border-color; + font-size: $f-dropdown-font-size; + height: $f-dropdown-height; + max-height: $f-dropdown-max-height; + padding: $f-dropdown-content-padding; + width: 100%; + z-index: 89; + } + + @if $triangle == bottom { + margin-top: $f-dropdown-margin-top; + + @if $f-dropdown-triangle-size != 0px { + + &:before { + @include css-triangle($f-dropdown-triangle-size, $f-dropdown-triangle-color, bottom); + position: absolute; + top: -($f-dropdown-triangle-size * 2); + #{$default-float}: $f-dropdown-triangle-side-offset; + z-index: 89; + } + &:after { + @include css-triangle($f-dropdown-triangle-size + 1, $f-dropdown-border-color, bottom); + position: absolute; + top: -(($f-dropdown-triangle-size + 1) * 2); + #{$default-float}: $f-dropdown-triangle-side-offset - 1; + z-index: 88; + } + + &.right:before { + #{$default-float}: auto; + #{$opposite-direction}: $f-dropdown-triangle-side-offset; + } + &.right:after { + #{$default-float}: auto; + #{$opposite-direction}: $f-dropdown-triangle-side-offset - 1; + } + } + } + + @if $triangle == $default-float { + margin-top: 0; + margin-#{$default-float}: $f-dropdown-margin-right; + + &:before { + @include css-triangle($f-dropdown-triangle-size, $f-dropdown-triangle-color, #{$opposite-direction}); + position: absolute; + top: $f-dropdown-triangle-side-offset; + #{$default-float}: -($f-dropdown-triangle-size * 2); + z-index: 89; + } + &:after { + @include css-triangle($f-dropdown-triangle-size + 1, $f-dropdown-border-color, #{$opposite-direction}); + position: absolute; + top: $f-dropdown-triangle-side-offset - 1; + #{$default-float}: -($f-dropdown-triangle-size * 2) - 2; + z-index: 88; + } + + } + + @if $triangle == $opposite-direction { + margin-top: 0; + margin-#{$default-float}: -$f-dropdown-margin-right; + + &:before { + @include css-triangle($f-dropdown-triangle-size, $f-dropdown-triangle-color, #{$default-float}); + position: absolute; + top: $f-dropdown-triangle-side-offset; + #{$opposite-direction}: -($f-dropdown-triangle-size * 2); + #{$default-float}: auto; + z-index: 89; + } + &:after { + @include css-triangle($f-dropdown-triangle-size + 1, $f-dropdown-border-color, #{$default-float}); + position: absolute; + top: $f-dropdown-triangle-side-offset - 1; + #{$opposite-direction}: -($f-dropdown-triangle-size * 2) - 2; + #{$default-float}: auto; + z-index: 88; + } + + } + + @if $triangle == top { + margin-left: 0; + margin-top: -$f-dropdown-margin-bottom; + + &:before { + @include css-triangle($f-dropdown-triangle-size, $f-dropdown-triangle-color, top); + bottom: -($f-dropdown-triangle-size * 2); + position: absolute; + top: auto; + #{$default-float}: $f-dropdown-triangle-side-offset; + #{$opposite-direction}: auto; + z-index: 89; + } + &:after { + @include css-triangle($f-dropdown-triangle-size + 1, $f-dropdown-border-color, top); + bottom: -($f-dropdown-triangle-size * 2) - 2; + position: absolute; + top: auto; + #{$default-float}: $f-dropdown-triangle-side-offset - 1; + #{$opposite-direction}: auto; + z-index: 88; + } + + } + + @if $max-width { max-width: $max-width; } + @else { max-width: $f-dropdown-max-width; } + +} + +// @MIXIN +// +// We use this to style the list elements or content inside the dropdown. + +@mixin dropdown-style { + cursor: $cursor-pointer-value; + font-size: $f-dropdown-font-size; + line-height: $f-dropdown-line-height; + margin: 0; + + &:hover, + &:focus { background: $f-dropdown-list-hover-bg; } + + &.radius { @include radius($f-dropdown-radius); } + + a { + display: block; + padding: $f-dropdown-list-padding; + color: $f-dropdown-font-color; + } +} + +@include exports("dropdown") { + @if $include-html-dropdown-classes { + + /* Foundation Dropdowns */ + .f-dropdown { + @include dropdown-container(list, bottom); + + &.drop-#{$opposite-direction} { + @include dropdown-container(list, #{$default-float}); + } + + &.drop-#{$default-float} { + @include dropdown-container(list, #{$opposite-direction}); + } + + &.drop-top { + @include dropdown-container(list, top); + } + // max-width: none; + + li { @include dropdown-style; } + + // You can also put custom content in these dropdowns + &.content { @include dropdown-container(content, $triangle:false); } + + // Sizes + &.tiny { max-width: 200px; } + &.small { max-width: 300px; } + &.medium { max-width: 500px; } + &.large { max-width: 800px; } + &.mega { + width:100%!important; + max-width:100%!important; + + &.open{ + left:0!important; + } + } + } + + } +} diff --git a/themes/foundation5/scss/foundation/components/_flex-video.scss b/themes/foundation5/scss/foundation/components/_flex-video.scss new file mode 100644 index 0000000000000000000000000000000000000000..4df77e5f742ecc422d7cdced4e4a3008529966b1 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_flex-video.scss @@ -0,0 +1,51 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// @variables +// +$include-html-media-classes: $include-html-classes !default; + +// We use these to control video container padding and margins +$flex-video-padding-top: rem-calc(25) !default; +$flex-video-padding-bottom: 67.5% !default; +$flex-video-margin-bottom: rem-calc(16) !default; + +// We use this to control widescreen bottom padding +$flex-video-widescreen-padding-bottom: 56.34% !default; + +// +// @mixins +// + +@mixin flex-video-container { + height: 0; + margin-bottom: $flex-video-margin-bottom; + overflow: hidden; + padding-bottom: $flex-video-padding-bottom; + padding-top: $flex-video-padding-top; + position: relative; + + &.widescreen { padding-bottom: $flex-video-widescreen-padding-bottom; } + &.vimeo { padding-top: 0; } + + iframe, + object, + embed, + video { + height: 100%; + position: absolute; + top: 0; + width: 100%; + #{$default-float}: 0; + } +} + +@include exports("flex-video") { + @if $include-html-media-classes { + .flex-video { @include flex-video-container; } + } +} diff --git a/themes/foundation5/scss/foundation/components/_forms.scss b/themes/foundation5/scss/foundation/components/_forms.scss new file mode 100644 index 0000000000000000000000000000000000000000..f0497499785671f196d1be46cded9a7bd9e92413 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_forms.scss @@ -0,0 +1,609 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; +@import 'buttons'; + +// +// @variables +// +$include-html-form-classes: $include-html-classes !default; + +// We use this to set the base for lots of form spacing and positioning styles +$form-spacing: rem-calc(16) !default; + +// We use these to style the labels in different ways +$form-label-pointer: pointer !default; +$form-label-font-size: rem-calc(14) !default; +$form-label-font-weight: $font-weight-normal !default; +$form-label-line-height: 1.5 !default; +$form-label-font-color: scale-color($black, $lightness: 30%) !default; +$form-label-small-transform: capitalize !default; +$form-label-bottom-margin: 0 !default; +$input-font-family: inherit !default; +$input-font-color: rgba(0,0,0,0.75) !default; +$input-placeholder-font-color: $steel !default; +$input-font-size: rem-calc(14) !default; +$input-bg-color: $white !default; +$input-focus-bg-color: scale-color($white, $lightness: -2%) !default; +$input-border-color: scale-color($white, $lightness: -20%) !default; +$input-focus-border-color: scale-color($white, $lightness: -40%) !default; +$input-border-style: solid !default; +$input-border-width: 1px !default; +$input-border-radius: $global-radius !default; +$input-disabled-bg: $gainsboro !default; +$input-disabled-cursor: $cursor-default-value !default; +$input-box-shadow: inset 0 1px 2px rgba(0,0,0,0.1) !default; +$input-include-glowing-effect: false !default; + +// We use these to style the fieldset border and spacing. +$fieldset-border-style: solid !default; +$fieldset-border-width: 1px !default; +$fieldset-border-color: $gainsboro !default; +$fieldset-padding: rem-calc(20) !default; +$fieldset-margin: rem-calc(18 0) !default; + +// We use these to style the legends when you use them +$legend-bg: $white !default; +$legend-font-weight: $font-weight-bold !default; +$legend-padding: rem-calc(0 3) !default; + +// We use these to style the prefix and postfix input elements +$input-prefix-bg: scale-color($white, $lightness: -5%) !default; +$input-prefix-border-color: scale-color($white, $lightness: -20%) !default; +$input-prefix-border-size: 1px !default; +$input-prefix-border-type: solid !default; +$input-prefix-overflow: visible !default; +$input-prefix-font-color: $oil !default; +$input-prefix-font-color-alt: $white !default; + +// We use this setting to turn on/off HTML5 number spinners (the up/down arrows) +$input-number-spinners: true !default; + +// We use these to style the error states for inputs and labels +$input-error-message-padding: rem-calc(6 9 9) !default; +$input-error-message-top: -1px !default; +$input-error-message-font-size: rem-calc(12) !default; +$input-error-message-font-weight: $font-weight-normal !default; +$input-error-message-font-style: italic !default; +$input-error-message-font-color: $white !default; +$input-error-message-bg-color: $alert-color !default; +$input-error-message-font-color-alt: $oil !default; + +// We use this to style the glowing effect of inputs when focused +$glowing-effect-fade-time: .45s !default; +$glowing-effect-color: $input-focus-border-color !default; + +// We use this to style the transition when inputs are focused and when the glowing effect is disabled. +$input-transition-fade-time: 0.15s !default; +$input-transition-fade-timing-function: linear !default; + +// Select variables +$select-bg-color: $ghost !default; +$select-hover-bg-color: scale-color($select-bg-color, $lightness: -3%) !default; + +// +// @MIXINS +// + +// We use this mixin to give us form styles for rows inside of forms +@mixin form-row-base { + .row { margin: 0 ((-$form-spacing) / 2); + + .column, + .columns { padding: 0 ($form-spacing / 2); } + + // Use this to collapse the margins of a form row + &.collapse { margin: 0; + + .column, + .columns { padding: 0; } + input { + @include side-radius($opposite-direction, 0); + } + + } + } + input.column, + input.columns, + textarea.column, + textarea.columns { padding-#{$default-float}: ($form-spacing / 2); } +} + +// @MIXIN +// +// We use this mixin to give all basic form elements their style +@mixin form-element { + background-color: $input-bg-color; + border: { + style: $input-border-style; + width: $input-border-width; + color: $input-border-color; + } + box-shadow: $input-box-shadow; + color: $input-font-color; + display: block; + font-family: $input-font-family; + font-size: $input-font-size; + height: ($input-font-size + ($form-spacing * 1.5) - rem-calc(1)); + margin: 0 0 $form-spacing 0; + padding: $form-spacing / 2; + width: 100%; + @include box-sizing(border-box); + @if $input-include-glowing-effect { + @include block-glowing-effect(focus, $glowing-effect-fade-time, $glowing-effect-color); + } + // Basic focus styles + &:focus { + background: $input-focus-bg-color; + border-color: $input-focus-border-color; + outline: none; + } + // Disabled Styles + &:disabled { + background-color: $input-disabled-bg; + cursor: $input-disabled-cursor; + } + + // Disabled background input background color + &[disabled], + &[readonly], + fieldset[disabled] & { + background-color: $input-disabled-bg; + cursor: $input-disabled-cursor; + } +} + +// @MIXIN +// +// We use this mixin to create form labels +// +// $alignment - Alignment options. Default: false. Options: [right, inline, false] +// $base-style - Control whether or not the base styles come through. Default: true. +@mixin form-label($alignment:false, $base-style:true) { + + // Control whether or not the base styles come through. + @if $base-style { + color: $form-label-font-color; + cursor: $form-label-pointer; + display: block; + font-size: $form-label-font-size; + font-weight: $form-label-font-weight; + line-height: $form-label-line-height; + margin-bottom: $form-label-bottom-margin; + } + + // Alignment options + @if $alignment == right { + float: none !important; + text-align: right; + } + @else if $alignment == inline { + margin: 0 0 $form-spacing 0; + padding: $form-spacing / 2 + rem-calc($input-border-width) 0; + } +} + +// We use this mixin to create postfix/prefix form Labels +@mixin prefix-postfix-base { + border-style: $input-prefix-border-type; + border-width: $input-prefix-border-size; + display: block; + font-size: $form-label-font-size; + height: ($input-font-size + ($form-spacing * 1.5) - rem-calc(1)); + line-height: ($input-font-size + ($form-spacing * 1.5) - rem-calc(1)); + overflow: $input-prefix-overflow; + padding-bottom: 0; + padding-top: 0; + position: relative; + text-align: center; + width: 100%; + z-index: 2; +} + +// @MIXIN +// +// We use this mixin to create prefix label styles +// $bg - Default:$input-prefix-bg || scale-color($white, $lightness: -5%) !default; +// $is-button - Toggle position settings if prefix is a button. Default:false +// +@mixin prefix($bg:$input-prefix-bg, $border:$input-prefix-border-color, $is-button:false) { + + @if $bg { + $bg-lightness: lightness($bg); + background: $bg; + border-#{$opposite-direction}: none; + + // Control the font color based on background brightness + @if $bg-lightness > 70% or $bg == yellow { color: $input-prefix-font-color; } + @else { color: $input-prefix-font-color-alt; } + } + + @if $border { + border-color: $border; + } + + @if $is-button { + border: none; + padding-#{$default-float}: 0; + padding-#{$opposite-direction}: 0; + padding-bottom: 0; + padding-top: 0; + text-align: center; + } + +} + +// @MIXIN +// +// We use this mixin to create postfix label styles +// $bg - Default:$input-prefix-bg || scale-color($white, $lightness: -5%) !default; +// $is-button - Toggle position settings if prefix is a button. Default: false +@mixin postfix($bg:$input-prefix-bg, $border-left-hidden:false, $border:$input-prefix-border-color, $is-button:false) { + + @if $bg { + $bg-lightness: lightness($bg); + background: $bg; + @if $border-left-hidden { + border-#{$default-float}: none; + } + + // Control the font color based on background brightness + @if $bg-lightness > 70% or $bg == yellow { color: $input-prefix-font-color; } + @else { color: $input-prefix-font-color-alt; } + } + + @if $border { + border-color: $border; + } + + @if $is-button { + border: none; + padding-#{$default-float}: 0; + padding-#{$opposite-direction}: 0; + padding-bottom: 0; + padding-top: 0; + text-align: center; + } + +} + +// We use this mixin to style fieldsets +@mixin fieldset { + border: $fieldset-border-width $fieldset-border-style $fieldset-border-color; + margin: $fieldset-margin; + padding: $fieldset-padding; + + // and legend styles + legend { + background: $legend-bg; + font-weight: $legend-font-weight; + margin-#{$default-float}: rem-calc(-3); + margin: 0; + padding: $legend-padding; + } +} + +// @MIXIN +// +// We use this mixin to control border and background color of error inputs +// $color - Default: $alert-color (found in settings file) +@mixin form-error-color($color:$alert-color) { + background-color: rgba($color, .1); + border-color: $color; + + // Go back to normal on focus + &:focus { + background: $input-focus-bg-color; + border-color: $input-focus-border-color; + } +} + +// @MIXIN +// +// We use this simple mixin to style labels for error inputs +// $color - Default:$alert-color. Found in settings file +@mixin form-label-error-color($color:$alert-color) { color: $color; } + +// @MIXIN +// +// We use this mixin to create error message styles +// $bg - Default: $alert-color (Found in settings file) +@mixin form-error-message($bg:$input-error-message-bg-color) { + display: block; + font-size: $input-error-message-font-size; + font-style: $input-error-message-font-style; + font-weight: $input-error-message-font-weight; + margin-bottom: $form-spacing; + margin-top: $input-error-message-top; + padding: $input-error-message-padding; + + // We can control the text color based on the brightness of the background. + $bg-lightness: lightness($bg); + background: $bg; + @if $bg-lightness < 70% or $bg == yellow { color: $input-error-message-font-color; } + @else { color: $input-error-message-font-color-alt; } +} + +// We use this mixin to style select elements +@mixin form-select { + -webkit-appearance: none !important; + -moz-appearance: none !important; + background-color: $select-bg-color; + border-radius: 0; + + // Hide the dropdown arrow shown in newer IE versions + &::-ms-expand { + display: none; + } + + // The custom arrow has some fake horizontal padding so we can align it + // from the right side of the element without relying on CSS3 + background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgeD0iMTJweCIgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIzcHgiIHZpZXdCb3g9IjAgMCA2IDMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYgMyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBvbHlnb24gcG9pbnRzPSI1Ljk5MiwwIDIuOTkyLDMgLTAuMDA4LDAgIi8+PC9zdmc+); + + // We can safely use leftmost and rightmost now + background-position: if($text-direction == 'rtl', 0%, 100%) center; + + background-repeat: no-repeat; + border: { + style: $input-border-style; + width: $input-border-width; + color: $input-border-color; + } + color: $input-font-color; + font-family: $input-font-family; + font-size: $input-font-size; + line-height: normal; + padding: ($form-spacing / 2); + @include radius(0); + &.radius { @include radius($global-radius); } + &:hover { + background-color: $select-hover-bg-color; + border-color: $input-focus-border-color; + } + // Disabled Styles + &:disabled { + background-color: $input-disabled-bg; + cursor: $input-disabled-cursor; + } +} + +// We use this mixin to turn on/off HTML5 number spinners +@mixin html5number($browser, $on:true) { + @if $on==false { + @if $browser==webkit { + -webkit-appearance: none; + margin: 0; + } @else if $browser==moz { + -moz-appearance: textfield; + } + } +} + +@include exports("form") { + @if $include-html-form-classes { + /* Standard Forms */ + form { margin: 0 0 $form-spacing; } + + /* Using forms within rows, we need to set some defaults */ + form .row { @include form-row-base; } + + /* Label Styles */ + label { @include form-label; + &.right { @include form-label(right, false); } + &.inline { @include form-label(inline, false); } + /* Styles for required inputs */ + small { + text-transform: $form-label-small-transform; + color: scale-color($form-label-font-color, $lightness: 15%); + } + } + + /* Attach elements to the beginning or end of an input */ + .prefix, + .postfix { @include prefix-postfix-base; } + + /* Adjust padding, alignment and radius if pre/post element is a button */ + .postfix.button { @include button-size(false, false); @include postfix(false, false, false, true); } + .prefix.button { @include button-size(false, false); @include prefix(false, false, true); } + + .prefix.button.radius { @include radius(0); @include side-radius($default-float, $button-radius); } + .postfix.button.radius { @include radius(0); @include side-radius($opposite-direction, $button-radius); } + .prefix.button.round { @include radius(0); @include side-radius($default-float, $button-round); } + .postfix.button.round { @include radius(0); @include side-radius($opposite-direction, $button-round); } + + /* Separate prefix and postfix styles when on span or label so buttons keep their own */ + span.prefix, label.prefix { @include prefix(); } + span.postfix, label.postfix { @include postfix(); } + + /* We use this to get basic styling on all basic form elements */ + #{text-inputs(all, 'input')} { + -webkit-appearance: none; + -moz-appearance: none; + border-radius: 0; + @include form-element; + @if $input-include-glowing-effect == false { + -webkit-transition: border-color $input-transition-fade-time $input-transition-fade-timing-function, background $input-transition-fade-time $input-transition-fade-timing-function; + -moz-transition: border-color $input-transition-fade-time $input-transition-fade-timing-function, background $input-transition-fade-time $input-transition-fade-timing-function; + -ms-transition: border-color $input-transition-fade-time $input-transition-fade-timing-function, background $input-transition-fade-time $input-transition-fade-timing-function; + -o-transition: border-color $input-transition-fade-time $input-transition-fade-timing-function, background $input-transition-fade-time $input-transition-fade-timing-function; + transition: border-color $input-transition-fade-time $input-transition-fade-timing-function, background $input-transition-fade-time $input-transition-fade-timing-function; + } + &.radius { + @include radius($input-border-radius); + } + } + + form { + .row { + .prefix-radius.row.collapse { + input, + textarea, + select, + button { @include radius(0); @include side-radius($opposite-direction, $button-radius); } + .prefix { @include radius(0); @include side-radius($default-float, $button-radius); } + } + .postfix-radius.row.collapse { + input, + textarea, + select, + button { @include radius(0); @include side-radius($default-float, $button-radius); } + .postfix { @include radius(0); @include side-radius($opposite-direction, $button-radius); } + } + .prefix-round.row.collapse { + input, + textarea, + select, + button { @include radius(0); @include side-radius($opposite-direction, $button-round); } + .prefix { @include radius(0); @include side-radius($default-float, $button-round); } + } + .postfix-round.row.collapse { + input, + textarea, + select, + button { @include radius(0); @include side-radius($default-float, $button-round); } + .postfix { @include radius(0); @include side-radius($opposite-direction, $button-round); } + } + } + } + + input[type="submit"] { + -webkit-appearance: none; + -moz-appearance: none; + border-radius: 0; + } + + /* Respect enforced amount of rows for textarea */ + textarea[rows] { + height: auto; + } + + /* Not allow resize out of parent */ + textarea { + max-width: 100%; + } + + // style placeholder text cross browser + ::-webkit-input-placeholder { + color: $input-placeholder-font-color; + } + + :-moz-placeholder { /* Firefox 18- */ + color: $input-placeholder-font-color; + } + + ::-moz-placeholder { /* Firefox 19+ */ + color: $input-placeholder-font-color; + } + + :-ms-input-placeholder { + color: $input-placeholder-font-color; + } + + + /* Add height value for select elements to match text input height */ + select { + @include form-select; + height: ($input-font-size + ($form-spacing * 1.5) - rem-calc(1)); + &[multiple] { + height: auto; + } + } + + /* Adjust margin for form elements below */ + input[type="file"], + input[type="checkbox"], + input[type="radio"], + select { + margin: 0 0 $form-spacing 0; + } + + input[type="checkbox"] + label, + input[type="radio"] + label { + display: inline-block; + margin-#{$default-float}: $form-spacing * .5; + margin-#{$opposite-direction}: $form-spacing; + margin-bottom: 0; + vertical-align: baseline; + } + + /* Normalize file input width */ + input[type="file"] { + width:100%; + } + + /* HTML5 Number spinners settings */ + input[type=number] { + @include html5number(moz, $input-number-spinners) + } + input[type="number"]::-webkit-inner-spin-button, + input[type="number"]::-webkit-outer-spin-button { + @include html5number(webkit, $input-number-spinners); + } + + /* We add basic fieldset styling */ + fieldset { + @include fieldset; + } + + /* Error Handling */ + + #{data('abide')} { + .error small.error, .error span.error, span.error, small.error { + @include form-error-message; + } + span.error, small.error { display: none; } + } + + span.error, small.error { + @include form-error-message; + } + + .error { + input, + textarea, + select { + margin-bottom: 0; + } + + input[type="checkbox"], + input[type="radio"] { + margin-bottom: $form-spacing + } + + label, + label.error { + @include form-label-error-color; + } + + small.error { + @include form-error-message; + } + + > label { + > small { + background: transparent; + color: scale-color($form-label-font-color, $lightness: 15%); + display: inline; + font-size: 60%; + font-style: normal; + margin: 0; + padding: 0; + text-transform: $form-label-small-transform; + } + } + + span.error-message { + display: block; + } + } + + input.error, + textarea.error, + select.error { + margin-bottom: 0; + } + label.error { @include form-label-error-color; } + } +} diff --git a/themes/foundation5/scss/foundation/components/_global.scss b/themes/foundation5/scss/foundation/components/_global.scss new file mode 100644 index 0000000000000000000000000000000000000000..1fda12acdb58a34b77ce3dadcc5b2cd48beb24d6 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_global.scss @@ -0,0 +1,499 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import '../functions'; +// +// Foundation Variables +// + +// Data attribute namespace +// styles get applied to [data-mysite-plugin], etc +$namespace: false !default; + +// The default font-size is set to 100% of the browser style sheet (usually 16px) +// for compatibility with browser-based text zoom or user-set defaults. + +// Since the typical default browser font-size is 16px, that makes the calculation for grid size. +// If you want your base font-size to be different and not have it affect the grid breakpoints, +// set $rem-base to $base-font-size and make sure $base-font-size is a px value. +$base-font-size: 100% !default; + +// $base-line-height is 24px while $base-font-size is 16px +$base-line-height: 1.5 !default; + +// +// Global Foundation Mixins +// + +// @mixins +// +// We use this to control border radius. +// $radius - Default: $global-radius || 4px +@mixin radius($radius:$global-radius) { + @if $radius { + border-radius: $radius; + } +} + +// @mixins +// +// We use this to create equal side border radius on elements. +// $side - Options: left, right, top, bottom +@mixin side-radius($side, $radius:$global-radius) { + @if ($side == left or $side == right) { + -webkit-border-bottom-#{$side}-radius: $radius; + -webkit-border-top-#{$side}-radius: $radius; + border-bottom-#{$side}-radius: $radius; + border-top-#{$side}-radius: $radius; + } @else { + -webkit-#{$side}-left-radius: $radius; + -webkit-#{$side}-right-radius: $radius; + border-#{$side}-left-radius: $radius; + border-#{$side}-right-radius: $radius; + } +} + +// @mixins +// +// We can control whether or not we have inset shadows edges. +// $active - Default: true, Options: false +@mixin inset-shadow($active:true) { + box-shadow: $shiny-edge-size $shiny-edge-color inset; + + @if $active { &:active { + box-shadow: $shiny-edge-size $shiny-edge-active-color inset; } } +} + +// @mixins +// +// We use this to add transitions to elements +// $property - Default: all, Options: http://www.w3.org/TR/css3-transitions/#animatable-properties +// $speed - Default: 300ms +// $ease - Default:ease-out, Options: http://css-tricks.com/almanac/properties/t/transition-timing-function/ +@mixin single-transition($property:all, $speed:300ms, $ease:ease-out) { + transition: $property $speed $ease; +} + +// @mixins +// +// We use this to add box-sizing across browser prefixes +@mixin box-sizing($type:border-box) { + -webkit-box-sizing: $type; // Android < 2.3, iOS < 4 + -moz-box-sizing: $type; // Firefox < 29 + box-sizing: $type; // Chrome, IE 8+, Opera, Safari 5.1 +} + +// @mixins +// +// We use this to create isosceles triangles +// $triangle-size - Used to set border-size. No default, set a px or em size. +// $triangle-color - Used to set border-color which makes up triangle. No default +// $triangle-direction - Used to determine which direction triangle points. Options: top, bottom, left, right +@mixin css-triangle($triangle-size, $triangle-color, $triangle-direction) { + border: inset $triangle-size; + content: ""; + display: block; + height: 0; + width: 0; + @if ($triangle-direction == top) { + border-color: $triangle-color transparent transparent transparent; + border-top-style: solid; + } + @if ($triangle-direction == bottom) { + border-color: transparent transparent $triangle-color transparent; + border-bottom-style: solid; + } + @if ($triangle-direction == left) { + border-color: transparent transparent transparent $triangle-color; + border-left-style: solid; + } + @if ($triangle-direction == right) { + border-color: transparent $triangle-color transparent transparent; + border-right-style: solid; + } +} + +// @mixins +// +// We use this to create the icon with three lines aka the hamburger icon, the menu-icon or the navicon +// $width - Width of hamburger icon in rem +// $left - If false, icon will be centered horizontally || explicitly set value in rem +// $top - If false, icon will be centered vertically || explicitly set value in rem +// $thickness - thickness of lines in hamburger icon, set value in px +// $gap - spacing between the lines in hamburger icon, set value in px +// $color - icon color +// $hover-color - icon color during hover +// $offcanvas - Set to true of @include in offcanvas +@mixin hamburger($width, $left, $top, $thickness, $gap, $color, $hover-color, $offcanvas) { + span::after { + content: ""; + display: block; + height: 0; + position: absolute; + + @if $offcanvas { + @if $top { + top: $top; + } + @else { + top: 50%; + margin-top: (-$width/2); + } + @if $left { + left: $left; + } + @else { + left: ($tabbar-menu-icon-width - $width)/2; + } + } + @else { + margin-top: -($width/2); + top: 50%; + #{$opposite-direction}: $topbar-link-padding; + } + + box-shadow: + 0 0 0 $thickness $color, + 0 $gap + $thickness 0 $thickness $color, + 0 (2 * $gap + 2*$thickness) 0 $thickness $color; + width: $width; + } + span:hover:after { + box-shadow: + 0 0 0 $thickness $hover-color, + 0 $gap + $thickness 0 $thickness $hover-color, + 0 (2 * $gap + 2*$thickness) 0 $thickness $hover-color; + } +} + +// We use this to do clear floats +@mixin clearfix { + &:before, &:after { content: " "; display: table; } + &:after { clear: both; } +} + +// @mixins +// +// We use this to add a glowing effect to block elements +// $selector - Used for selector state. Default: focus, Options: hover, active, visited +// $fade-time - Default: 300ms +// $glowing-effect-color - Default: fade-out($primary-color, .25) +@mixin block-glowing-effect($selector:focus, $fade-time:300ms, $glowing-effect-color:fade-out($primary-color, .25)) { + transition: box-shadow $fade-time, border-color $fade-time ease-in-out; + + &:#{$selector} { + border-color: $glowing-effect-color; + box-shadow: 0 0 5px $glowing-effect-color; + } +} + +// @mixins +// +// We use this to translate elements in 2D +// $horizontal: Default: 0 +// $vertical: Default: 0 +@mixin translate2d($horizontal:0, $vertical:0) { + transform: translate($horizontal, $vertical) +} + +// @mixins +// +// Makes an element visually hidden, but accessible. +// @see http://snook.ca/archives/html_and_css/hiding-content-for-accessibility +@mixin element-invisible { + clip: rect(1px, 1px, 1px, 1px); + height: 1px; + overflow: hidden; + position: absolute !important; + width: 1px; +} + +// @mixins +// +// Turns off the element-invisible effect. +@mixin element-invisible-off { + position: static !important; + height: auto; + width: auto; + overflow: visible; + clip: auto; +} + +$white : #FFFFFF !default; +$ghost : #FAFAFA !default; +$snow : #F9F9F9 !default; +$vapor : #F6F6F6 !default; +$white-smoke : #F5F5F5 !default; +$silver : #EFEFEF !default; +$smoke : #EEEEEE !default; +$gainsboro : #DDDDDD !default; +$iron : #CCCCCC !default; +$base : #AAAAAA !default; +$aluminum : #999999 !default; +$jumbo : #888888 !default; +$monsoon : #777777 !default; +$steel : #666666 !default; +$charcoal : #555555 !default; +$tuatara : #444444 !default; +$oil : #333333 !default; +$jet : #222222 !default; +$black : #000000 !default; + +// We use these as default colors throughout +$primary-color: #008CBA !default; // bondi-blue +$secondary-color: #e7e7e7 !default; // white-lilac +$alert-color: #f04124 !default; // cinnabar +$success-color: #43AC6A !default; // sea-green +$warning-color: #f08a24 !default; // carrot +$info-color: #a0d3e8 !default; // cornflower + +// We use these to define default font stacks +$font-family-sans-serif: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif !default; +$font-family-serif: Georgia, Cambria, "Times New Roman", Times, serif !default; +$font-family-monospace: Consolas, "Liberation Mono", Courier, monospace !default; + +// We use these to define default font weights +$font-weight-normal: normal !default; +$font-weight-bold: bold !default; + +// We use these to control various global styles +$body-bg: #fff !default; +$body-font-color: #222 !default; +$body-font-family: $font-family-sans-serif !default; +$body-font-weight: $font-weight-normal !default; +$body-font-style: normal !default; + +// We use this to control font-smoothing +$font-smoothing: antialiased !default; + +// We use these to control text direction settings +$text-direction: ltr !default; +$default-float: left !default; +$opposite-direction: right !default; +@if $text-direction == ltr { + $default-float: left; + $opposite-direction: right; +} @else { + $default-float: right; + $opposite-direction: left; +} + +// We use these to make sure border radius matches unless we want it different. +$global-radius: 3px !default; +$global-rounded: 1000px !default; + +// We use these to control inset shadow shiny edges and depressions. +$shiny-edge-size: 0 1px 0 !default; +$shiny-edge-color: rgba(#fff, .5) !default; +$shiny-edge-active-color: rgba(#000, .2) !default; + +// We use this to control whether or not CSS classes come through in the gem files. +$include-html-classes: true !default; +$include-print-styles: true !default; +$include-js-meta-styles: true !default; // Warning! Meta styles are a dependancy of the Javascript. +$include-html-global-classes: $include-html-classes !default; + +$column-gutter: rem-calc(30) !default; + +// Media Query Ranges +$small-breakpoint: em-calc(640) !default; +$medium-breakpoint: em-calc(1024) !default; +$large-breakpoint: em-calc(1440) !default; +$xlarge-breakpoint: em-calc(1920) !default; + +$small-range: (0, $small-breakpoint) !default; +$medium-range: ($small-breakpoint + em-calc(1), $medium-breakpoint) !default; +$large-range: ($medium-breakpoint + em-calc(1), $large-breakpoint) !default; +$xlarge-range: ($large-breakpoint + em-calc(1), $xlarge-breakpoint) !default; +$xxlarge-range: ($xlarge-breakpoint + em-calc(1), em-calc(99999999)) !default; + +$screen: "only screen" !default; + +$landscape: "#{$screen} and (orientation: landscape)" !default; +$portrait: "#{$screen} and (orientation: portrait)" !default; + +$small-up: $screen !default; +$small-only: "#{$screen} and (max-width: #{upper-bound($small-range)})" !default; + +$medium-up: "#{$screen} and (min-width:#{lower-bound($medium-range)})" !default; +$medium-only: "#{$screen} and (min-width:#{lower-bound($medium-range)}) and (max-width:#{upper-bound($medium-range)})" !default; + +$large-up: "#{$screen} and (min-width:#{lower-bound($large-range)})" !default; +$large-only: "#{$screen} and (min-width:#{lower-bound($large-range)}) and (max-width:#{upper-bound($large-range)})" !default; + +$xlarge-up: "#{$screen} and (min-width:#{lower-bound($xlarge-range)})" !default; +$xlarge-only: "#{$screen} and (min-width:#{lower-bound($xlarge-range)}) and (max-width:#{upper-bound($xlarge-range)})" !default; + +$xxlarge-up: "#{$screen} and (min-width:#{lower-bound($xxlarge-range)})" !default; +$xxlarge-only: "#{$screen} and (min-width:#{lower-bound($xxlarge-range)}) and (max-width:#{upper-bound($xxlarge-range)})" !default; + +$retina: ( + "#{$screen} and (-webkit-min-device-pixel-ratio: 2)", + "#{$screen} and (min--moz-device-pixel-ratio: 2)", + "#{$screen} and (-o-min-device-pixel-ratio: 2/1)", + "#{$screen} and (min-device-pixel-ratio: 2)", + "#{$screen} and (min-resolution: 192dpi)", + "#{$screen} and (min-resolution: 2dppx)" +); + +// Legacy +$small: $medium-up; +$medium: $medium-up; +$large: $large-up; + + +//We use this as cursors values for enabling the option of having custom cursors in the whole site's stylesheet +$cursor-auto-value: auto !default; +$cursor-crosshair-value: crosshair !default; +$cursor-default-value: default !default; +$cursor-disabled-value: not-allowed !default; +$cursor-pointer-value: pointer !default; +$cursor-help-value: help !default; +$cursor-text-value: text !default; + + +@include exports("global") { + + // Meta styles are a dependancy of the Javascript. + // Used to provide media query values for javascript components. + // Forward slash placed around everything to convince PhantomJS to read the value. + + @if $include-js-meta-styles { + + meta.foundation-version { + font-family: "/{{VERSION}}/"; + } + + meta.foundation-mq-small { + font-family: "/" + unquote($small-up) + "/"; + width: lower-bound($small-range); + } + + meta.foundation-mq-small-only { + font-family: "/" + unquote($small-only) + "/"; + width: lower-bound($small-range); + } + + meta.foundation-mq-medium { + font-family: "/" + unquote($medium-up) + "/"; + width: lower-bound($medium-range); + } + + meta.foundation-mq-medium-only { + font-family: "/" + unquote($medium-only) + "/"; + width: lower-bound($medium-range); + } + + meta.foundation-mq-large { + font-family: "/" + unquote($large-up) + "/"; + width: lower-bound($large-range); + } + + meta.foundation-mq-large-only { + font-family: "/" + unquote($large-only) + "/"; + width: lower-bound($large-range); + } + + meta.foundation-mq-xlarge { + font-family: "/" + unquote($xlarge-up) + "/"; + width: lower-bound($xlarge-range); + } + + meta.foundation-mq-xlarge-only { + font-family: "/" + unquote($xlarge-only) + "/"; + width: lower-bound($xlarge-range); + } + + meta.foundation-mq-xxlarge { + font-family: "/" + unquote($xxlarge-up) + "/"; + width: lower-bound($xxlarge-range); + } + + meta.foundation-data-attribute-namespace { + font-family: #{$namespace}; + } + + } + + @if $include-html-global-classes { + + // Must be 100% for off canvas to work + html, body { height: 100%; } + + // Set box-sizing globally to handle padding and border widths + *, + *:before, + *:after { + @include box-sizing(border-box); + } + + html, + body { font-size: $base-font-size; } + + // Default body styles + body { + background: $body-bg; + color: $body-font-color; + cursor: $cursor-auto-value; + font-family: $body-font-family; + font-style: $body-font-style; + font-weight: $body-font-weight; + line-height: $base-line-height; // Set to $base-line-height to take on browser default of 150% + margin: 0; + padding: 0; + position: relative; + } + + a:hover { cursor: $cursor-pointer-value; } + + // Grid Defaults to get images and embeds to work properly + img { max-width: 100%; height: auto; } + + img { -ms-interpolation-mode: bicubic; } + + #map_canvas, + .map_canvas, + .mqa-display { + img, + embed, + object { max-width: none !important; + } + } + + // Miscellaneous useful HTML classes + .left { float: left !important; } + .right { float: right !important; } + .clearfix { @include clearfix; } + + // Hide visually and from screen readers + .hide { + display: none; + } + + // Hide visually and from screen readers, but maintain layout + .invisible { visibility: hidden; } + + // Font smoothing + // Antialiased font smoothing works best for light text on a dark background. + // Apply to single elements instead of globally to body. + // Note this only applies to webkit-based desktop browsers and Firefox 25 (and later) on the Mac. + .antialiased { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } + + // Get rid of gap under images by making them display: inline-block; by default + img { + display: inline-block; + vertical-align: middle; + } + + // + // Global resets for forms + // + + // Make sure textarea takes on height automatically + textarea { height: auto; min-height: 50px; } + + // Make select elements 100% width by default + select { width: 100%; } + } +} diff --git a/themes/foundation5/scss/foundation/components/_grid.scss b/themes/foundation5/scss/foundation/components/_grid.scss new file mode 100644 index 0000000000000000000000000000000000000000..a449af498931feaf072fcb5c4890596bf9bcaaa7 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_grid.scss @@ -0,0 +1,292 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// @variables +// +$include-html-grid-classes: $include-html-classes !default; +$include-xl-html-grid-classes: false !default; + +$row-width: rem-calc(1000) !default; +$total-columns: 12 !default; + +$last-child-float: $opposite-direction !default; + +// +// Grid Functions +// + +// Deprecated: We'll drop support for this in 5.1, use grid-calc() +@function gridCalc($colNumber, $totalColumns) { + @warn "gridCalc() is deprecated, use grid-calc()"; + @return grid-calc($colNumber, $totalColumns); +} + +// @FUNCTION +// $colNumber - Found in settings file +// $totalColumns - Found in settings file +@function grid-calc($colNumber, $totalColumns) { + $result: percentage(($colNumber / $totalColumns)); + @if $result == 0% { $result: 0; } + @return $result; +} + +// +// @mixins +// + +// For creating container, nested, and collapsed rows. +// +// +// $behavior - Any special behavior for this row? Default: false. Options: nest, collapse, nest-collapse, false. +@mixin grid-row($behavior: false) { + + // use @include grid-row(nest); to include a nested row + @if $behavior == nest { + margin: 0 (-($column-gutter/2)); + max-width: none; + width: auto; + } + + // use @include grid-row(collapse); to collapsed a container row margins + @else if $behavior == collapse { + margin: 0; + max-width: $row-width; + width: 100%; + } + + // use @include grid-row(nest-collapse); to collapse outer margins on a nested row + @else if $behavior == nest-collapse { + margin: 0; + max-width: none; + width: auto; + } + + // use @include grid-row; to use a container row + @else { + margin: 0 auto; + max-width: $row-width; + width: 100%; + } + + // Clearfix for all rows + @include clearfix(); +} + +// Creates a column, should be used inside of a media query to control layouts +// +// $columns - The number of columns this should be +// $last-column - Is this the last column? Default: false. +// $center - Center these columns? Default: false. +// $offset - # of columns to offset. Default: false. +// $push - # of columns to push. Default: false. +// $pull - # of columns to pull. Default: false. +// $collapse - Get rid of gutter padding on column? Default: false. +// $float - Should this float? Default: true. Options: true, false, left, right. +@mixin grid-column( + $columns:false, + $last-column:false, + $center:false, + $offset:false, + $push:false, + $pull:false, + $collapse:false, + $float:true, + $position:false) { + + // If positioned for default .column, include relative position + // push and pull require position set + @if $position or $push or $pull { + position: relative; + } + + // If collapsed, get rid of gutter padding + @if $collapse { + padding-left: 0; + padding-right: 0; + } + + // Gutter padding whenever a column isn't set to collapse + // (use $collapse:null to do nothing) + @else if $collapse == false { + padding-left: ($column-gutter / 2); + padding-right: ($column-gutter / 2); + } + + // If a column number is given, calculate width + @if $columns { + width: grid-calc($columns, $total-columns); + + // If last column, float naturally instead of to the right + @if $last-column { float: $opposite-direction; } + } + + // Source Ordering, adds left/right depending on which you use. + @if $push { #{$default-float}: grid-calc($push, $total-columns); #{$opposite-direction}: auto; } + @if $pull { #{$opposite-direction}: grid-calc($pull, $total-columns); #{$default-float}: auto; } + + @if $float and $last-column == false { + @if $float == left or $float == true { float: $default-float; } + @else if $float == right { float: $opposite-direction; } + @else { float: none; } + } + + // If centered, get rid of float and add appropriate margins + @if $center { + margin-#{$default-float}: auto; + margin-#{$opposite-direction}: auto; + float: none; + } + + // If offset, calculate appropriate margins + @if $offset { margin-#{$default-float}: grid-calc($offset, $total-columns) !important; } + +} + +// Create presentational classes for grid +// +// $size - Name of class to use, i.e. "large" will generate .large-1, .large-2, etc. +@mixin grid-html-classes($size) { + + @for $i from 0 through $total-columns - 1 { + .#{$size}-push-#{$i} { + @include grid-column($push:$i, $collapse:null, $float:false); + } + .#{$size}-pull-#{$i} { + @include grid-column($pull:$i, $collapse:null, $float:false); + } + } + + .column, + .columns { @include grid-column($columns:false, $position:true); } + + + @for $i from 1 through $total-columns { + .#{$size}-#{$i} { @include grid-column($columns:$i, $collapse:null, $float:false); } + } + + @for $i from 0 through $total-columns - 1 { + .#{$size}-offset-#{$i} { @include grid-column($offset:$i, $collapse:null, $float:false); } + } + + .#{$size}-reset-order { + float: $default-float; + left: auto; + margin-#{$default-float}: 0; + margin-#{$opposite-direction}: 0; + right: auto; + } + + .column.#{$size}-centered, + .columns.#{$size}-centered { @include grid-column($center:true, $collapse:null, $float:false); } + + .column.#{$size}-uncentered, + .columns.#{$size}-uncentered { + float: $default-float; + margin-#{$default-float}: 0; + margin-#{$opposite-direction}: 0; + } + + // Fighting [class*="column"] + [class*="column"]:last-child + .column.#{$size}-centered:last-child, + .columns.#{$size}-centered:last-child{ + float: none; + } + + // Fighting .column.<previous-size>-centered:last-child + .column.#{$size}-uncentered:last-child, + .columns.#{$size}-uncentered:last-child { + float: $default-float; + } + + .column.#{$size}-uncentered.opposite, + .columns.#{$size}-uncentered.opposite { + float: $opposite-direction; + } + + .row { + &.#{$size}-collapse { + > .column, + > .columns { @include grid-column($collapse:true, $float:false); } + + .row {margin-left:0; margin-right:0;} + } + &.#{$size}-uncollapse { + > .column, + > .columns { + @include grid-column; + } + } + } +} + +@include exports("grid") { + @if $include-html-grid-classes { + .row { + @include grid-row; + + &.collapse { + > .column, + > .columns { @include grid-column($collapse:true, $float:false); } + + .row {margin-left:0; margin-right:0;} + } + + .row { @include grid-row($behavior:nest); + &.collapse { @include grid-row($behavior:nest-collapse); } + } + } + + .column, + .columns { @include grid-column($columns:$total-columns); } + + .column, + .columns { + & + &:last-child { + float: $last-child-float; + } + & + &.end { + float: $default-float; + } + } + + @media #{$small-up} { + @include grid-html-classes($size:small); + } + + @media #{$medium-up} { + @include grid-html-classes($size:medium); + // Old push and pull classes + @for $i from 0 through $total-columns - 1 { + .push-#{$i} { + @include grid-column($push:$i, $collapse:null, $float:false); + } + .pull-#{$i} { + @include grid-column($pull:$i, $collapse:null, $float:false); + } + } + } + @media #{$large-up} { + @include grid-html-classes($size:large); + @for $i from 0 through $total-columns - 1 { + .push-#{$i} { + @include grid-column($push:$i, $collapse:null, $float:false); + } + .pull-#{$i} { + @include grid-column($pull:$i, $collapse:null, $float:false); + } + } + } + } + @if $include-xl-html-grid-classes { + @media #{$xlarge-up} { + @include grid-html-classes($size:xlarge); + } + @media #{$xxlarge-up} { + @include grid-html-classes($size:xxlarge); + } + } +} diff --git a/themes/foundation5/scss/foundation/components/_icon-bar.scss b/themes/foundation5/scss/foundation/components/_icon-bar.scss new file mode 100644 index 0000000000000000000000000000000000000000..6ca01dabaf4ca5ade0d7319cbfcc338fe765afc4 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_icon-bar.scss @@ -0,0 +1,460 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + + +// @name +// @dependencies _global.scss + +$include-html-icon-bar-classes: $include-html-classes !default; + +// @variables + +// We use these to style the icon-bar and items +$icon-bar-bg: $oil !default; +$icon-bar-font-color: $white !default; +$icon-bar-font-color-hover: $icon-bar-font-color !default; +$icon-bar-font-size: 1rem !default; +$icon-bar-hover-color: $primary-color !default; +$icon-bar-icon-color: $white !default; +$icon-bar-icon-color-hover: $icon-bar-icon-color !default; +$icon-bar-icon-size: 1.875rem !default; +$icon-bar-image-width: 1.875rem !default; +$icon-bar-image-height: 1.875rem !default; +$icon-bar-active-color: $primary-color !default; +$icon-bar-item-padding: 1.25rem !default; + +// We use this to set default opacity and cursor for disabled icons. +$icon-bar-disabled-opacity: .7 !default; +$icon-bar-disabled-cursor: $cursor-disabled-value !default; + + +// +// @mixins +// + +// We use this mixin to create the base styles for our Icon bar element. +// +@mixin icon-bar-base() { + display: inline-block; + font-size: 0; + width: 100%; + + > * { + display: block; + float: left; + font-size: $icon-bar-font-size; + margin: 0 auto; + padding: $icon-bar-item-padding; + text-align: center; + width: 25%; + + i, img { + display: block; + margin: 0 auto; + + & + label { + margin-top: .0625rem; + } + } + + i { + font-size: $icon-bar-icon-size; + vertical-align: middle; + } + + img { + height: $icon-bar-image-height; + width: $icon-bar-image-width; + } + } + + &.label-right > * { + + i, img { + display: inline-block; + margin: 0 .0625rem 0 0; + + & + label { + margin-top: 0; + } + } + + label { display: inline-block; } + } + + &.vertical.label-right > * { + text-align: left; + } + + &.vertical, &.small-vertical{ + height: 100%; + width: auto; + + .item { + float: none; + margin: auto; + width: auto; + } + } + + &.medium-vertical { + @media #{$medium-up} { + height: 100%; + width: auto; + + .item { + float: none; + margin: auto; + width: auto; + } + } + } + &.large-vertical { + @media #{$large-up} { + height: 100%; + width: auto; + + .item { + float: none; + margin: auto; + width: auto; + } + } + } +} + +// We use this mixin to create the size styles for icon bars. +@mixin icon-bar-size( + $padding: $icon-bar-item-padding, + $font-size: $icon-bar-font-size, + $icon-size: $icon-bar-icon-size, + $image-width: $icon-bar-image-width, + $image-height: $icon-bar-image-height) { + + > * { + font-size: $font-size; + padding: $padding; + + i, img { + + & + label { + margin-top: .0625rem; + font-size: $font-size; + } + } + + i { + font-size: $icon-size; + } + + img { + height: $image-height; + width: $image-width; + } + } + +} + +@mixin icon-bar-style( + $bar-bg:$icon-bar-bg, + $bar-font-color:$icon-bar-font-color, + $bar-font-color-hover:$icon-bar-font-color-hover, + $bar-hover-color:$icon-bar-hover-color, + $bar-icon-color:$icon-bar-icon-color, + $bar-icon-color-hover:$icon-bar-icon-color-hover, + $bar-active-color:$icon-bar-active-color, + $base-style:true, + $disabled:false) { + + @if $base-style { + + background: $bar-bg; + + > * { + label { color: $bar-font-color; } + + i { color: $bar-icon-color; } + } + + > a:hover { + + background: $bar-hover-color; + + label { color: $bar-font-color-hover; } + + i { color: $bar-icon-color-hover; } + } + + > a.active { + + background: $bar-active-color; + + label { color: $bar-font-color-hover; } + + i { color: $bar-icon-color-hover; } + } + } + @if $disabled { + .item.disabled { + cursor: $icon-bar-disabled-cursor; + opacity: $icon-bar-disabled-opacity; + pointer-events: none; + >* { + opacity: $icon-bar-disabled-opacity; + cursor: $icon-bar-disabled-cursor; + } + } + } + +} + +// We use this to quickly create icon bars with a single mixin +// $height - The overall calculated height of the icon bar (horizontal) +// $bar-bg - the background color of the bar +// $bar-font-color - the font color +// $bar-hover-color - okay these are pretty obvious variables +// $bar-icon-color - maybe we could skip explaining them all? Okay this one does change icon color if you use an icon font +// $bar-active-color - the color of an active / hover state +// $base-style - Apply base styles? Default: true. +// $disabled - Allow disabled icons? Default: false. + +@mixin icon-bar( + $bar-bg:$icon-bar-bg, + $bar-font-color:$icon-bar-font-color, + $bar-font-color-hover:$icon-bar-font-color-hover, + $bar-hover-color:$icon-bar-hover-color, + $bar-icon-color:$icon-bar-icon-color, + $bar-icon-color-hover:$icon-bar-icon-color-hover, + $bar-active-color:$icon-bar-active-color, + $padding: $icon-bar-item-padding, + $font-size: $icon-bar-font-size, + $icon-size: $icon-bar-icon-size, + $image-width: $icon-bar-image-width, + $image-height: $icon-bar-image-height, + $base-style:true, + $disabled:true) { + @include icon-bar-base(); + @include icon-bar-size($padding, $font-size, $icon-size, $image-width, $image-height); + @include icon-bar-style($bar-bg, $bar-font-color, $bar-font-color-hover, $bar-hover-color, $bar-icon-color, $bar-icon-color-hover, $bar-active-color, $base-style, $disabled); + + // Counts + + &.two-up { + .item { width: 50%; } + &.vertical .item, &.small-vertical .item { width: auto; } + &.medium-vertical .item { + @media #{$medium-up} { + width: auto; + } + } + &.large-vertical .item { + @media #{$large-up} { + width: auto; + } + } + } + &.three-up { + .item { width: 33.3333%; } + &.vertical .item, &.small-vertical .item { width: auto; } + &.medium-vertical .item { + @media #{$medium-up} { + width: auto; + } + } + &.large-vertical .item { + @media #{$large-up} { + width: auto; + } + } + } + &.four-up { + .item { width: 25%; } + &.vertical .item, &.small-vertical .item { width: auto; } + &.medium-vertical .item { + @media #{$medium-up} { + width: auto; + } + } + &.large-vertical .item { + @media #{$large-up} { + width: auto; + } + } + } + &.five-up { + .item { width: 20%; } + &.vertical .item, &.small-vertical .item { width: auto; } + &.medium-vertical .item { + @media #{$medium-up} { + width: auto; + } + } + &.large-vertical .item { + @media #{$large-up} { + width: auto; + } + } + } + &.six-up { + .item { width: 16.66667%; } + &.vertical .item, &.small-vertical .item { width: auto; } + &.medium-vertical .item { + @media #{$medium-up} { + width: auto; + } + } + &.large-vertical .item { + @media #{$large-up} { + width: auto; + } + } + } + &.seven-up { + .item { width: 14.28571%; } + &.vertical .item, &.small-vertical .item { width: auto; } + &.medium-vertical .item { + @media #{$medium-up} { + width: auto; + } + } + &.large-vertical .item { + @media #{$large-up} { + width: auto; + } + } + } + &.eight-up { + .item { width: 12.5%; } + &.vertical .item, &.small-vertical .item { width: auto; } + &.medium-vertical .item { + @media #{$medium-up} { + width: auto; + } + } + &.large-vertical .item { + @media #{$large-up} { + width: auto; + } + } + } +} + +@include exports("icon-bar") { + @if $include-html-icon-bar-classes { + .icon-bar { + @include icon-bar; + } + } +} + +@if $include-html-icon-bar-classes { + + // toolbar styles + + .icon-bar { + + // Counts + + &.two-up { + .item { width: 50%; } + &.vertical .item, &.small-vertical .item { width: auto; } + &.medium-vertical .item { + @media #{$medium-up} { + width: auto; + } + } + &.large-vertical .item { + @media #{$large-up} { + width: auto; + } + } + } + &.three-up { + .item { width: 33.3333%; } + &.vertical .item, &.small-vertical .item { width: auto; } + &.medium-vertical .item { + @media #{$medium-up} { + width: auto; + } + } + &.large-vertical .item { + @media #{$large-up} { + width: auto; + } + } + } + &.four-up { + .item { width: 25%; } + &.vertical .item, &.small-vertical .item { width: auto; } + &.medium-vertical .item { + @media #{$medium-up} { + width: auto; + } + } + &.large-vertical .item { + @media #{$large-up} { + width: auto; + } + } + } + &.five-up { + .item { width: 20%; } + &.vertical .item, &.small-vertical .item { width: auto; } + &.medium-vertical .item { + @media #{$medium-up} { + width: auto; + } + } + &.large-vertical .item { + @media #{$large-up} { + width: auto; + } + } + } + &.six-up { + .item { width: 16.66667%; } + &.vertical .item, &.small-vertical .item { width: auto; } + &.medium-vertical .item { + @media #{$medium-up} { + width: auto; + } + } + &.large-vertical .item { + @media #{$large-up} { + width: auto; + } + } + } + &.seven-up { + .item { width: 14.28571%; } + &.vertical .item, &.small-vertical .item { width: auto; } + &.medium-vertical .item { + @media #{$medium-up} { + width: auto; + } + } + &.large-vertical .item { + @media #{$large-up} { + width: auto; + } + } + } + &.eight-up { + .item { width: 12.5%; } + &.vertical .item, &.small-vertical .item { width: auto; } + &.medium-vertical .item { + @media #{$medium-up} { + width: auto; + } + } + &.large-vertical .item { + @media #{$large-up} { + width: auto; + } + } + } + } +} diff --git a/themes/foundation5/scss/foundation/components/_inline-lists.scss b/themes/foundation5/scss/foundation/components/_inline-lists.scss new file mode 100644 index 0000000000000000000000000000000000000000..a75c5d830940e38c422cef2b63b89298df6cfdf5 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_inline-lists.scss @@ -0,0 +1,57 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// @variables +// +$include-html-inline-list-classes: $include-html-classes !default; + +// We use this to control the margins and padding of the inline list. +$inline-list-top-margin: 0 !default; +$inline-list-opposite-margin: 0 !default; +$inline-list-bottom-margin: rem-calc(17) !default; +$inline-list-default-float-margin: rem-calc(-22) !default; +$inline-list-default-float-list-margin: rem-calc(22) !default; + +$inline-list-padding: 0 !default; + +// We use this to control the overflow of the inline list. +$inline-list-overflow: hidden !default; + +// We use this to control the list items +$inline-list-display: block !default; + +// We use this to control any elements within list items +$inline-list-children-display: block !default; + +// +// @mixins +// +// We use this mixin to create inline lists +@mixin inline-list { + list-style: none; + margin-#{$default-float}: $inline-list-default-float-margin; + margin-#{$opposite-direction}: $inline-list-opposite-margin; + margin: $inline-list-top-margin auto $inline-list-bottom-margin auto; + overflow: $inline-list-overflow; + padding: $inline-list-padding; + + > li { + display: $inline-list-display; + float: $default-float; + list-style: none; + margin-#{$default-float}: $inline-list-default-float-list-margin; + > * { display: $inline-list-children-display; } + } +} + +@include exports("inline-list") { + @if $include-html-inline-list-classes { + .inline-list { + @include inline-list(); + } + } +} diff --git a/themes/foundation5/scss/foundation/components/_joyride.scss b/themes/foundation5/scss/foundation/components/_joyride.scss new file mode 100644 index 0000000000000000000000000000000000000000..cea07d3ba9ef35193eba89449d14dd15d9f3bd8c --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_joyride.scss @@ -0,0 +1,220 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// @variables +// +$include-html-joyride-classes: $include-html-classes !default; + +// Controlling default Joyride styles +$joyride-tip-bg: $oil !default; +$joyride-tip-default-width: 300px !default; +$joyride-tip-padding: rem-calc(18 20 24) !default; +$joyride-tip-border: solid 1px $charcoal !default; +$joyride-tip-radius: 4px !default; +$joyride-tip-position-offset: 22px !default; + +// Here, we're setting the tip font styles +$joyride-tip-font-color: $white !default; +$joyride-tip-font-size: rem-calc(14) !default; +$joyride-tip-header-weight: $font-weight-bold !default; + +// This changes the nub size +$joyride-tip-nub-size: 10px !default; + +// This adjusts the styles for the timer when its enabled +$joyride-tip-timer-width: 50px !default; +$joyride-tip-timer-height: 3px !default; +$joyride-tip-timer-color: $steel !default; + +// This changes up the styles for the close button +$joyride-tip-close-color: $monsoon !default; +$joyride-tip-close-size: 24px !default; +$joyride-tip-close-weight: $font-weight-normal !default; + +// When Joyride is filling the screen, we use this style for the bg +$joyride-screenfill: rgba(0,0,0,0.5) !default; + + +// We decided not to make a mixin for this because it relies on +// predefined classes to work properly. +@include exports("joyride") { + @if $include-html-joyride-classes { + + /* Foundation Joyride */ + .joyride-list { display: none; } + + /* Default styles for the container */ + .joyride-tip-guide { + background: $joyride-tip-bg; + color: $joyride-tip-font-color; + display: none; + font-family: inherit; + font-weight: $font-weight-normal; + position: absolute; + top: 0; + width: 95%; + z-index: 101; + #{$default-float}: 2.5%; + } + + .lt-ie9 .joyride-tip-guide { + margin-#{$default-float}: -400px; + max-width: 800px; + #{$default-float}: 50%; + } + + .joyride-content-wrapper { + padding: $joyride-tip-padding; + width: 100%; + + .button { margin-bottom: 0 !important; } + + .joyride-prev-tip { margin-right: 10px; } + } + + /* Add a little css triangle pip, older browser just miss out on the fanciness of it */ + .joyride-tip-guide { + .joyride-nub { + border: $joyride-tip-nub-size solid $joyride-tip-bg; + display: block; + height: 0; + position: absolute; + width: 0; + #{$default-float}: $joyride-tip-position-offset; + + &.top { + border-color: $joyride-tip-bg; + border-top-color: transparent !important; + border-top-style: solid; + border-#{$default-float}-color: transparent !important; + border-#{$opposite-direction}-color: transparent !important; + top: -($joyride-tip-nub-size*2); + } + &.bottom { + border-color: $joyride-tip-bg !important; + border-bottom-color: transparent !important; + border-bottom-style: solid; + border-#{$default-float}-color: transparent !important; + border-#{$opposite-direction}-color: transparent !important; + bottom: -($joyride-tip-nub-size*2); + } + + &.right { right: -($joyride-tip-nub-size*2); } + &.left { left: -($joyride-tip-nub-size*2); } + } + } + + /* Typography */ + .joyride-tip-guide h1, + .joyride-tip-guide h2, + .joyride-tip-guide h3, + .joyride-tip-guide h4, + .joyride-tip-guide h5, + .joyride-tip-guide h6 { + color: $joyride-tip-font-color; + font-weight: $joyride-tip-header-weight; + line-height: 1.25; + margin: 0; + } + .joyride-tip-guide p { + font-size: $joyride-tip-font-size; + line-height: 1.3; + margin: rem-calc(0 0 18 0); + } + + .joyride-timer-indicator-wrap { + border: $joyride-tip-border; + bottom: rem-calc(16); + height: $joyride-tip-timer-height; + position: absolute; + width: $joyride-tip-timer-width; + #{$opposite-direction}: rem-calc(17); + } + .joyride-timer-indicator { + background: $joyride-tip-timer-color; + display: block; + height: inherit; + width: 0; + } + + .joyride-close-tip { + color: $joyride-tip-close-color !important; + font-size: $joyride-tip-close-size; + font-weight: $joyride-tip-close-weight; + line-height: .5 !important; + position: absolute; + text-decoration: none; + top: 10px; + #{$opposite-direction}: 12px; + + &:hover, + &:focus { color: $smoke !important; } + } + + .joyride-modal-bg { + background: $joyride-screenfill; + cursor: $cursor-pointer-value; + display: none; + height: 100%; + position: fixed; + top: 0; + width: 100%; + z-index: 100; + #{$default-float}: 0; + } + + .joyride-expose-wrapper { + background-color: $white; + border-radius: 3px; + box-shadow: 0 0 15px $white; + position: absolute; + z-index: 102; + } + + .joyride-expose-cover { + background: transparent; + border-radius: 3px; + left: 0; + position: absolute; + top: 0; + z-index: 9999; + } + + + /* Styles for screens that are at least 768px; */ + @media #{$small} { + .joyride-tip-guide { width: $joyride-tip-default-width; #{$default-float}: inherit; + .joyride-nub { + &.bottom { + border-color: $joyride-tip-bg !important; + border-bottom-color: transparent !important; + border-#{$default-float}-color: transparent !important; + border-#{$opposite-direction}-color: transparent !important; + bottom: -($joyride-tip-nub-size*2); + } + &.right { + border-color: $joyride-tip-bg !important; + border-right-color: transparent !important; border-bottom-color: transparent !important; + border-top-color: transparent !important; + left: auto; + right: -($joyride-tip-nub-size*2); + top: $joyride-tip-position-offset; + } + &.left { + border-color: $joyride-tip-bg !important; + border-bottom-color: transparent !important; + border-left-color: transparent !important; + border-top-color: transparent !important; + left: -($joyride-tip-nub-size*2); + right: auto; + top: $joyride-tip-position-offset; + } + } + } + } + } +} diff --git a/themes/foundation5/scss/foundation/components/_keystrokes.scss b/themes/foundation5/scss/foundation/components/_keystrokes.scss new file mode 100644 index 0000000000000000000000000000000000000000..28076df170efb18a754c915abf8a90141a64314b --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_keystrokes.scss @@ -0,0 +1,60 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// @variables +// +$include-html-keystroke-classes: $include-html-classes !default; + +// We use these to control text styles. +$keystroke-font: "Consolas", "Menlo", "Courier", monospace !default; +$keystroke-font-size: inherit !default; +$keystroke-font-color: $jet !default; +$keystroke-font-color-alt: $white !default; +$keystroke-function-factor: -7% !default; + +// We use this to control keystroke padding. +$keystroke-padding: rem-calc(2 4 0) !default; + +// We use these to control background and border styles. +$keystroke-bg: scale-color($white, $lightness: $keystroke-function-factor) !default; +$keystroke-border-style: solid !default; +$keystroke-border-width: 1px !default; +$keystroke-border-color: scale-color($keystroke-bg, $lightness: $keystroke-function-factor) !default; +$keystroke-radius: $global-radius !default; + +// +// @mixins +// +// We use this mixin to create keystroke styles. +// $bg - Default: $keystroke-bg || scale-color($white, $lightness: $keystroke-function-factor) !default; +@mixin keystroke($bg:$keystroke-bg) { + // This find the lightness percentage of the background color. + $bg-lightness: lightness($bg); + background-color: $bg; + border-color: scale-color($bg, $lightness: $keystroke-function-factor); + + // We adjust the font color based on the brightness of the background. + @if $bg-lightness > 70% { color: $keystroke-font-color; } + @else { color: $keystroke-font-color-alt; } + + border-style: $keystroke-border-style; + border-width: $keystroke-border-width; + font-family: $keystroke-font; + font-size: $keystroke-font-size; + margin: 0; + padding: $keystroke-padding; +} + +@include exports("keystroke") { + @if $include-html-keystroke-classes { + .keystroke, + kbd { + @include keystroke; + @include radius($keystroke-radius); + } + } +} diff --git a/themes/foundation5/scss/foundation/components/_labels.scss b/themes/foundation5/scss/foundation/components/_labels.scss new file mode 100644 index 0000000000000000000000000000000000000000..770d82fa6f110f3fac4dc302169c93a3c70a2a98 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_labels.scss @@ -0,0 +1,106 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// @variables +// +$include-html-label-classes: $include-html-classes !default; + +// We use these to style the labels +$label-padding: rem-calc(4 8 4) !default; +$label-radius: $global-radius !default; + +// We use these to style the label text +$label-font-sizing: rem-calc(11) !default; +$label-font-weight: $font-weight-normal !default; +$label-font-color: $oil !default; +$label-font-color-alt: $white !default; +$label-font-family: $body-font-family !default; + +// +// @mixins +// +// We use this mixin to create a default label base. +@mixin label-base { + display: inline-block; + font-family: $label-font-family; + font-weight: $label-font-weight; + line-height: 1; + margin-bottom: auto; + position: relative; + text-align: center; + text-decoration: none; + white-space: nowrap; +} + +// @mixins +// +// We use this mixin to add label size styles. +// $padding - Used to determine label padding. Default: $label-padding || rem-calc(4 8 4) !default +// $text-size - Used to determine label text-size. Default: $text-size found in settings +@mixin label-size($padding:$label-padding, $text-size:$label-font-sizing) { + @if $padding { padding: $padding; } + @if $text-size { font-size: $text-size; } +} + +// @mixins +// +// We use this mixin to add label styles. +// $bg - Default: $primary-color (found in settings file) +// $radius - Default: false, Options: true, sets radius to $global-radius (found in settings file) +@mixin label-style($bg:$primary-color, $radius:false) { + + // We control which background color comes through + @if $bg { + + // This find the lightness percentage of the background color. + $bg-lightness: lightness($bg); + + background-color: $bg; + + // We control the text color for you based on the background color. + @if $bg-lightness < 70% { color: $label-font-color-alt; } + @else { color: $label-font-color; } + } + + // We use this to control the radius on labels. + @if $radius == true { @include radius($label-radius); } + @else if $radius { @include radius($radius); } + +} + +// @mixins +// +// We use this to add close buttons to alerts +// $padding - Default: $label-padding, +// $text-size - Default: $label-font-sizing, +// $bg - Default: $primary-color(found in settings file) +// $radius - Default: false, Options: true which sets radius to $global-radius (found in settings file) +@mixin label($padding:$label-padding, $text-size:$label-font-sizing, $bg:$primary-color, $radius:false) { + + @include label-base; + @include label-size($padding, $text-size); + @include label-style($bg, $radius); +} + +@include exports("label") { + @if $include-html-label-classes { + .label { + @include label-base; + @include label-size; + @include label-style; + + &.radius { @include label-style(false, true); } + &.round { @include label-style(false, $radius:1000px); } + + &.alert { @include label-style($alert-color); } + &.warning { @include label-style($warning-color); } + &.success { @include label-style($success-color); } + &.secondary { @include label-style($secondary-color); } + &.info { @include label-style($info-color); } + } + } +} diff --git a/themes/foundation5/scss/foundation/components/_magellan.scss b/themes/foundation5/scss/foundation/components/_magellan.scss new file mode 100644 index 0000000000000000000000000000000000000000..b06a18b9cbb0c5c660ce1cb733e3c8b6fc6fd083 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_magellan.scss @@ -0,0 +1,34 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// @variables +// +$include-html-magellan-classes: $include-html-classes !default; + +$magellan-bg: $white !default; +$magellan-padding: 10px !default; + +@include exports("magellan") { + @if $include-html-magellan-classes { + + #{data('magellan-expedition')}, #{data('magellan-expedition-clone')} { + background: $magellan-bg; + min-width: 100%; + padding: $magellan-padding; + z-index: 50; + + .sub-nav { + margin-bottom: 0; + dd { margin-bottom: 0; } + a { + line-height: 1.8em; + } + } + } + + } +} diff --git a/themes/foundation5/scss/foundation/components/_offcanvas.scss b/themes/foundation5/scss/foundation/components/_offcanvas.scss new file mode 100644 index 0000000000000000000000000000000000000000..f23da55c00437ff1fb5e1edcfdf4b152c6f6e288 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_offcanvas.scss @@ -0,0 +1,518 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; +@import 'type'; + +// Off Canvas Tab Bar Variables +$include-html-off-canvas-classes: $include-html-classes !default; + +$tabbar-bg: $oil !default; +$tabbar-height: rem-calc(45) !default; +$tabbar-icon-width: $tabbar-height !default; +$tabbar-line-height: $tabbar-height !default; +$tabbar-color: $white !default; +$tabbar-middle-padding: 0 rem-calc(10) !default; + +// Off Canvas Divider Styles +$tabbar-left-section-border: solid 1px scale-color($tabbar-bg, $lightness: -50%) !default; +$tabbar-right-section-border: $tabbar-left-section-border; + + +// Off Canvas Tab Bar Headers +$tabbar-header-color: $white !default; +$tabbar-header-weight: $font-weight-bold !default; +$tabbar-header-line-height: $tabbar-height !default; +$tabbar-header-margin: 0 !default; + +// Off Canvas Menu Variables +$off-canvas-width: rem-calc(250) !default; +$off-canvas-bg: $oil !default; +$off-canvas-bg-hover: scale-color($tabbar-bg, $lightness: -30%) !default; +$off-canvas-bg-active: scale-color($tabbar-bg, $lightness: -30%) !default; + +// Off Canvas Menu List Variables +$off-canvas-label-padding: .3rem rem-calc(15) !default; +$off-canvas-label-color: $aluminum !default; +$off-canvas-label-text-transform: uppercase !default; +$off-canvas-label-font-size: rem-calc(12) !default; +$off-canvas-label-font-weight: $font-weight-bold !default; +$off-canvas-label-bg: $tuatara !default; +$off-canvas-label-border-top: 1px solid scale-color($off-canvas-label-bg, $lightness: 14%) !default; +$off-canvas-label-border-bottom: none !default; +$off-canvas-label-margin:0 !default; +$off-canvas-link-padding: rem-calc(10, 15) !default; +$off-canvas-link-color: rgba($white, .7) !default; +$off-canvas-link-border-bottom: 1px solid scale-color($off-canvas-bg, $lightness: -25%) !default; +$off-canvas-back-bg: #444 !default; +$off-canvas-back-border-top: $off-canvas-label-border-top !default; +$off-canvas-back-border-bottom: $off-canvas-label-border-bottom !default; +$off-canvas-back-hover-bg: scale-color($off-canvas-back-bg, $lightness: -30%) !default; +$off-canvas-back-hover-border-top: 1px solid scale-color($off-canvas-label-bg, $lightness: 14%) !default; +$off-canvas-back-hover-border-bottom: none !default; + +// Off Canvas Menu Icon Variables +$tabbar-menu-icon-color: $white !default; +$tabbar-menu-icon-hover: scale-color($tabbar-menu-icon-color, $lightness: -30%) !default; + +$tabbar-menu-icon-text-indent: rem-calc(35) !default; +$tabbar-menu-icon-width: $tabbar-icon-width !default; +$tabbar-menu-icon-height: $tabbar-height !default; +$tabbar-menu-icon-padding: 0 !default; + +$tabbar-hamburger-icon-width: rem-calc(16) !default; +$tabbar-hamburger-icon-left: false !default; +$tabbar-hamburger-icon-top: false !default; +$tabbar-hamburger-icon-thickness: 1px !default; +$tabbar-hamburger-icon-gap: 6px !default; + +// Off Canvas Back-Link Overlay +$off-canvas-overlay-transition: background 300ms ease !default; +$off-canvas-overlay-cursor: pointer !default; +$off-canvas-overlay-box-shadow: -4px 0 4px rgba($black, .5), 4px 0 4px rgba($black, .5) !default; +$off-canvas-overlay-background: rgba($white, .2) !default; +$off-canvas-overlay-background-hover: rgba($white, .05) !default; + +// Transition Variables +$menu-slide: "transform 500ms ease" !default; + + +// MIXINS +// Remove transition flicker on phones +@mixin kill-flicker { + // -webkit-transform: translateZ(0x); + -webkit-backface-visibility: hidden; +} + +// Basic properties for the content wraps +@mixin wrap-base { + position: relative; + width: 100%; +} + +@mixin translate3d($tx, $ty, $tz) { + -webkit-transform: translate3d($tx, $ty, $tz); + -moz-transform: translate3d($tx, $ty, $tz); + -ms-transform: translate($tx, $ty); + -ms-transform: translate3d($tx, $ty, $tz); + -o-transform: translate3d($tx, $ty, $tz); + transform: translate3d($tx, $ty, $tz) +} + +// basic styles for off-canvas menu container +@mixin off-canvas-menu($position) { + @include kill-flicker; + * { @include kill-flicker; } + background: $off-canvas-bg; + bottom: 0; + box-sizing: content-box; + -webkit-overflow-scrolling: touch; + -ms-overflow-style: -ms-autohiding-scrollbar; + overflow-x: hidden; + overflow-y: auto; + position: absolute; + top: 0; + transition: transform 500ms ease 0s; + width: $off-canvas-width; + z-index: 1001; + + @if $position == left { + @include translate3d(-100%,0,0); + left: 0; + } + @if $position == right { + @include translate3d(100%,0,0); + right: 0; + } +} + +// OFF CANVAS WRAP +// Wrap visible content and prevent scroll bars +@mixin off-canvas-wrap { + @include kill-flicker; + @include wrap-base; + overflow: hidden; + &.move-right, + &.move-left { min-height: 100%; -webkit-overflow-scrolling: touch; } +} + +// INNER WRAP +// Main content area that moves to reveal the off-canvas nav +@mixin inner-wrap { + // @include kill-flicker; + // removed for now till chrome fixes backface issue + @include wrap-base; + @include clearfix; + -webkit-transition: -webkit-#{$menu-slide}; + -moz-transition: -moz-#{$menu-slide}; + -ms-transition: -ms-#{$menu-slide}; + -o-transition: -o-#{$menu-slide}; + transition: #{$menu-slide}; +} + +// TAB BAR +// This is the tab bar base +@mixin tab-bar-base { + @include kill-flicker; + + // base styles + background: $tabbar-bg; + color: $tabbar-color; + height: $tabbar-height; + line-height: $tabbar-line-height; + + // make sure it's below the .exit-off-canvas link + position: relative; + // z-index: 999; + + // Typography + h1, h2, h3, h4, h5, h6 { + color: $tabbar-header-color; + font-weight: $tabbar-header-weight; + line-height: $tabbar-header-line-height; + margin: $tabbar-header-margin; + } + h1, h2, h3, h4 { font-size: $h5-font-size; } +} + +// SMALL SECTIONS +// These are small sections on the left and right that contain the off-canvas toggle buttons; +@mixin tabbar-small-section($position) { + height: $tabbar-height; + position: absolute; + top: 0; + width: $tabbar-icon-width; + @if $position == left { + border-right: $tabbar-left-section-border; + // box-shadow: 1px 0 0 scale-color($tabbar-bg, $lightness: 13%); + left: 0; + } + @if $position == right { + border-left: $tabbar-right-section-border; + // box-shadow: -1px 0 0 scale-color($tabbar-bg, $lightness: -50%); + right:0; + } +} + +@mixin tab-bar-section { + height: $tabbar-height; + padding: $tabbar-middle-padding; + position: absolute; + text-align: center; + top: 0; + &.left { text-align: left; } + &.right { text-align: right; } + + + // still need to make these non-presentational + &.left { + left: 0; + right: $tabbar-icon-width; + } + &.right { + left: $tabbar-icon-width; + right: 0; + } + &.middle { + left: $tabbar-icon-width; + right: $tabbar-icon-width; + } +} + +// OFF CANVAS LIST +// This is the list of links in the off-canvas menu +@mixin off-canvas-list { + list-style-type: none; + margin:0; + padding:0; + + li { + label { + background: $off-canvas-label-bg; + border-bottom: $off-canvas-label-border-bottom; + border-top: $off-canvas-label-border-top; + color: $off-canvas-label-color; + display: block; + font-size: $off-canvas-label-font-size; + font-weight: $off-canvas-label-font-weight; + margin: $off-canvas-label-margin; + padding: $off-canvas-label-padding; + text-transform: $off-canvas-label-text-transform; + } + a { + border-bottom: $off-canvas-link-border-bottom; + color: $off-canvas-link-color; + display: block; + padding: $off-canvas-link-padding; + transition: background 300ms ease; + &:hover { + background: $off-canvas-bg-hover; + } + &:active { + background: $off-canvas-bg-active; + } + } + } + +} + +// BACK LINK +// This is an overlay that, when clicked, will toggle off the off canvas menu +@mixin back-link { + @include kill-flicker; + + box-shadow: $off-canvas-overlay-box-shadow; + cursor: $off-canvas-overlay-cursor; + transition: $off-canvas-overlay-transition; + + // fill the screen + -webkit-tap-highlight-color: rgba(0,0,0,0); + background: $off-canvas-overlay-background; + bottom: 0; + display: block; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 1002; + + @media #{$medium-up} { + &:hover { + background: $off-canvas-overlay-background-hover; + } + } +} + +// +// Off-Canvas Submenu Classes +// +@mixin off-canvas-submenu($position) { + @include kill-flicker; + * { @include kill-flicker; } + -webkit-overflow-scrolling: touch; + background: $off-canvas-bg; + bottom: 0; + box-sizing: content-box; + margin: 0; + overflow-x: hidden; + overflow-y: auto; + position: absolute; + top: 0; + width: $off-canvas-width; + z-index: 1002; + @if $position == left { + @include translate3d(-100%,0,0); + left: 0; + } + @if $position == right { + @include translate3d(100%,0,0); + right: 0; + } + -webkit-transition: -webkit-#{$menu-slide}; + -moz-transition: -moz-#{$menu-slide}; + -ms-transition: -ms-#{$menu-slide}; + -o-transition: -o-#{$menu-slide}; + transition: #{$menu-slide}; + + //back button style like label + .back > a { + background: $off-canvas-back-bg; + border-bottom: $off-canvas-back-border-bottom; + border-top: $off-canvas-back-border-top; + color: $off-canvas-label-color; + font-weight: $off-canvas-label-font-weight; + padding: $off-canvas-label-padding; + text-transform: $off-canvas-label-text-transform; + + &:hover { + background: $off-canvas-back-hover-bg; + border-bottom: $off-canvas-back-hover-border-bottom; + border-top: $off-canvas-back-hover-border-top; + } + + margin: $off-canvas-label-margin; + @if $position == right { + @if $text-direction == rtl { + &:before { + @include icon-double-arrows($position: left); + } + } @else { + &:after { + @include icon-double-arrows($position: right); + } + } + } + @if $position == left { + @if $text-direction == rtl { + &:after { + @include icon-double-arrows($position: right); + } + } @else { + &:before { + @include icon-double-arrows($position: left); + } + } + } + } +} +//Left double angle quote or Right double angle quote chars +@mixin icon-double-arrows ($position) { + @if $position == left { + content: "\AB"; + @if $text-direction == rtl { + margin-left: .5rem; + } @else { + margin-right: .5rem; + } + } + @if $position == right { + content: "\BB"; + @if $text-direction == rtl { + margin-right: .5rem; + } @else { + margin-left: .5rem; + } + } + display: inline; +} + +// +// DEFAULT CLASSES +// +@include exports("offcanvas") { + @if $include-html-off-canvas-classes { + + .off-canvas-wrap { @include off-canvas-wrap; } + .inner-wrap { @include inner-wrap; } + + .tab-bar { @include tab-bar-base; } + + .left-small { @include tabbar-small-section($position: left); } + .right-small { @include tabbar-small-section($position: right); } + + .tab-bar-section { @include tab-bar-section; } + + // MENU BUTTON + // This is a little bonus. You don't need it for off canvas to work. Mixins to be written in the future. + .tab-bar .menu-icon { + color: $tabbar-menu-icon-color; + display: block; + height: $tabbar-menu-icon-height; + padding: $tabbar-menu-icon-padding; + position: relative; + text-indent: $tabbar-menu-icon-text-indent; + transform: translate3d(0,0,0); + width: $tabbar-menu-icon-width; + + // @include for the hamburger menu-icon + // + // Arguments as follows: ($width, $left, $top, $thickness, $gap, $color, $hover-color) + // $width - Width of hamburger icon in rem Default: $tabbar-hamburger-icon-width. + // $left - If false, icon will be centered horizontally || explicitly set value in rem Default: $tabbar-hamburger-icon-left= False + // $top - If false, icon will be centered vertically || explicitly set value in rem Default: = False + // $thickness - thickness of lines in hamburger icon, set value in px Default: $tabbar-hamburger-icon-thickness = 1px + // $gap - spacing between the lines in hamburger icon, set value in px Default: $tabbar-hamburger-icon-gap = 6px + // $color - icon color Default: $tabbar-menu-icon-color + // $hover-color - icon color when hovered Default: $tabbar-menu-icon-hover + // $offcanvas - Set to true + @include hamburger($tabbar-hamburger-icon-width, $tabbar-hamburger-icon-left, $tabbar-hamburger-icon-top, $tabbar-hamburger-icon-thickness, $tabbar-hamburger-icon-gap, $tabbar-menu-icon-color, $tabbar-menu-icon-hover, true) + } + + .left-off-canvas-menu { @include off-canvas-menu($position: left); } + .right-off-canvas-menu { @include off-canvas-menu($position: right); } + + ul.off-canvas-list { @include off-canvas-list; } + + + // ANIMATION CLASSES + // These classes are added with JS and trigger the actual animation. + .move-right { + > .inner-wrap { + @include translate3d($off-canvas-width,0,0); + } + .exit-off-canvas { @include back-link;} + } + + .move-left { + > .inner-wrap { + @include translate3d(-($off-canvas-width),0,0); + + } + .exit-off-canvas { @include back-link; } + } + .offcanvas-overlap { + .left-off-canvas-menu, .right-off-canvas-menu { + -ms-transform: none; + -webkit-transform: none; + -moz-transform: none; + -o-transform: none; + transform: none; + z-index: 1003; + } + .exit-off-canvas { @include back-link; } + } + .offcanvas-overlap-left { + .right-off-canvas-menu { + -ms-transform: none; + -webkit-transform: none; + -moz-transform: none; + -o-transform: none; + transform: none; + z-index: 1003; + } + .exit-off-canvas { @include back-link; } + } + .offcanvas-overlap-right { + .left-off-canvas-menu { + -ms-transform: none; + -webkit-transform: none; + -moz-transform: none; + -o-transform: none; + transform: none; + z-index: 1003; + } + .exit-off-canvas { @include back-link; } + } + + // Older browsers + .no-csstransforms { + .left-off-canvas-menu { left: -($off-canvas-width); } + .right-off-canvas-menu { right: -($off-canvas-width); } + + .move-left > .inner-wrap { right: $off-canvas-width; } + .move-right > .inner-wrap { left: $off-canvas-width; } + } + + .left-submenu { + @include off-canvas-submenu($position: left); + &.move-right, &.offcanvas-overlap-right, &.offcanvas-overlap { + @include translate3d(0%,0,0); + } + } + + .right-submenu { + @include off-canvas-submenu($position: right); + &.move-left, &.offcanvas-overlap-left, &.offcanvas-overlap { + @include translate3d(0%,0,0); + } + } + + @if $text-direction == rtl { + .left-off-canvas-menu ul.off-canvas-list li.has-submenu > a:before { + @include icon-double-arrows($position: left); + } + .right-off-canvas-menu ul.off-canvas-list li.has-submenu > a:after { + @include icon-double-arrows($position: right); + } + } @else { + .left-off-canvas-menu ul.off-canvas-list li.has-submenu > a:after { + @include icon-double-arrows($position: right); + } + .right-off-canvas-menu ul.off-canvas-list li.has-submenu > a:before { + @include icon-double-arrows($position: left); + } + } + + } +} diff --git a/themes/foundation5/scss/foundation/components/_orbit.scss b/themes/foundation5/scss/foundation/components/_orbit.scss new file mode 100644 index 0000000000000000000000000000000000000000..dfd02d02fff763bf5544a43e9c63df56d0832fa0 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_orbit.scss @@ -0,0 +1,388 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// @variables +// +$include-html-orbit-classes: $include-html-classes !default; + +// We use these to control the caption styles +$orbit-container-bg: none !default; +$orbit-caption-bg: rgba(51,51,51, .8) !default; +$orbit-caption-font-color: $white !default; +$orbit-caption-font-size: rem-calc(14) !default; +$orbit-caption-position: "bottom" !default; // Supported values: "bottom", "under" +$orbit-caption-padding: rem-calc(10 14) !default; +$orbit-caption-height: auto !default; + +// We use these to control the left/right nav styles +$orbit-nav-bg: transparent !default; +$orbit-nav-bg-hover: rgba(0,0,0,0.3) !default; +$orbit-nav-arrow-color: $white !default; +$orbit-nav-arrow-color-hover: $white !default; + +// We use these to control the timer styles +$orbit-timer-bg: rgba(255,255,255,0.3) !default; +$orbit-timer-show-progress-bar: true !default; + +// We use these to control the bullet nav styles +$orbit-bullet-nav-color: $iron !default; +$orbit-bullet-nav-color-active: $aluminum !default; +$orbit-bullet-radius: rem-calc(9) !default; + +// We use these to controls the style of slide numbers +$orbit-slide-number-bg: rgba(0,0,0,0) !default; +$orbit-slide-number-font-color: $white !default; +$orbit-slide-number-padding: rem-calc(5) !default; + +// Graceful Loading Wrapper and preloader +$wrapper-class: "slideshow-wrapper" !default; +$preloader-class: "preloader" !default; + +// Hide controls on small +$orbit-nav-hide-for-small: true !default; +$orbit-bullet-hide-for-small: true !default; +$orbit-timer-hide-for-small: true !default; + + +@include exports("orbit") { + @if $include-html-orbit-classes { + + @-webkit-keyframes rotate { + from { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + + @keyframes rotate { + from { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + to { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + /* Orbit Graceful Loading */ + .#{$wrapper-class} { + position: relative; + + ul { + // Prevent bullets showing before .orbit-container is loaded + list-style-type: none; + margin: 0; + + // Hide all list items + li, + li .orbit-caption { display: none; } + + // ...except for the first one + li:first-child { display: block; } + } + + .orbit-container { background-color: transparent; + + // Show images when .orbit-container is loaded + li { display: block; + + .orbit-caption { display: block; } + } + .orbit-bullets li { + display: inline-block; + } + } + + // Orbit preloader + .#{$preloader-class} { + @include radius(1000px); + animation-duration: 1.5s; + animation-iteration-count: infinite; + animation-name: rotate; + animation-timing-function: linear; + border-color: $charcoal $white; + border: solid 3px; + display: block; + height: 40px; + left: 50%; + margin-left: -20px; + margin-top: -20px; + position: absolute; + top: 50%; + width: 40px; + } + } + + + .orbit-container { + background: $orbit-container-bg; + overflow: hidden; + position: relative; + width: 100%; + + .orbit-slides-container { + list-style: none; + margin: 0; + padding: 0; + position: relative; + + // Prevents images (and captions) from disappearing after first rotation on Chrome for Android + -webkit-transform: translateZ(0); + -moz-transform: translateZ(0); + -ms-transform: translateZ(0); + -o-transform: translateZ(0); + transform: translateZ(0); + + img { display: block; max-width: 100%; } + + > * { + position: absolute; + top: 0; + width: 100%; + @if $text-direction == rtl { + margin-right: 100%; + } + @else { + margin-left: 100%; + } + + &:first-child { + @if $text-direction == rtl { + margin-right: 0; + } + @else { + margin-left: 0; + } + } + + .orbit-caption { + @if $orbit-caption-position == "bottom" { + bottom: 0; + position: absolute; + } @else if $orbit-caption-position == "under" { + position: relative; + } + + background-color: $orbit-caption-bg; + color: $orbit-caption-font-color; + font-size: $orbit-caption-font-size; + padding: $orbit-caption-padding; + width: 100%; + } + } + } + + .orbit-slide-number { + #{$default-float}: 10px; + background: $orbit-slide-number-bg; + color: $orbit-slide-number-font-color; + font-size: 12px; + position: absolute; + span { font-weight: 700; padding: $orbit-slide-number-padding;} + top: 10px; + z-index: 10; + } + + .orbit-timer { + + position: absolute; + top: 12px; + #{$opposite-direction}: 10px; + height: 6px; + width: 100px; + z-index: 10; + + + .orbit-progress { + @if $orbit-timer-show-progress-bar { + height: 3px; + background-color: $orbit-timer-bg; + display: block; + width: 0; + position: relative; + right: 20px; + top: 5px; + + } + } + + // Play button + & > span { + border: solid 4px $white; + border-bottom: none; + border-top: none; + display: none; + height: 14px; + position: absolute; + top: 0; + width: 11px; + #{$opposite-direction}: 0; + } + + // Pause button + &.paused { + & > span { + top: 0; + width: 11px; + height: 14px; + border: inset 8px; + border-left-style: solid; + border-color: transparent; + border-left-color: $white; + #{$opposite-direction}: -4px; + + &.dark { + border-left-color: $oil; + } + } + } + } + + + + &:hover .orbit-timer > span { display: block; } + + // Let's get those controls to be right in the center on each side + .orbit-prev, + .orbit-next { + background-color: $orbit-nav-bg; + color: white; + height: 60px; + line-height: 50px; + margin-top: -25px; + position: absolute; + text-indent: -9999px !important; + top: 45%; + width: 36px; + z-index: 10; + + &:hover { + background-color: $orbit-nav-bg-hover; + } + + & > span { + border: inset 10px; + display: block; + height: 0; + margin-top: -10px; + position: absolute; + top: 50%; + width: 0; + } + } + .orbit-prev { #{$default-float}: 0; + & > span { + border-#{$opposite-direction}-style: solid; + border-color: transparent; + border-#{$opposite-direction}-color: $orbit-nav-arrow-color; + } + &:hover > span { + border-#{$opposite-direction}-color: $orbit-nav-arrow-color-hover; + } + } + .orbit-next { #{$opposite-direction}: 0; + & > span { + border-color: transparent; + border-#{$default-float}-style: solid; + border-#{$default-float}-color: $orbit-nav-arrow-color; + #{$default-float}: 50%; + margin-#{$default-float}: -4px; + } + &:hover > span { + border-#{$default-float}-color: $orbit-nav-arrow-color-hover; + } + } + } + + .orbit-bullets-container { text-align: center; } + .orbit-bullets { + display: block; + float: none; + margin: 0 auto 30px auto; + overflow: hidden; + position: relative; + text-align: center; + top: 10px; + + li { + background: $orbit-bullet-nav-color; + cursor: pointer; + display: inline-block; + // float: $default-float; + float: none; + height: $orbit-bullet-radius; + margin-#{$opposite-direction}: 6px; + width: $orbit-bullet-radius; + + @include radius(1000px); + + &.active { + background: $orbit-bullet-nav-color-active; + } + + &:last-child { margin-#{$opposite-direction}: 0; } + } + } + + .touch { + .orbit-container { + .orbit-prev, + .orbit-next { display: none; } + } + + .orbit-bullets { display: none; } + } + + + @media #{$medium-up} { + + .touch { + .orbit-container { + .orbit-prev, + .orbit-next { display: inherit; } + } + + .orbit-bullets { display: block; } + } + + } + + @media #{$small-only} { + .orbit-stack-on-small { + .orbit-slides-container {height: auto !important;} + .orbit-slides-container > * { + margin:0 !important; + opacity: 1 !important; + position: relative; + } + + .orbit-slide-number { + display: none; + } + } + + @if $orbit-timer-hide-for-small { + .orbit-timer{display: none;} + } + @if $orbit-nav-hide-for-small { + .orbit-next,.orbit-prev{display: none;} + } + @if $orbit-bullet-hide-for-small { + .orbit-bullets{display: none;} + } + } + } +} diff --git a/themes/foundation5/scss/foundation/components/_pagination.scss b/themes/foundation5/scss/foundation/components/_pagination.scss new file mode 100644 index 0000000000000000000000000000000000000000..6e75da1fb69ae1d41edc7d67a2bf9e3246b27996 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_pagination.scss @@ -0,0 +1,162 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// @variables +// +$include-pagination-classes: $include-html-classes !default; + +// We use these to control the pagination container +$pagination-height: rem-calc(24) !default; +$pagination-margin: rem-calc(-5) !default; + +// We use these to set the list-item properties +$pagination-li-float: $default-float !default; +$pagination-li-height: rem-calc(24) !default; +$pagination-li-font-color: $jet !default; +$pagination-li-font-size: rem-calc(14) !default; +$pagination-li-margin: rem-calc(5) !default; + +// We use these for the pagination anchor links +$pagination-link-pad: rem-calc(1 10 1) !default; +$pagination-link-font-color: $aluminum !default; +$pagination-link-active-bg: scale-color($white, $lightness: -10%) !default; + +// We use these for disabled anchor links +$pagination-link-unavailable-cursor: default !default; +$pagination-link-unavailable-font-color: $aluminum !default; +$pagination-link-unavailable-bg-active: transparent !default; + +// We use these for currently selected anchor links +$pagination-link-current-background: $primary-color !default; +$pagination-link-current-font-color: $white !default; +$pagination-link-current-font-weight: $font-weight-bold !default; +$pagination-link-current-cursor: default !default; +$pagination-link-current-active-bg: $primary-color !default; + +// @mixins +// +// Style the pagination container. Currently only used when centering elements. +// $center - Default: false, Options: true +@mixin pagination-container($center:false) { + @if $center { text-align: center; } +} + +// @mixins +// Style unavailable list items +@mixin pagination-unavailable-item { + a, button { + cursor: $pagination-link-unavailable-cursor; + color: $pagination-link-unavailable-font-color; + } + &:hover a, + & a:focus, + + &:hover button, + & button:focus + { background: $pagination-link-unavailable-bg-active; } +} +// @mixins +// Style the current list item. Do not assume that the current item has +// an anchor <a> element. +// $has-anchor - Default: true, Options: false +@mixin pagination-current-item($has-anchor: true) { + @if $has-anchor { + a, button { + background: $pagination-link-current-background; + color: $pagination-link-current-font-color; + cursor: $pagination-link-current-cursor; + font-weight: $pagination-link-current-font-weight; + + &:hover, + &:focus { background: $pagination-link-current-active-bg; } + } + } @else { + background: $pagination-link-current-background; + color: $pagination-link-current-font-color; + cursor: $pagination-link-current-cursor; + font-weight: $pagination-link-current-font-weight; + height: auto; + padding: $pagination-link-pad; + @include radius; + + &:hover, + &:focus { background: $pagination-link-current-active-bg; } + } +} + +// @mixins +// +// We use this mixin to set the properties for the creating Foundation pagination +// $center - Left or center align the li elements. Default: false +// $base-style - Sets base styles for pagination. Default: true, Options: false +// $use-default-classes - Makes unavailable & current classes available for use. Default: true +@mixin pagination($center:false, $base-style:true, $use-default-classes:true) { + + @if $base-style { + display: block; + margin-#{$default-float}: $pagination-margin; + min-height: $pagination-height; + + li { + color: $pagination-li-font-color; + font-size: $pagination-li-font-size; + height: $pagination-li-height; + margin-#{$default-float}: $pagination-li-margin; + + a, button { + @include radius; + @include single-transition(background-color); + background: none; + color: $pagination-link-font-color; + display: block; + font-size: 1em; + font-weight: normal; + line-height: inherit; + padding: $pagination-link-pad; + } + + &:hover a, + a:focus, + &:hover button, + button:focus + { background: $pagination-link-active-bg; } + + @if $use-default-classes { + &.unavailable { @include pagination-unavailable-item(); } + &.current { @include pagination-current-item(); } + } + } + } + + // Left or center align the li elements + li { + @if $center { + display: inline-block; + float: none; + } @else { + display: block; + float: $pagination-li-float; + } + } +} + +@include exports("pagination") { + @if $include-pagination-classes { + ul.pagination { + @include pagination; + } + + /* Pagination centred wrapper */ + .pagination-centered { + @include pagination-container(true); + + ul.pagination { + @include pagination(true, false); + } + } + } +} diff --git a/themes/foundation5/scss/foundation/components/_panels.scss b/themes/foundation5/scss/foundation/components/_panels.scss new file mode 100644 index 0000000000000000000000000000000000000000..123ad9c52cb7a7d8a89f445d084f369aedf4866d --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_panels.scss @@ -0,0 +1,107 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// @variables +// +$include-html-panel-classes: $include-html-classes !default; + +// We use these to control the background and border styles +$panel-bg: scale-color($white, $lightness: -5%) !default; +$panel-border-style: solid !default; +$panel-border-size: 1px !default; +$callout-panel-bg: scale-color($primary-color, $lightness: 94%) !default; + +// We use this % to control how much we darken things on hover +$panel-border-color: scale-color($panel-bg, $lightness: -11%) !default; + +// We use these to set default inner padding and bottom margin +$panel-margin-bottom: rem-calc(20) !default; +$panel-padding: rem-calc(20) !default; + +// We use these to set default font colors +$panel-font-color: $oil !default; +$panel-font-color-alt: $white !default; + +$panel-header-adjust: true !default; +$callout-panel-link-color: $primary-color !default; +$callout-panel-link-color-hover: scale-color($callout-panel-link-color, $lightness: -14%) !default; +// +// @mixins +// +// We use this mixin to create panels. +// $bg - Sets the panel background color. Default: $panel-pg || scale-color($white, $lightness: -5%) !default +// $padding - Sets the panel padding amount. Default: $panel-padding || rem-calc(20) +// $adjust - Sets the font color based on the darkness of the bg & resets header line-heights for panels. Default: $panel-header-adjust || true +@mixin panel($bg:$panel-bg, $padding:$panel-padding, $adjust:$panel-header-adjust, $border:true) { + + @if $bg { + $bg-lightness: lightness($bg); + + @if $border { + border-style: $panel-border-style; + border-width: $panel-border-size; + border-color: $panel-border-color; + } @else { + border-style: none; + border-width: 0; + } + + margin-bottom: $panel-margin-bottom; + padding: $padding; + + background: $bg; + @if $bg-lightness >= 50% { color: $panel-font-color; } + @else { color: $panel-font-color-alt; } + + // Respect the padding, fool. + > :first-child { margin-top: 0; } + > :last-child { margin-bottom: 0; } + + @if $adjust { + // We set the font color based on the darkness of the bg. + @if $bg-lightness >= 50% { + h1, h2, h3, h4, h5, h6, p, li, dl { color: $panel-font-color; } + } + @else { + h1, h2, h3, h4, h5, h6, p, li, dl { color: $panel-font-color-alt; } + } + + // reset header line-heights for panels + h1, h2, h3, h4, h5, h6 { + line-height: 1; margin-bottom: rem-calc(20) / 2; + &.subheader { line-height: 1.4; } + } + } + } +} + +@include exports("panel") { + @if $include-html-panel-classes { + + /* Panels */ + .panel { @include panel; + + &.callout { + @include panel($callout-panel-bg); + a:not(.button) { + color: $callout-panel-link-color; + + &:hover, + &:focus { + color: $callout-panel-link-color-hover; + } + } + } + + &.radius { + @include radius; + } + + } + + } +} diff --git a/themes/foundation5/scss/foundation/components/_pricing-tables.scss b/themes/foundation5/scss/foundation/components/_pricing-tables.scss new file mode 100644 index 0000000000000000000000000000000000000000..71b7b9c7ec2a24da13eab8355413e567c25ee7cf --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_pricing-tables.scss @@ -0,0 +1,150 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// @variables +// +$include-html-pricing-classes: $include-html-classes !default; + +// We use this to control the border color +$price-table-border: solid 1px $gainsboro !default; + +// We use this to control the bottom margin of the pricing table +$price-table-margin-bottom: rem-calc(20) !default; + +// We use these to control the title styles +$price-title-bg: $oil !default; +$price-title-padding: rem-calc(15 20) !default; +$price-title-align: center !default; +$price-title-color: $smoke !default; +$price-title-weight: $font-weight-normal !default; +$price-title-size: rem-calc(16) !default; +$price-title-font-family: $body-font-family !default; + +// We use these to control the price styles +$price-money-bg: $vapor !default; +$price-money-padding: rem-calc(15 20) !default; +$price-money-align: center !default; +$price-money-color: $oil !default; +$price-money-weight: $font-weight-normal !default; +$price-money-size: rem-calc(32) !default; +$price-money-font-family: $body-font-family !default; + + +// We use these to control the description styles +$price-bg: $white !default; +$price-desc-color: $monsoon !default; +$price-desc-padding: rem-calc(15) !default; +$price-desc-align: center !default; +$price-desc-font-size: rem-calc(12) !default; +$price-desc-weight: $font-weight-normal !default; +$price-desc-line-height: 1.4 !default; +$price-desc-bottom-border: dotted 1px $gainsboro !default; + +// We use these to control the list item styles +$price-item-color: $oil !default; +$price-item-padding: rem-calc(15) !default; +$price-item-align: center !default; +$price-item-font-size: rem-calc(14) !default; +$price-item-weight: $font-weight-normal !default; +$price-item-bottom-border: dotted 1px $gainsboro !default; + +// We use these to control the CTA area styles +$price-cta-bg: $white !default; +$price-cta-align: center !default; +$price-cta-padding: rem-calc(20 20 0) !default; + +// @mixins +// +// We use this to create the container element for the pricing tables +@mixin pricing-table-container { + border: $price-table-border; + margin-#{$default-float}: 0; + margin-bottom: $price-table-margin-bottom; + + & * { + list-style: none; + line-height: 1; + } +} +// @mixins +// +// We use this mixin to create the pricing table title styles +@mixin pricing-table-title { + background-color: $price-title-bg; + color: $price-title-color; + font-family: $price-title-font-family; + font-size: $price-title-size; + font-weight: $price-title-weight; + padding: $price-title-padding; + text-align: $price-title-align; +} + +// @mixins +// +// We use this mixin to control the pricing table price styles +@mixin pricing-table-price { + background-color: $price-money-bg; + color: $price-money-color; + font-family: $price-money-font-family; + font-size: $price-money-size; + font-weight: $price-money-weight; + padding: $price-money-padding; + text-align: $price-money-align; +} + +// @mixins +// +// We use this mixin to create the description styles for the pricing table +@mixin pricing-table-description { + background-color: $price-bg; + border-bottom: $price-desc-bottom-border; + color: $price-desc-color; + font-size: $price-desc-font-size; + font-weight: $price-desc-weight; + line-height: $price-desc-line-height; + padding: $price-desc-padding; + text-align: $price-desc-align; +} + +// @mixins +// +// We use this mixin to style the bullet items in the pricing table +@mixin pricing-table-bullet { + background-color: $price-bg; + border-bottom: $price-item-bottom-border; + color: $price-item-color; + font-size: $price-item-font-size; + font-weight: $price-item-weight; + padding: $price-item-padding; + text-align: $price-item-align; +} + +// @mixins +// +// We use this mixin to style the CTA area of the pricing tables +@mixin pricing-table-cta { + background-color: $price-cta-bg; + padding: $price-cta-padding; + text-align: $price-cta-align; +} + +@include exports("pricing-table") { + @if $include-html-pricing-classes { + + /* Pricing Tables */ + .pricing-table { + @include pricing-table-container; + + .title { @include pricing-table-title; } + .price { @include pricing-table-price; } + .description { @include pricing-table-description; } + .bullet-item { @include pricing-table-bullet; } + .cta-button { @include pricing-table-cta; } + } + + } +} diff --git a/themes/foundation5/scss/foundation/components/_progress-bars.scss b/themes/foundation5/scss/foundation/components/_progress-bars.scss new file mode 100644 index 0000000000000000000000000000000000000000..87f88ed8322b8afc52327725f9e34a0a5dda8e52 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_progress-bars.scss @@ -0,0 +1,79 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// @variables +// +$include-html-media-classes: $include-html-classes !default; + +// We use this to set the progress bar height +$progress-bar-height: rem-calc(25) !default; +$progress-bar-color: $vapor !default; + +// We use these to control the border styles +$progress-bar-border-color: scale-color($white, $lightness: 20%) !default; +$progress-bar-border-size: 1px !default; +$progress-bar-border-style: solid !default; +$progress-bar-border-radius: $global-radius !default; + +// We use these to control the margin & padding +$progress-bar-pad: rem-calc(2) !default; +$progress-bar-margin-bottom: rem-calc(10) !default; + +// We use these to set the meter colors +$progress-meter-color: $primary-color !default; +$progress-meter-secondary-color: $secondary-color !default; +$progress-meter-success-color: $success-color !default; +$progress-meter-alert-color: $alert-color !default; + +// @mixins +// +// We use this to set up the progress bar container +@mixin progress-container { + background-color: $progress-bar-color; + border: $progress-bar-border-size $progress-bar-border-style $progress-bar-border-color; + height: $progress-bar-height; + margin-bottom: $progress-bar-margin-bottom; + padding: $progress-bar-pad; +} + +// @mixins +// +// $bg - Default: $progress-meter-color || $primary-color +@mixin progress-meter($bg:$progress-meter-color) { + background: $bg; + display: block; + height: 100%; +} + + +@include exports("progress-bar") { + @if $include-html-media-classes { + + /* Progress Bar */ + .progress { + @include progress-container; + + // Meter + .meter { + @include progress-meter; + } + &.secondary .meter { @include progress-meter($bg:$progress-meter-secondary-color); } + &.success .meter { @include progress-meter($bg:$progress-meter-success-color); } + &.alert .meter { @include progress-meter($bg:$progress-meter-alert-color); } + + &.radius { @include radius($progress-bar-border-radius); + .meter { @include radius($progress-bar-border-radius - 1); } + } + + &.round { @include radius(1000px); + .meter { @include radius(999px); } + } + + } + + } +} diff --git a/themes/foundation5/scss/foundation/components/_range-slider.scss b/themes/foundation5/scss/foundation/components/_range-slider.scss new file mode 100644 index 0000000000000000000000000000000000000000..1a35218477b79c25a4a0c3fb9f064d71bc8b08e1 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_range-slider.scss @@ -0,0 +1,177 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// @name _range-slider.scss +// @dependencies _global.scss +// + +// +// @variables +// + +$include-html-range-slider-classes: $include-html-classes !default; + +// These variables define the slider bar styles +$range-slider-bar-width: 100% !default; +$range-slider-bar-height: rem-calc(16) !default; + +$range-slider-bar-border-width: 1px !default; +$range-slider-bar-border-style: solid !default; +$range-slider-bar-border-color: $gainsboro !default; +$range-slider-radius: $global-radius !default; +$range-slider-round: $global-rounded !default; +$range-slider-bar-bg-color: $ghost !default; +$range-slider-active-segment-bg-color: scale-color($secondary-color, $lightness: -1%) !default; + +// Vertical bar styles +$range-slider-vertical-bar-width: rem-calc(16) !default; +$range-slider-vertical-bar-height: rem-calc(200) !default; + +// These variables define the slider handle styles +$range-slider-handle-width: rem-calc(32) !default; +$range-slider-handle-height: rem-calc(22) !default; +$range-slider-handle-position-top: rem-calc(-5) !default; +$range-slider-handle-bg-color: $primary-color !default; +$range-slider-handle-border-width: 1px !default; +$range-slider-handle-border-style: solid !default; +$range-slider-handle-border-color: none !default; +$range-slider-handle-radius: $global-radius !default; +$range-slider-handle-round: $global-rounded !default; +$range-slider-handle-bg-hover-color: scale-color($primary-color, $lightness: -12%) !default; +$range-slider-handle-cursor: pointer !default; + +$range-slider-disabled-opacity: .7 !default; +$range-slider-disabled-cursor: $cursor-disabled-value !default; + +// +// @mixins +// + +@mixin range-slider-bar-base($vertical: false) { + border: $range-slider-bar-border-width $range-slider-bar-border-style $range-slider-bar-border-color; + margin: rem-calc(20 0); + position: relative; + -ms-touch-action: none; + touch-action: none; + @if $vertical == true { + display: inline-block; + height: $range-slider-vertical-bar-height; + width: $range-slider-vertical-bar-width; + } @else { + display: block; + height: $range-slider-bar-height; + width: $range-slider-bar-width; + } +} +@mixin range-slider-bar-style( + $bg: true, + $radius: false, + $round: false, + $disabled: false) { + @if $bg == true { background: $range-slider-bar-bg-color; } + @if $radius == true { @include radius($range-slider-radius); } + @if $round == true { @include radius($range-slider-round); } + @if $disabled == true { + cursor: $range-slider-disabled-cursor; + opacity: $range-slider-disabled-opacity; + } +} + +@mixin range-slider-bar( + $bg: $range-slider-bar-bg-color, + $radius:false) { + @include range-slider-bar-base; + @include range-slider-bar-style; +} + +@mixin range-slider-handle-base() { + border: $range-slider-handle-border-width $range-slider-handle-border-style $range-slider-handle-border-color; + cursor: $range-slider-handle-cursor; + display: inline-block; + height: $range-slider-handle-height; + position: absolute; + top: $range-slider-handle-position-top; + width: $range-slider-handle-width; + z-index: 1; + + // This removes the 300ms touch delay on Windows 8 + -ms-touch-action: manipulation; + touch-action: manipulation; +} + +@mixin range-slider-handle-style( + $bg: true, + $radius: false, + $round: false, + $disabled: false) { + @if $bg == true { background: $range-slider-handle-bg-color; } + @if $radius == true { @include radius($range-slider-radius); } + @if $round == true { @include radius($range-slider-round); } + @if $disabled == true { + cursor: $cursor-default-value; + opacity: $range-slider-disabled-opacity; + } + &:hover { + background: $range-slider-handle-bg-hover-color; + } +} + +@mixin range-slider-handle() { + @include range-slider-handle-base; + @include range-slider-handle-style; +} + +// CSS Generation +@include exports("range-slider-bar") { + @if $include-html-range-slider-classes { + .range-slider { + @include range-slider-bar-base; + @include range-slider-bar-style($bg:true, $radius:false); + &.vertical-range { + @include range-slider-bar-base($vertical: true); + .range-slider-handle { + bottom: -($range-slider-vertical-bar-height - $range-slider-handle-width); + margin-#{$default-float}: -($range-slider-handle-width / 4); + margin-top: 0; + position: absolute; + } + .range-slider-active-segment { + border-bottom-left-radius: inherit; + border-bottom-right-radius: inherit; + border-top-left-radius: initial; + bottom: 0; + height: auto; + width: $range-slider-bar-height - rem-calc((strip-unit($range-slider-bar-border-width) * 2)); + } + } + &.radius { + @include range-slider-bar-style($radius:true); + .range-slider-handle { @include range-slider-handle-style($radius: true); } + } + &.round { + @include range-slider-bar-style($round:true); + .range-slider-handle { @include range-slider-handle-style($round: true); } + } + &.disabled, &[disabled] { + @include range-slider-bar-style($disabled:true); + .range-slider-handle { @include range-slider-handle-style($disabled: true); } + } + } + .range-slider-active-segment { + background: $range-slider-active-segment-bg-color; + border-bottom-left-radius: inherit; + border-top-left-radius: inherit; + display: inline-block; + height: $range-slider-bar-height - rem-calc((strip-unit($range-slider-bar-border-width) * 2)); + position: absolute; + } + .range-slider-handle { + @include range-slider-handle-base; + @include range-slider-handle-style($bg:true, $radius: false); + } + } +} diff --git a/themes/foundation5/scss/foundation/components/_reveal.scss b/themes/foundation5/scss/foundation/components/_reveal.scss new file mode 100644 index 0000000000000000000000000000000000000000..19c493d1841c9941c0ab383193a9486e4cf68d2a --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_reveal.scss @@ -0,0 +1,209 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; +@import 'grid'; + +// +// @name _reveal.scss +// @dependencies _global.scss +// + +$include-html-reveal-classes: $include-html-classes !default; + +// We use these to control the style of the reveal overlay. +$reveal-overlay-bg: rgba($black, .45) !default; +$reveal-overlay-bg-old: $black !default; + +// We use these to control the style of the modal itself. +$reveal-modal-bg: $white !default; +$reveal-position-top: rem-calc(100) !default; +$reveal-default-width: 80% !default; +$reveal-max-width: $row-width !default; +$reveal-modal-padding: rem-calc(30) !default; +$reveal-box-shadow: 0 0 10px rgba($black,.4) !default; + +// We use these to style the reveal close button +$reveal-close-font-size: rem-calc(40) !default; +$reveal-close-top: rem-calc(10) !default; +$reveal-close-side: rem-calc(22) !default; +$reveal-close-color: $base !default; +$reveal-close-weight: $font-weight-bold !default; + +// We use this to set the default radius used throughout the core. +$reveal-radius: $global-radius !default; +$reveal-round: $global-rounded !default; + +// We use these to control the modal border +$reveal-border-style: solid !default; +$reveal-border-width: 1px !default; +$reveal-border-color: $steel !default; + +$reveal-modal-class: "reveal-modal" !default; +$close-reveal-modal-class: "close-reveal-modal" !default; + +// Set base z-index +$z-index-base: 1005; + +// +// @mixins +// + +// We use this to create the reveal background overlay styles +@mixin reveal-bg( $include-z-index-value: true ) { + // position: absolute; // allows modal background to extend beyond window position + background: $reveal-overlay-bg-old; // Autoprefixer should be used to avoid such variables needed when Foundation for Sites can do so in the near future. + background: $reveal-overlay-bg; + bottom: 0; + display: none; + left: 0; + position: fixed; + right: 0; + top: 0; + z-index: if( $include-z-index-value, $z-index-base - 1, auto ); + #{$default-float}: 0; +} + +// We use this mixin to create the structure of a reveal modal +// +// $base-style - Provides reveal base styles, can be set to false to override. Default: true, Options: false +// $width - Sets reveal width Default: $reveal-default-width || 80% +// +@mixin reveal-modal-base( $base-style: true, $width:$reveal-default-width, $max-width:$reveal-max-width, $border-radius: $reveal-radius) { + @if $base-style { + border-radius: $border-radius; + display: none; + position: absolute; + top:0; + visibility: hidden; + width: 100%; + z-index: $z-index-base; + #{$default-float}: 0; + + @media #{$small-only} { + min-height:100vh; + } + + // Make sure rows don't have a min-width on them + .column, .columns { min-width: 0; } + + // Get rid of margin from first and last element inside modal + > :first-child { margin-top: 0; } + + > :last-child { margin-bottom: 0; } + } + + @if $width { + @media #{$medium-up} { + left: 0; + margin: 0 auto; + max-width: $max-width; + right: 0; + width: $width; + } + } +} + +// We use this to style the reveal modal defaults +// +// $bg - Sets background color of reveal modal. Default: $reveal-modal-bg || $white +// $padding - Padding to apply to reveal modal. Default: $reveal-modal-padding. +// $border - Choose whether reveal uses a border. Default: true, Options: false +// $border-style - Set reveal border style. Default: $reveal-border-style || solid +// $border-width - Width of border (i.e. 1px). Default: $reveal-border-width. +// $border-color - Color of border. Default: $reveal-border-color. +// $box-shadow - Choose whether or not to include the default box-shadow. Default: true, Options: false +// $radius - If true, set to modal radius which is $global-radius || explicitly set radius amount in px (ex. $radius:10px). Default: false +// $top-offset - Default: $reveal-position-top || 50px +@mixin reveal-modal-style( + $bg:false, + $padding:false, + $border:false, + $border-style:$reveal-border-style, + $border-width:$reveal-border-width, + $border-color:$reveal-border-color, + $box-shadow:false, + $radius:false, + $top-offset:false) { + + @if $bg { background-color: $bg; } + @if $padding != false { padding: $padding; } + + @if $border { border: $border-style $border-width $border-color; } + + // We can choose whether or not to include the default box-shadow. + @if $box-shadow { + box-shadow: $reveal-box-shadow; + } + + // We can control how much radius is used on the modal + @if $radius == true { @include radius($reveal-radius); } + @else if $radius { @include radius($radius); } + + @if $top-offset { + @media #{$medium-up} { + top: $top-offset; + } + } +} + +// We use this to create a close button for the reveal modal +// +// $color - Default: $reveal-close-color || $base +@mixin reveal-close($color:$reveal-close-color) { + color: $color; + cursor: $cursor-pointer-value; + font-size: $reveal-close-font-size; + font-weight: $reveal-close-weight; + line-height: 1; + position: absolute; + top: $reveal-close-top; + #{$opposite-direction}: $reveal-close-side; +} + +@include exports("reveal") { + @if $include-html-reveal-classes { + + // Reveal Modals + .reveal-modal-bg { @include reveal-bg; } + + .#{$reveal-modal-class} { + @include reveal-modal-base; + @include reveal-modal-style( + $bg:$reveal-modal-bg, + $padding:$reveal-modal-padding, + $border:true, + $box-shadow:true, + $radius:false, + $top-offset:$reveal-position-top + ); + + &.radius { @include reveal-modal-style($radius:true); } + &.round { @include reveal-modal-style($radius:$reveal-round); } + &.collapse { @include reveal-modal-style($padding:0); } + &.tiny { @include reveal-modal-base(false, 30%); } + &.small { @include reveal-modal-base(false, 40%); } + &.medium { @include reveal-modal-base(false, 60%); } + &.large { @include reveal-modal-base(false, 70%); } + &.xlarge { @include reveal-modal-base(false, 95%); } + &.full { + @include reveal-modal-base(false, 100%); + height: 100vh; + height:100%; + left:0; + margin-left: 0 !important; + max-width: none !important; + min-height:100vh; + top:0; + } + + // Modals pushed to back + &.toback { + z-index: $z-index-base - 2; + } + + .#{$close-reveal-modal-class} { @include reveal-close; } + } + } +} diff --git a/themes/foundation5/scss/foundation/components/_side-nav.scss b/themes/foundation5/scss/foundation/components/_side-nav.scss new file mode 100644 index 0000000000000000000000000000000000000000..ba74a53a97feb4c1a2be7f3d0c328e2778840dc6 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_side-nav.scss @@ -0,0 +1,120 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// @variables +// + +$include-html-nav-classes: $include-html-classes !default; + +// We use this to control padding. +$side-nav-padding: rem-calc(14 0) !default; + +// We use these to control list styles. +$side-nav-list-type: none !default; +$side-nav-list-position: outside !default; +$side-nav-list-margin: rem-calc(0 0 7 0) !default; + +// We use these to control link styles. +$side-nav-link-color: $primary-color !default; +$side-nav-link-color-active: scale-color($side-nav-link-color, $lightness: 30%) !default; +$side-nav-link-color-hover: scale-color($side-nav-link-color, $lightness: 30%) !default; +$side-nav-link-bg-hover: hsla(0, 0, 0, .025) !default; +$side-nav-link-margin: 0 !default; +$side-nav-link-padding: rem-calc(7 14) !default; +$side-nav-font-size: rem-calc(14) !default; +$side-nav-font-weight: $font-weight-normal !default; +$side-nav-font-weight-active: $side-nav-font-weight !default; +$side-nav-font-family: $body-font-family !default; +$side-nav-font-family-active: $side-nav-font-family !default; + +// We use these to control heading styles. +$side-nav-heading-color: $side-nav-link-color !default; +$side-nav-heading-font-size: $side-nav-font-size !default; +$side-nav-heading-font-weight: bold !default; +$side-nav-heading-text-transform: uppercase !default; + +// We use these to control border styles +$side-nav-divider-size: 1px !default; +$side-nav-divider-style: solid !default; +$side-nav-divider-color: scale-color($white, $lightness: -10%) !default; + + +// +// @mixins +// + + +// We use this to style the side-nav +// +// $divider-color - Border color of divider. Default: $side-nav-divider-color. +// $font-size - Font size of nav items. Default: $side-nav-font-size. +// $link-color - Color of navigation links. Default: $side-nav-link-color. +// $link-color-hover - Color of navigation links when hovered. Default: $side-nav-link-color-hover. +@mixin side-nav( + $divider-color:$side-nav-divider-color, + $font-size:$side-nav-font-size, + $link-color:$side-nav-link-color, + $link-color-active:$side-nav-link-color-active, + $link-color-hover:$side-nav-link-color-hover, + $link-bg-hover:$side-nav-link-bg-hover) { + display: block; + font-family: $side-nav-font-family; + list-style-position: $side-nav-list-position; + list-style-type: $side-nav-list-type; + margin: 0; + padding: $side-nav-padding; + + li { + font-size: $font-size; + font-weight: $side-nav-font-weight; + margin: $side-nav-list-margin; + + a:not(.button) { + color: $link-color; + display: block; + margin: $side-nav-link-margin; + padding: $side-nav-link-padding; + &:hover, + &:focus { + background: $link-bg-hover; + color: $link-color-hover; + } + &:active { + color: $link-color-active; + } + } + + &.active > a:first-child:not(.button) { + color: $side-nav-link-color-active; + font-family: $side-nav-font-family-active; + font-weight: $side-nav-font-weight-active; + } + + &.divider { + border-top: $side-nav-divider-size $side-nav-divider-style; + height: 0; + list-style: none; + padding: 0; + border-top-color: $divider-color; + } + + &.heading { + color: $side-nav-heading-color; + font: { + size: $side-nav-heading-font-size; + weight: $side-nav-heading-font-weight; + } + text-transform: $side-nav-heading-text-transform; + } + } +} + +@include exports("side-nav") { + @if $include-html-nav-classes { + .side-nav {@include side-nav;} + } +} diff --git a/themes/foundation5/scss/foundation/components/_split-buttons.scss b/themes/foundation5/scss/foundation/components/_split-buttons.scss new file mode 100644 index 0000000000000000000000000000000000000000..7e8a4e30c9467fdc407524fae24f54fcf8d075cc --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_split-buttons.scss @@ -0,0 +1,203 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; +@import 'buttons'; +@import 'dropdown-buttons'; + +// +// @name _split-buttons.scss +// @dependencies _buttons.scss, _global.scss +// + +// +// @variables +// + +$include-html-button-classes: $include-html-classes !default; + +// We use these to control different shared styles for Split Buttons +$split-button-function-factor: 10% !default; +$split-button-pip-color: $white !default; +$split-button-pip-color-alt: $oil !default; +$split-button-active-bg-tint: rgba(0,0,0,0.1) !default; +$split-button-span-border-color: rgba(255,255,255,0.5) !default; + +// We use these to control tiny split buttons +$split-button-padding-tny: $button-pip-tny * 10 !default; +$split-button-span-width-tny: $button-pip-tny * 6 !default; +$split-button-pip-size-tny: $button-pip-tny !default; +$split-button-pip-top-tny: $button-pip-tny * 2 !default; +$split-button-pip-default-float-tny: rem-calc(-6) !default; + +// We use these to control small split buttons +$split-button-padding-sml: $button-pip-sml * 10 !default; +$split-button-span-width-sml: $button-pip-sml * 6 !default; +$split-button-pip-size-sml: $button-pip-sml !default; +$split-button-pip-top-sml: $button-pip-sml * 1.5 !default; +$split-button-pip-default-float-sml: rem-calc(-6) !default; + +// We use these to control medium split buttons +$split-button-padding-med: $button-pip-med * 9 !default; +$split-button-span-width-med: $button-pip-med * 5.5 !default; +$split-button-pip-size-med: $button-pip-med - rem-calc(3) !default; +$split-button-pip-top-med: $button-pip-med * 1.5 !default; +$split-button-pip-default-float-med: rem-calc(-6) !default; + +// We use these to control large split buttons +$split-button-padding-lrg: $button-pip-lrg * 8 !default; +$split-button-span-width-lrg: $button-pip-lrg * 5 !default; +$split-button-pip-size-lrg: $button-pip-lrg - rem-calc(6) !default; +$split-button-pip-top-lrg: $button-pip-lrg + rem-calc(5) !default; +$split-button-pip-default-float-lrg: rem-calc(-6) !default; + + +// +// @mixins +// + +// We use this mixin to create split buttons that build upon the button mixins +// +// $padding - Type of padding to apply. Default: medium. Options: tiny, small, medium, large. +// $pip-color - Color of the triangle. Default: $split-button-pip-color. +// $span-border - Border color of button divider. Default: $split-button-span-border-color. +// $base-style - Apply base style to split button. Default: true. +@mixin split-button( + $padding:medium, + $pip-color:$split-button-pip-color, + $span-border:$split-button-span-border-color, + $base-style:true) { + + // With this, we can control whether or not the base styles come through. + @if $base-style { + position: relative; + + // Styling for the split arrow clickable area + span { + display: block; + height: 100%; + position: absolute; + #{$opposite-direction}: 0; + top: 0; + border-#{$default-float}: solid 1px; + + // Building the triangle pip indicator + &:after { + position: absolute; + content: ""; + width: 0; + height: 0; + display: block; + border-style: inset; + top: 50%; + #{$default-float}: 50%; + } + + &:active { background-color: $split-button-active-bg-tint; } + } + } + + // Control the border color for the span area of the split button + @if $span-border { + span { + border-#{$default-float}-color: $span-border; + } + } + + // Style of the button and clickable area for tiny sizes + @if $padding == tiny { + padding-#{$opposite-direction}: $split-button-padding-tny; + + span { width: $split-button-span-width-tny; + &:after { + border-top-style: solid; + border-width: $split-button-pip-size-tny; + margin-#{$default-float}: $split-button-pip-default-float-tny; + top: 48%; + } + } + } + + // Style of the button and clickable area for small sizes + @else if $padding == small { + padding-#{$opposite-direction}: $split-button-padding-sml; + + span { width: $split-button-span-width-sml; + &:after { + border-top-style: solid; + border-width: $split-button-pip-size-sml; + margin-#{$default-float}: $split-button-pip-default-float-sml; + top: 48%; + } + } + } + + // Style of the button and clickable area for default (medium) sizes + @else if $padding == medium { + padding-#{$opposite-direction}: $split-button-padding-med; + + span { width: $split-button-span-width-med; + &:after { + border-top-style: solid; + border-width: $split-button-pip-size-med; + margin-#{$default-float}: $split-button-pip-default-float-med; + top: 48%; + } + } + } + + // Style of the button and clickable area for large sizes + @else if $padding == large { + padding-#{$opposite-direction}: $split-button-padding-lrg; + + span { width: $split-button-span-width-lrg; + &:after { + border-top-style: solid; + border-width: $split-button-pip-size-lrg; + margin-#{$default-float}: $split-button-pip-default-float-lrg; + top: 48%; + } + } + } + + // Control the color of the triangle pip + @if $pip-color { + span:after { border-color: $pip-color transparent transparent transparent; } + } +} + +@include exports("split-button") { + @if $include-html-button-classes { + + .split.button { @include split-button; + + &.secondary { @include split-button(false, $split-button-pip-color, $split-button-span-border-color, false); } + &.alert { @include split-button(false, false, $split-button-span-border-color, false); } + &.success { @include split-button(false, false, $split-button-span-border-color, false); } + + &.tiny { @include split-button(tiny, false, false, false); } + &.small { @include split-button(small, false, false, false); } + &.large { @include split-button(large, false, false, false); } + &.expand { padding-left: 2rem; } + + &.secondary { @include split-button(false, $split-button-pip-color-alt, false, false); } + + &.radius span { @include side-radius($opposite-direction, $global-radius); } + &.round span { @include side-radius($opposite-direction, 1000px); } + &.no-pip{ + span:before{ border-style:none; } + span:after{ border-style:none; } + span>i{ + display: block; + left: 50%; + margin-left: -0.28889em; + margin-top: -0.48889em; + position: absolute; + top: 50%; + } + } + } + + } +} diff --git a/themes/foundation5/scss/foundation/components/_sub-nav.scss b/themes/foundation5/scss/foundation/components/_sub-nav.scss new file mode 100644 index 0000000000000000000000000000000000000000..279b6356f0481cb25baeaac8cf2133af211ccf23 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_sub-nav.scss @@ -0,0 +1,125 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// @name _sub-nav.scss +// @dependencies _global.scss +// + +// +// @variables +// + +$include-html-nav-classes: $include-html-classes !default; + +// We use these to control margin and padding +$sub-nav-list-margin: rem-calc(-4 0 18) !default; +$sub-nav-list-padding-top: rem-calc(4) !default; + +// We use this to control the definition +$sub-nav-font-family: $body-font-family !default; +$sub-nav-font-size: rem-calc(14) !default; +$sub-nav-font-color: $aluminum !default; +$sub-nav-font-weight: $font-weight-normal !default; +$sub-nav-text-decoration: none !default; +$sub-nav-padding: rem-calc(3 16) !default; +$sub-nav-border-radius: 3px !default; +$sub-nav-font-color-hover: scale-color($sub-nav-font-color, $lightness: -25%) !default; + + +// We use these to control the active item styles + +$sub-nav-active-font-weight: $font-weight-normal !default; +$sub-nav-active-bg: $primary-color !default; +$sub-nav-active-bg-hover: scale-color($sub-nav-active-bg, $lightness: -14%) !default; +$sub-nav-active-color: $white !default; +$sub-nav-active-padding: $sub-nav-padding !default; +$sub-nav-active-cursor: default !default; + +$sub-nav-item-divider: "" !default; +$sub-nav-item-divider-margin: rem-calc(12) !default; + +// +// @mixins +// + + +// Create a sub-nav item +// +// $font-color - Font color. Default: $sub-nav-font-color. +// $font-size - Font size. Default: $sub-nav-font-size. +// $active-bg - Background of active nav item. Default: $sub-nav-active-bg. +// $active-bg-hover - Background of active nav item, when hovered. Default: $sub-nav-active-bg-hover. +@mixin sub-nav( + $font-color: $sub-nav-font-color, + $font-size: $sub-nav-font-size, + $active-bg: $sub-nav-active-bg, + $active-bg-hover: $sub-nav-active-bg-hover) { + display: block; + margin: $sub-nav-list-margin; + overflow: hidden; + padding-top: $sub-nav-list-padding-top; + width: auto; + + dt { + text-transform: uppercase; + } + + dt, + dd, + li { + color: $font-color; + float: $default-float; + font-family: $sub-nav-font-family; + font-size: $font-size; + font-weight: $sub-nav-font-weight; + margin-#{$default-float}: rem-calc(16); + margin-bottom: 0; + + a { + color: $sub-nav-font-color; + padding: $sub-nav-padding; + text-decoration: $sub-nav-text-decoration; + + &:hover { + color: $sub-nav-font-color-hover; + } + } + + &.active a { + @include radius($sub-nav-border-radius); + background: $active-bg; + color: $sub-nav-active-color; + cursor: $sub-nav-active-cursor; + font-weight: $sub-nav-active-font-weight; + padding: $sub-nav-active-padding; + + &:hover { + background: $active-bg-hover; + } + } + + @if $sub-nav-item-divider != "" { + margin-#{$default-float}: 0; + + &:before { + content: "#{$sub-nav-item-divider}"; + margin: 0 $sub-nav-item-divider-margin; + } + + &:first-child:before { + content: ""; + margin: 0; + } + } + } +} + +@include exports("sub-nav") { + @if $include-html-nav-classes { + .sub-nav { @include sub-nav; } + } +} diff --git a/themes/foundation5/scss/foundation/components/_switches.scss b/themes/foundation5/scss/foundation/components/_switches.scss new file mode 100644 index 0000000000000000000000000000000000000000..883d9ad719ddaee855aa7bee78f77aa7a4c7024d --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_switches.scss @@ -0,0 +1,241 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// @name +// @dependencies _global.scss +// + +// +// @variables +// + +$include-html-form-classes: $include-html-classes !default; + +// Controlling background color for the switch container +$switch-bg: $gainsboro !default; + +// We use these to control the switch heights for our default classes +$switch-height-tny: 1.5rem !default; +$switch-height-sml: 1.75rem !default; +$switch-height-med: 2rem !default; +$switch-height-lrg: 2.5rem !default; +$switch-bottom-margin: 1.5rem !default; + +// We use these to style the switch-paddle +$switch-paddle-bg: $white !default; +$switch-paddle-transition-speed: .15s !default; +$switch-paddle-transition-ease: ease-out !default; +$switch-active-color: $primary-color !default; + + +// +// @mixins +// + +// We use this mixin to create the base styles for our switch element. +// +// $transition-speed - Time in ms for switch to toggle. Default: $switch-paddle-transition-speed. +// $transition-ease - Easing function to use for animation (i.e. ease-out). Default: $switch-paddle-transition-ease. +@mixin switch-base( + $transition-speed:$switch-paddle-transition-speed, + $transition-ease:$switch-paddle-transition-ease) { + + border: none; + margin-bottom: $switch-bottom-margin; + outline: 0; + padding: 0; + position: relative; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + // Default label styles for type and transition + label { + background: $switch-bg; + color: transparent; + cursor: pointer; + display: block; + margin-bottom: ($switch-height-med / 2); + position: relative; + text-indent: 100%; + width: $switch-height-med * 2; height: $switch-height-med; + + // Transition for the switch label to follow paddle + @include single-transition(left, $transition-speed, $transition-ease); + } + + // So that we don't need to recreate the form with any JS, we use the + // existing checkbox or radio button, but we cleverly position and hide it. + input { + left: 10px; + opacity: 0; + padding:0; + position: absolute; + top: 9px; + + & + label { margin-left: 0; margin-right: 0; } + } + + // The paddle for the switch is created from an after psuedoclass + // content element. This is sized and positioned, and reacts to + // the state of the input. + + label:after { + background: $switch-paddle-bg; + content: ""; + display: block; + height: $switch-height-med - .5rem; + left: .25rem; + position: absolute; + top: .25rem; + width: $switch-height-med - .5rem; + + -webkit-transition: left $transition-speed $transition-ease; + -moz-transition: left $transition-speed $transition-ease; + -o-transition: translate3d(0,0,0); + transition: left $transition-speed $transition-ease; + + -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); + } + + input:checked + label { + background: $switch-active-color; + } + + input:checked + label:after { + left: $switch-height-med + .25rem; + } +} + +// We use this mixin to create the size styles for switches. +// +// $height - Height (in px) of the switch. Default: $switch-height-med. +// $font-size - Font size of text in switch. Default: $switch-font-size-med. +// $line-height - Line height of switch. Default: 2.3rem. +@mixin switch-size($height: $switch-height-med) { + + label { + height: $height; + width: $height * 2; + } + + label:after { + height: $height - .5rem; + width: $height - .5rem; + } + + input:checked + label:after { + left: $height + .25rem; + } + +} + +// We use this mixin to add color and other fanciness to the switches. +// +// $paddle-bg - Background of switch paddle. Default: $switch-paddle-bg. +// $active-color - Background color of positive side of switch. Default: $switch-positive-color. +// $negative-color - Background color of negative side of switch. Default: $switch-negative-color. +// $radius - Radius to apply to switch. Default: false. +// $base-style - Apply base styles? Default: true. +@mixin switch-style( + $paddle-bg:$switch-paddle-bg, + $active-color:$switch-active-color, + $radius:false, + $base-style:true) { + + @if $base-style { + + label { + color: transparent; + background: $switch-bg; + } + + label:after { + background: $paddle-bg; + } + + input:checked + label { + background: $active-color; + } + } + + // Setting up the radius for switches + @if $radius == true { + label { + border-radius: 2rem; + } + label:after { + border-radius: 2rem; + } + } + @else if $radius { + label { + border-radius: $radius; + } + label:after { + border-radius: $radius; + } + } + +} + +// We use this to quickly create switches with a single mixin +// +// $transition-speed - Time in ms for switch to toggle. Default: $switch-paddle-transition-speed. +// $transition-ease - Easing function to use for animation (i.e. ease-out). Default: $switch-paddle-transition-ease. +// $height - Height (in px) of the switch. Default: $switch-height-med. +// $paddle-bg - Background of switch paddle. Default: $switch-paddle-bg. +// $active-color - Background color of an active switch. Default: $switch-active-color. +// $radius - Radius to apply to switch. Default: false. +// $base-style - Apply base styles? Default: true. +@mixin switch( + $transition-speed: $switch-paddle-transition-speed, + $transition-ease: $switch-paddle-transition-ease, + $height: $switch-height-med, + $paddle-bg: $switch-paddle-bg, + $active-color: $switch-active-color, + $radius:false, + $base-style:true) { + @include switch-base($transition-speed, $transition-ease); + @include switch-size($height); + @include switch-style($paddle-bg, $active-color, $radius, $base-style); +} + +@include exports("switch") { + @if $include-html-form-classes { + .switch { + @include switch; + + // Large radio switches + &.large { @include switch-size($switch-height-lrg); } + + // Small radio switches + &.small { @include switch-size($switch-height-sml); } + + // Tiny radio switches + &.tiny { @include switch-size($switch-height-tny); } + + // Add a radius to the switch + &.radius { + label { @include radius(4px); } + label:after { @include radius(3px); } + } + + // Make the switch completely round, like a pill + &.round { @include radius(1000px); + label { @include radius(2rem); } + label:after { @include radius(2rem); } + } + + } + } +} diff --git a/themes/foundation5/scss/foundation/components/_tables.scss b/themes/foundation5/scss/foundation/components/_tables.scss new file mode 100644 index 0000000000000000000000000000000000000000..53e2c7a9f3430ebe45ffba2aa19a00bc84b40bec --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_tables.scss @@ -0,0 +1,135 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// @name _tables.scss +// @dependencies _global.scss +// + +// +// @variables +// + +$include-html-table-classes: $include-html-classes !default; + +// These control the background color for the table and even rows +$table-bg: $white !default; +$table-even-row-bg: $snow !default; + +// These control the table cell border style +$table-border-style: solid !default; +$table-border-size: 1px !default; +$table-border-color: $gainsboro !default; + +// These control the table head styles +$table-head-bg: $white-smoke !default; +$table-head-font-size: rem-calc(14) !default; +$table-head-font-color: $jet !default; +$table-head-font-weight: $font-weight-bold !default; +$table-head-padding: rem-calc(8 10 10) !default; + +// These control the table foot styles +$table-foot-bg: $table-head-bg !default; +$table-foot-font-size: $table-head-font-size !default; +$table-foot-font-color: $table-head-font-color !default; +$table-foot-font-weight: $table-head-font-weight !default; +$table-foot-padding: $table-head-padding !default; + +// These control the caption +$table-caption-bg: transparent !default; +$table-caption-font-color: $table-head-font-color !default; +$table-caption-font-size: rem-calc(16) !default; +$table-caption-font-weight: bold !default; + +// These control the row padding and font styles +$table-row-padding: rem-calc(9 10) !default; +$table-row-font-size: rem-calc(14) !default; +$table-row-font-color: $jet !default; +$table-line-height: rem-calc(18) !default; + +// These are for controlling the layout, display and margin of tables +$table-layout: auto !default; +$table-display: table-cell !default; +$table-margin-bottom: rem-calc(20) !default; + + +// +// @mixins +// + +@mixin table { + background: $table-bg; + border: $table-border-style $table-border-size $table-border-color; + margin-bottom: $table-margin-bottom; + table-layout: $table-layout; + + caption { + background: $table-caption-bg; + color: $table-caption-font-color; + font: { + size: $table-caption-font-size; + weight: $table-caption-font-weight; + } + } + + thead { + background: $table-head-bg; + + tr { + th, + td { + color: $table-head-font-color; + font-size: $table-head-font-size; + font-weight: $table-head-font-weight; + padding: $table-head-padding; + } + } + } + + tfoot { + background: $table-foot-bg; + + tr { + th, + td { + color: $table-foot-font-color; + font-size: $table-foot-font-size; + font-weight: $table-foot-font-weight; + padding: $table-foot-padding; + } + } + } + + tr { + th, + td { + color: $table-row-font-color; + font-size: $table-row-font-size; + padding: $table-row-padding; + text-align: $default-float; + } + + &.even, + &.alt, + &:nth-of-type(even) { background: $table-even-row-bg; } + } + + thead tr th, + tfoot tr th, + tfoot tr td, + tbody tr th, + tbody tr td, + tr td { display: $table-display; line-height: $table-line-height; } +} + + +@include exports("table") { + @if $include-html-table-classes { + table { + @include table; + } + } +} diff --git a/themes/foundation5/scss/foundation/components/_tabs.scss b/themes/foundation5/scss/foundation/components/_tabs.scss new file mode 100644 index 0000000000000000000000000000000000000000..03fcc0f0a35a9d027fdfee8f08571eff815b1f8c --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_tabs.scss @@ -0,0 +1,142 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; +@import 'grid'; + +// +// @variables +// + +$include-html-tabs-classes: $include-html-classes !default; + +$tabs-navigation-padding: rem-calc(16) !default; +$tabs-navigation-bg-color: $silver !default; +$tabs-navigation-active-bg-color: $white !default; +$tabs-navigation-hover-bg-color: scale-color($tabs-navigation-bg-color, $lightness: -6%) !default; +$tabs-navigation-font-color: $jet !default; +$tabs-navigation-active-font-color: $tabs-navigation-font-color !default; +$tabs-navigation-font-size: rem-calc(16) !default; +$tabs-navigation-font-family: $body-font-family !default; + +$tabs-content-margin-bottom: rem-calc(24) !default; +$tabs-content-padding: ($column-gutter/2) !default; + +$tabs-vertical-navigation-margin-bottom: 1.25rem !default; + +@include exports("tab") { + @if $include-html-tabs-classes { + .tabs { + @include clearfix; + margin-bottom: 0 !important; + margin-left: 0; + + dd, + .tab-title { + float: $default-float; + list-style: none; + margin-bottom: 0 !important; + position: relative; + + > a { + display: block; + background-color: $tabs-navigation-bg-color; + color: $tabs-navigation-font-color; + font-family: $tabs-navigation-font-family; + font-size: $tabs-navigation-font-size; + padding: $tabs-navigation-padding $tabs-navigation-padding * 2; + + &:hover { + background-color: $tabs-navigation-hover-bg-color; + } + } + + &.active a { + background-color: $tabs-navigation-active-bg-color; + color: $tabs-navigation-active-font-color; + } + } + + &.radius { + dd:first-child, + .tab:first-child { + a { @include side-radius($default-float, $global-radius); } + } + + dd:last-child, + .tab:last-child { + a { @include side-radius($opposite-direction, $global-radius); } + } + } + + &.vertical { + dd, + .tab-title { + position: inherit; + float: none; + display: block; + top: auto; + } + } + } + + .tabs-content { + @include clearfix; + margin-bottom: $tabs-content-margin-bottom; + width: 100%; + + > .content { + display: none; + float: $default-float; + padding: $tabs-content-padding 0; + width: 100%; + + &.active { + display: block; + float: none; + } + &.contained { + padding: $tabs-content-padding; + } + } + + &.vertical { + display: block; + + > .content { + padding: 0 $tabs-content-padding; + } + } + } + + @media #{$medium-up} { + .tabs { + &.vertical { + float: $default-float; + margin: 0; + margin-bottom: $tabs-vertical-navigation-margin-bottom !important; + max-width: 20%; + width: 20%; + } + } + + .tabs-content { + &.vertical { + float: $default-float; + margin-#{$default-float}: -1px; + max-width: 80%; + padding-#{$default-float}: 1rem; + width: 80%; + } + } + } + + .no-js { + .tabs-content > .content { + display: block; + float: none; + } + } + } +} diff --git a/themes/foundation5/scss/foundation/components/_thumbs.scss b/themes/foundation5/scss/foundation/components/_thumbs.scss new file mode 100644 index 0000000000000000000000000000000000000000..e40a501c5eaca86c16c07403d105998115ac76da --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_thumbs.scss @@ -0,0 +1,66 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// @name _thumbs.scss +// @dependencies _globals.scss +// + +// +// @variables +// + +$include-html-media-classes: $include-html-classes !default; + +// We use these to control border styles +$thumb-border-style: solid !default; +$thumb-border-width: 4px !default; +$thumb-border-color: $white !default; +$thumb-box-shadow: 0 0 0 1px rgba($black,.2) !default; +$thumb-box-shadow-hover: 0 0 6px 1px rgba($primary-color,0.5) !default; + +// Radius and transition speed for thumbs +$thumb-radius: $global-radius !default; +$thumb-transition-speed: 200ms !default; + +// +// @mixins +// + +// We use this to create image thumbnail styles. +// +// $border-width - Width of border around thumbnail. Default: $thumb-border-width. +// $box-shadow - Box shadow to apply to thumbnail. Default: $thumb-box-shadow. +// $box-shadow-hover - Box shadow to apply on hover. Default: $thumb-box-shadow-hover. +@mixin thumb( + $border-width:$thumb-border-width, + $box-shadow:$thumb-box-shadow, + $box-shadow-hover:$thumb-box-shadow-hover) { + border: $thumb-border-style $border-width $thumb-border-color; + box-shadow: $box-shadow; + display: inline-block; + line-height: 0; + max-width: 100%; + + &:hover, + &:focus { + box-shadow: $box-shadow-hover; + } +} + + +@include exports("thumb") { + @if $include-html-media-classes { + + /* Image Thumbnails */ + .th { + @include thumb; + @include single-transition(all, $thumb-transition-speed, ease-out); + + &.radius { @include radius($thumb-radius); } + } + } +} diff --git a/themes/foundation5/scss/foundation/components/_tooltips.scss b/themes/foundation5/scss/foundation/components/_tooltips.scss new file mode 100644 index 0000000000000000000000000000000000000000..c328dd172eece0533a2e664d37c6fc52c994d687 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_tooltips.scss @@ -0,0 +1,142 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// Tooltip Variables +// +$include-html-tooltip-classes: $include-html-classes !default; + +$has-tip-border-bottom: dotted 1px $iron !default; +$has-tip-font-weight: $font-weight-bold !default; +$has-tip-font-color: $oil !default; +$has-tip-border-bottom-hover: dotted 1px scale-color($primary-color, $lightness: -55%) !default; +$has-tip-font-color-hover: $primary-color !default; +$has-tip-cursor-type: help !default; + +$tooltip-padding: rem-calc(12) !default; +$tooltip-bg: $oil !default; +$tooltip-font-size: rem-calc(14) !default; +$tooltip-font-weight: $font-weight-normal !default; +$tooltip-font-color: $white !default; +$tooltip-line-height: 1.3 !default; +$tooltip-close-font-size: rem-calc(10) !default; +$tooltip-close-font-weight: $font-weight-normal !default; +$tooltip-close-font-color: $monsoon !default; +$tooltip-font-size-sml: rem-calc(14) !default; +$tooltip-radius: $global-radius !default; +$tooltip-rounded: $global-rounded !default; +$tooltip-pip-size: 5px !default; +$tooltip-max-width: 300px !default; + +@include exports("tooltip") { + @if $include-html-tooltip-classes { + + /* Tooltips */ + .has-tip { + border-bottom: $has-tip-border-bottom; + color: $has-tip-font-color; + cursor: $has-tip-cursor-type; + font-weight: $has-tip-font-weight; + + &:hover, + &:focus { + border-bottom: $has-tip-border-bottom-hover; + color: $has-tip-font-color-hover; + } + + &.tip-left, + &.tip-right { float: none !important; } + } + + .tooltip { + background: $tooltip-bg; + color: $tooltip-font-color; + display: none; + font-size: $tooltip-font-size; + font-weight: $tooltip-font-weight; + line-height: $tooltip-line-height; + max-width: $tooltip-max-width; + padding: $tooltip-padding; + position: absolute; + width: 100%; + z-index: 1006; + #{$default-float}: 50%; + + > .nub { + border-color: transparent transparent $tooltip-bg transparent; + border: solid $tooltip-pip-size; + display: block; + height: 0; + pointer-events: none; + position: absolute; + top: -($tooltip-pip-size * 2); + width: 0; + #{$default-float}: $tooltip-pip-size; + + &.rtl { + left: auto; + #{$opposite-direction}: $tooltip-pip-size; + } + } + + &.radius { + @include radius($tooltip-radius); + } + &.round { + @include radius($tooltip-rounded); + > .nub { + left: 2rem; + } + } + + &.opened { + border-bottom: $has-tip-border-bottom-hover !important; + color: $has-tip-font-color-hover !important; + } + } + + .tap-to-close { + color: $tooltip-close-font-color; + display: block; + font-size: $tooltip-close-font-size; + font-weight: $tooltip-close-font-weight; + } + + @media #{$small} { + .tooltip { + > .nub { + border-color: transparent transparent $tooltip-bg transparent; + top: -($tooltip-pip-size * 2); + } + &.tip-top>.nub { + border-color: $tooltip-bg transparent transparent transparent; + bottom: -($tooltip-pip-size * 2); + top: auto; + } + + &.tip-left, + &.tip-right { float: none !important; } + + &.tip-left>.nub { + border-color: transparent transparent transparent $tooltip-bg; + left: auto; + margin-top: -$tooltip-pip-size; + right: -($tooltip-pip-size * 2); + top: 50%; + } + &.tip-right>.nub { + border-color: transparent $tooltip-bg transparent transparent; + left: -($tooltip-pip-size * 2); + margin-top: -$tooltip-pip-size; + right: auto; + top: 50%; + } + + } + } + + } +} diff --git a/themes/foundation5/scss/foundation/components/_top-bar.scss b/themes/foundation5/scss/foundation/components/_top-bar.scss new file mode 100644 index 0000000000000000000000000000000000000000..f8e99c6313049f729505676ec2b0dfb8e527d1c5 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_top-bar.scss @@ -0,0 +1,743 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; +@import 'grid'; +@import 'buttons'; +@import 'forms'; + +// +// Top Bar Variables +// +$include-html-top-bar-classes: $include-html-classes !default; + +// Background color for the top bar +$topbar-bg-color: $oil !default; +$topbar-bg: $topbar-bg-color !default; + +// Height and margin +$topbar-height: rem-calc(45) !default; +$topbar-margin-bottom: 0 !default; + +// Controlling the styles for the title in the top bar +$topbar-title-weight: $font-weight-normal !default; +$topbar-title-font-size: rem-calc(17) !default; + +// Set the link colors and styles for top-level nav +$topbar-link-color: $white !default; +$topbar-link-color-hover: $white !default; +$topbar-link-color-active: $white !default; +$topbar-link-color-active-hover: $white !default; +$topbar-link-weight: $font-weight-normal !default; +$topbar-link-font-size: rem-calc(13) !default; +$topbar-link-hover-lightness: -10% !default; // Darken by 10% +$topbar-link-bg: $topbar-bg !default; +$topbar-link-bg-hover: $jet !default; +$topbar-link-bg-color-hover: $charcoal !default; +$topbar-link-bg-active: $primary-color !default; +$topbar-link-bg-active-hover: scale-color($primary-color, $lightness: -14%) !default; +$topbar-link-font-family: $body-font-family !default; +$topbar-link-text-transform: none !default; +$topbar-link-padding: ($topbar-height / 3) !default; +$topbar-back-link-size: rem-calc(18) !default; +$topbar-link-dropdown-padding: rem-calc(20) !default; +$topbar-button-font-size: .75rem !default; +$topbar-button-top: 7px !default; + +// Style the top bar dropdown elements +$topbar-dropdown-bg: $oil !default; +$topbar-dropdown-link-color: $white !default; +$topbar-dropdown-link-color-hover: $topbar-link-color-hover !default; +$topbar-dropdown-link-bg: $oil !default; +$topbar-dropdown-link-bg-hover: $jet !default; +$topbar-dropdown-link-weight: $font-weight-normal !default; +$topbar-dropdown-toggle-size: 5px !default; +$topbar-dropdown-toggle-color: $white !default; +$topbar-dropdown-toggle-alpha: .4 !default; + +$topbar-dropdown-label-color: $monsoon !default; +$topbar-dropdown-label-text-transform: uppercase !default; +$topbar-dropdown-label-font-weight: $font-weight-bold !default; +$topbar-dropdown-label-font-size: rem-calc(10) !default; +$topbar-dropdown-label-bg: $oil !default; + +// Top menu icon styles +$topbar-menu-link-transform: uppercase !default; +$topbar-menu-link-font-size: rem-calc(13) !default; +$topbar-menu-link-weight: $font-weight-bold !default; +$topbar-menu-link-color: $white !default; +$topbar-menu-icon-color: $white !default; +$topbar-menu-link-color-toggled: $jumbo !default; +$topbar-menu-icon-color-toggled: $jumbo !default; +$topbar-menu-icon-position: $opposite-direction !default; // Change to $default-float for a left menu icon + +// Transitions and breakpoint styles +$topbar-transition-speed: 300ms !default; +// Using rem-calc for the below breakpoint causes issues with top bar +$topbar-breakpoint: #{lower-bound($medium-range)} !default; // Change to 9999px for always mobile layout +$topbar-media-query: "#{$screen} and (min-width:#{lower-bound($topbar-breakpoint)})" !default; + +// Top-bar input styles +$topbar-input-height: rem-calc(28) !default; + +// Divider Styles +$topbar-divider-border-bottom: solid 1px scale-color($topbar-bg-color, $lightness: 13%) !default; +$topbar-divider-border-top: solid 1px scale-color($topbar-bg-color, $lightness: -50%) !default; + +// Sticky Class +$topbar-sticky-class: ".sticky" !default; +$topbar-arrows: true !default; //Set false to remove the triangle icon from the menu item +$topbar-dropdown-arrows: true !default; //Set false to remove the \00bb >> text from dropdown subnavigation li + +// Accessibility mixins for hiding and showing the menu dropdown items +@mixin topbar-hide-dropdown { + // Makes an element visually hidden by default, but visible when focused. + @include element-invisible(); + display: block; +} + +@mixin topbar-show-dropdown { + @include element-invisible-off(); + display: block; + position: absolute !important; // Reset the position from static to absolute +} + +@include exports("top-bar") { + + @if $include-html-top-bar-classes { + + // Used to provide media query values for javascript components. + // This class is generated despite the value of $include-html-top-bar-classes + // to ensure width calculations work correctly. + meta.foundation-mq-topbar { + font-family: "/" + unquote($topbar-media-query) + "/"; + width: $topbar-breakpoint; + } + + /* Wrapped around .top-bar to contain to grid width */ + .contain-to-grid { + width: 100%; + background: $topbar-bg; + + .top-bar { + margin-bottom: $topbar-margin-bottom; + } + } + + // Wrapped around .top-bar to make it stick to the top + .fixed { + position: fixed; + top: 0; + width: 100%; + z-index: 99; + #{$default-float}: 0; + + &.expanded:not(.top-bar) { + height: auto; + max-height: 100%; + overflow-y: auto; + width: 100%; + + .title-area { + position: fixed; + width: 100%; + z-index: 99; + } + + // Ensure you can scroll the menu on small screens + .top-bar-section { + margin-top: $topbar-height; + z-index: 98; + } + } + } + + .top-bar { + background: $topbar-bg; + height: $topbar-height; + line-height: $topbar-height; + margin-bottom: $topbar-margin-bottom; + overflow: hidden; + position: relative; + + // Topbar Global list Styles + ul { + list-style: none; + margin-bottom: 0; + } + + .row { + max-width: none; + } + + form, + input, + select { + margin-bottom: 0; + } + + input, + select { + font-size: $topbar-button-font-size; + height: $topbar-input-height; + padding-bottom: .35rem; + padding-top: .35rem; + } + + .button, button { + font-size: $topbar-button-font-size; + margin-bottom: 0; + padding-bottom: .35rem + rem-calc(1); + padding-top: .35rem + rem-calc(1); + // position: relative; + // top: -1px; + + // Corrects a slight misalignment when put next to an input field + @media #{$small-only} { + position: relative; + top: -1px; + } + } + + // Title Area + .title-area { + margin: 0; + position: relative; + } + + .name { + font-size: $rem-base; + height: $topbar-height; + margin: 0; + + h1, h2, h3, h4, p, span { + font-size: $topbar-title-font-size; + line-height: $topbar-height; + margin: 0; + + a { + color: $topbar-link-color; + display: block; + font-weight: $topbar-title-weight; + padding: 0 $topbar-link-padding; + width: 75%; + } + } + } + + // Menu toggle button on small devices + .toggle-topbar { + position: absolute; + #{$topbar-menu-icon-position}: 0; + top: 0; + + a { + color: $topbar-link-color; + display: block; + font-size: $topbar-menu-link-font-size; + font-weight: $topbar-menu-link-weight; + height: $topbar-height; + line-height: $topbar-height; + padding: 0 $topbar-link-padding; + position: relative; + text-transform: $topbar-menu-link-transform; + } + + // Adding the class "menu-icon" will add the 3-line icon people love and adore. + &.menu-icon { + margin-top: -16px; + top: 50%; + + a { + @include hamburger(16px, false, 0, 1px, 6px, $topbar-menu-icon-color, "", false); + + @if $text-direction == rtl { + text-indent: -58px; + } + color: $topbar-menu-link-color; + height: 34px; + line-height: 33px; + padding: 0 $topbar-link-padding+rem-calc(25) 0 $topbar-link-padding; + position: relative; + } + } + } + + // Change things up when the top-bar is expanded + &.expanded { + background: transparent; + height: auto; + + .title-area { + background: $topbar-bg; + } + + .toggle-topbar { + a { + color: $topbar-menu-link-color-toggled; + + span::after { + // Shh, don't tell, but box-shadows create the menu icon :) + // Change the color of the bars when the menu is expanded, using given thickness from hamburger() above + box-shadow: 0 0 0 1px $topbar-menu-icon-color-toggled, + 0 7px 0 1px $topbar-menu-icon-color-toggled, + 0 14px 0 1px $topbar-menu-icon-color-toggled; + } + } + } + + // Fixes an issue with Desktop and Mobile Safari where deeply-nested menus don't appear + @media screen and (-webkit-min-device-pixel-ratio:0) { + .top-bar-section { + .has-dropdown.moved > .dropdown, + .dropdown { + clip: initial; + } + + // This was needed as parent ul's had padding, and the clip: was allowing content to peak through + .has-dropdown:not(.moved) > ul { + padding: 0; + } + } + } + } + } + + // Right and Left Navigation that stacked by default + .top-bar-section { + #{$default-float}: 0; + position: relative; + width: auto; + @include single-transition($default-float, $topbar-transition-speed); + + ul { + display: block; + font-size: $rem-base; + height: auto; + margin: 0; + padding: 0; + width: 100%; + } + + .divider, + [role="separator"] { + border-top: $topbar-divider-border-top; + clear: both; + height: 1px; + width: 100%; + } + + ul li { + background: $topbar-dropdown-bg; + + > a { + color: $topbar-link-color; + display: block; + font-family: $topbar-link-font-family; + font-size: $topbar-link-font-size; + font-weight: $topbar-link-weight; + padding-#{$default-float}: $topbar-link-padding; + padding: 12px 0 12px $topbar-link-padding; + text-transform: $topbar-link-text-transform; + width: 100%; + + &.button { + font-size: $topbar-link-font-size; + padding-#{$default-float}: $topbar-link-padding; + padding-#{$opposite-direction}: $topbar-link-padding; + @include button-style($bg:$primary-color); + } + + &.button.secondary { @include button-style($bg:$secondary-color); } + &.button.success { @include button-style($bg:$success-color); } + &.button.alert { @include button-style($bg:$alert-color); } + &.button.warning { @include button-style($bg:$warning-color); } + &.button.info { @include button-style($bg:$info-color); } + } + + > button { + font-size: $topbar-link-font-size; + padding-#{$default-float}: $topbar-link-padding; + padding-#{$opposite-direction}: $topbar-link-padding; + @include button-style($bg:$primary-color); + + &.secondary { @include button-style($bg:$secondary-color); } + &.success { @include button-style($bg:$success-color); } + &.alert { @include button-style($bg:$alert-color); } + &.warning { @include button-style($bg:$warning-color); } + &.info { @include button-style($bg:$info-color); } + } + + // Apply the hover link color when it has that class + &:hover:not(.has-form) > a { + background-color: $topbar-link-bg-color-hover; + color: $topbar-link-color-hover; + + @if ($topbar-link-bg-hover) { + background: $topbar-link-bg-hover; + } + } + + // Apply the active link color when it has that class + &.active > a { + background: $topbar-link-bg-active; + color: $topbar-link-color-active; + + &:hover { + background: $topbar-link-bg-active-hover; + color: $topbar-link-color-active-hover; + } + } + } + + // Add some extra padding for list items contains buttons + .has-form { + padding: $topbar-link-padding; + } + + // Styling for list items that have a dropdown within them. + .has-dropdown { + position: relative; + + > a { + &:after { + @if ($topbar-arrows) { + @include css-triangle($topbar-dropdown-toggle-size, rgba($topbar-dropdown-toggle-color, $topbar-dropdown-toggle-alpha), $default-float); + } + + margin-#{$opposite-direction}: $topbar-link-padding; + margin-top: -($topbar-dropdown-toggle-size / 2) - 2; + position: absolute; + top: 50%; + #{$opposite-direction}: 0; + } + } + + &.moved { + position: static; + + > .dropdown { + @include topbar-show-dropdown(); + width: 100%; + } + + > a:after { + display: none; + } + } + } + + // Styling elements inside of dropdowns + .dropdown { + @include topbar-hide-dropdown(); + padding: 0; + position: absolute; + top: 0; + z-index: 99; + #{$default-float}: 100%; + + li { + height: auto; + width: 100%; + + a { + font-weight: $topbar-dropdown-link-weight; + padding: 8px $topbar-link-padding; + &.parent-link { + font-weight: $topbar-link-weight; + } + } + + &.title h5, + &.parent-link { + // Back Button + margin-bottom: 0; + margin-top: 0; + font-size: $topbar-back-link-size; + a { + color: $topbar-link-color; + // line-height: ($topbar-height / 2); + display: block; + &:hover { background:none; } + } + } + + &.has-form { + padding: 8px $topbar-link-padding; + } + + .button, + button { + top: auto; + } + } + + label { + color: $topbar-dropdown-label-color; + font-size: $topbar-dropdown-label-font-size; + font-weight: $topbar-dropdown-label-font-weight; + margin-bottom: 0; + padding: 8px $topbar-link-padding 2px; + text-transform: $topbar-dropdown-label-text-transform; + } + } + } + + .js-generated { display: block; } + + + // Top Bar styles intended for screen sizes above the breakpoint. + @media #{$topbar-media-query} { + .top-bar { + @include clearfix; + background: $topbar-bg; + overflow: visible; + + .toggle-topbar { display: none; } + + .title-area { float: $default-float; } + .name h1 a, + .name h2 a, + .name h3 a, + .name h4 a, + .name h5 a, + .name h6 a { width: auto; } + + input, + select, + .button, + button { + font-size: rem-calc(14); + height: $topbar-input-height; + position: relative; + top: (($topbar-height - $topbar-input-height) / 2); + } + + .has-form > .button, + .has-form > button { + padding-top: rem-calc(5); + top: (($topbar-height - $topbar-input-height + rem-calc(-3)) / 2); + } + + &.expanded { + background: $topbar-bg; + } + } + + .contain-to-grid .top-bar { + margin: 0 auto; + margin-bottom: $topbar-margin-bottom; + max-width: $row-width; + } + + .top-bar-section { + @include single-transition(none,0,0); + #{$default-float}: 0 !important; + + ul { + display: inline; + height: auto !important; + width: auto; + + li { + float: $default-float; + .js-generated { display: none; } + } + } + + li { + &.hover { + > a:not(.button) { + background-color: $topbar-link-bg-color-hover; + @if ($topbar-link-bg-hover) { + background: $topbar-link-bg-hover; + } + color: $topbar-link-color-hover; + } + } + + &:not(.has-form) { + a:not(.button) { + background: $topbar-link-bg; + line-height: $topbar-height; + padding: 0 $topbar-link-padding; + &:hover { + background-color: $topbar-link-bg-color-hover; + @if ($topbar-link-bg-hover) { + background: $topbar-link-bg-hover; + } + } + } + } + + &.active:not(.has-form) { + a:not(.button) { + background: $topbar-link-bg-active; + color: $topbar-link-color-active; + line-height: $topbar-height; + padding: 0 $topbar-link-padding; + &:hover { + background: $topbar-link-bg-active-hover; + color: $topbar-link-color-active-hover; + } + } + } + } + + .has-dropdown { + @if $topbar-arrows { + > a { + padding-#{$opposite-direction}: $topbar-link-padding + $topbar-link-dropdown-padding !important; + &:after { + @include css-triangle($topbar-dropdown-toggle-size, rgba($topbar-dropdown-toggle-color, $topbar-dropdown-toggle-alpha), top); + margin-top: -($topbar-dropdown-toggle-size / 2); + top: ($topbar-height / 2); + } + } + } + + &.moved { position: relative; + > .dropdown { + @include topbar-hide-dropdown(); + } + } + + &.hover, &.not-click:hover { + > .dropdown { + @include topbar-show-dropdown(); + } + } + + > a:focus + .dropdown { + @include topbar-show-dropdown(); + } + + .dropdown li.has-dropdown { + > a { + @if ($topbar-dropdown-arrows) { + &:after { + border: none; + content: "\00bb"; + top: rem-calc(3); + + #{$opposite-direction}: 5px; + } + } + } + } + } + + .dropdown { + #{$default-float}: 0; + background: transparent; + min-width: 100%; + top: auto; + + li { + a { + background: $topbar-dropdown-link-bg; + color: $topbar-dropdown-link-color; + line-height: $topbar-height; + padding: 12px $topbar-link-padding; + white-space: nowrap; + } + + &:not(.has-form):not(.active) { + > a:not(.button) { + background: $topbar-dropdown-link-bg; + color: $topbar-dropdown-link-color; + } + + &:hover > a:not(.button) { + background-color: $topbar-link-bg-color-hover; + color: $topbar-dropdown-link-color-hover; + @if ($topbar-dropdown-link-bg-hover) { + background: $topbar-dropdown-link-bg-hover; + } + } + } + + label { + background: $topbar-dropdown-label-bg; + white-space: nowrap; + } + + // Second Level Dropdowns + .dropdown { + #{$default-float}: 100%; + top: 0; + } + } + } + + > ul > .divider, + > ul > [role="separator"] { + border-#{$opposite-direction}: $topbar-divider-border-bottom; + border-bottom: none; + border-top: none; + clear: none; + height: $topbar-height; + width: 0; + } + + .has-form { + background: $topbar-link-bg; + height: $topbar-height; + padding: 0 $topbar-link-padding; + } + + // Position overrides for ul.right and ul.left + .#{$opposite-direction} { + li .dropdown { + #{$default-float}: auto; + #{$opposite-direction}: 0; + + li .dropdown { #{$opposite-direction}: 100%; } + } + } + .#{$default-float} { + li .dropdown { + #{$opposite-direction}: auto; + #{$default-float}: 0; + + li .dropdown { #{$default-float}: 100%; } + } + } + } + + // Degrade gracefully when Javascript is disabled. Displays dropdown and changes + // background & text color on hover. + .no-js .top-bar-section { + ul li { + // Apply the hover link color when it has that class + &:hover > a { + background-color: $topbar-link-bg-color-hover; + @if ($topbar-link-bg-hover) { + background: $topbar-link-bg-hover; + } + color: $topbar-link-color-hover; + } + + // Apply the active link color when it has that class + &:active > a { + background: $topbar-link-bg-active; + color: $topbar-link-color-active; + } + } + + .has-dropdown { + &:hover { + > .dropdown { + @include topbar-show-dropdown(); + } + } + + > a:focus + .dropdown { + @include topbar-show-dropdown(); + } + } + } + } + } +} diff --git a/themes/foundation5/scss/foundation/components/_type.scss b/themes/foundation5/scss/foundation/components/_type.scss new file mode 100644 index 0000000000000000000000000000000000000000..57ad4556ceed69f0c41927d6d17b58f248bc66f6 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_type.scss @@ -0,0 +1,464 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +$include-html-type-classes: $include-html-classes !default; + +// We use these to control header font styles +$header-font-family: $body-font-family !default; +$header-font-weight: $font-weight-normal !default; +$header-font-style: normal !default; +$header-font-color: $jet !default; +$header-line-height: 1.4 !default; +$header-top-margin: .2rem !default; +$header-bottom-margin: .5rem !default; +$header-text-rendering: optimizeLegibility !default; + +// We use these to control header font sizes +$h1-font-size: rem-calc(44) !default; +$h2-font-size: rem-calc(37) !default; +$h3-font-size: rem-calc(27) !default; +$h4-font-size: rem-calc(23) !default; +$h5-font-size: rem-calc(18) !default; +$h6-font-size: 1rem !default; + +// We use these to control header size reduction on small screens +$h1-font-reduction: rem-calc(10) !default; +$h2-font-reduction: rem-calc(10) !default; +$h3-font-reduction: rem-calc(5) !default; +$h4-font-reduction: rem-calc(5) !default; +$h5-font-reduction: 0 !default; +$h6-font-reduction: 0 !default; + +// These control how subheaders are styled. +$subheader-line-height: 1.4 !default; +$subheader-font-color: scale-color($header-font-color, $lightness: 35%) !default; +$subheader-font-weight: $font-weight-normal !default; +$subheader-top-margin: .2rem !default; +$subheader-bottom-margin: .5rem !default; + +// A general <small> styling +$small-font-size: 60% !default; +$small-font-color: scale-color($header-font-color, $lightness: 35%) !default; + +// We use these to style paragraphs +$paragraph-font-family: inherit !default; +$paragraph-font-weight: $font-weight-normal !default; +$paragraph-font-size: 1rem !default; +$paragraph-line-height: 1.6 !default; +$paragraph-margin-bottom: rem-calc(20) !default; +$paragraph-aside-font-size: rem-calc(14) !default; +$paragraph-aside-line-height: 1.35 !default; +$paragraph-aside-font-style: italic !default; +$paragraph-text-rendering: optimizeLegibility !default; + +// We use these to style <code> tags +$code-color: $oil !default; +$code-font-family: $font-family-monospace !default; +$code-font-weight: $font-weight-normal !default; +$code-background-color: scale-color($secondary-color, $lightness: 70%) !default; +$code-border-size: 1px !default; +$code-border-style: solid !default; +$code-border-color: scale-color($code-background-color, $lightness: -10%) !default; +$code-padding: rem-calc(2) rem-calc(5) rem-calc(1) !default; + +// We use these to style anchors +$anchor-text-decoration: none !default; +$anchor-text-decoration-hover: none !default; +$anchor-font-color: $primary-color !default; +$anchor-font-color-hover: scale-color($anchor-font-color, $lightness: -14%) !default; + +// We use these to style the <hr> element +$hr-border-width: 1px !default; +$hr-border-style: solid !default; +$hr-border-color: $gainsboro !default; +$hr-margin: rem-calc(20) !default; + +// We use these to style lists +$list-font-family: $paragraph-font-family !default; +$list-font-size: $paragraph-font-size !default; +$list-line-height: $paragraph-line-height !default; +$list-margin-bottom: $paragraph-margin-bottom !default; +$list-style-position: outside !default; +$list-side-margin: 1.1rem !default; +$list-ordered-side-margin: 1.4rem !default; +$list-side-margin-no-bullet: 0 !default; +$list-nested-margin: rem-calc(20) !default; +$definition-list-header-weight: $font-weight-bold !default; +$definition-list-header-margin-bottom: .3rem !default; +$definition-list-margin-bottom: rem-calc(12) !default; + +// We use these to style blockquotes +$blockquote-font-color: scale-color($header-font-color, $lightness: 35%) !default; +$blockquote-padding: rem-calc(9 20 0 19) !default; +$blockquote-border: 1px solid $gainsboro !default; +$blockquote-cite-font-size: rem-calc(13) !default; +$blockquote-cite-font-color: scale-color($header-font-color, $lightness: 23%) !default; +$blockquote-cite-link-color: $blockquote-cite-font-color !default; + +// Acronym styles +$acronym-underline: 1px dotted $gainsboro !default; + +// We use these to control padding and margin +$microformat-padding: rem-calc(10 12) !default; +$microformat-margin: rem-calc(0 0 20 0) !default; + +// We use these to control the border styles +$microformat-border-width: 1px !default; +$microformat-border-style: solid !default; +$microformat-border-color: $gainsboro !default; + +// We use these to control full name font styles +$microformat-fullname-font-weight: $font-weight-bold !default; +$microformat-fullname-font-size: rem-calc(15) !default; + +// We use this to control the summary font styles +$microformat-summary-font-weight: $font-weight-bold !default; + +// We use this to control abbr padding +$microformat-abbr-padding: rem-calc(0 1) !default; + +// We use this to control abbr font styles +$microformat-abbr-font-weight: $font-weight-bold !default; +$microformat-abbr-font-decoration: none !default; + +// Text alignment class names +$align-class-names: + small-only, + small, + medium-only, + medium, + large-only, + large, + xlarge-only, + xlarge, + xxlarge-only, + xxlarge; + +// Text alignment breakpoints +$align-class-breakpoints: + $small-only, + $small-up, + $medium-only, + $medium-up, + $large-only, + $large-up, + $xlarge-only, + $xlarge-up, + $xxlarge-only, + $xxlarge-up; + +// Generates text align and justify 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; } + } + } +} + +// +// Typography Placeholders +// + +// These will throw a deprecation warning if used within a media query. +@mixin lead { + font-size: $paragraph-font-size + rem-calc(3.5); + line-height: 1.6; +} + +@mixin subheader { + line-height: $subheader-line-height; + color: $subheader-font-color; + font-weight: $subheader-font-weight; + margin-top: $subheader-top-margin; + margin-bottom: $subheader-bottom-margin; +} +@include exports("type") { + @if $include-html-type-classes { + // Responsive Text alignment + @include align-classes; + + /* Typography resets */ + div, + dl, + dt, + dd, + ul, + ol, + li, + h1, + h2, + h3, + h4, + h5, + h6, + pre, + form, + p, + blockquote, + th, + td { + margin:0; + padding:0; + } + + /* Default Link Styles */ + a { + color: $anchor-font-color; + line-height: inherit; + text-decoration: $anchor-text-decoration; + + &:hover, + &:focus { + color: $anchor-font-color-hover; + @if $anchor-text-decoration-hover != $anchor-text-decoration { + text-decoration: $anchor-text-decoration-hover; + } + } + + img { border:none; } + } + + /* Default paragraph styles */ + p { + font-family: $paragraph-font-family; + font-size: $paragraph-font-size; + font-weight: $paragraph-font-weight; + line-height: $paragraph-line-height; + margin-bottom: $paragraph-margin-bottom; + text-rendering: $paragraph-text-rendering; + + &.lead { @include lead; } + + & aside { + font-size: $paragraph-aside-font-size; + font-style: $paragraph-aside-font-style; + line-height: $paragraph-aside-line-height; + } + } + + /* Default header styles */ + h1, h2, h3, h4, h5, h6 { + color: $header-font-color; + font-family: $header-font-family; + font-style: $header-font-style; + font-weight: $header-font-weight; + line-height: $header-line-height; + margin-bottom: $header-bottom-margin; + margin-top: $header-top-margin; + text-rendering: $header-text-rendering; + + small { + color: $small-font-color; + font-size: $small-font-size; + line-height: 0; + } + } + + h1 { font-size: $h1-font-size - $h1-font-reduction; } + h2 { font-size: $h2-font-size - $h2-font-reduction; } + h3 { font-size: $h3-font-size - $h3-font-reduction; } + h4 { font-size: $h4-font-size - $h4-font-reduction; } + h5 { font-size: $h5-font-size - $h5-font-reduction; } + h6 { font-size: $h6-font-size - $h6-font-reduction; } + + .subheader { @include subheader; } + + hr { + border: $hr-border-style $hr-border-color; + border-width: $hr-border-width 0 0; + clear: both; + height: 0; + margin: $hr-margin 0 ($hr-margin - rem-calc($hr-border-width)); + } + + /* Helpful Typography Defaults */ + em, + i { + font-style: italic; + line-height: inherit; + } + + strong, + b { + font-weight: $font-weight-bold; + line-height: inherit; + } + + small { + font-size: $small-font-size; + line-height: inherit; + } + + code { + background-color: $code-background-color; + border-color: $code-border-color; + border-style: $code-border-style; + border-width: $code-border-size; + color: $code-color; + font-family: $code-font-family; + font-weight: $code-font-weight; + padding: $code-padding; + } + + /* Lists */ + ul, + ol, + dl { + font-family: $list-font-family; + font-size: $list-font-size; + line-height: $list-line-height; + list-style-position: $list-style-position; + margin-bottom: $list-margin-bottom; + } + + ul { + margin-#{$default-float}: $list-side-margin; + &.no-bullet { + margin-#{$default-float}: $list-side-margin-no-bullet; + li { + ul, + ol { + margin-#{$default-float}: $list-nested-margin; + margin-bottom: 0; + list-style: none; + } + } + } + } + + /* Unordered Lists */ + ul { + li { + ul, + ol { + margin-#{$default-float}: $list-nested-margin; + margin-bottom: 0; + } + } + &.square, + &.circle, + &.disc { + li ul { list-style: inherit; } + } + + &.square { list-style-type: square; margin-#{$default-float}: $list-side-margin;} + &.circle { list-style-type: circle; margin-#{$default-float}: $list-side-margin;} + &.disc { list-style-type: disc; margin-#{$default-float}: $list-side-margin;} + &.no-bullet { list-style: none; } + } + + /* Ordered Lists */ + ol { + margin-#{$default-float}: $list-ordered-side-margin; + li { + ul, + ol { + margin-#{$default-float}: $list-nested-margin; + margin-bottom: 0; + } + } + } + + /* Definition Lists */ + dl { + dt { + margin-bottom: $definition-list-header-margin-bottom; + font-weight: $definition-list-header-weight; + } + dd { margin-bottom: $definition-list-margin-bottom; } + } + + /* Abbreviations */ + abbr, + acronym { + text-transform: uppercase; + font-size: 90%; + color: $body-font-color; + cursor: $cursor-help-value; + } + abbr { + text-transform: none; + &[title] { + border-bottom: $acronym-underline; + } + } + + /* Blockquotes */ + blockquote { + margin: 0 0 $paragraph-margin-bottom; + padding: $blockquote-padding; + border-#{$default-float}: $blockquote-border; + + cite { + display: block; + font-size: $blockquote-cite-font-size; + color: $blockquote-cite-font-color; + &:before { + content: "\2014 \0020"; + } + + a, + a:visited { + color: $blockquote-cite-link-color; + } + } + } + blockquote, + blockquote p { + line-height: $paragraph-line-height; + color: $blockquote-font-color; + } + + /* Microformats */ + .vcard { + display: inline-block; + margin: $microformat-margin; + border: $microformat-border-width $microformat-border-style $microformat-border-color; + padding: $microformat-padding; + + li { + margin: 0; + display: block; + } + .fn { + font-weight: $microformat-fullname-font-weight; + font-size: $microformat-fullname-font-size; + } + } + + .vevent { + .summary { font-weight: $microformat-summary-font-weight; } + + abbr { + cursor: $cursor-default-value; + text-decoration: $microformat-abbr-font-decoration; + font-weight: $microformat-abbr-font-weight; + border: none; + padding: $microformat-abbr-padding; + } + } + + + @media #{$medium-up} { + h1, h2, h3, h4, h5, h6 { line-height: $header-line-height; } + 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; } + } + } +} diff --git a/themes/foundation5/scss/foundation/components/_visibility.scss b/themes/foundation5/scss/foundation/components/_visibility.scss new file mode 100644 index 0000000000000000000000000000000000000000..f4bfebc5713dc9a5f2f6622e82007bec18d7a9d7 --- /dev/null +++ b/themes/foundation5/scss/foundation/components/_visibility.scss @@ -0,0 +1,492 @@ +// Foundation by ZURB +// foundation.zurb.com +// Licensed under MIT Open Source + +@import 'global'; + +// +// Foundation Visibility Classes +// +$include-html-visibility-classes: $include-html-classes !default; +$include-accessibility-classes: true !default; +$include-table-visibility-classes: true !default; +$include-legacy-visibility-classes: true !default; + +// +// Media Class Names +// +// Visibility Breakpoints +$visibility-breakpoint-sizes: + small, + medium, + large, + xlarge, + xxlarge; + +$visibility-breakpoint-queries: + unquote($small-up), + unquote($medium-up), + unquote($large-up), + unquote($xlarge-up), + unquote($xxlarge-up); + +@mixin visibility-loop { + @each $current-visibility-breakpoint in $visibility-breakpoint-sizes { + $visibility-inherit-list: (); + $visibility-none-list: (); + + $visibility-visible-list: (); + $visibility-hidden-list: (); + + $visibility-table-list: (); + $visibility-table-header-group-list: (); + $visibility-table-row-group-list: (); + $visibility-table-row-list: (); + $visibility-table-cell-list: (); + + @each $visibility-comparison-breakpoint in $visibility-breakpoint-sizes { + @if index($visibility-breakpoint-sizes, $visibility-comparison-breakpoint) < index($visibility-breakpoint-sizes, $current-visibility-breakpoint) { + // Smaller than current breakpoint + + $visibility-inherit-list: append($visibility-inherit-list, unquote( + '.hide-for-#{$visibility-comparison-breakpoint}-only, .show-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-none-list: append($visibility-none-list, unquote( + '.show-for-#{$visibility-comparison-breakpoint}-only, .hide-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-visible-list: append($visibility-visible-list, unquote( + '.hidden-for-#{$visibility-comparison-breakpoint}-only, .visible-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-hidden-list: append($visibility-hidden-list, unquote( + '.visible-for-#{$visibility-comparison-breakpoint}-only, .hidden-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-table-list: append($visibility-table-list, unquote( + 'table.hide-for-#{$visibility-comparison-breakpoint}-only, table.show-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-table-header-group-list: append($visibility-table-header-group-list, unquote( + 'thead.hide-for-#{$visibility-comparison-breakpoint}-only, thead.show-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-table-row-group-list: append($visibility-table-row-group-list, unquote( + 'tbody.hide-for-#{$visibility-comparison-breakpoint}-only, tbody.show-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-table-row-list: append($visibility-table-row-list, unquote( + 'tr.hide-for-#{$visibility-comparison-breakpoint}-only, tr.show-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-table-cell-list: append($visibility-table-cell-list, unquote( + 'th.hide-for-#{$visibility-comparison-breakpoint}-only, td.hide-for-#{$visibility-comparison-breakpoint}-only, th.show-for-#{$visibility-comparison-breakpoint}-up, td.show-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + + // Foundation 4 compatibility: + // Include .show/hide-for-[size] and .show/hide-for-[size]-down classes + // for small, medium, and large breakpoints only + @if $include-legacy-visibility-classes and index((small, medium, large), $visibility-comparison-breakpoint) != false { + $visibility-inherit-list: append($visibility-inherit-list, unquote( + '.hide-for-#{$visibility-comparison-breakpoint}, .hide-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-none-list: append($visibility-none-list, unquote( + '.show-for-#{$visibility-comparison-breakpoint}, .show-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-visible-list: append($visibility-visible-list, unquote( + '.hidden-for-#{$visibility-comparison-breakpoint}, .hidden-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-hidden-list: append($visibility-hidden-list, unquote( + '.visible-for-#{$visibility-comparison-breakpoint}, .visible-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-table-list: append($visibility-table-list, unquote( + 'table.hide-for-#{$visibility-comparison-breakpoint}, table.hide-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-table-header-group-list: append($visibility-table-header-group-list, unquote( + 'thead.hide-for-#{$visibility-comparison-breakpoint}, thead.hide-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-table-row-group-list: append($visibility-table-row-group-list, unquote( + 'tbody.hide-for-#{$visibility-comparison-breakpoint}, tbody.hide-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-table-row-list: append($visibility-table-row-list, unquote( + 'tr.hide-for-#{$visibility-comparison-breakpoint}, tr.hide-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-table-cell-list: append($visibility-table-cell-list, unquote( + 'th.hide-for-#{$visibility-comparison-breakpoint}, td.hide-for-#{$visibility-comparison-breakpoint}, th.hide-for-#{$visibility-comparison-breakpoint}-down, td.hide-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + } + + } @else if index($visibility-breakpoint-sizes, $visibility-comparison-breakpoint) > index($visibility-breakpoint-sizes, $current-visibility-breakpoint) { + // Larger than current breakpoint + + $visibility-inherit-list: append($visibility-inherit-list, unquote( + '.hide-for-#{$visibility-comparison-breakpoint}-only, .hide-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-none-list: append($visibility-none-list, unquote( + '.show-for-#{$visibility-comparison-breakpoint}-only, .show-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-visible-list: append($visibility-visible-list, unquote( + '.hidden-for-#{$visibility-comparison-breakpoint}-only, .hidden-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-hidden-list: append($visibility-hidden-list, unquote( + '.visible-for-#{$visibility-comparison-breakpoint}-only, .visible-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-table-list: append($visibility-table-list, unquote( + 'table.hide-for-#{$visibility-comparison-breakpoint}-only, table.hide-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-table-header-group-list: append($visibility-table-header-group-list, unquote( + 'thead.hide-for-#{$visibility-comparison-breakpoint}-only, thead.hide-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-table-row-group-list: append($visibility-table-row-group-list, unquote( + 'tbody.hide-for-#{$visibility-comparison-breakpoint}-only, tbody.hide-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-table-row-list: append($visibility-table-row-list, unquote( + 'tr.hide-for-#{$visibility-comparison-breakpoint}-only, tr.hide-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-table-cell-list: append($visibility-table-cell-list, unquote( + 'th.hide-for-#{$visibility-comparison-breakpoint}-only, td.hide-for-#{$visibility-comparison-breakpoint}-only, th.hide-for-#{$visibility-comparison-breakpoint}-up, td.hide-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + + // Foundation 4 compatibility: + // Include .show/hide-for-[size] and .show/hide-for-[size]-down classes + // for small, medium, and large breakpoints only + @if $include-legacy-visibility-classes and index((small, medium, large), $visibility-comparison-breakpoint) != false { + $visibility-inherit-list: append($visibility-inherit-list, unquote( + '.hide-for-#{$visibility-comparison-breakpoint}, .show-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-none-list: append($visibility-none-list, unquote( + '.show-for-#{$visibility-comparison-breakpoint}, .hide-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-visible-list: append($visibility-visible-list, unquote( + '.hidden-for-#{$visibility-comparison-breakpoint}, .visible-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-hidden-list: append($visibility-hidden-list, unquote( + '.visible-for-#{$visibility-comparison-breakpoint}, .hidden-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-table-list: append($visibility-table-list, unquote( + 'table.hide-for-#{$visibility-comparison-breakpoint}, table.show-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-table-header-group-list: append($visibility-table-header-group-list, unquote( + 'thead.hide-for-#{$visibility-comparison-breakpoint}, thead.show-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-table-row-group-list: append($visibility-table-row-group-list, unquote( + 'tbody.hide-for-#{$visibility-comparison-breakpoint}, tbody.show-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-table-row-list: append($visibility-table-row-list, unquote( + 'tr.hide-for-#{$visibility-comparison-breakpoint}, tr.show-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-table-cell-list: append($visibility-table-cell-list, unquote( + 'th.hide-for-#{$visibility-comparison-breakpoint}, td.hide-for-#{$visibility-comparison-breakpoint}, th.show-for-#{$visibility-comparison-breakpoint}-down, td.show-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + } + + } @else { + // Current breakpoint + + $visibility-inherit-list: append($visibility-inherit-list, unquote( + '.show-for-#{$visibility-comparison-breakpoint}-only, .show-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-none-list: append($visibility-none-list, unquote( + '.hide-for-#{$visibility-comparison-breakpoint}-only, .hide-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-visible-list: append($visibility-visible-list, unquote( + '.visible-for-#{$visibility-comparison-breakpoint}-only, .visible-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-hidden-list: append($visibility-hidden-list, unquote( + '.hidden-for-#{$visibility-comparison-breakpoint}-only, .hidden-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-table-list: append($visibility-table-list, unquote( + 'table.show-for-#{$visibility-comparison-breakpoint}-only, table.show-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-table-header-group-list: append($visibility-table-header-group-list, unquote( + 'thead.show-for-#{$visibility-comparison-breakpoint}-only, thead.show-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-table-row-group-list: append($visibility-table-row-group-list, unquote( + 'tbody.show-for-#{$visibility-comparison-breakpoint}-only, tbody.show-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-table-row-list: append($visibility-table-row-list, unquote( + 'tr.show-for-#{$visibility-comparison-breakpoint}-only, tr.show-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + $visibility-table-cell-list: append($visibility-table-cell-list, unquote( + 'th.show-for-#{$visibility-comparison-breakpoint}-only, td.show-for-#{$visibility-comparison-breakpoint}-only, th.show-for-#{$visibility-comparison-breakpoint}-up, td.show-for-#{$visibility-comparison-breakpoint}-up' + ), comma); + + // Foundation 4 compatibility: + // Include .show/hide-for-[size] and .show/hide-for-[size]-down classes + // for small, medium, and large breakpoints only + @if $include-legacy-visibility-classes and index((small, medium, large), $visibility-comparison-breakpoint) != false { + $visibility-inherit-list: append($visibility-inherit-list, unquote( + '.show-for-#{$visibility-comparison-breakpoint}, .show-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-none-list: append($visibility-none-list, unquote( + '.hide-for-#{$visibility-comparison-breakpoint}, .hide-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-visible-list: append($visibility-visible-list, unquote( + '.visible-for-#{$visibility-comparison-breakpoint}, .visible-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-hidden-list: append($visibility-hidden-list, unquote( + '.hidden-for-#{$visibility-comparison-breakpoint}, .hidden-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-table-list: append($visibility-table-list, unquote( + 'table.show-for-#{$visibility-comparison-breakpoint}, table.show-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-table-header-group-list: append($visibility-table-header-group-list, unquote( + 'thead.show-for-#{$visibility-comparison-breakpoint}, thead.show-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-table-row-group-list: append($visibility-table-row-group-list, unquote( + 'tbody.show-for-#{$visibility-comparison-breakpoint}, tbody.show-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-table-row-list: append($visibility-table-row-list, unquote( + 'tr.show-for-#{$visibility-comparison-breakpoint}, tr.show-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + $visibility-table-cell-list: append($visibility-table-cell-list, unquote( + 'th.show-for-#{$visibility-comparison-breakpoint}, td.show-for-#{$visibility-comparison-breakpoint}, th.show-for-#{$visibility-comparison-breakpoint}-down, td.show-for-#{$visibility-comparison-breakpoint}-down' + ), comma); + } + } + } + + /* #{$current-visibility-breakpoint} displays */ + @media #{nth($visibility-breakpoint-queries, index($visibility-breakpoint-sizes, $current-visibility-breakpoint))} { + #{$visibility-inherit-list} { + display: inherit !important; + } + #{$visibility-none-list} { + display: none !important; + } + @if $include-accessibility-classes != false { + #{$visibility-visible-list} { + @include element-invisible-off; + } + #{$visibility-hidden-list} { + @include element-invisible; + } + } + @if $include-table-visibility-classes != false { + #{$visibility-table-list} { + display: table !important; + } + #{$visibility-table-header-group-list} { + display: table-header-group !important; + } + #{$visibility-table-row-group-list} { + display: table-row-group !important; + } + #{$visibility-table-row-list} { + display: table-row; + } + #{$visibility-table-cell-list} { + display: table-cell !important; + } + } + } + } +} + +@include exports("visibility"){ + @if $include-html-visibility-classes != false { + + @include visibility-loop; + + /* Orientation targeting */ + .show-for-landscape, + .hide-for-portrait { display: inherit !important; } + .hide-for-landscape, + .show-for-portrait { display: none !important; } + + /* Specific visibility for tables */ + table { + &.hide-for-landscape, + &.show-for-portrait { display: table !important; } + } + thead { + &.hide-for-landscape, + &.show-for-portrait { display: table-header-group !important; } + } + tbody { + &.hide-for-landscape, + &.show-for-portrait { display: table-row-group !important; } + } + tr { + &.hide-for-landscape, + &.show-for-portrait { display: table-row !important; } + } + td, + th { + &.hide-for-landscape, + &.show-for-portrait { display: table-cell !important; } + } + + @media #{$landscape} { + .show-for-landscape, + .hide-for-portrait { display: inherit !important; } + .hide-for-landscape, + .show-for-portrait { display: none !important; } + + /* Specific visibility for tables */ + table { + &.show-for-landscape, + &.hide-for-portrait { display: table !important; } + } + thead { + &.show-for-landscape, + &.hide-for-portrait { display: table-header-group !important; } + } + tbody { + &.show-for-landscape, + &.hide-for-portrait { display: table-row-group !important; } + } + tr { + &.show-for-landscape, + &.hide-for-portrait { display: table-row !important; } + } + td, + th { + &.show-for-landscape, + &.hide-for-portrait { display: table-cell !important; } + } + } + + @media #{$portrait} { + .show-for-portrait, + .hide-for-landscape { display: inherit !important; } + .hide-for-portrait, + .show-for-landscape { display: none !important; } + + /* Specific visibility for tables */ + table { + &.show-for-portrait, + &.hide-for-landscape { display: table !important; } + } + thead { + &.show-for-portrait, + &.hide-for-landscape { display: table-header-group !important; } + } + tbody { + &.show-for-portrait, + &.hide-for-landscape { display: table-row-group !important; } + } + tr { + &.show-for-portrait, + &.hide-for-landscape { display: table-row !important; } + } + td, + th { + &.show-for-portrait, + &.hide-for-landscape { display: table-cell !important; } + } + } + + /* Touch-enabled device targeting */ + .show-for-touch { display: none !important; } + .hide-for-touch { display: inherit !important; } + .touch .show-for-touch { display: inherit !important; } + .touch .hide-for-touch { display: none !important; } + + /* Specific visibility for tables */ + table.hide-for-touch { display: table !important; } + .touch table.show-for-touch { display: table !important; } + thead.hide-for-touch { display: table-header-group !important; } + .touch thead.show-for-touch { display: table-header-group !important; } + tbody.hide-for-touch { display: table-row-group !important; } + .touch tbody.show-for-touch { display: table-row-group !important; } + tr.hide-for-touch { display: table-row !important; } + .touch tr.show-for-touch { display: table-row !important; } + td.hide-for-touch { display: table-cell !important; } + .touch td.show-for-touch { display: table-cell !important; } + th.hide-for-touch { display: table-cell !important; } + .touch th.show-for-touch { display: table-cell !important; } + + /* Screen reader-specific classes */ + .show-for-sr { + @include element-invisible; + } + .show-on-focus { + @include element-invisible; + + &:focus, + &:active { + @include element-invisible-off; + } + } + + // Only include these styles if you want them. + @if $include-print-styles { + /* + * Print styles. + * + * Inlined to avoid required HTTP connection: www.phpied.com/delay-loading-your-print-css/ + * Credit to Paul Irish and HTML5 Boilerplate (html5boilerplate.com) + */ + .print-only { display: none !important; } + @media print { + * { + background: transparent !important; + box-shadow: none !important; + color: $black !important; /* Black prints faster: h5bp.com/s */ + text-shadow: none !important; + } + .show-for-print { display: block; } + .hide-for-print { display: none; } + + table.show-for-print { display: table !important; } + thead.show-for-print { display: table-header-group !important; } + tbody.show-for-print { display: table-row-group !important; } + tr.show-for-print { display: table-row !important; } + td.show-for-print { display: table-cell !important; } + th.show-for-print { display: table-cell !important; } + + a, + a:visited { text-decoration: underline;} + a[href]:after { content: " (" attr(href) ")"; } + + abbr[title]:after { content: " (" attr(title) ")"; } + + // Don't show links for images, or javascript/internal links + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { content: ""; } + + pre, + blockquote { + border: 1px solid $aluminum; + page-break-inside: avoid; + } + + thead { display: table-header-group; /* h5bp.com/t */ } + + tr, + img { page-break-inside: avoid; } + + img { max-width: 100% !important; } + + @page { margin: .5cm; } + + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + + h2, + h3 { page-break-after: avoid; } + + .hide-on-print { display: none !important; } + .print-only { display: block !important; } + .hide-for-print { display: none !important; } + .show-for-print { display: inherit !important; } + } + } + + /* Print visibility */ + @media print { + .show-for-print { display: block; } + .hide-for-print { display: none; } + + table.show-for-print { display: table !important; } + thead.show-for-print { display: table-header-group !important; } + tbody.show-for-print { display: table-row-group !important; } + tr.show-for-print { display: table-row !important; } + td.show-for-print { display: table-cell !important; } + th.show-for-print { display: table-cell !important; } + } + + @media not print{ + .show-for-print { display: none !important; } + } + } +} diff --git a/themes/foundation5/scss/normalize.scss b/themes/foundation5/scss/normalize.scss new file mode 100644 index 0000000000000000000000000000000000000000..5e5e3c898106bb66986f7224bf51eea2dc3c82a3 --- /dev/null +++ b/themes/foundation5/scss/normalize.scss @@ -0,0 +1,424 @@ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ + +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS and IE text size adjust after device orientation change, + * without disabling user zoom. + */ + +html { + font-family: sans-serif; /* 1 */ + -ms-text-size-adjust: 100%; /* 2 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/** + * Remove default margin. + */ + +body { + margin: 0; +} + +/* HTML5 display definitions + ========================================================================== */ + +/** + * Correct `block` display not defined for any HTML5 element in IE 8/9. + * Correct `block` display not defined for `details` or `summary` in IE 10/11 + * and Firefox. + * Correct `block` display not defined for `main` in IE 11. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +/** + * 1. Correct `inline-block` display not defined in IE 8/9. + * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. + */ + +audio, +canvas, +progress, +video { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address `[hidden]` styling not present in IE 8/9/10. + * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22. + */ + +[hidden], +template { + display: none; +} + +/* Links + ========================================================================== */ + +/** + * Remove the gray background color from active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * Improve readability of focused elements when they are also in an + * active/hover state. + */ + +a:active, +a:hover { + outline: 0; +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Address styling not present in IE 8/9/10/11, Safari, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +/** + * Address styling not present in Safari and Chrome. + */ + +dfn { + font-style: italic; +} + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari, and Chrome. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/** + * Address styling not present in IE 8/9. + */ + +mark { + background: #ff0; + color: #000; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove border when inside `a` element in IE 8/9/10. + */ + +img { + border: 0; +} + +/** + * Correct overflow not hidden in IE 9/10/11. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Grouping content + ========================================================================== */ + +/** + * Address margin not present in IE 8/9 and Safari. + */ + +figure { + margin: 1em 40px; +} + +/** + * Address differences between Firefox and other browsers. + */ + +hr { + box-sizing: content-box; + height: 0; +} + +/** + * Contain overflow in all browsers. + */ + +pre { + overflow: auto; +} + +/** + * Address odd `em`-unit font size rendering in all browsers. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +/* Forms + ========================================================================== */ + +/** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ + +/** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ + +button, +input, +optgroup, +select, +textarea { + color: inherit; /* 1 */ + font: inherit; /* 2 */ + margin: 0; /* 3 */ +} + +/** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ + +button { + overflow: visible; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * Remove inner padding and border in Firefox 4+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +input { + line-height: normal; +} + +/** + * It's recommended that you don't attempt to style these elements. + * Firefox's implementation doesn't respect box-sizing, padding, or width. + * + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari and Chrome. + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + box-sizing: content-box; /* 2 */ +} + +/** + * Remove inner padding and search cancel button in Safari and Chrome on OS X. + * Safari (but not Chrome) clips the cancel button when the search input has + * padding (and `textfield` appearance). + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/** + * 1. Correct `color` not being inherited in IE 8/9/10/11. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + +legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Remove default vertical scrollbar in IE 8/9/10/11. + */ + +textarea { + overflow: auto; +} + +/** + * Don't inherit the `font-weight` (applied by a rule above). + * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + */ + +optgroup { + font-weight: bold; +} + +/* Tables + ========================================================================== */ + +/** + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} diff --git a/themes/foundation5/templates/myresearch/bulk-action-buttons.phtml b/themes/foundation5/templates/myresearch/bulk-action-buttons.phtml index 28dde26c1b35c422ad98f4acd8d9e7cef38be8fd..27ec8118a0524d35024bf0776c02b76557e11a5f 100644 --- a/themes/foundation5/templates/myresearch/bulk-action-buttons.phtml +++ b/themes/foundation5/templates/myresearch/bulk-action-buttons.phtml @@ -12,24 +12,24 @@ </div> <ul class="button-group bulk-action-buttons hide-for-print"> <li> - <input class="button secondary small" type="submit" name="email" role="button" value="<?=$this->transEsc('Email')?>" title="<?=$this->transEsc('email_selected')?>"/> + <input class="button secondary tiny" type="submit" name="email" role="button" value="<?=$this->transEsc('Email')?>" title="<?=$this->transEsc('email_selected')?>"/> </li> <? if ((!is_null($this->list) && $this->list->editAllowed($user)) || is_null($this->list) && $user): ?> <li> - <input class="button secondary small" id="<?=$this->idPrefix?>delete_list_items_<?=!is_null($this->list) ? $this->escapeHtmlAttr($this->list->id) : ''?>" type="submit" name="delete" role="button" value="<?=$this->transEsc('Delete')?>" title="<?=$this->transEsc('delete_selected')?>"/> + <input class="button secondary tiny" id="<?=$this->idPrefix?>delete_list_items_<?=!is_null($this->list) ? $this->escapeHtmlAttr($this->list->id) : ''?>" type="submit" name="delete" role="button" value="<?=$this->transEsc('Delete')?>" title="<?=$this->transEsc('delete_selected')?>"/> </li> <? endif; ?> <? $exportOptions = $this->export()->getBulkOptions(); if (count($exportOptions) > 0): ?> <li> - <input class="button secondary small" type="submit" name="export" role="button" value="<?=$this->transEsc('Export')?>" title="<?=$this->transEsc('export_selected')?>"/> + <input class="button secondary tiny" type="submit" name="export" role="button" value="<?=$this->transEsc('Export')?>" title="<?=$this->transEsc('export_selected')?>"/> </li> <? endif; ?> <li> - <input class="button secondary small" type="submit" name="print" role="button" value="<?=$this->transEsc('Print')?>" title="<?=$this->transEsc('print_selected')?>"/> + <input class="button secondary tiny" type="submit" name="print" role="button" value="<?=$this->transEsc('Print')?>" title="<?=$this->transEsc('print_selected')?>"/> </li> <? if ($this->cart()->isActive()): ?> <li> - <input class="button secondary small" id="<?=$this->idPrefix?>updateCart" type="submit" name="add" role="button" value="<?=$this->transEsc('Add to Book Bag')?>"/> + <input class="button secondary tiny" id="<?=$this->idPrefix?>updateCart" type="submit" name="add" role="button" value="<?=$this->transEsc('Add to Book Bag')?>"/> </li> <? endif; ?> </ul>