diff --git a/CHANGELOG.md b/CHANGELOG.md index 525b0cdf..30cd4c4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,11 @@ # v1.5.0-rc.3 ## 05/xx/2017 +1. [](#new) + * Added a new `mediapicker` form field which allows to select a media from any page [#1125](https://github.com/getgrav/grav-plugin-admin/pull/1125) 1. [](#improved) * Various form styling improvements + * Provided an option to control how parent select field displays # v1.5.0-rc.2 ## 05/22/2017 @@ -14,7 +17,7 @@ * Use new unified `Utils::getPagePathFromToken()` method rather 1. [](#bugfix) * Fix for undefined `include_metadata` error - + # v1.5.0-rc.1 ## 05/16/2017 diff --git a/admin.php b/admin.php index d39dd406..44677801 100644 --- a/admin.php +++ b/admin.php @@ -84,7 +84,11 @@ class AdminPlugin extends Plugin { if (!Grav::instance()['config']->get('plugins.admin-pro.enabled')) { return [ - 'onPluginsInitialized' => [['setup', 100000], ['onPluginsInitialized', 1001]], + 'onPluginsInitialized' => [ + ['setup', 100000], + ['onPluginsInitialized', 1001] + ], + 'onPageInitialized' => ['onPageInitialized', 0], 'onShutdown' => ['onShutdown', 1000], 'onFormProcessed' => ['onFormProcessed', 0], 'onAdminDashboard' => ['onAdminDashboard', 0], @@ -95,6 +99,17 @@ class AdminPlugin extends Plugin return []; } + public function onPageInitialized() + { + $page = $this->grav['page']; + + $template = $this->grav['uri']->param('tmpl'); + + if ($template) { + $page->template($template); + } + } + /** * If the admin path matches, initialize the Login plugin configuration and set the admin * as active. @@ -516,6 +531,10 @@ class AdminPlugin extends Plugin $this->popularity->trackHit(); } } + + if ($this->grav['admin']->shouldLoadAdditionalFilesInBackground()) { + $this->grav['admin']->loadAdditionalFilesInBackground(); + } } /** diff --git a/admin.yaml b/admin.yaml index e5f39717..0ada343e 100644 --- a/admin.yaml +++ b/admin.yaml @@ -17,6 +17,8 @@ widgets: dashboard-notifications: true dashboard-feed: true dashboard-pages: true +pages: + show_parents: both session: timeout: 1800 warnings: diff --git a/blueprints.yaml b/blueprints.yaml index 2a030f08..a0e30196 100644 --- a/blueprints.yaml +++ b/blueprints.yaml @@ -136,6 +136,16 @@ form: frontend_tab: Separate tab (always the same) _self: Current tab + pages.show_parents: + type: select + size: medium + label: Parent dropdown + highlight: 1 + options: + both: Show slug and folder + folder: Show folder + fullpath: Show fullpath + google_fonts: type: toggle label: Use Google Fonts diff --git a/blueprints/config/media.yaml b/blueprints/config/media.yaml index 89f37c4e..ba558680 100644 --- a/blueprints/config/media.yaml +++ b/blueprints/config/media.yaml @@ -24,6 +24,8 @@ form: .mime: type: text label: PLUGIN_ADMIN.MIME_TYPE + validate: + type: lower .image: type: textarea yaml: true diff --git a/classes/admin.php b/classes/admin.php index fb1a4dc3..22a5ec30 100644 --- a/classes/admin.php +++ b/classes/admin.php @@ -32,6 +32,8 @@ define('LOGIN_REDIRECT_COOKIE', 'grav-login-redirect'); class Admin { + const MEDIA_PAGINATION_INTERVAL = 20; + /** * @var Grav */ @@ -95,6 +97,16 @@ class Admin */ protected $permissions; + /** + * @var bool + */ + protected $load_additional_files_in_background = false; + + /** + * @var bool + */ + protected $loading_additional_files_in_background = false; + /** * Constructor. * @@ -532,6 +544,28 @@ class Admin ?: $this->grav['locator']->findResource("config://{$type}.yaml", true, true); $file = CompiledYamlFile::instance($filename); $obj->file($file); + $data[$type] = $obj; + } elseif (preg_match('|media-manager/|', $type)) { + $filename = base64_decode(preg_replace('|media-manager/|', '', $type)); + + $file = File::instance($filename); + + $obj = new \StdClass(); + $obj->title = $file->basename(); + $obj->path = $file->filename(); + $obj->file = $file; + $obj->page = $this->grav['pages']->get(dirname($obj->path)); + + $filename = pathinfo($obj->title)['filename']; + $filename = str_replace(['@3x', '@2x'], '', $filename); + if (isset(pathinfo($obj->title)['extension'])) { + $filename .= '.' . pathinfo($obj->title)['extension']; + } + + if ($obj->page && isset($obj->page->media()[$filename])) { + $obj->metadata = new Data($obj->page->media()[$filename]->metadata()); + } + $data[$type] = $obj; } else { throw new \RuntimeException("Data type '{$type}' doesn't exist!"); @@ -540,6 +574,17 @@ class Admin return $data[$type]; } + protected function hasErrorMessage() + { + $msgs = $this->grav['messages']->all(); + foreach ($msgs as $msg) { + if (isset($msg['scope']) && $msg['scope'] === 'error') { + return true; + } + } + return false; + } + /** * Returns blueprints for the given type. * @@ -1373,4 +1418,260 @@ class Admin return [$this->base, $this->location, $this->route]; } + /** + * Get the files list + * + * @todo allow pagination + * @return array + */ + public function files($filtered = true, $page_index = 0) + { + $param_type = $this->grav['uri']->param('type'); + $param_date = $this->grav['uri']->param('date'); + $param_page = $this->grav['uri']->param('page'); + $param_page = str_replace('\\', '/', $param_page); + + $files_cache_key = 'media-manager-files'; + + if ($param_type) { + $files_cache_key .= "-{$param_type}"; + } + if ($param_date) { + $files_cache_key .= "-{$param_date}"; + } + if ($param_page) { + $files_cache_key .= "-{$param_page}"; + } + + $page_files = null; + + $cache_enabled = $this->grav['config']->get('plugins.admin.cache_enabled'); + if (!$cache_enabled) { + $this->grav['cache']->setEnabled(true); + } + + $page_files = $this->grav['cache']->fetch(md5($files_cache_key)); + + if (!$cache_enabled) { + $this->grav['cache']->setEnabled(false); + } + + if (!$page_files) { + $page_files = []; + $pages = $this->grav['pages']; + + if ($param_page) { + $page = $pages->dispatch($param_page); + + $page_files = $this->getFiles('images', $page, $page_files, $filtered); + $page_files = $this->getFiles('videos', $page, $page_files, $filtered); + $page_files = $this->getFiles('audios', $page, $page_files, $filtered); + $page_files = $this->getFiles('files', $page, $page_files, $filtered); + } else { + $allPages = $pages->all(); + + if ($allPages) foreach ($allPages as $page) { + $page_files = $this->getFiles('images', $page, $page_files, $filtered); + $page_files = $this->getFiles('videos', $page, $page_files, $filtered); + $page_files = $this->getFiles('audios', $page, $page_files, $filtered); + $page_files = $this->getFiles('files', $page, $page_files, $filtered); + } + } + + if (count($page_files) >= self::MEDIA_PAGINATION_INTERVAL) { + $this->shouldLoadAdditionalFilesInBackground(true); + } + + if (!$cache_enabled) { + $this->grav['cache']->setEnabled(true); + } + $this->grav['cache']->save(md5($files_cache_key), $page_files, 600); //cache for 10 minutes + if (!$cache_enabled) { + $this->grav['cache']->setEnabled(false); + } + + } + + if (count($page_files) >= self::MEDIA_PAGINATION_INTERVAL) { + $page_files = array_slice($page_files, $page_index * self::MEDIA_PAGINATION_INTERVAL, self::MEDIA_PAGINATION_INTERVAL); + } + + return $page_files; + } + + public function shouldLoadAdditionalFilesInBackground($status = null) + { + if ($status) { + $this->load_additional_files_in_background = true; + } + + return $this->load_additional_files_in_background; + } + + public function loadAdditionalFilesInBackground($status = null) + { + if (!$this->loading_additional_files_in_background) { + $this->loading_additional_files_in_background = true; + $this->files(false, false); + $this->shouldLoadAdditionalFilesInBackground(false); + $this->loading_additional_files_in_background = false; + } + } + + private function getFiles($type, $page, $page_files, $filtered) + { + $page_files = $this->getMediaOfType($type, $page, $page_files); + + if ($filtered) { + $page_files = $this->filterByType($page_files); + $page_files = $this->filterByDate($page_files); + } + + return $page_files; + } + + /** + * Get all the media of a type ('images' | 'audios' | 'videos' | 'files') + * + * @param string $type + * @param Page\Page $page + * @param array $files + * + * @return array + */ + private function getMediaOfType($type, $page, $page_files) { + if ($page) { + +// $path = $page->path(); + $media = $page->media(); + $mediaOfType = $media->$type(); + + foreach($mediaOfType as $title => $file) { + $page_files[] = [ + 'title' => $title, + 'type' => $type, + 'page_route' => $page->route(), + 'file' => $file->higherQualityAlternative() + ]; + } + + return $page_files; + } else { + return []; + } + } + + /** + * Filter media by type + * + * @param array $filesFiltered + * + * @return array + */ + private function filterByType($filesFiltered) + { + $filter_type = $this->grav['uri']->param('type'); + if (!$filter_type) { + return $filesFiltered; + } + + $filesFiltered = array_filter($filesFiltered, function ($file) use ($filter_type) { + return $file['type'] == $filter_type; + }); + + return $filesFiltered; + } + + /** + * Filter media by date + * + * @param array $filesFiltered + * + * @return array + */ + private function filterByDate($filesFiltered) + { + $filter_date = $this->grav['uri']->param('date'); + if (!$filter_date) { + return $filesFiltered; + } + + $year = substr($filter_date, 0, 4); + $month = substr($filter_date, 5, 2); + + $filesFilteredByDate = []; + + foreach($filesFiltered as $file) { + $filedate = $this->fileDate($file['file']); + $fileYear = $filedate->format('Y'); + $fileMonth = $filedate->format('m'); + + if ($fileYear == $year && $fileMonth == $month) { + $filesFilteredByDate[] = $file; + } + } + + return $filesFilteredByDate; + } + + /** + * Return the DateTime object representation of a file modified date + * + * @param File $file + * + * @return DateTime + */ + private function fileDate($file) { + $datetime = new \DateTime(); + $datetime->setTimestamp($file->toArray()['modified']); + return $datetime; + } + + /** + * Get the files dates list to be used in the Media Files filter + * + * @return array + */ + public function filesDates() + { + $files = $this->files(false); + $dates = []; + + foreach ($files as $file) { + $datetime = $this->fileDate($file['file']); + $year = $datetime->format('Y'); + $month = $datetime->format('m'); + + if (!isset($dates[$year])) { + $dates[$year] = []; + } + + if (!isset($dates[$year][$month])) { + $dates[$year][$month] = 1; + } else { + $dates[$year][$month]++; + } + } + + return $dates; + } + + /** + * Get the pages list to be used in the Media Files filter + * + * @return array + */ + public function pages() + { + $pages = $this->grav['pages']->all(); + + $pagesWithFiles = []; + if ($pages) foreach ($pages as $page) { + if (count($page->media()->all())) { + $pagesWithFiles[] = $page; + } + } + + return $pagesWithFiles; + } } diff --git a/classes/adminbasecontroller.php b/classes/adminbasecontroller.php index fc8dd85b..ab73efc2 100644 --- a/classes/adminbasecontroller.php +++ b/classes/adminbasecontroller.php @@ -924,7 +924,7 @@ class AdminBaseController $fileParts = pathinfo($filename); foreach (scandir($fileParts['dirname']) as $file) { - $regex_pattern = "/" . preg_quote($fileParts['filename']) . "@\d+x\." . $fileParts['extension'] . "$|" . preg_quote($fileParts['basename']) . ".meta.yaml$/"; + $regex_pattern = "/" . preg_quote($fileParts['filename']) . "@\d+x\." . $fileParts['extension'] . "(?:\.meta\.yaml)?$|" . preg_quote($fileParts['basename']) . "\.meta\.yaml$/"; if (preg_match($regex_pattern, $file)) { $path = $fileParts['dirname'] . '/' . $file; @unlink($path); diff --git a/classes/admincontroller.php b/classes/admincontroller.php index 7196edad..2e2da8f2 100644 --- a/classes/admincontroller.php +++ b/classes/admincontroller.php @@ -1520,8 +1520,21 @@ class AdminController extends AdminBaseController $media_list = []; $media = new Media($page->path()); + $include_metadata = Grav::instance()['config']->get('system.media.auto_metadata_exif', false); + foreach ($media->all() as $name => $medium) { - $media_list[$name] = ['url' => $medium->display($medium->get('extension') === 'svg' ? 'source' : 'thumbnail')->cropZoom(400, 300)->url(), 'size' => $medium->get('size')]; + + $metadata = []; + + if ($include_metadata) { + $img_metadata = $medium->metadata(); + if ($img_metadata) { + $metadata = $img_metadata; + } + } + + + $media_list[$name] = ['url' => $medium->display($medium->get('extension') === 'svg' ? 'source' : 'thumbnail')->cropZoom(400, 300)->url(), 'size' => $medium->get('size'), 'metadata' => $metadata]; } $this->admin->json_response = ['status' => 'success', 'results' => $media_list]; @@ -1631,13 +1644,28 @@ class AdminController extends AdminBaseController } // reinitialize media to trigger availability - $page->media(); + $media = $page->media(); + + // Add metadata if needed + $include_metadata = Grav::instance()['config']->get('system.media.auto_metadata_exif', false); + $filename = $fileParts['basename']; + $filename = str_replace(['@3x', '@2x'], '', $filename); + + $metadata = []; + + if ($include_metadata && isset($media[$filename])) { + $img_metadata = $media[$filename]->metadata(); + if ($img_metadata) { + $metadata = $img_metadata; + } + } $this->grav->fireEvent('onAdminAfterAddMedia', new Event(['page' => $page])); $this->admin->json_response = [ 'status' => 'success', - 'message' => $this->admin->translate('PLUGIN_ADMIN.FILE_UPLOADED_SUCCESSFULLY') + 'message' => $this->admin->translate('PLUGIN_ADMIN.FILE_UPLOADED_SUCCESSFULLY'), + 'metadata' => $metadata, ]; return true; @@ -1697,7 +1725,7 @@ class AdminController extends AdminBaseController // Remove Extra Files foreach (scandir($page->path()) as $file) { - if (preg_match("/{$fileParts['filename']}@\d+x\.{$fileParts['extension']}$|{$filename}.meta.yaml$/", $file)) { + if (preg_match("/{$fileParts['filename']}@\d+x\.{$fileParts['extension']}(?:\.meta\.yaml)?$|{$filename}\.meta\.yaml$/", $file)) { $result = unlink($page->path() . '/' . $file); if (!$result) { diff --git a/themes/grav/app/forms/fields/index.js b/themes/grav/app/forms/fields/index.js index 1e486cc5..9e1f421e 100644 --- a/themes/grav/app/forms/fields/index.js +++ b/themes/grav/app/forms/fields/index.js @@ -6,6 +6,7 @@ import DateTimeField, { Instance as DateTimeFieldInstance } from './datetime'; import EditorField, { Instance as EditorFieldInstance } from './editor'; import ColorpickerField, { Instance as ColorpickerFieldInstance } from './colorpicker'; import FilesField, { Instance as FilesFieldInstance } from './files'; +import MediapickerField, { Instance as MediapickerInstance } from './mediapicker'; import SelectUniqueField, { Instance as SelectUniqueInstance } from './selectunique'; export default { @@ -44,6 +45,10 @@ export default { SelectUniqueField: { SelectUniqueField, Instance: SelectUniqueInstance + }, + MediapickerField: { + MediapickerField, + Instance: MediapickerInstance } }; diff --git a/themes/grav/app/forms/fields/mediapicker.js b/themes/grav/app/forms/fields/mediapicker.js new file mode 100644 index 00000000..8e1edf3f --- /dev/null +++ b/themes/grav/app/forms/fields/mediapicker.js @@ -0,0 +1,49 @@ +import $ from 'jquery'; +import Scrollbar from '../../utils/scrollbar'; + +$(function() { + var modal = ''; + + var treescroll = new Scrollbar('.pages-list-container .mediapicker-scroll', { autoshow: true }); + var thumbscroll = new Scrollbar('.thumbs-list-container .mediapicker-scroll', { autoshow: true }); + + // Thumb Resizer + $('.media-container .media-range').on('input change', function() { + var cards = $('.media-container div.card-item'); + var width = $(this).val() + 'px'; + cards.each(function() { + $(this).css('width', width); + }); + }); + + $(document).on('opened', '.remodal', function() { + setTimeout(function() { + treescroll.update(); + thumbscroll.update(); + }, 10); + }); + + $('body').on('click', '[data-mediapicker-modal-trigger]', function() { + var modal_identifier = $(this).data('grav-mediapicker-unique-identifier'); + var modal_element = $('body').find('[data-remodal-unique-identifier="' + modal_identifier + '"]'); + modal = $.remodal.lookup[modal_element.data('remodal')]; + modal.open(); + + // load all media + modal_element.find('.js__files').trigger('fillView'); + }); + + /* handle media modal click actions */ + $('body').on('click', '[data-remodal-mediapicker] .media-container.in-modal .admin-media-details a', (event) => { + event.preventDefault(); + event.stopPropagation(); + + var val = $(event.target).parents('.js__media-element').data('file-url'); + var string = val.replace(/ /g, '%20'); + + var modal_identifier = $(event.target).parents('[data-remodal-mediapicker]').data('remodal-unique-identifier'); + $('body').find('[data-grav-mediapicker-unique-identifier="' + modal_identifier + '"] input').val(string); + + modal.close(); + }); +}); diff --git a/themes/grav/app/main.js b/themes/grav/app/main.js index eb6b2a80..b4672d87 100644 --- a/themes/grav/app/main.js +++ b/themes/grav/app/main.js @@ -8,6 +8,7 @@ import Forms from './forms'; import Scrollbar, { Instance as contentScrollbar } from './utils/scrollbar'; import './plugins'; import './themes'; +import { Filter as MediaFilter, Instance as MediaFilterInstance} from './media'; // bootstrap jQuery extensions import 'bootstrap/js/transition'; @@ -65,5 +66,9 @@ export default { Sidebar: { Sidebar, Instance: sidebar + }, + MediaFilter: { + MediaFilter, + Instance: MediaFilterInstance } }; diff --git a/themes/grav/app/media/index.js b/themes/grav/app/media/index.js new file mode 100644 index 00000000..deab043d --- /dev/null +++ b/themes/grav/app/media/index.js @@ -0,0 +1,219 @@ +import $ from 'jquery'; +import { config, uri_params } from 'grav-config'; +import request from '../utils/request'; + +export default class Filter { + constructor() { + this.URI = `${config.base_url_relative}/media-manager/`; + } + + filter(name, value) { + let filtered = []; + let keys = Object.keys(uri_params); + if (!~keys.indexOf(name)) { keys.push(name); } + + keys.forEach((key) => { + let filter = Filter.cleanValue(key === name ? value : uri_params[key]); + if (filter !== '*') { + filtered.push(`${key}${config.param_sep}${filter}`); + } + }); + + global.location = this.URI + filtered.join('/'); + } + + static cleanValue(value) { + return encodeURIComponent(value.replace('/', '\\')); + } +} + +export let Instance = new Filter(); +var isLoading = false; + +var filters = {}; +var global_index = 1; +var files_ended = false; +const MEDIA_PAGINATION_INTERVAL = 20; + +/* handle changing file type / date filter */ +$('body').on('change', '.thumbs-list-container select.filter', (event) => { + let target = $(event.currentTarget); + let filterName = target.data('name'); + let filterValue = target.val(); + + if (filterValue) { + filters[filterName] = filterValue; + } else { + delete filters[filterName]; + } + + filterFiles(); +}); + +/* initialize media uploader */ +if ($('.thumbs-list-container .dropzone')[0]) { + $('.thumbs-list-container .dropzone')[0].dropzone.on('queuecomplete', function() { + let body = {}; + if (filters.page) { body.page = filters.page; } + if (filters.date) { body.date = filters.date; } + if (filters.type) { body.type = filters.type; } + + $('.dropzone')[0].dropzone.files.forEach(function(file) { file.previewElement.remove(); }); + $('.dropzone').first().removeClass('dz-started'); + + request(config.base_url_relative + '/media-manager.json/task:clearMediaCache', { method: 'post', body }, () => { + filterFiles(); + }); + }); +} + +/* handle loading media */ +var loadMedia = function loadMedia(filters, callback) { + var url = config.base_url_relative + '/media.json/tmpl:media-list-content/index:' + global_index; + + if (filters.page) { + url += '/page:' + (filters.page).split('/').join('%5C'); + } + if (filters.type && filters.type !== '*') { + url += '/type:' + filters.type; + } + if (filters.date && filters.date !== '*') { + url += '/date:' + filters.date; + } + + if (!isLoading) { + isLoading = true; + + $('.spinning-wheel').show(); + $.get(url, function(content) { + $('.js__files').append(content); + $('.spinning-wheel').hide(); + isLoading = false; + global_index++; + + callback(content); + }); + } +}; + +var cleanFilesList = function cleanFilesList() { + $('.js__files .card-item').remove(); +}; + +var resetActiveStateInSidebar = function resetActiveStateInSidebar() { + $('.pages-list-container .row').removeClass('active'); // clear active state in sidebar +}; + +var showEmptyState = function showEmptyState() { + $('.thumbs-list-container').append('
No media found
'); +}; + +var filterFiles = function filterFiles() { + cleanFilesList(); + global_index = 0; + files_ended = false; + $('.empty-space').remove(); + loadMedia(filters, function(content) { + if (!$(content).length) { + showEmptyState(); + } else { + if (!filters.page && (!filters.date || filters.date === '*') && (!filters.type || filters.type === '*')) { + $('.js__files').trigger('fillView'); + } + } + }); +}; + +/* handle changing page */ +$('body').on('click', '.pages-list-container .js__page-link', (event) => { + var page = $(event.target).data('page'); + filters['page'] = page; + + $('.media-list-title .page-indicator').html(page); // set indication + $('.js__reset-pages-filter').removeClass('hidden'); // activate reset pages icon + resetActiveStateInSidebar(); + $(event.target).parents('.row').addClass('active'); // set active state in sidebar + $('.js__file-uploader').removeClass('hidden'); + + // customize processing URL, as the page changes dynamically + if ($('.dropzone')[0]) { + $('.dropzone')[0].dropzone.on('processing', function(file) { + this.options.url = `${config.base_url_relative}/media-manager${page}.json/task${config.param_sep}addmedia`; + }); + } + + $('.js__button-clear-media-cache').addClass('hidden'); + filterFiles(); + + disableInfiniteScrolling(); // only infinite scroll on main list, not inside single pages +}); + +/* handle clearing page filter */ +$('body').on('click', '.js__reset-pages-filter', (event) => { + $('.media-list-title .page-indicator').html('All Pages'); // set indication + cleanFilesList(); + resetActiveStateInSidebar(); + $('.js__reset-pages-filter').addClass('hidden'); // remove reset pages icon + $('.js__file-uploader').addClass('hidden'); + $('.js__button-clear-media-cache').removeClass('hidden'); + delete filters['page']; + + filterFiles(); +}); + +/* handle infinite loading */ +var enableInfiniteScrolling = function enableInfiniteScrolling() { + $('.spinning-wheel').hide(); + var view = $('.mediapicker-scroll'); + view.scroll(function() { + if (($(this).scrollTop() + $(this).innerHeight() + 100) >= $(this)[0].scrollHeight) { + fillView(); + } + }); +}; + +var loadNextBatch = function loadNextBatch(callback) { + if (files_ended) { + return; + } + + loadMedia({}, function(content) { + if (!$(content).length || ((content.split('card-item').length - 1) < MEDIA_PAGINATION_INTERVAL)) { + files_ended = true; + } else { + if (callback) { + callback(); + } + } + }); +}; + +var fillView = function fillView() { + if (!$('.js__files').find('.card-item').last().offset()) { + setTimeout(function() { + // retry later + fillView(); + }, 300); + + return; + } + if ($('.js__files').find('.card-item').last().offset().top < $('.media-container').height()) { + loadNextBatch(function() { + fillView(); + }); + } +}; + +/* disable infinite loading */ +var disableInfiniteScrolling = function disableInfiniteScrolling() { + $('.spinning-wheel').hide(); + $('.content-wrapper').unbind('scroll'); +}; + +$('.js__files').on('fillView', function(event) { + // the first batch got the max number of media files, try loading more + if (($('.js__files')[0].innerHTML.split('card-item').length - 1) === MEDIA_PAGINATION_INTERVAL) { + fillView(); + enableInfiniteScrolling(); + } +}); diff --git a/themes/grav/css-compiled/fonts.css b/themes/grav/css-compiled/fonts.css index 4890d75d..da990ede 100644 --- a/themes/grav/css-compiled/fonts.css +++ b/themes/grav/css-compiled/fonts.css @@ -1,3 +1,3 @@ @import url("//fonts.googleapis.com/css?family=Montserrat:400|Lato:300,400,700|Inconsolata:400,700");body,h5,h6,.badge,.note,.grav-mdeditor-preview,input,select,textarea,button,.selectize-input{font-family:"Lato","Helvetica","Tahoma","Geneva","Arial",sans-serif}h1,h2,h3,h4,#admin-menu li,.form-tabs>label,.label{font-family:"Montserrat","Helvetica","Tahoma","Geneva","Arial",sans-serif}code,kbd,pre,samp,body .CodeMirror{font-family:"Inconsolata","Monaco","Consolas","Lucida Console",monospace !important} -/*# sourceMappingURL=fonts.css.map */ +/*# sourceMappingURL=../css-compiled/fonts.css.map */ \ No newline at end of file diff --git a/themes/grav/css-compiled/fonts.css.map b/themes/grav/css-compiled/fonts.css.map index 2c8e5966..a8fdf2e3 100644 --- a/themes/grav/css-compiled/fonts.css.map +++ b/themes/grav/css-compiled/fonts.css.map @@ -1 +1,11 @@ -{"version":3,"file":"fonts.css","sources":["fonts.scss","configuration/fonts/_support.scss"],"sourcesContent":["$fonts-default: 'Lato' !default;\n$fonts-header: 'Montserrat' !default;\n$fonts-mono: 'Inconsolata' !default;\n\n$font-definitions: (\n Montserrat: '400',\n Lato: '300,400,700',\n Inconsolata: '400,700'\n);\n\n@import \"configuration/fonts/support\";\n\n\n\n\n","@function str-replace($string, $search, $replace: '') {\n $index: str-index($string, $search);\n\n @if $index {\n @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);\n }\n\n @return $string;\n}\n\n@function admin-font-faces($fonts) {\n $url: \"//fonts.googleapis.com/css?family=\";\n $nb: 0;\n\n @each $fontname, $weights in $fonts {\n\n @if $fontname == $fonts-default or\n $fontname == $fonts-header or\n $fontname == $fonts-mono {\n\n $nb: $nb + 1;\n $nb-word: 0;\n\n $fontname: str-replace(\"#{$fontname}\", \" \", \"+\");\n\n $url: $url + $fontname;\n\n @if $weights != null {\n $url: $url + \":\" + $weights;\n }\n\n @if $nb < 3 {\n $url: $url + \"|\";\n }\n }\n }\n\n @return $url;\n}\n\n@mixin body-fonts($font) {\n body, h5, h6,\n .badge, .note, .grav-mdeditor-preview,\n input, select, textarea, button, .selectize-input {\n font-family: \"#{$font}\", \"Helvetica\", \"Tahoma\", \"Geneva\", \"Arial\", sans-serif;\n }\n}\n\n@mixin header-fonts($font) {\n h1, h2, h3, h4,\n #admin-menu li, .form-tabs > label, .label {\n font-family: \"#{$font}\", \"Helvetica\", \"Tahoma\", \"Geneva\", \"Arial\", sans-serif;\n }\n}\n\n@mixin mono-fonts($font) {\n code, kbd, pre, samp,\n body .CodeMirror {\n font-family: \"#{$font}\", \"Monaco\", \"Consolas\", \"Lucida Console\", monospace !important;\n }\n}\n$font-url: admin-font-faces($font-definitions);\n\n@import url(\"#{$font-url}\");\n\n@include body-fonts($fonts-default);\n\n@include header-fonts($fonts-header);\n\n@include mono-fonts($fonts-mono);\n\n\n\n\n\n"],"names":[],"mappings":"AC+DA,OAAO,CAAC,4FAAI,CAtBR,AAAA,IAAI,CAAE,AAAA,EAAE,CAAE,AAAA,EAAE,CACZ,AAAA,MAAM,CAAE,AAAA,KAAK,CAAE,AAAA,sBAAsB,CACrC,AAAA,KAAK,CAAE,AAAA,MAAM,CAAE,AAAA,QAAQ,CAAE,AAAA,MAAM,CAAE,AAAA,gBAAgB,AAAC,CAC9C,WAAW,CAAE,MAAU,CAAE,WAAW,CAAE,QAAQ,CAAE,QAAQ,CAAE,OAAO,CAAE,UAAU,CAChF,AAID,AAAA,EAAE,CAAE,AAAA,EAAE,CAAE,AAAA,EAAE,CAAE,AAAA,EAAE,CACd,AAAY,WAAD,CAAC,EAAE,CAAE,AAAa,UAAH,CAAG,KAAK,CAAE,AAAA,MAAM,AAAC,CACvC,WAAW,CAAE,YAAU,CAAE,WAAW,CAAE,QAAQ,CAAE,QAAQ,CAAE,OAAO,CAAE,UAAU,CAChF,AAID,AAAA,IAAI,CAAE,AAAA,GAAG,CAAE,AAAA,GAAG,CAAE,AAAA,IAAI,CACpB,AAAK,IAAD,CAAC,WAAW,AAAC,CACb,WAAW,CAAE,aAAU,CAAE,QAAQ,CAAE,UAAU,CAAE,gBAAgB,CAAE,SAAS,CAAC,UAAU,CACxF"} \ No newline at end of file +{ + "version": 3, + "file": "../scss/fonts.css", + "sources": [ + "../scss/fonts.scss", + "../hdr0", + "../scss/configuration/fonts/_support.scss" + ], + "mappings": "AE+DA,OAAO,CAAC,4FAAI,CAtBR,AAAA,IAAI,CAAE,AAAA,EAAE,CAAE,AAAA,EAAE,CACZ,AAAA,MAAM,CAAE,AAAA,KAAK,CAAE,AAAA,sBAAsB,CACrC,AAAA,KAAK,CAAE,AAAA,MAAM,CAAE,AAAA,QAAQ,CAAE,AAAA,MAAM,CAAE,AAAA,gBAAgB,AAAC,CAC9C,WAAW,CAAE,MAAU,CAAE,WAAW,CAAE,QAAQ,CAAE,QAAQ,CAAE,OAAO,CAAE,UAAU,CAChF,AAID,AAAA,EAAE,CAAE,AAAA,EAAE,CAAE,AAAA,EAAE,CAAE,AAAA,EAAE,CACd,AAAY,WAAD,CAAC,EAAE,CAAE,AAAa,UAAH,CAAG,KAAK,CAAE,AAAA,MAAM,AAAC,CACvC,WAAW,CAAE,YAAU,CAAE,WAAW,CAAE,QAAQ,CAAE,QAAQ,CAAE,OAAO,CAAE,UAAU,CAChF,AAID,AAAA,IAAI,CAAE,AAAA,GAAG,CAAE,AAAA,GAAG,CAAE,AAAA,IAAI,CACpB,AAAK,IAAD,CAAC,WAAW,AAAC,CACb,WAAW,CAAE,aAAU,CAAE,QAAQ,CAAE,UAAU,CAAE,gBAAgB,CAAE,SAAS,CAAC,UAAU,CACxF", + "names": [] +} \ No newline at end of file diff --git a/themes/grav/css-compiled/nucleus.css b/themes/grav/css-compiled/nucleus.css index 6006576a..1ad8b73d 100644 --- a/themes/grav/css-compiled/nucleus.css +++ b/themes/grav/css-compiled/nucleus.css @@ -1,3 +1,3 @@ *,*::before,*::after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-webkit-viewport{width:device-width}@-moz-viewport{width:device-width}@-ms-viewport{width:device-width}@-o-viewport{width:device-width}@viewport{width:device-width}html{font-size:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent;text-decoration:none}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}mark{background:#ff0;color:#000}sub,sup{font-size:.75rem;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0;max-width:100%}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0}pre{overflow:auto}code,kbd,pre,samp{font-size:1rem}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0;table-layout:fixed;width:100%}tr,td,th{vertical-align:middle}th,td{padding:.425rem 0}th{text-align:left}.container{width:75em;margin:0 auto;padding:0}@media only all and (min-width: 60em) and (max-width: 74.938em){.container{width:60em}}@media only all and (min-width: 48em) and (max-width: 59.938em){.container{width:48em}}@media only all and (min-width: 30.063em) and (max-width: 47.938em){.container{width:30em}}@media only all and (max-width: 30em){.container{width:100%}}.grid{display:-webkit-box;display:-moz-box;display:box;display:-webkit-flex;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-flex-flow:row;-moz-flex-flow:row;flex-flow:row;list-style:none;margin:0;padding:0}@media only all and (max-width: 47.938em){.grid{-webkit-flex-flow:row wrap;-moz-flex-flow:row wrap;flex-flow:row wrap}}.block{-webkit-box-flex:1;-moz-box-flex:1;box-flex:1;-webkit-flex:1;-moz-flex:1;-ms-flex:1;flex:1}@media only all and (max-width: 47.938em){.block{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 100%;-moz-flex:0 100%;-ms-flex:0 100%;flex:0 100%}}.content{margin:.625rem;padding:.938rem}@media only all and (max-width: 47.938em){body [class*="size-"]{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 100%;-moz-flex:0 100%;-ms-flex:0 100%;flex:0 100%}}.size-1-2{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 50%;-moz-flex:0 50%;-ms-flex:0 50%;flex:0 50%}.size-1-3{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 33.33333%;-moz-flex:0 33.33333%;-ms-flex:0 33.33333%;flex:0 33.33333%}.size-1-4{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 25%;-moz-flex:0 25%;-ms-flex:0 25%;flex:0 25%}.size-1-5{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 20%;-moz-flex:0 20%;-ms-flex:0 20%;flex:0 20%}.size-1-6{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 16.66667%;-moz-flex:0 16.66667%;-ms-flex:0 16.66667%;flex:0 16.66667%}.size-1-7{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 14.28571%;-moz-flex:0 14.28571%;-ms-flex:0 14.28571%;flex:0 14.28571%}.size-1-8{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 12.5%;-moz-flex:0 12.5%;-ms-flex:0 12.5%;flex:0 12.5%}.size-1-9{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 11.11111%;-moz-flex:0 11.11111%;-ms-flex:0 11.11111%;flex:0 11.11111%}.size-1-10{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 10%;-moz-flex:0 10%;-ms-flex:0 10%;flex:0 10%}.size-1-11{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 9.09091%;-moz-flex:0 9.09091%;-ms-flex:0 9.09091%;flex:0 9.09091%}.size-1-12{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 8.33333%;-moz-flex:0 8.33333%;-ms-flex:0 8.33333%;flex:0 8.33333%}@media only all and (min-width: 48em) and (max-width: 59.938em){.size-tablet-1-2{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 50%;-moz-flex:0 50%;-ms-flex:0 50%;flex:0 50%}.size-tablet-1-3{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 33.33333%;-moz-flex:0 33.33333%;-ms-flex:0 33.33333%;flex:0 33.33333%}.size-tablet-1-4{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 25%;-moz-flex:0 25%;-ms-flex:0 25%;flex:0 25%}.size-tablet-1-5{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 20%;-moz-flex:0 20%;-ms-flex:0 20%;flex:0 20%}.size-tablet-1-6{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 16.66667%;-moz-flex:0 16.66667%;-ms-flex:0 16.66667%;flex:0 16.66667%}.size-tablet-1-7{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 14.28571%;-moz-flex:0 14.28571%;-ms-flex:0 14.28571%;flex:0 14.28571%}.size-tablet-1-8{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 12.5%;-moz-flex:0 12.5%;-ms-flex:0 12.5%;flex:0 12.5%}.size-tablet-1-9{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 11.11111%;-moz-flex:0 11.11111%;-ms-flex:0 11.11111%;flex:0 11.11111%}.size-tablet-1-10{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 10%;-moz-flex:0 10%;-ms-flex:0 10%;flex:0 10%}.size-tablet-1-11{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 9.09091%;-moz-flex:0 9.09091%;-ms-flex:0 9.09091%;flex:0 9.09091%}.size-tablet-1-12{-webkit-box-flex:0;-moz-box-flex:0;box-flex:0;-webkit-flex:0 8.33333%;-moz-flex:0 8.33333%;-ms-flex:0 8.33333%;flex:0 8.33333%}}@media only all and (max-width: 47.938em){@supports not (flex-wrap: wrap){.grid{display:block;-webkit-box-lines:inherit;-moz-box-lines:inherit;box-lines:inherit;-webkit-flex-wrap:inherit;-moz-flex-wrap:inherit;-ms-flex-wrap:inherit;flex-wrap:inherit}.block{display:block;-webkit-box-flex:inherit;-moz-box-flex:inherit;box-flex:inherit;-webkit-flex:inherit;-moz-flex:inherit;-ms-flex:inherit;flex:inherit}}}.first-block{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.last-block{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.fixed-blocks{-webkit-flex-flow:row wrap;-moz-flex-flow:row wrap;flex-flow:row wrap}.fixed-blocks .block{-webkit-box-flex:inherit;-moz-box-flex:inherit;box-flex:inherit;-webkit-flex:inherit;-moz-flex:inherit;-ms-flex:inherit;flex:inherit;width:25%}@media only all and (min-width: 60em) and (max-width: 74.938em){.fixed-blocks .block{width:33.33333%}}@media only all and (min-width: 48em) and (max-width: 59.938em){.fixed-blocks .block{width:50%}}@media only all and (max-width: 47.938em){.fixed-blocks .block{width:100%}}@supports not (flex-wrap: wrap){.fixed-blocks{display:block;-webkit-flex-flow:inherit;-moz-flex-flow:inherit;flex-flow:inherit}}body{font-size:1rem;line-height:1.7}h1,h2,h3,h4,h5,h6{margin:1.7rem 0 .85rem 0;text-rendering:optimizeLegibility}h1{font-size:3.2rem}h2{font-size:2.5rem}h3{font-size:2.1rem}h4{font-size:1.75rem}h5{font-size:1.35rem}h6{font-size:.85rem}p{margin:.85rem 0 1.7rem}ul,ol{margin-top:1.7rem;margin-bottom:1.7rem}ul ul,ul ol,ol ul,ol ol{margin-top:0;margin-bottom:0}blockquote{margin:1.7rem 0;padding-left:.85rem}cite{display:block;font-size:.875rem}cite:before{content:"\2014 \0020"}pre{margin:1.7rem 0;padding:.938rem}code{vertical-align:bottom}small{font-size:.875rem}hr{border-left:none;border-right:none;border-top:none;margin:1.7rem 0}fieldset{border:0;padding:.938rem;margin:0 0 1.7rem 0}input,label,select{display:block}label{margin-bottom:.425rem}label.required:after{content:"*"}label abbr{display:none}textarea,input[type="email"],input[type="number"],input[type="password"],input[type="search"],input[type="tel"],input[type="text"],input[type="url"],input[type="color"],input[type="date"],input[type="datetime"],input[type="datetime-local"],input[type="month"],input[type="time"],input[type="week"],select[multiple=multiple]{-webkit-transition:border-color;-moz-transition:border-color;transition:border-color;border-radius:.1875rem;padding:.425rem .425rem;width:100%}textarea:focus,input[type="email"]:focus,input[type="number"]:focus,input[type="password"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="text"]:focus,input[type="url"]:focus,input[type="color"]:focus,input[type="date"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,select[multiple=multiple]:focus{outline:none}textarea{resize:vertical}input[type="checkbox"],input[type="radio"]{display:inline;margin-right:.425rem}input[type="file"]{width:100%}select{width:auto;max-width:100%;margin-bottom:1.7rem}button,input[type="submit"]{cursor:pointer;user-select:none;vertical-align:middle;white-space:nowrap;border:inherit} -/*# sourceMappingURL=nucleus.css.map */ +/*# sourceMappingURL=../css-compiled/nucleus.css.map */ \ No newline at end of file diff --git a/themes/grav/css-compiled/nucleus.css.map b/themes/grav/css-compiled/nucleus.css.map index 13ad6a4c..0d2ab3bb 100644 --- a/themes/grav/css-compiled/nucleus.css.map +++ b/themes/grav/css-compiled/nucleus.css.map @@ -1 +1,93 @@ -{"version":3,"file":"nucleus.css","sources":["nucleus.scss","vendor/bourbon/_bourbon.scss","vendor/bourbon/settings/_prefixer.scss","vendor/bourbon/settings/_px-to-em.scss","vendor/bourbon/helpers/_convert-units.scss","vendor/bourbon/helpers/_gradient-positions-parser.scss","vendor/bourbon/helpers/_is-num.scss","vendor/bourbon/helpers/_linear-angle-parser.scss","vendor/bourbon/helpers/_linear-gradient-parser.scss","vendor/bourbon/helpers/_linear-positions-parser.scss","vendor/bourbon/helpers/_linear-side-corner-parser.scss","vendor/bourbon/helpers/_radial-arg-parser.scss","vendor/bourbon/helpers/_radial-positions-parser.scss","vendor/bourbon/helpers/_radial-gradient-parser.scss","vendor/bourbon/helpers/_render-gradients.scss","vendor/bourbon/helpers/_shape-size-stripper.scss","vendor/bourbon/helpers/_str-to-num.scss","vendor/bourbon/functions/_assign.scss","vendor/bourbon/functions/_color-lightness.scss","vendor/bourbon/functions/_flex-grid.scss","vendor/bourbon/functions/_golden-ratio.scss","vendor/bourbon/functions/_grid-width.scss","vendor/bourbon/functions/_modular-scale.scss","vendor/bourbon/functions/_px-to-em.scss","vendor/bourbon/functions/_px-to-rem.scss","vendor/bourbon/functions/_strip-units.scss","vendor/bourbon/functions/_tint-shade.scss","vendor/bourbon/functions/_transition-property-name.scss","vendor/bourbon/functions/_unpack.scss","vendor/bourbon/css3/_animation.scss","vendor/bourbon/css3/_appearance.scss","vendor/bourbon/css3/_backface-visibility.scss","vendor/bourbon/css3/_background.scss","vendor/bourbon/css3/_background-image.scss","vendor/bourbon/css3/_border-image.scss","vendor/bourbon/css3/_border-radius.scss","vendor/bourbon/css3/_box-sizing.scss","vendor/bourbon/css3/_calc.scss","vendor/bourbon/css3/_columns.scss","vendor/bourbon/css3/_filter.scss","vendor/bourbon/css3/_flex-box.scss","vendor/bourbon/css3/_font-face.scss","vendor/bourbon/css3/_hyphens.scss","vendor/bourbon/css3/_hidpi-media-query.scss","vendor/bourbon/css3/_image-rendering.scss","vendor/bourbon/css3/_keyframes.scss","vendor/bourbon/css3/_linear-gradient.scss","vendor/bourbon/css3/_perspective.scss","vendor/bourbon/css3/_radial-gradient.scss","vendor/bourbon/css3/_transform.scss","vendor/bourbon/css3/_transition.scss","vendor/bourbon/css3/_user-select.scss","vendor/bourbon/css3/_placeholder.scss","vendor/bourbon/addons/_button.scss","vendor/bourbon/addons/_clearfix.scss","vendor/bourbon/addons/_directional-values.scss","vendor/bourbon/addons/_ellipsis.scss","vendor/bourbon/addons/_font-family.scss","vendor/bourbon/addons/_hide-text.scss","vendor/bourbon/addons/_html5-input-types.scss","vendor/bourbon/addons/_position.scss","vendor/bourbon/addons/_prefixer.scss","vendor/bourbon/addons/_retina-image.scss","vendor/bourbon/addons/_size.scss","vendor/bourbon/addons/_timing-functions.scss","vendor/bourbon/addons/_triangle.scss","vendor/bourbon/addons/_word-wrap.scss","vendor/bourbon/_bourbon-deprecated-upcoming.scss","configuration/nucleus/_base.scss","configuration/nucleus/_core.scss","configuration/nucleus/_breakpoints.scss","configuration/nucleus/_layout.scss","configuration/nucleus/_typography.scss","configuration/nucleus/_nav.scss","nucleus/functions/_base.scss","nucleus/functions/_direction.scss","nucleus/functions/_range.scss","nucleus/mixins/_base.scss","nucleus/mixins/_breakpoints.scss","nucleus/mixins/_utilities.scss","nucleus/_core.scss","nucleus/_flex.scss","nucleus/_typography.scss","nucleus/_forms.scss"],"sourcesContent":["// REQUIRED DEPENDENCIES - DO NOT CHANGE\n\n// Load Third Party Libraries\n@import \"vendor/bourbon/bourbon\";\n\n// Load Nucleus Configuration\n@import \"configuration/nucleus/base\";\n\n// Load Nucleus Mixins and Functions\n@import \"nucleus/functions/base\";\n@import \"nucleus/mixins/base\";\n\n//-------------------------------------------\n\n// LOAD NUCLEUS COMPONENTS\n\n// Core\n@import \"nucleus/core\";\n\n// Flex\n@import \"nucleus/flex\";\n\n// Typography\n@import \"nucleus/typography\";\n\n// Forms\n@import \"nucleus/forms\";\n","// Settings\n@import \"settings/prefixer\";\n@import \"settings/px-to-em\";\n\n// Custom Helpers\n@import \"helpers/convert-units\";\n@import \"helpers/gradient-positions-parser\";\n@import \"helpers/is-num\";\n@import \"helpers/linear-angle-parser\";\n@import \"helpers/linear-gradient-parser\";\n@import \"helpers/linear-positions-parser\";\n@import \"helpers/linear-side-corner-parser\";\n@import \"helpers/radial-arg-parser\";\n@import \"helpers/radial-positions-parser\";\n@import \"helpers/radial-gradient-parser\";\n@import \"helpers/render-gradients\";\n@import \"helpers/shape-size-stripper\";\n@import \"helpers/str-to-num\";\n\n// Custom Functions\n@import \"functions/assign\";\n@import \"functions/color-lightness\";\n@import \"functions/flex-grid\";\n@import \"functions/golden-ratio\";\n@import \"functions/grid-width\";\n@import \"functions/modular-scale\";\n@import \"functions/px-to-em\";\n@import \"functions/px-to-rem\";\n@import \"functions/strip-units\";\n@import \"functions/tint-shade\";\n@import \"functions/transition-property-name\";\n@import \"functions/unpack\";\n\n// CSS3 Mixins\n@import \"css3/animation\";\n@import \"css3/appearance\";\n@import \"css3/backface-visibility\";\n@import \"css3/background\";\n@import \"css3/background-image\";\n@import \"css3/border-image\";\n@import \"css3/border-radius\";\n@import \"css3/box-sizing\";\n@import \"css3/calc\";\n@import \"css3/columns\";\n@import \"css3/filter\";\n@import \"css3/flex-box\";\n@import \"css3/font-face\";\n@import \"css3/hyphens\";\n@import \"css3/hidpi-media-query\";\n@import \"css3/image-rendering\";\n@import \"css3/keyframes\";\n@import \"css3/linear-gradient\";\n@import \"css3/perspective\";\n@import \"css3/radial-gradient\";\n@import \"css3/transform\";\n@import \"css3/transition\";\n@import \"css3/user-select\";\n@import \"css3/placeholder\";\n\n// Addons & other mixins\n@import \"addons/button\";\n@import \"addons/clearfix\";\n@import \"addons/directional-values\";\n@import \"addons/ellipsis\";\n@import \"addons/font-family\";\n@import \"addons/hide-text\";\n@import \"addons/html5-input-types\";\n@import \"addons/position\";\n@import \"addons/prefixer\";\n@import \"addons/retina-image\";\n@import \"addons/size\";\n@import \"addons/timing-functions\";\n@import \"addons/triangle\";\n@import \"addons/word-wrap\";\n\n// Soon to be deprecated Mixins\n@import \"bourbon-deprecated-upcoming\";\n","// Variable settings for /addons/prefixer.scss\n$prefix-for-webkit: true !default;\n$prefix-for-mozilla: true !default;\n$prefix-for-microsoft: true !default;\n$prefix-for-opera: true !default;\n$prefix-for-spec: true !default; // required for keyframe mixin\n","$em-base: 16px !default;\n","//************************************************************************//\n// Helper function for str-to-num fn.\n// Source: http://sassmeister.com/gist/9647408\n//************************************************************************//\n@function _convert-units($number, $unit) {\n $strings: 'px' 'cm' 'mm' '%' 'ch' 'pica' 'in' 'em' 'rem' 'pt' 'pc' 'ex' 'vw' 'vh' 'vmin' 'vmax', 'deg', 'rad', 'grad', 'turn';\n $units: 1px 1cm 1mm 1% 1ch 1pica 1in 1em 1rem 1pt 1pc 1ex 1vw 1vh 1vmin 1vmax, 1deg, 1rad, 1grad, 1turn;\n $index: index($strings, $unit);\n\n @if not $index {\n @warn \"Unknown unit `#{$unit}`.\";\n @return false;\n }\n @return $number * nth($units, $index);\n}\n","@function _gradient-positions-parser($gradient-type, $gradient-positions) {\n @if $gradient-positions\n and ($gradient-type == linear)\n and (type-of($gradient-positions) != color) {\n $gradient-positions: _linear-positions-parser($gradient-positions);\n }\n @else if $gradient-positions\n and ($gradient-type == radial)\n and (type-of($gradient-positions) != color) {\n $gradient-positions: _radial-positions-parser($gradient-positions);\n }\n @return $gradient-positions;\n}\n","//************************************************************************//\n// Helper for linear-gradient-parser\n//************************************************************************//\n@function _is-num($char) {\n $values: '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' 0 1 2 3 4 5 6 7 8 9;\n $index: index($values, $char);\n @return if($index, true, false);\n}\n","// Private function for linear-gradient-parser\n@function _linear-angle-parser($image, $first-val, $prefix, $suffix) {\n $offset: null;\n $unit-short: str-slice($first-val, str-length($first-val) - 2, str-length($first-val));\n $unit-long: str-slice($first-val, str-length($first-val) - 3, str-length($first-val));\n\n @if ($unit-long == \"grad\") or\n ($unit-long == \"turn\") {\n $offset: if($unit-long == \"grad\", -100grad * 3, -0.75turn);\n }\n\n @else if ($unit-short == \"deg\") or\n ($unit-short == \"rad\") {\n $offset: if($unit-short == \"deg\", -90 * 3, 1.6rad);\n }\n\n @if $offset {\n $num: _str-to-num($first-val);\n\n @return (\n webkit-image: -webkit- + $prefix + ($offset - $num) + $suffix,\n spec-image: $image\n );\n }\n}\n","@function _linear-gradient-parser($image) {\n $image: unquote($image);\n $gradients: ();\n $start: str-index($image, \"(\");\n $end: str-index($image, \",\");\n $first-val: str-slice($image, $start + 1, $end - 1);\n\n $prefix: str-slice($image, 0, $start);\n $suffix: str-slice($image, $end, str-length($image));\n\n $has-multiple-vals: str-index($first-val, \" \");\n $has-single-position: unquote(_position-flipper($first-val) + \"\");\n $has-angle: _is-num(str-slice($first-val, 0, 0));\n\n @if $has-multiple-vals {\n $gradients: _linear-side-corner-parser($image, $first-val, $prefix, $suffix, $has-multiple-vals);\n }\n\n @else if $has-single-position != \"\" {\n $pos: unquote($has-single-position + \"\");\n\n $gradients: (\n webkit-image: -webkit- + $image,\n spec-image: $prefix + \"to \" + $pos + $suffix\n );\n }\n\n @else if $has-angle {\n // Rotate degree for webkit\n $gradients: _linear-angle-parser($image, $first-val, $prefix, $suffix);\n }\n\n @else {\n $gradients: (\n webkit-image: -webkit- + $image,\n spec-image: $image\n );\n }\n\n @return $gradients;\n}\n","@function _linear-positions-parser($pos) {\n $type: type-of(nth($pos, 1));\n $spec: null;\n $degree: null;\n $side: null;\n $corner: null;\n $length: length($pos);\n // Parse Side and corner positions\n @if ($length > 1) {\n @if nth($pos, 1) == \"to\" { // Newer syntax\n $side: nth($pos, 2);\n\n @if $length == 2 { // eg. to top\n // Swap for backwards compatability\n $degree: _position-flipper(nth($pos, 2));\n }\n @else if $length == 3 { // eg. to top left\n $corner: nth($pos, 3);\n }\n }\n @else if $length == 2 { // Older syntax (\"top left\")\n $side: _position-flipper(nth($pos, 1));\n $corner: _position-flipper(nth($pos, 2));\n }\n\n @if (\"#{$side} #{$corner}\" == \"left top\") or (\"#{$side} #{$corner}\" == \"top left\") {\n $degree: _position-flipper(#{$side}) _position-flipper(#{$corner});\n }\n @else if (\"#{$side} #{$corner}\" == \"right top\") or (\"#{$side} #{$corner}\" == \"top right\") {\n $degree: _position-flipper(#{$side}) _position-flipper(#{$corner});\n }\n @else if (\"#{$side} #{$corner}\" == \"right bottom\") or (\"#{$side} #{$corner}\" == \"bottom right\") {\n $degree: _position-flipper(#{$side}) _position-flipper(#{$corner});\n }\n @else if (\"#{$side} #{$corner}\" == \"left bottom\") or (\"#{$side} #{$corner}\" == \"bottom left\") {\n $degree: _position-flipper(#{$side}) _position-flipper(#{$corner});\n }\n $spec: to $side $corner;\n }\n @else if $length == 1 {\n // Swap for backwards compatability\n @if $type == string {\n $degree: $pos;\n $spec: to _position-flipper($pos);\n }\n @else {\n $degree: -270 - $pos; //rotate the gradient opposite from spec\n $spec: $pos;\n }\n }\n $degree: unquote($degree + \",\");\n $spec: unquote($spec + \",\");\n @return $degree $spec;\n}\n\n@function _position-flipper($pos) {\n @return if($pos == left, right, null)\n if($pos == right, left, null)\n if($pos == top, bottom, null)\n if($pos == bottom, top, null);\n}\n","// Private function for linear-gradient-parser\n@function _linear-side-corner-parser($image, $first-val, $prefix, $suffix, $has-multiple-vals) {\n $val-1: str-slice($first-val, 0, $has-multiple-vals - 1 );\n $val-2: str-slice($first-val, $has-multiple-vals + 1, str-length($first-val));\n $val-3: null;\n $has-val-3: str-index($val-2, \" \");\n\n @if $has-val-3 {\n $val-3: str-slice($val-2, $has-val-3 + 1, str-length($val-2));\n $val-2: str-slice($val-2, 0, $has-val-3 - 1);\n }\n\n $pos: _position-flipper($val-1) _position-flipper($val-2) _position-flipper($val-3);\n $pos: unquote($pos + \"\");\n\n // Use old spec for webkit\n @if $val-1 == \"to\" {\n @return (\n webkit-image: -webkit- + $prefix + $pos + $suffix,\n spec-image: $image\n );\n }\n\n // Bring the code up to spec\n @else {\n @return (\n webkit-image: -webkit- + $image,\n spec-image: $prefix + \"to \" + $pos + $suffix\n );\n }\n}\n","@function _radial-arg-parser($G1, $G2, $pos, $shape-size) {\n @each $value in $G1, $G2 {\n $first-val: nth($value, 1);\n $pos-type: type-of($first-val);\n $spec-at-index: null;\n\n // Determine if spec was passed to mixin\n @if type-of($value) == list {\n $spec-at-index: if(index($value, at), index($value, at), false);\n }\n @if $spec-at-index {\n @if $spec-at-index > 1 {\n @for $i from 1 through ($spec-at-index - 1) {\n $shape-size: $shape-size nth($value, $i);\n }\n @for $i from ($spec-at-index + 1) through length($value) {\n $pos: $pos nth($value, $i);\n }\n }\n @else if $spec-at-index == 1 {\n @for $i from ($spec-at-index + 1) through length($value) {\n $pos: $pos nth($value, $i);\n }\n }\n $G1: null;\n }\n\n // If not spec calculate correct values\n @else {\n @if ($pos-type != color) or ($first-val != \"transparent\") {\n @if ($pos-type == number)\n or ($first-val == \"center\")\n or ($first-val == \"top\")\n or ($first-val == \"right\")\n or ($first-val == \"bottom\")\n or ($first-val == \"left\") {\n\n $pos: $value;\n\n @if $pos == $G1 {\n $G1: null;\n }\n }\n\n @else if\n ($first-val == \"ellipse\")\n or ($first-val == \"circle\")\n or ($first-val == \"closest-side\")\n or ($first-val == \"closest-corner\")\n or ($first-val == \"farthest-side\")\n or ($first-val == \"farthest-corner\")\n or ($first-val == \"contain\")\n or ($first-val == \"cover\") {\n\n $shape-size: $value;\n\n @if $value == $G1 {\n $G1: null;\n }\n\n @else if $value == $G2 {\n $G2: null;\n }\n }\n }\n }\n }\n @return $G1, $G2, $pos, $shape-size;\n}\n","@function _radial-positions-parser($gradient-pos) {\n $shape-size: nth($gradient-pos, 1);\n $pos: nth($gradient-pos, 2);\n $shape-size-spec: _shape-size-stripper($shape-size);\n\n $pre-spec: unquote(if($pos, \"#{$pos}, \", null))\n unquote(if($shape-size, \"#{$shape-size},\", null));\n $pos-spec: if($pos, \"at #{$pos}\", null);\n\n $spec: \"#{$shape-size-spec} #{$pos-spec}\";\n\n // Add comma\n @if ($spec != ' ') {\n $spec: \"#{$spec},\"\n }\n\n @return $pre-spec $spec;\n}\n","@function _radial-gradient-parser($image) {\n $image: unquote($image);\n $gradients: ();\n $start: str-index($image, \"(\");\n $end: str-index($image, \",\");\n $first-val: str-slice($image, $start + 1, $end - 1);\n\n $prefix: str-slice($image, 0, $start);\n $suffix: str-slice($image, $end, str-length($image));\n\n $is-spec-syntax: str-index($first-val, \"at\");\n\n @if $is-spec-syntax and $is-spec-syntax > 1 {\n $keyword: str-slice($first-val, 1, $is-spec-syntax - 2);\n $pos: str-slice($first-val, $is-spec-syntax + 3, str-length($first-val));\n $pos: append($pos, $keyword, comma);\n\n $gradients: (\n webkit-image: -webkit- + $prefix + $pos + $suffix,\n spec-image: $image\n )\n }\n\n @else if $is-spec-syntax == 1 {\n $pos: str-slice($first-val, $is-spec-syntax + 3, str-length($first-val));\n\n $gradients: (\n webkit-image: -webkit- + $prefix + $pos + $suffix,\n spec-image: $image\n )\n }\n\n @else if str-index($image, \"cover\") or str-index($image, \"contain\") {\n @warn \"Radial-gradient needs to be updated to conform to latest spec.\";\n\n $gradients: (\n webkit-image: null,\n spec-image: $image\n )\n }\n\n @else {\n $gradients: (\n webkit-image: -webkit- + $image,\n spec-image: $image\n )\n }\n\n @return $gradients;\n}\n","// User for linear and radial gradients within background-image or border-image properties\n\n@function _render-gradients($gradient-positions, $gradients, $gradient-type, $vendor: false) {\n $pre-spec: null;\n $spec: null;\n $vendor-gradients: null;\n @if $gradient-type == linear {\n @if $gradient-positions {\n $pre-spec: nth($gradient-positions, 1);\n $spec: nth($gradient-positions, 2);\n }\n }\n @else if $gradient-type == radial {\n $pre-spec: nth($gradient-positions, 1);\n $spec: nth($gradient-positions, 2);\n }\n\n @if $vendor {\n $vendor-gradients: -#{$vendor}-#{$gradient-type}-gradient(#{$pre-spec} $gradients);\n }\n @else if $vendor == false {\n $vendor-gradients: \"#{$gradient-type}-gradient(#{$spec} #{$gradients})\";\n $vendor-gradients: unquote($vendor-gradients);\n }\n @return $vendor-gradients;\n}\n","@function _shape-size-stripper($shape-size) {\n $shape-size-spec: null;\n @each $value in $shape-size {\n @if ($value == \"cover\") or ($value == \"contain\") {\n $value: null;\n }\n $shape-size-spec: \"#{$shape-size-spec} #{$value}\";\n }\n @return $shape-size-spec;\n}\n","//************************************************************************//\n// Helper function for linear/radial-gradient-parsers.\n// Source: http://sassmeister.com/gist/9647408\n//************************************************************************//\n@function _str-to-num($string) {\n // Matrices\n $strings: '0' '1' '2' '3' '4' '5' '6' '7' '8' '9';\n $numbers: 0 1 2 3 4 5 6 7 8 9;\n\n // Result\n $result: 0;\n $divider: 0;\n $minus: false;\n\n // Looping through all characters\n @for $i from 1 through str-length($string) {\n $character: str-slice($string, $i, $i);\n $index: index($strings, $character);\n\n @if $character == '-' {\n $minus: true;\n }\n\n @else if $character == '.' {\n $divider: 1;\n }\n\n @else {\n @if not $index {\n $result: if($minus, $result * -1, $result);\n @return _convert-units($result, str-slice($string, $i));\n }\n\n $number: nth($numbers, $index);\n\n @if $divider == 0 {\n $result: $result * 10;\n }\n\n @else {\n // Move the decimal dot to the left\n $divider: $divider * 10;\n $number: $number / $divider;\n }\n\n $result: $result + $number;\n }\n }\n @return if($minus, $result * -1, $result);\n}\n","@function assign-inputs($inputs, $pseudo: null) {\n $list : ();\n\n @each $input in $inputs {\n $input: unquote($input);\n $input: if($pseudo, $input + \":\" + $pseudo, $input);\n $list: append($list, $input, comma);\n }\n\n @return $list;\n}","// Programatically determines whether a color is light or dark\n// Returns a boolean\n// More details here http://robots.thoughtbot.com/closer-look-color-lightness\n\n@function is-light($hex-color) {\n $-local-red: red(rgba($hex-color, 1.0));\n $-local-green: green(rgba($hex-color, 1.0));\n $-local-blue: blue(rgba($hex-color, 1.0));\n\n $-local-lightness: ($-local-red * 0.2126 + $-local-green * 0.7152 + $-local-blue * 0.0722) / 255;\n\n @return $-local-lightness > .6;\n}\n","// Flexible grid\n@function flex-grid($columns, $container-columns: $fg-max-columns) {\n $width: $columns * $fg-column + ($columns - 1) * $fg-gutter;\n $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter;\n @return percentage($width / $container-width);\n}\n\n// Flexible gutter\n@function flex-gutter($container-columns: $fg-max-columns, $gutter: $fg-gutter) {\n $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter;\n @return percentage($gutter / $container-width);\n}\n\n// The $fg-column, $fg-gutter and $fg-max-columns variables must be defined in your base stylesheet to properly use the flex-grid function.\n// This function takes the fluid grid equation (target / context = result) and uses columns to help define each.\n//\n// The calculation presumes that your column structure will be missing the last gutter:\n//\n// -- column -- gutter -- column -- gutter -- column\n//\n// $fg-column: 60px; // Column Width\n// $fg-gutter: 25px; // Gutter Width\n// $fg-max-columns: 12; // Total Columns For Main Container\n//\n// div {\n// width: flex-grid(4); // returns (315px / 995px) = 31.65829%;\n// margin-left: flex-gutter(); // returns (25px / 995px) = 2.51256%;\n//\n// p {\n// width: flex-grid(2, 4); // returns (145px / 315px) = 46.031746%;\n// float: left;\n// margin: flex-gutter(4); // returns (25px / 315px) = 7.936508%;\n// }\n//\n// blockquote {\n// float: left;\n// width: flex-grid(2, 4); // returns (145px / 315px) = 46.031746%;\n// }\n// }","@function golden-ratio($value, $increment) {\n @return modular-scale($value, $increment, $golden)\n}\n","@function grid-width($n) {\n @return $n * $gw-column + ($n - 1) * $gw-gutter;\n}\n\n// The $gw-column and $gw-gutter variables must be defined in your base stylesheet to properly use the grid-width function.\n//\n// $gw-column: 100px; // Column Width\n// $gw-gutter: 40px; // Gutter Width\n//\n// div {\n// width: grid-width(4); // returns 520px;\n// margin-left: $gw-gutter; // returns 40px;\n// }\n","// Scaling Variables\n$golden: 1.618;\n$minor-second: 1.067;\n$major-second: 1.125;\n$minor-third: 1.2;\n$major-third: 1.25;\n$perfect-fourth: 1.333;\n$augmented-fourth: 1.414;\n$perfect-fifth: 1.5;\n$minor-sixth: 1.6;\n$major-sixth: 1.667;\n$minor-seventh: 1.778;\n$major-seventh: 1.875;\n$octave: 2;\n$major-tenth: 2.5;\n$major-eleventh: 2.667;\n$major-twelfth: 3;\n$double-octave: 4;\n\n@function modular-scale($value, $increment, $ratio) {\n $v1: nth($value, 1);\n $v2: nth($value, length($value));\n $value: $v1;\n\n // scale $v2 to just above $v1\n @while $v2 > $v1 {\n $v2: ($v2 / $ratio); // will be off-by-1\n }\n @while $v2 < $v1 {\n $v2: ($v2 * $ratio); // will fix off-by-1\n }\n\n // check AFTER scaling $v2 to prevent double-counting corner-case\n $double-stranded: $v2 > $v1;\n\n @if $increment > 0 {\n @for $i from 1 through $increment {\n @if $double-stranded and ($v1 * $ratio) > $v2 {\n $value: $v2;\n $v2: ($v2 * $ratio);\n } @else {\n $v1: ($v1 * $ratio);\n $value: $v1;\n }\n }\n }\n\n @if $increment < 0 {\n // adjust $v2 to just below $v1\n @if $double-stranded {\n $v2: ($v2 / $ratio);\n }\n\n @for $i from $increment through -1 {\n @if $double-stranded and ($v1 / $ratio) < $v2 {\n $value: $v2;\n $v2: ($v2 / $ratio);\n } @else {\n $v1: ($v1 / $ratio);\n $value: $v1;\n }\n }\n }\n\n @return $value;\n}\n","// Convert pixels to ems\n// eg. for a relational value of 12px write em(12) when the parent is 16px\n// if the parent is another value say 24px write em(12, 24)\n\n@function em($pxval, $base: $em-base) {\n @if not unitless($pxval) {\n $pxval: strip-units($pxval);\n }\n @if not unitless($base) {\n $base: strip-units($base);\n }\n @return ($pxval / $base) * 1em;\n}\n","// Convert pixels to rems\n// eg. for a relational value of 12px write rem(12)\n// Assumes $em-base is the font-size of \n\n@function rem($pxval) {\n @if not unitless($pxval) {\n $pxval: strip-units($pxval);\n }\n\n $base: $em-base;\n @if not unitless($base) {\n $base: strip-units($base);\n }\n @return ($pxval / $base) * 1rem;\n}\n","// Srtips the units from a value. e.g. 12px -> 12\n\n@function strip-units($val) {\n @return ($val / ($val * 0 + 1));\n}\n","// Add percentage of white to a color\n@function tint($color, $percent){\n @return mix(white, $color, $percent);\n}\n\n// Add percentage of black to a color\n@function shade($color, $percent){\n @return mix(black, $color, $percent);\n}\n","// Return vendor-prefixed property names if appropriate\n// Example: transition-property-names((transform, color, background), moz) -> -moz-transform, color, background\n//************************************************************************//\n@function transition-property-names($props, $vendor: false) {\n\t$new-props: ();\n\t\n\t@each $prop in $props {\n\t\t$new-props: append($new-props, transition-property-name($prop, $vendor), comma);\n\t}\n\n\t@return $new-props;\n}\n\n@function transition-property-name($prop, $vendor: false) {\n\t// put other properties that need to be prefixed here aswell\n\t@if $vendor and $prop == transform {\n\t\t@return unquote('-'+$vendor+'-'+$prop);\n\t}\n\t@else {\n\t\t@return $prop;\n\t}\n}","// Convert shorthand to the 4-value syntax\n\n@function unpack($shorthand) {\n @if length($shorthand) == 1 {\n @return nth($shorthand, 1) nth($shorthand, 1) nth($shorthand, 1) nth($shorthand, 1);\n }\n @else if length($shorthand) == 2 {\n @return nth($shorthand, 1) nth($shorthand, 2) nth($shorthand, 1) nth($shorthand, 2);\n }\n @else if length($shorthand) == 3 {\n @return nth($shorthand, 1) nth($shorthand, 2) nth($shorthand, 3) nth($shorthand, 2);\n }\n @else {\n @return $shorthand;\n }\n}\n\n","// http://www.w3.org/TR/css3-animations/#the-animation-name-property-\n// Each of these mixins support comma separated lists of values, which allows different transitions for individual properties to be described in a single style rule. Each value in the list corresponds to the value at that same position in the other properties.\n\n// Official animation shorthand property.\n@mixin animation ($animations...) {\n @include prefixer(animation, $animations, webkit moz spec);\n}\n\n// Individual Animation Properties\n@mixin animation-name ($names...) {\n @include prefixer(animation-name, $names, webkit moz spec);\n}\n\n\n@mixin animation-duration ($times...) {\n @include prefixer(animation-duration, $times, webkit moz spec);\n}\n\n\n@mixin animation-timing-function ($motions...) {\n// ease | linear | ease-in | ease-out | ease-in-out\n @include prefixer(animation-timing-function, $motions, webkit moz spec);\n}\n\n\n@mixin animation-iteration-count ($values...) {\n// infinite |"+t.stack+"":"";u.default.error("Fetch Failed: \n '+l.translations.PLUGIN_ADMIN.UPDATE+" "+l.translations.PLUGIN_ADMIN.ALL+" "+c+'\n \n '+a+" "+l.translations.PLUGIN_ADMIN.OF_YOUR+" "+o+" "+l.translations.PLUGIN_ADMIN.HAVE_AN_UPDATE_AVAILABLE+"\n
\n ");var d=(0,s.default)("[data-update-packages]").attr("data-packages-slugs")||"";d=d?d.split(","):[];var h=(0,u.default)(d.concat(Object.keys(r))).join();(0,s.default)("[data-update-packages]").attr("data-packages-slugs",""+h),Object.keys(r).forEach(function(e){var a=(0,s.default)("[data-gpm-"+n[i]+'="'+e+'"]'),c=a.find(".gpm-name"),u=c.find("a"),f=a.parents(".content-wrapper");if("plugins"!==o||c.find(".badge.update").length?"themes"===o&&(c.append('"),f.addClass("has-updates")):(c.append(''+l.translations.PLUGIN_ADMIN.UPDATE_AVAILABLE+"!"),f.addClass("has-updates")),a.length){var d=(0,s.default)(".grav-update."+n[i]);if(d.length){var h="testing"===r[e].type?'test release':"";d.html('\n\n '+l.translations.PLUGIN_ADMIN.UPDATE+" "+(n[i].charAt(0).toUpperCase()+n[i].substr(1).toLowerCase())+'\n \n v'+r[e].available+" "+h+" "+l.translations.PLUGIN_ADMIN.OF_THIS+" "+n[i]+" "+l.translations.PLUGIN_ADMIN.IS_NOW_AVAILABLE+"!\n
\n ").css("display","block"),t=!1}}}),(0,s.default)("[data-update-packages]").removeClass("hidden")}}),(0,s.default)(".content-wrapper").addClass("updates-checked"),void(t||(0,s.default)(".warning-reinstall-not-latest-release").removeClass("hidden"))):this}}]),t}();e.default=y;var _=new y;e.Instance=_,e.Notifications=m.default,e.Feed=g.default,h.Instance.on("fetched",function(t,e){_.setPayload(t.payload||{}),_.grav().resources()}),"1"===l.config.enable_auto_updates_check&&h.Instance.fetch()},function(t,e,n){function r(t,e){return e=e||i,a(t,function(t,n,r){for(var i=r.length;++n ul").show();switch(r.find("div").remove(),r.find(".fa-warning").removeClass("fa-warning").addClass("fa-refresh fa-spin"),t.type||(t.type="note"),t.type){case"note":t.intro_text="Note";break;case"info":t.intro_text="Info";break;case"warning":t.intro_text="Warning"}var a="";if(e>9&&(a=" hidden "),t.link)i.append('\n"+t.message+"
").text();i.append('\n"+h.translations.PLUGIN_ADMIN.FILE_ERROR_UPLOAD+" "+e.name+"
\n"+n.message+""})}},{key:"onDropzoneComplete",value:function(e){if(!e.accepted&&!e.rejected){var n={status:"error",message:h.translations.PLUGIN_ADMIN.FILE_UNSUPPORTED+": "+e.name.match(/\..+/).join("")};return this.handleError({file:e,data:n,mode:"removeFile",msg:"
"+h.translations.PLUGIN_ADMIN.FILE_ERROR_ADD+" "+e.name+"
\n"+n.message+""})}this.options.reloadPage&&t.location.reload()}},{key:"b64_to_utf8",value:function(t){return t=t.replace(/\s/g,""),decodeURIComponent(escape(window.atob(t)))}},{key:"onDropzoneRemovedFile",value:function(t){var e=this;if(t.accepted&&!t.rejected){var n=t.removeUrl||this.urls.delete,r=(n||"").match(/path:(.*)\//),i={filename:t.name};t.sessionParams&&(i.task="filessessionremove",i.session=t.sessionParams),(0,d.default)(n,{method:"post",body:i},function(){if(r){r=e.b64_to_utf8(r[1]);var t=e.container.find('[name][type="hidden"]'),n=JSON.parse(t.val()||"{}");delete n[r],t.val(JSON.stringify(n))}})}}},{key:"onDropzoneError",value:function(t,e,n){var r=n?e.error.message:e;return(0,c.default)(t.previewElement).find("[data-dz-errormessage]").html(r),this.handleError({file:t,data:{status:"error"},msg:"
"+r+""})}},{key:"handleError",value:function(t){var e=t.file,n=t.data,r=t.mode,i=t.msg;if("error"===n.status||"unauthorized"===n.status){switch(r){case"addBack":e instanceof File?this.dropzone.addFile.call(this.dropzone,e):(this.dropzone.files.push(e),this.dropzone.options.addedfile.call(this.dropzone,e),this.dropzone.options.thumbnail.call(this.dropzone,e,e.extras.url));break;case"removeFile":default:~this.dropzone.files.indexOf(e)&&(e.rejected=!0,this.dropzone.removeFile.call(this.dropzone,e,{silent:!0}))}var a=(0,c.default)('[data-remodal-id="generic"]');a.find(".error-content").html(i),c.default.remodal.lookup[a.data("remodal")].open()}}}]),e}();e.default=v;var g=[],y=(0,c.default)(),_=function(t,e){var n=(0,c.default)(e).find(".dropzone.files-upload");n.length&&n.each(function(t,e){e=(0,c.default)(e),~y.index(e)||b(e)})},b=function(t){t=(0,c.default)(t);var e=t.find('input[type="file"]'),n=t.data("grav-file-settings")||{};n.accept&&~n.accept.indexOf("*")&&(n.accept=[""]);var r={url:t.data("file-url-add")||(t.closest("form").attr("action")||h.config.current_url)+".json",paramName:n.paramName||"file",dotNotation:n.name||"file",acceptedFiles:n.accept?n.accept.join(","):e.attr("accept")||t.data("media-types"),maxFilesize:"undefined"!=typeof n.filesize?n.filesize:256,maxFiles:n.limit||null};y=y.add(t),t=t[0],g.push(new v({container:t,options:r}))};e.Instances=function(){return(0,c.default)(".dropzone.files-upload").each(function(t,e){return b(e)}),(0,c.default)("body").on("mutation._grav",_),g}()}).call(e,function(){return this}())},,,function(t,e,n){(function(t){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0}),e.Instance=e.Toolbar=void 0;var a=function(){function t(t,e){for(var n=0;n
"+e.stack+"":"";u.default.error("Fetch Failed: \n '+l.translations.PLUGIN_ADMIN.UPDATE+" "+l.translations.PLUGIN_ADMIN.ALL+" "+c+'\n \n '+a+" "+l.translations.PLUGIN_ADMIN.OF_YOUR+" "+o+" "+l.translations.PLUGIN_ADMIN.HAVE_AN_UPDATE_AVAILABLE+"\n
\n ");var d=(0,s.default)("[data-update-packages]").attr("data-packages-slugs")||"";d=d?d.split(","):[];var h=(0,u.default)(d.concat(Object.keys(r))).join();(0,s.default)("[data-update-packages]").attr("data-packages-slugs",""+h),Object.keys(r).forEach(function(t){var a=(0,s.default)("[data-gpm-"+n[i]+'="'+t+'"]'),c=a.find(".gpm-name"),u=c.find("a"),f=a.parents(".content-wrapper");if("plugins"!==o||c.find(".badge.update").length?"themes"===o&&(c.append('"),f.addClass("has-updates")):(c.append(''+l.translations.PLUGIN_ADMIN.UPDATE_AVAILABLE+"!"),f.addClass("has-updates")),a.length){var d=(0,s.default)(".grav-update."+n[i]);if(d.length){var h="testing"===r[t].type?'test release':"";d.html('\n\n '+l.translations.PLUGIN_ADMIN.UPDATE+" "+(n[i].charAt(0).toUpperCase()+n[i].substr(1).toLowerCase())+'\n \n v'+r[t].available+" "+h+" "+l.translations.PLUGIN_ADMIN.OF_THIS+" "+n[i]+" "+l.translations.PLUGIN_ADMIN.IS_NOW_AVAILABLE+"!\n
\n ").css("display","block"),e=!1}}}),(0,s.default)("[data-update-packages]").removeClass("hidden")}}),(0,s.default)(".content-wrapper").addClass("updates-checked"),void(e||(0,s.default)(".warning-reinstall-not-latest-release").removeClass("hidden"))):this}}]),e}();t.default=y;var _=new y;t.Instance=_,t.Notifications=m.default,t.Feed=g.default,h.Instance.on("fetched",function(e,t){_.setPayload(e.payload||{}),_.grav().resources()}),"1"===l.config.enable_auto_updates_check&&h.Instance.fetch()},function(e,t,n){function r(e,t){return t=t||i,a(e,function(e,n,r){for(var i=r.length;++n ul").show();switch(r.find("div").remove(),r.find(".fa-warning").removeClass("fa-warning").addClass("fa-refresh fa-spin"),e.type||(e.type="note"),e.type){case"note":e.intro_text="Note";break;case"info":e.intro_text="Info";break;case"warning":e.intro_text="Warning"}var a="";if(t>9&&(a=" hidden "),e.link)i.append('\n"+e.message+"
").text();i.append('\n"+h.translations.PLUGIN_ADMIN.FILE_ERROR_UPLOAD+" "+t.name+"
\n"+n.message+""})}},{key:"onDropzoneComplete",value:function(t){if(!t.accepted&&!t.rejected){var n={status:"error",message:h.translations.PLUGIN_ADMIN.FILE_UNSUPPORTED+": "+t.name.match(/\..+/).join("")};return this.handleError({file:t,data:n,mode:"removeFile",msg:"
"+h.translations.PLUGIN_ADMIN.FILE_ERROR_ADD+" "+t.name+"
\n"+n.message+""})}this.options.reloadPage&&e.location.reload()}},{key:"b64_to_utf8",value:function(e){return e=e.replace(/\s/g,""),decodeURIComponent(escape(window.atob(e)))}},{key:"onDropzoneRemovedFile",value:function(e){var t=this;if(e.accepted&&!e.rejected){var n=e.removeUrl||this.urls.delete,r=(n||"").match(/path:(.*)\//),i={filename:e.name};e.sessionParams&&(i.task="filessessionremove",i.session=e.sessionParams),(0,d.default)(n,{method:"post",body:i},function(){if(r){r=t.b64_to_utf8(r[1]);var e=t.container.find('[name][type="hidden"]'),n=JSON.parse(e.val()||"{}");delete n[r],e.val(JSON.stringify(n))}})}}},{key:"onDropzoneError",value:function(e,t,n){var r=n?t.error.message:t;return(0,c.default)(e.previewElement).find("[data-dz-errormessage]").html(r),this.handleError({file:e,data:{status:"error"},msg:"
"+r+""})}},{key:"handleError",value:function(e){var t=e.file,n=e.data,r=e.mode,i=e.msg;if("error"===n.status||"unauthorized"===n.status){switch(r){case"addBack":t instanceof File?this.dropzone.addFile.call(this.dropzone,t):(this.dropzone.files.push(t),this.dropzone.options.addedfile.call(this.dropzone,t),this.dropzone.options.thumbnail.call(this.dropzone,t,t.extras.url));break;case"removeFile":default:~this.dropzone.files.indexOf(t)&&(t.rejected=!0,this.dropzone.removeFile.call(this.dropzone,t,{silent:!0}))}var a=(0,c.default)('[data-remodal-id="generic"]');a.find(".error-content").html(i),c.default.remodal.lookup[a.data("remodal")].open()}}}]),t}();t.default=v;var g=[],y=(0,c.default)(),_=function(e,t){var n=(0,c.default)(t).find(".dropzone.files-upload");n.length&&n.each(function(e,t){t=(0,c.default)(t),~y.index(t)||b(t)})},b=function(e){e=(0,c.default)(e);var t=e.find('input[type="file"]'),n=e.data("grav-file-settings")||{};n.accept&&~n.accept.indexOf("*")&&(n.accept=[""]);var r={url:e.data("file-url-add")||(e.closest("form").attr("action")||h.config.current_url)+".json",paramName:n.paramName||"file",dotNotation:n.name||"file",acceptedFiles:n.accept?n.accept.join(","):t.attr("accept")||e.data("media-types"),maxFilesize:"undefined"!=typeof n.filesize?n.filesize:256,maxFiles:n.limit||null};y=y.add(e),e=e[0],g.push(new v({container:e,options:r}))};t.Instances=function(){return(0,c.default)(".dropzone.files-upload").each(function(e,t){return b(t)}),(0,c.default)("body").on("mutation._grav",_),g}()}).call(t,function(){return this}())},,,function(e,t,n){(function(e){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0}),t.Instance=t.Toolbar=void 0;var a=function(){function e(e,t){for(var n=0;n