commit f9a0ddfb0a4b9119e38e11701aa2d3adf4d09360 Author: lea.jean Date: Wed Feb 2 16:09:48 2022 +0100 première version diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2a8645f --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.hugo_build.lock diff --git a/archetypes/default.md b/archetypes/default.md new file mode 100644 index 0000000..00e77bd --- /dev/null +++ b/archetypes/default.md @@ -0,0 +1,6 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +draft: true +--- + diff --git a/assets/css/reveal.css b/assets/css/reveal.css new file mode 100644 index 0000000..ca174e3 --- /dev/null +++ b/assets/css/reveal.css @@ -0,0 +1,31 @@ +/************************************************* + * Reveal JS + **************************************************/ + +/* This is a copy of MathJax's `.mjx-chtml` with font-family added to override `.reveal span`. */ +/* See https://github.com/hakimel/reveal.js/issues/1924 */ +.reveal span.mjx-chtml { + display: inline-block; + line-height: 0; + text-indent: 0; + text-align: left; + text-transform: none; + font-style: normal; + font-weight: normal; + font-size: 100%; + font-size-adjust: none; + letter-spacing: normal; + word-wrap: normal; + word-spacing: normal; + white-space: nowrap; + float: none; + direction: ltr; + max-width: none; + max-height: none; + min-width: 0; + min-height: 0; + border: 0; + margin: 0; + padding: 1px 0; + font-family: MJXc-TeX-math-I,MJXc-TeX-math-Ix,MJXc-TeX-math-Iw; +} diff --git a/assets/css/reveal_custom.css b/assets/css/reveal_custom.css new file mode 100644 index 0000000..e69de29 diff --git a/assets/js/academia-search.js b/assets/js/academia-search.js new file mode 100644 index 0000000..d3c12fc --- /dev/null +++ b/assets/js/academia-search.js @@ -0,0 +1,178 @@ +/************************************************* + * academia + * https://github.com/gcushen/hugo-academia + * + * In-built Fuse based search algorithm. + **************************************************/ + +/* --------------------------------------------------------------------------- +* Configuration. +* --------------------------------------------------------------------------- */ + +// Configure Fuse. +let fuseOptions = { + shouldSort: true, + includeMatches: true, + tokenize: true, + threshold: 0.0, + location: 0, + distance: 100, + maxPatternLength: 32, + minMatchCharLength: 2, + keys: [ + {name:'title', weight:0.99}, /* 1.0 doesn't work o_O */ + {name:'summary', weight:0.6}, + {name:'authors', weight:0.5}, + {name:'content', weight:0.2}, + {name:'tags', weight:0.5}, + {name:'categories', weight:0.5} + ] +}; + +// Configure summary. +let summaryLength = 60; + +/* --------------------------------------------------------------------------- +* Functions. +* --------------------------------------------------------------------------- */ + +// Get query from URI. +function getSearchQuery(name) { + return decodeURIComponent((location.search.split(name + '=')[1] || '').split('&')[0]).replace(/\+/g, ' '); +} + +// Set query in URI without reloading the page. +function updateURL(url) { + if (history.pushState) { + window.history.pushState({path:url}, '', url); + } +} + +// Pre-process new search query. +function initSearch(force, fuse) { + let query = $("#search-query").val(); + + // If query deleted, clear results. + if ( query.length < 1) { + $('#search-hits').empty(); + } + + // Check for timer event (enter key not pressed) and query less than minimum length required. + if (!force && query.length < fuseOptions.minMatchCharLength) + return; + + // Do search. + $('#search-hits').empty(); + searchacademia(query, fuse); + let newURL = window.location.protocol + "//" + window.location.host + window.location.pathname + '?q=' + encodeURIComponent(query) + window.location.hash; + updateURL(newURL); +} + +// Perform search. +function searchacademia(query, fuse) { + let results = fuse.search(query); + // console.log({"results": results}); + + if (results.length > 0) { + $('#search-hits').append('

' + results.length + ' ' + i18n.results + '

'); + parseResults(query, results); + } else { + $('#search-hits').append('
' + i18n.no_results + '
'); + } +} + +// Parse search results. +function parseResults(query, results) { + $.each( results, function(key, value) { + let content = value.item.content; + let snippet = ""; + let snippetHighlights = []; + + if ( fuseOptions.tokenize ) { + snippetHighlights.push(query); + } else { + $.each( value.matches, function(matchKey, matchValue) { + if (matchValue.key == "content") { + let start = (matchValue.indices[0][0]-summaryLength>0) ? matchValue.indices[0][0]-summaryLength : 0; + let end = (matchValue.indices[0][1]+summaryLength element that was clicked, even if the element that is inside the element is e.target + let targetElement = $(e.target).is('a') ? $(e.target) : $(e.target).parent(); + + if (targetElement.is('a') && targetElement.attr('class') != 'dropdown-toggle') { + $(this).collapse('hide'); + } + }); + + /* --------------------------------------------------------------------------- + * Filter publications. + * --------------------------------------------------------------------------- */ + + // Active publication filters. + let pubFilters = {}; + + // Search term. + let searchRegex; + + // Filter values (concatenated). + let filterValues; + + // Publication container. + let $grid_pubs = $('#container-publications'); + + // Initialise Isotope. + $grid_pubs.isotope({ + itemSelector: '.isotope-item', + percentPosition: true, + masonry: { + // Use Bootstrap compatible grid layout. + columnWidth: '.grid-sizer' + }, + filter: function () { + let $this = $(this); + let searchResults = searchRegex ? $this.text().match(searchRegex) : true; + let filterResults = filterValues ? $this.is(filterValues) : true; + return searchResults && filterResults; + } + }); + + // Filter by search term. + let $quickSearch = $('.filter-search').keyup(debounce(function () { + searchRegex = new RegExp($quickSearch.val(), 'gi'); + $grid_pubs.isotope(); + })); + + // Debounce input to prevent spamming filter requests. + function debounce(fn, threshold) { + let timeout; + threshold = threshold || 100; + return function debounced() { + clearTimeout(timeout); + let args = arguments; + let _this = this; + + function delayed() { + fn.apply(_this, args); + } + timeout = setTimeout(delayed, threshold); + }; + } + + // Flatten object by concatenating values. + function concatValues(obj) { + let value = ''; + for (let prop in obj) { + value += obj[prop]; + } + return value; + } + + $('.pub-filters').on('change', function () { + let $this = $(this); + + // Get group key. + let filterGroup = $this[0].getAttribute('data-filter-group'); + + // Set filter for group. + pubFilters[filterGroup] = this.value; + + // Combine filters. + filterValues = concatValues(pubFilters); + + // Activate filters. + $grid_pubs.isotope(); + + // If filtering by publication type, update the URL hash to enable direct linking to results. + if (filterGroup == "pubtype") { + // Set hash URL to current filter. + let url = $(this).val(); + if (url.substr(0, 9) == '.pubtype-') { + window.location.hash = url.substr(9); + } else { + window.location.hash = ''; + } + } + }); + + // Filter publications according to hash in URL. + function filter_publications() { + let urlHash = window.location.hash.replace('#', ''); + let filterValue = '*'; + + // Check if hash is numeric. + if (urlHash != '' && !isNaN(urlHash)) { + filterValue = '.pubtype-' + urlHash; + } + + // Set filter. + let filterGroup = 'pubtype'; + pubFilters[filterGroup] = filterValue; + filterValues = concatValues(pubFilters); + + // Activate filters. + $grid_pubs.isotope(); + + // Set selected option. + $('.pubtype-select').val(filterValue); + } + + /* --------------------------------------------------------------------------- + * Google Maps or OpenStreetMap via Leaflet. + * --------------------------------------------------------------------------- */ + + function initMap() { + if ($('#map').length) { + let map_provider = $('#map-provider').val(); + let lat = $('#map-lat').val(); + let lng = $('#map-lng').val(); + let zoom = parseInt($('#map-zoom').val()); + let address = $('#map-dir').val(); + let api_key = $('#map-api-key').val(); + + if (map_provider == 1) { + let map = new GMaps({ + div: '#map', + lat: lat, + lng: lng, + zoom: zoom, + zoomControl: true, + zoomControlOpt: { + style: 'SMALL', + position: 'TOP_LEFT' + }, + panControl: false, + streetViewControl: false, + mapTypeControl: false, + overviewMapControl: false, + scrollwheel: true, + draggable: true + }); + + map.addMarker({ + lat: lat, + lng: lng, + click: function (e) { + let url = 'https://www.google.com/maps/place/' + encodeURIComponent(address) + '/@' + lat + ',' + lng + '/'; + window.open(url, '_blank') + }, + title: address + }) + } else { + let map = new L.map('map').setView([lat, lng], zoom); + if (map_provider == 3 && api_key.length) { + L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token={accessToken}', { + attribution: 'Map data © OpenStreetMap contributors, CC-BY-SA, Imagery © Mapbox', + maxZoom: 18, + id: 'mapbox.streets', + accessToken: api_key + }).addTo(map); + } else { + L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { + maxZoom: 19, + attribution: '© OpenStreetMap' + }).addTo(map); + } + let marker = L.marker([lat, lng]).addTo(map); + let url = lat + ',' + lng + '#map=' + zoom + '/' + lat + '/' + lng + '&layers=N'; + marker.bindPopup(address + '

Routing via OpenStreetMap

'); + } + } + } + + /* --------------------------------------------------------------------------- + * GitHub API. + * --------------------------------------------------------------------------- */ + + function printLatestRelease(selector, repo) { + $.getJSON('https://api.github.com/repos/' + repo + '/tags').done(function (json) { + let release = json[0]; + $(selector).append(' ' + release.name); + }).fail(function (jqxhr, textStatus, error) { + let err = textStatus + ", " + error; + console.log("Request Failed: " + err); + }); + } + + /* --------------------------------------------------------------------------- + * Toggle search dialog. + * --------------------------------------------------------------------------- */ + + function toggleSearchDialog() { + if ($('body').hasClass('searching')) { + $('[id=search-query]').blur(); + $('body').removeClass('searching'); + removeQueryParamsFromUrl(); + } else { + $('body').addClass('searching'); + $('.search-results').css({ + opacity: 0, + visibility: 'visible' + }).animate({ + opacity: 1 + }, 200); + $('#search-query').focus(); + } + } + + /* --------------------------------------------------------------------------- + * Toggle day/night mode. + * --------------------------------------------------------------------------- */ + + function toggleDarkMode(codeHlEnabled, codeHlLight, codeHlDark, diagramEnabled) { + if ($('body').hasClass('dark')) { + $('body').css({ + opacity: 0, + visibility: 'visible' + }).animate({ + opacity: 1 + }, 500); + $('body').removeClass('dark'); + if (codeHlEnabled) { + codeHlLight.disabled = false; + codeHlDark.disabled = true; + } + $('.js-dark-toggle i').removeClass('fa-sun').addClass('fa-moon'); + localStorage.setItem('dark_mode', '0'); + if (diagramEnabled) { + // TODO: Investigate Mermaid.js approach to re-render diagrams with new theme without reloading. + location.reload(); + } + } else { + $('body').css({ + opacity: 0, + visibility: 'visible' + }).animate({ + opacity: 1 + }, 500); + $('body').addClass('dark'); + if (codeHlEnabled) { + codeHlLight.disabled = true; + codeHlDark.disabled = false; + } + $('.js-dark-toggle i').removeClass('fa-moon').addClass('fa-sun'); + localStorage.setItem('dark_mode', '1'); + if (diagramEnabled) { + // TODO: Investigate Mermaid.js approach to re-render diagrams with new theme without reloading. + location.reload(); + } + } + } + + /* --------------------------------------------------------------------------- + * Normalize Bootstrap Carousel Slide Heights. + * --------------------------------------------------------------------------- */ + + function normalizeCarouselSlideHeights() { + $('.carousel').each(function () { + // Get carousel slides. + let items = $('.carousel-item', this); + // Reset all slide heights. + items.css('min-height', 0); + // Normalize all slide heights. + let maxHeight = Math.max.apply(null, items.map(function () { + return $(this).outerHeight() + }).get()); + items.css('min-height', maxHeight + 'px'); + }) + } + + /* --------------------------------------------------------------------------- + * On document ready. + * --------------------------------------------------------------------------- */ + + $(document).ready(function () { + // Fix Hugo's auto-generated Table of Contents. + // Must be performed prior to initializing ScrollSpy. + $('#TableOfContents > ul > li > ul').unwrap().unwrap(); + $('#TableOfContents').addClass('nav flex-column'); + $('#TableOfContents li').addClass('nav-item'); + $('#TableOfContents li a').addClass('nav-link'); + + // Set dark mode if user chose it. + let default_mode = 0; + if ($('body').hasClass('dark')) { + default_mode = 1; + } + let dark_mode = parseInt(localStorage.getItem('dark_mode') || default_mode); + + // Is code highlighting enabled in site config? + const codeHlEnabled = $('link[title=hl-light]').length > 0; + const codeHlLight = $('link[title=hl-light]')[0]; + const codeHlDark = $('link[title=hl-dark]')[0]; + const diagramEnabled = $('script[title=mermaid]').length > 0; + + if (dark_mode) { + $('body').addClass('dark'); + if (codeHlEnabled) { + codeHlLight.disabled = true; + codeHlDark.disabled = false; + } + if (diagramEnabled) { + mermaid.initialize({ + theme: 'dark' + }); + } + $('.js-dark-toggle i').removeClass('fa-moon').addClass('fa-sun'); + } else { + $('body').removeClass('dark'); + if (codeHlEnabled) { + codeHlLight.disabled = false; + codeHlDark.disabled = true; + } + if (diagramEnabled) { + mermaid.initialize({ + theme: 'default' + }); + } + $('.js-dark-toggle i').removeClass('fa-sun').addClass('fa-moon'); + } + + // Toggle day/night mode. + $('.js-dark-toggle').click(function (e) { + e.preventDefault(); + toggleDarkMode(codeHlEnabled, codeHlLight, codeHlDark, diagramEnabled); + }); + }); + + /* --------------------------------------------------------------------------- + * On window loaded. + * --------------------------------------------------------------------------- */ + + $(window).on('load', function () { + if (window.location.hash) { + // When accessing homepage from another page and `#top` hash is set, show top of page (no hash). + if (window.location.hash == "#top") { + window.location.hash = "" + } else if (!$('.projects-container').length) { + // If URL contains a hash and there are no dynamically loaded images on the page, + // immediately scroll to target ID taking into account responsive offset. + // Otherwise, wait for `imagesLoaded()` to complete before scrolling to hash to prevent scrolling to wrong + // location. + scrollToAnchor(); + } + } + + // Initialize Scrollspy. + let $body = $('body'); + $body.scrollspy({ + offset: navbar_offset + }); + + // Call `fixScrollspy` when window is resized. + let resizeTimer; + $(window).resize(function () { + clearTimeout(resizeTimer); + resizeTimer = setTimeout(fixScrollspy, 200); + }); + + // Filter projects. + $('.projects-container').each(function (index, container) { + let $container = $(container); + let $section = $container.closest('section'); + let layout; + if ($section.find('.isotope').hasClass('js-layout-row')) { + layout = 'fitRows'; + } else { + layout = 'masonry'; + } + + $container.imagesLoaded(function () { + // Initialize Isotope after all images have loaded. + $container.isotope({ + itemSelector: '.isotope-item', + layoutMode: layout, + masonry: { + gutter: 20 + }, + filter: $section.find('.default-project-filter').text() + }); + + // Filter items when filter link is clicked. + $section.find('.project-filters a').click(function () { + let selector = $(this).attr('data-filter'); + $container.isotope({ + filter: selector + }); + $(this).removeClass('active').addClass('active').siblings().removeClass('active all'); + return false; + }); + + // If window hash is set, scroll to hash. + // Placing this within `imagesLoaded` prevents scrolling to the wrong location due to dynamic image loading + // affecting page layout and position of the target anchor ID. + // Note: If there are multiple project widgets on a page, ideally only perform this once after images + // from *all* project widgets have finished loading. + if (window.location.hash) { + scrollToAnchor(); + } + }); + }); + + // Enable publication filter for publication index page. + if ($('.pub-filters-select')) { + filter_publications(); + // Useful for changing hash manually (e.g. in development): + // window.addEventListener('hashchange', filter_publications, false); + } + + // Load citation modal on 'Cite' click. + $('.js-cite-modal').click(function (e) { + e.preventDefault(); + let filename = $(this).attr('data-filename'); + let modal = $('#modal'); + modal.find('.modal-body code').load(filename, function (response, status, xhr) { + if (status == 'error') { + let msg = "Error: "; + $('#modal-error').html(msg + xhr.status + " " + xhr.statusText); + } else { + $('.js-download-cite').attr('href', filename); + } + }); + modal.modal('show'); + }); + + // Copy citation text on 'Copy' click. + $('.js-copy-cite').click(function (e) { + e.preventDefault(); + // Get selection. + let range = document.createRange(); + let code_node = document.querySelector('#modal .modal-body'); + range.selectNode(code_node); + window.getSelection().addRange(range); + try { + // Execute the copy command. + document.execCommand('copy'); + } catch (e) { + console.log('Error: citation copy failed.'); + } + // Remove selection. + window.getSelection().removeRange(range); + }); + + // Initialise Google Maps if necessary. + initMap(); + + // Print latest version of GitHub projects. + let githubReleaseSelector = '.js-github-release'; + if ($(githubReleaseSelector).length > 0) + printLatestRelease(githubReleaseSelector, $(githubReleaseSelector).data('repo')); + + // On search icon click toggle search dialog. + $('.js-search').click(function (e) { + e.preventDefault(); + toggleSearchDialog(); + }); + $(document).on('keydown', function (e) { + if (e.which == 27) { + // `Esc` key pressed. + if ($('body').hasClass('searching')) { + toggleSearchDialog(); + } + } else if (e.which == 191 && e.shiftKey == false && !$('input,textarea').is(':focus')) { + // `/` key pressed outside of text input. + e.preventDefault(); + toggleSearchDialog(); + } + }); + + }); + + // Normalize Bootstrap carousel slide heights. + $(window).on('load resize orientationchange', normalizeCarouselSlideHeights); + +})(jQuery); \ No newline at end of file diff --git a/assets/js/algolia-search.js b/assets/js/algolia-search.js new file mode 100644 index 0000000..d264e99 --- /dev/null +++ b/assets/js/algolia-search.js @@ -0,0 +1,72 @@ +/************************************************* + * academia + * https://github.com/gcushen/hugo-academia + * + * Algolia based search algorithm. + **************************************************/ + +if ((typeof instantsearch === 'function') && $('#search-box').length) { + function getTemplate(templateName) { + return document.querySelector(`#${templateName}-template`).innerHTML; + } + + const options = { + appId: algoliaConfig.appId, + apiKey: algoliaConfig.apiKey, + indexName: algoliaConfig.indexName, + routing: true, + searchParameters: { + hitsPerPage: 10 + }, + searchFunction: function (helper) { + let searchResults = document.querySelector('#search-hits') + if (helper.state.query === '') { + searchResults.style.display = 'none'; + return; + } + helper.search(); + searchResults.style.display = 'block'; + } + }; + + const search = instantsearch(options); + + // Initialize search box. + search.addWidget( + instantsearch.widgets.searchBox({ + container: '#search-box', + autofocus: false, + reset: true, + poweredBy: algoliaConfig.poweredBy, + placeholder: i18n.placeholder + }) + ); + + // Initialize search results. + search.addWidget( + instantsearch.widgets.infiniteHits({ + container: '#search-hits', + escapeHits: true, + templates: { + empty: '
' + i18n.no_results + '
', + item: getTemplate('search-hit-algolia') + }, + cssClasses: { + showmoreButton: 'btn btn-outline-primary' + } + }) + ); + + // On render search results, localize the content type metadata. + search.on('render', function () { + $('.search-hit-type').each(function (index) { + let content_key = $(this).text(); + if (content_key in content_type) { + $(this).text(content_type[content_key]); + } + }); + }); + + // Start search. + search.start(); +} diff --git a/assets/js/mathjax-config.js b/assets/js/mathjax-config.js new file mode 100644 index 0000000..5a0772a --- /dev/null +++ b/assets/js/mathjax-config.js @@ -0,0 +1,6 @@ +window.MathJax = { + CommonHTML: { linebreaks: { automatic: true } }, + tex2jax: { inlineMath: [ ['$', '$'], ['\\(','\\)'] ], displayMath: [ ['$$','$$'], ['\\[', '\\]'] ], processEscapes: false }, + TeX: { noUndefined: { attributes: { mathcolor: 'red', mathbackground: '#FFEEEE', mathsize: '90%' } } }, + messageStyle: 'none' +}; diff --git a/assets/js/vendor/bootstrap.min.js b/assets/js/vendor/bootstrap.min.js new file mode 100644 index 0000000..c4c0d1f --- /dev/null +++ b/assets/js/vendor/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t=t||self).bootstrap={},t.jQuery,t.Popper)}(this,function(t,g,u){"use strict";function i(t,e){for(var n=0;nthis._items.length-1||t<0))if(this._isSliding)g(this._element).one(Q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=ndocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Ee},je="show",He="out",Re={HIDE:"hide"+De,HIDDEN:"hidden"+De,SHOW:"show"+De,SHOWN:"shown"+De,INSERTED:"inserted"+De,CLICK:"click"+De,FOCUSIN:"focusin"+De,FOCUSOUT:"focusout"+De,MOUSEENTER:"mouseenter"+De,MOUSELEAVE:"mouseleave"+De},xe="fade",Fe="show",Ue=".tooltip-inner",We=".arrow",qe="hover",Me="focus",Ke="click",Qe="manual",Be=function(){function i(t,e){if("undefined"==typeof u)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(Fe))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===g(this.element).css("display"))throw new Error("Please use show on visible elements");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=_.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=_.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&g(o).addClass(xe);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new u(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:We},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),g(o).addClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().on("mouseover",null,g.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),t===He&&e._leave(null,e)};if(g(this.tip).hasClass(xe)){var h=_.getTransitionDurationFromElement(this.tip);g(this.tip).one(_.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=g.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==je&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),g(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(g(this.element).trigger(i),!i.isDefaultPrevented()){if(g(n).removeClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),this._activeTrigger[Ke]=!1,this._activeTrigger[Me]=!1,this._activeTrigger[qe]=!1,g(this.tip).hasClass(xe)){var r=_.getTransitionDurationFromElement(n);g(n).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Ae+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(Ue)),this.getTitle()),g(t).removeClass(xe+" "+Fe)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Se(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:_.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return Pe[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Qe){var e=t===qe?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===qe?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),g(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Me:qe]=!0),g(e.getTipElement()).hasClass(Fe)||e._hoverState===je?e._hoverState=je:(clearTimeout(e._timeout),e._hoverState=je,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===je&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Me:qe]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=He,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===He&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==Oe.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),_.typeCheckConfig(be,t,this.constructor.DefaultType),t.sanitize&&(t.template=Se(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ne);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(g(t).removeClass(xe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ie),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ie,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Le}},{key:"NAME",get:function(){return be}},{key:"DATA_KEY",get:function(){return Ie}},{key:"Event",get:function(){return Re}},{key:"EVENT_KEY",get:function(){return De}},{key:"DefaultType",get:function(){return ke}}]),i}();g.fn[be]=Be._jQueryInterface,g.fn[be].Constructor=Be,g.fn[be].noConflict=function(){return g.fn[be]=we,Be._jQueryInterface};var Ve="popover",Ye="bs.popover",ze="."+Ye,Xe=g.fn[Ve],$e="bs-popover",Ge=new RegExp("(^|\\s)"+$e+"\\S+","g"),Je=l({},Be.Default,{placement:"right",trigger:"click",content:"",template:''}),Ze=l({},Be.DefaultType,{content:"(string|element|function)"}),tn="fade",en="show",nn=".popover-header",on=".popover-body",rn={HIDE:"hide"+ze,HIDDEN:"hidden"+ze,SHOW:"show"+ze,SHOWN:"shown"+ze,INSERTED:"inserted"+ze,CLICK:"click"+ze,FOCUSIN:"focusin"+ze,FOCUSOUT:"focusout"+ze,MOUSEENTER:"mouseenter"+ze,MOUSELEAVE:"mouseleave"+ze},sn=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){g(this.getTipElement()).addClass($e+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},o.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(nn),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(on),e),t.removeClass(tn+" "+en)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ge);null!==e&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||t li:not(.active) > a, +.dark .modal button.close, +.dark input, +.dark .form-control, +.dark .form-control:focus { + color: rgb(248, 248, 242); + background: $sta-dark-background; +} + +.dark .form-control { + background-color: rgb(68, 71, 90); +} + +.dark .form-control:focus { + background-color: rgb(68, 71, 90); + border-color: $sta-primary; + box-shadow: 0 0 0 .2rem $sta-primary-dark; +} + +.dark h1, +.dark h2, +.dark h3, +.dark h4, +.dark h5, +.dark h6 { + color: rgb(152, 166, 173); +} + +.dark pre, +.dark code { + color: rgb(139, 233, 253); + background-color: rgb(68, 71, 90); +} + +.dark pre { + background-color: rgb(68, 71, 90); + border-color: rgb(68, 71, 90); +} + +.dark .markup-quote { + background-image: linear-gradient(to bottom, rgba(233, 231, 245, 0.2), rgba(233, 231, 245, 0.2)); +} + +.dark #MathJax_Zoom { + background-color: rgb(68, 71, 90) !important; +} + +.dark ul.share li a { + background-color: $sta-primary; +} + +.dark table table { + background-color: rgb(40, 42, 54); +} + +/* Table Striped */ +.dark table > tbody > tr:nth-child(odd) > td, +.dark table > tbody > tr:nth-child(odd) > th { + background-color: rgb(50, 52, 64); +} + +/* Table Hover */ +.dark table > tbody > tr:hover > td, +.dark table > tbody > tr:hover > th { + background-color: rgb(60, 62, 74); +} + +.dark .article-title a { + color: #fff; +} + +.dark .portrait-title h2 { + color: #fff; +} + +.dark .portrait-title h3 { + color: rgba(255, 255, 255, 0.54); +} + +.dark ul.ul-edu li .description p.institution { + color: rgba(255, 255, 255, 0.6); +} + +.dark .pub-icon { + color: rgba(255, 255, 255, 0.54); +} + +.dark .talk-metadata { + color: rgba(255, 255, 255, 0.54); +} + +.dark .pagination li > a, .pagination li > span { + background-color: rgb(40, 42, 54); + border: 1px solid #ddd; +} + +.dark .card { + background: #343a40; +} + +.dark .card h4 a { + color: $sta-primary; + border-bottom: solid 1px transparent; +} + +.dark .card .card-image.hover-overlay::before { + background: #666; +} + +.dark .card .card-image.hover-overlay::after { + color: #fff; +} + +.dark .navbar-light { + background: #2d303c !important; + box-shadow: 0 0.125rem 0.25rem 0 #22212900; + border-color: #070707; +} + +.dark .navbar-brand{ + color: #fff; +} + +.dark .nav-link{ + color: #fff !important; +} + +.dark select { + background: rgb(40, 42, 54); + color: rgb(248, 248, 242); +} + +/* Algolia search input */ +.dark .ais-search-box--input { + background-color: rgb(68, 71, 90); +} + +.dark #search-query { + background-color: rgb(68, 71, 90); +} + +.dark .badge-light { + color: rgba(255, 255, 255, .68); + background: rgba(255, 255, 255, .2); +} + +.dark .badge-light[href]:focus, +.dark .badge-light[href]:hover { + background: rgba(255, 255, 255, .3); +} + +.dark a.badge:focus, +.dark a.badge:hover { + color: rgba(255, 255, 255, .68); +} + +.dark .btn-primary, +.dark .btn.btn-primary.active { + color: initial; +} + + +.dark .btn-outline-dark, +.dark .btn.btn-outline-dark.active { + color: #fff; +} + +.dark .bg-white{ + background: #2d303c !important; +} + +.dark .network-icon a:hover { + background: #272935; +} + +.dark .home-section:nth-of-type(even) { + background-color: #212529 !important; +} diff --git a/assets/sass/academia/_docs.scss b/assets/sass/academia/_docs.scss new file mode 100644 index 0000000..26ff85b --- /dev/null +++ b/assets/sass/academia/_docs.scss @@ -0,0 +1,260 @@ +/************************************************* + * Documentation layout + **************************************************/ + +.docs-article-container { + max-width: 90%; +} + +/* Documentation: article footer. */ + +.docs .body-footer { + border-top: 1px solid #e8e8e8; + margin-top: 30px; + padding-top: 10px; + font-size: 14px; + color: #707070; +} + +/* Docs content. */ + +.docs-content { + order: 1; + position: relative; +} + +.docs-content>h2[id], +.docs-content>h3[id], +.docs-content>h4[id] { + pointer-events: none; +} + +.docs-content>ol li, +.docs-content>ul li { + margin-bottom: .25rem; +} + +/* Docs search. */ + +.docs-search { + position: relative; + padding: 1rem 15px; + margin-right: -15px; + margin-left: -15px; + border-bottom: 1px solid rgba(0, 0, 0, .05); +} + +.docs-search .form-control:focus { + border-color: $sta-primary; + box-shadow: 0 0 0 3px $sta-primary-light; +} + +/* Docs sidebar. */ + +.docs-sidebar { + order: 0; + border-bottom: 1px solid rgba(0, 0, 0, .1) +} + +@media (min-width:768px) { + .docs-sidebar { + border-right: 1px solid rgba(0, 0, 0, .1) + } + @supports ((position:-webkit-sticky) or (position:sticky)) { + .docs-sidebar { + position: -webkit-sticky; + position: sticky; + top: 50px; + z-index: 10; + height: calc(100vh - 50px) + } + } +} + +@media (min-width:1200px) { + .docs-sidebar { + border-right: 1px solid rgba(0, 0, 0, .1) + } + @supports ((position:-webkit-sticky) or (position:sticky)) { + .docs-sidebar { + position: -webkit-sticky; + position: sticky; + top: 70px; + z-index: 10; + height: calc(100vh - 70px) + } + } +} + +@media (min-width:1200px) { + .docs-sidebar { + flex: 0 1 320px + } +} + +/* Docs sidebar li>a. */ + +.docs-sidebar .nav>li>a { + display: block; + padding: .25rem 1.5rem; + font-size: 0.8rem; + color: rgba(0, 0, 0, .65); +} + +.docs-sidebar .nav>li>a:hover { + color: rgba(0, 0, 0, .85); + text-decoration: none; + background-color: transparent; +} + +.docs-sidebar .docs-toc-item.active a, +.docs-sidebar .nav>.active:hover>a, +.docs-sidebar .nav>.active>a { + font-weight: bold; + color: $sta-primary; + background-color: transparent; +} + +/* Docs links. */ + +.docs-toggle { + line-height: 1; + font-size: 1.2rem; + color: $sta-primary; + background-color: transparent; +} + +.docs-links { + padding-top: 1rem; + padding-bottom: 1rem; + margin-right: -15px; + margin-left: -15px; +} + +@media (min-width:768px) { + @supports ((position:-webkit-sticky) or (position:sticky)) { + .docs-links { + max-height: calc(100vh - 5rem - 70px); + overflow-y: auto; + } + } +} + +@media (min-width:768px) { + .docs-links { + display: block!important; + } +} + +/* Docs TOC. */ + +.docs-toc { + order: 2; + padding-top: 1.5rem; + padding-bottom: 1.5rem; + font-size: .875rem +} + +@supports ((position:-webkit-sticky) or (position:sticky)) { + .docs-toc { + position: -webkit-sticky; + position: sticky; + top: 70px; + height: calc(100vh - 70px); + overflow-y: auto + } +} + +/* Docs TOC item links. */ + +.docs-toc-link { + display: block; + padding: .25rem 1.5rem; + font-weight: bold; + color: rgba(0, 0, 0, .65); +} + +.docs-toc-link:hover { + color: rgba(0, 0, 0, .85); + text-decoration: none; +} + +.docs-toc-item.active { + margin-bottom: 1rem; +} + +.docs-toc-item.active:not(:first-child) { + margin-top: 1rem; +} + +.docs-toc-item.active>.docs-toc-link { + color: rgba(0, 0, 0, .85); +} + +.docs-toc-item.active>.docs-toc-link:hover { + background-color: transparent; +} + +.docs-sidenav { + display: block; +} + +/* Docs TOC nav. */ + +.docs-toc-title { + color: #b5b5b5; + font-size: .875rem; + font-weight: 600; + padding-left: calc(1.5rem + 1px); +} + +#TableOfContents { + padding-left: 0; + border-left: 1px solid #eee; +} + +#TableOfContents ul, +ul.toc-top { + padding-left: 0; +} + +#TableOfContents ul ul { + display: none; +} + +#TableOfContents li { + display: block; +} + +#TableOfContents li a, +.toc-top li a { + display: block; + padding: .125rem 1.5rem; + color: #99979c; + font-size: 0.7rem; +} + +#TableOfContents li a:hover, +.toc-top li a:hover { + color: $sta-primary; + text-decoration: none; +} + +/* ScrollSpy active link style. */ +#TableOfContents li a.active { + color: $sta-primary; + font-weight: 700; +} + +/* Docs achnorjs links. */ + +.anchorjs-link { + font-weight: 400; + color: $sta-primary-dark; + transition: color .16s linear; +} + +.anchorjs-link:hover { + color: $sta-primary; + text-decoration: none; +} diff --git a/assets/sass/academia/_integrations.scss b/assets/sass/academia/_integrations.scss new file mode 100644 index 0000000..e4e4d4a --- /dev/null +++ b/assets/sass/academia/_integrations.scss @@ -0,0 +1,5 @@ +/* Mermaid.js div */ +div.mermaid { + width: 100%; + text-align: center; +} diff --git a/assets/sass/academia/_listings.scss b/assets/sass/academia/_listings.scss new file mode 100644 index 0000000..c1b8089 --- /dev/null +++ b/assets/sass/academia/_listings.scss @@ -0,0 +1,60 @@ +/************************************************* + * List items + **************************************************/ + +.view-list-item { + margin-bottom: 1rem; +} + +.pub-icon { + color: rgba(0, 0, 0, 0.54); + font-size: 0.81em; + padding-right: 6px; +} + +.view-list-item .article-metadata { + margin-bottom: 0; +} + +.pub-list-item .pub-abstract { + font-size: 1rem; +} + +.pub-list-item .btn-links { + padding-top: 10px; +} + +/************************************************* + * Compact (stream) list view + **************************************************/ + +.media.stream-item { + margin-bottom: 2rem; +} + +.media.stream-item .article-title, +.card-simple .article-title { + font-size: 1.2rem; +} + +.media.stream-item .article-style, +.card-simple .article-style { + margin-top: 2px; + font-size: 0.8rem; +} + +.media.stream-item .stream-meta { + margin-top: 12px; +} + +.media.stream-item img { + max-width: 150px; + height: auto; + object-fit: cover; +} + +@media screen and (max-width: 768px) { + .media.stream-item img { + max-width: 80px; + } +} diff --git a/assets/sass/academia/_nav.scss b/assets/sass/academia/_nav.scss new file mode 100644 index 0000000..34ababb --- /dev/null +++ b/assets/sass/academia/_nav.scss @@ -0,0 +1,198 @@ +/************************************************* + * Navigation bar + **************************************************/ + +.navbar { + min-height: 70px !important; +} + +.navbar-light { + background: $sta-menu-primary !important; + box-shadow: 0 0.125rem 0.25rem 0 rgba(0,0,0,.11) +} + +.navbar-light .navbar-toggler { + border-color: transparent; +} + +.navbar-toggler { + color: $sta-menu-text !important; +} + +.navbar-light .navbar-toggler:focus, +.navbar-light .navbar-toggler:hover { + background-color: transparent; +} + +.dropdown-menu, +nav#navbar-main li.nav-item { + font-size: #{$sta-font-size-small}px; +} + +.navbar-light .navbar-nav>.nav-item>.nav-link, +.navbar-light .navbar-nav>.nav-item>.nav-link:focus, +.navbar-light .navbar-nav>.nav-item>.nav-link:hover { + white-space: nowrap; + -webkit-transition: 0.2s ease; + transition: 0.2s ease; + color: $sta-menu-text; +} + +.navbar-light .navbar-nav>.nav-item>.nav-link:focus { + color: $sta-menu-text; + background-color: transparent; +} + +.navbar-light .navbar-nav>.nav-item>.nav-link:hover { + color: $sta-menu-text-active !important; + background-color: transparent; +} + +.navbar-light .navbar-nav>li.nav-item>a.active, +.navbar-light .navbar-nav>li.nav-item>a.active:focus, +.navbar-light .navbar-nav>li.nav-item>a.active:hover { + color: $sta-menu-text-active !important; + font-weight: 700; + background-color: transparent !important; /* Override Bootstrap. */ +} + +.navbar-brand, +.navbar-nav li.nav-item a.nav-link { + height: inherit; + line-height: 50px; + padding-top: 10px; + padding-bottom: 10px; +} + +.navbar-brand img { + max-height: 50px; +} + +.navbar-light .navbar-toggler .icon-bar { + background-color: $sta-menu-text !important; +} + +.dropdown-menu { + background-color: $sta-menu-primary !important; +} + +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: 400; + line-height: 1.42857143; + color: $sta-menu-text; + white-space: nowrap; +} + +.dropdown-menu>li>a:focus, +.dropdown-menu>li>a:hover { + color: $sta-menu-text-active; + text-decoration: none; + background-color: $sta-menu-primary; +} + +.dropdown-menu > .active, +.dropdown-menu > .active:focus, +.dropdown-menu > .active:hover { + color: $sta-menu-primary; + text-decoration: none; + background-color: $sta-menu-text-active; + outline: 0; +} + +.navbar-light .navbar-nav>.open>a, +.navbar-light .navbar-nav>.open>a:focus, +.navbar-light .navbar-nav>.open>a:hover, +.navbar-light .navbar-nav>.open>a:visited { + color: $sta-menu-text !important; + background-color: $sta-menu-primary !important; +} + +.navbar-light .navbar-brand { + font-weight: bold; + font-size: 1.2em; + color: $sta-menu-title; +} + +.navbar-light .navbar-brand:focus, +.navbar-light .navbar-brand:hover { + color: $sta-menu-title; + background-color: transparent; +} + +@media screen and (max-width: 1200px) { + .navbar { + min-height: 50px !important; + } + + .navbar-brand, + .navbar-nav li.nav-item a.nav-link { + height: inherit; + line-height: 40px; + padding-top: 5px; + padding-bottom: 5px; + } + + .navbar-brand img { + max-height: 40px; + } + + .navbar-toggler { + display: block; + } + + .fixed-top { + top: 0; + border-width: 0 0 1px; + } + + .navbar-nav > li.nav-item > a.nav-link { + padding-top: 10px; + padding-bottom: 10px; + line-height: normal; + } + + .dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: 400; + line-height: 1.42857143; + color: $sta-menu-text; + white-space: nowrap; + } + + .navbar-light .navbar-nav .open .dropdown-menu { + position: static; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; + } + + .navbar-light .navbar-nav .open .dropdown-menu > li > a { + padding: 5px 15px 5px 25px; + line-height: 20px; + color: $sta-menu-text; + } + + .navbar-light .navbar-nav .open .dropdown-menu > li > a:focus, + .navbar-light .navbar-nav .open .dropdown-menu > li > a:hover { + color: inherit; + background-color: transparent; + } + + .navbar-light .navbar-nav .open .dropdown-menu >.nav-item> .active, + .navbar-light .navbar-nav .open .dropdown-menu >.nav-item> .active:focus, + .navbar-light .navbar-nav .open .dropdown-menu >.nav-item> .active:hover { + color: $sta-menu-text-active; + background-color: transparent; + } + + .collapse.in { + display: block !important; + } +} diff --git a/assets/sass/academia/_root.scss b/assets/sass/academia/_root.scss new file mode 100644 index 0000000..f687613 --- /dev/null +++ b/assets/sass/academia/_root.scss @@ -0,0 +1,641 @@ +/************************************************* + * academia's Core + **************************************************/ + +html { + font-family: $sta-font-body, sans-serif; + font-size: #{$sta-font-size-small}px; + color: rgba(0,0,0,0.8); + line-height: 1.65; +} +@media screen and (min-width: 58em) { + html { + font-size: #{$sta-font-size}px; + } +} + +body { + font-family: inherit; + font-size: 1rem; + line-height: inherit; + color: inherit; + background-color: $sta-background; + margin-top: 70px; /* Offset body content by navbar height. */ + padding-top: 0; + counter-reset: captions; +} +@media screen and (max-width: 1200px) { /* Match max-width of .nav-bar query. */ + body { + margin-top: 50px; /* Offset body content by navbar height. */ + } +} + +.max-width-640 { + max-width: 640px; +} + +.margin-auto { + margin-left: auto; + margin-right: auto; +} + +.center-text { + text-align: center; +} + +/* Body text */ +p { + margin-top: 0; + margin-bottom: 1rem; +} + +/* Lists */ +ul, ol, dl { + margin-top: 0; + margin-bottom: 1rem; +} + +/* Navigation bar text */ +.navbar-light { + font-family: $sta-font-nav, sans-serif; + font-weight: 400; + line-height: 1.25; + text-rendering: optimizeLegibility; +} + +/* Headings */ +h1, h2, h3, h4, h5, h6 { + font-family: $sta-font-heading, sans-serif; + font-weight: 400; + margin-top: 1rem; + margin-bottom: .5rem; + line-height: 1.25; + color: #313131; + text-rendering: optimizeLegibility; + + /* Ensure long words do not overflow into content. */ + overflow-wrap: break-word; + word-wrap: break-word; + word-break: break-word; + + /* Add a hyphen where the word breaks (use `­` to insert a soft-hyphen in a word). */ + -webkit-hyphens: manual; + -ms-hyphens: manual; + hyphens: manual; +} +h1 { + font-size: 2.25rem; +} +h2 { + margin-top: 1rem; + font-size: 1.5rem; +} +h3 { + font-weight: 700; + margin-top: 1.5rem; + font-size: 1.25rem; +} +h4, h5, h6 { + font-weight: 700; + margin-top: 1rem; + font-size: 1rem; +} + +a, +h3.article-title a:hover { + color: $sta-link; + text-decoration: none; + transition: color 0.6s ease; +} + +a:hover, +a:focus { + color: $sta-link-hover; +} + +img, +video { + height: auto; + max-width: 100%; + display: block; +} + +video { + width: 100%; + height: auto; + max-height: 400px; +} + +.img-responsive { + /* Extend Bootstrap declaration with centering. */ + margin: 0 auto; +} + +figcaption { + display: block; + margin-top: 0.75em; + line-height: 1.25; + font-size: 1rem; + margin-bottom: 1.65rem; + font-family: $sta-font-heading, sans-serif; +} + +figcaption.numbered:before { + font-weight: 700; + text-transform: uppercase; + content: attr(data-pre) counter(captions) attr(data-post); +} + +figcaption.numbered { + counter-increment: captions; +} + +figcaption h4 { + display: inline; + font-size: 1rem; + font-weight: 400; + margin: 0; +} + +pre, +code { + font-family: $sta-font-mono, monospace; + color: #c7254e; + background-color: #f9f2f4; +} + +pre { + margin: 0 0 1rem 0; + background-color: rgb(248, 248, 248); /* Match default highlight theme. */ + border-color: rgb(248, 248, 248); + font-size: 0.7rem; + border-radius: 4px; +} + +pre code { + white-space: pre; /* Override Bootstrap to preserve line breaks in code. */ + overflow-x: auto; +} + +hr { + border: 0; + height: 1px; + background: #333; + background-image: linear-gradient(to right, #ccc, #333, #ccc); +} + +/* Quotes */ +blockquote { + padding: .5rem 1rem; + margin: .8rem 0; + color: #7a7a7a; + border-left: .25rem solid #e5e5e5; +} +blockquote p:last-child { + margin-bottom: 0; +} +@media (min-width: 30em) { + blockquote { + padding-right: 5rem; + padding-left: 1.25rem; + } +} + +.markup-quote { + background-color: transparent; + background-image: linear-gradient(to bottom, rgba(233, 231, 245, 1), rgba(233, 231, 245, 1)); +} + +.space-below { + margin-bottom: 50px; +} +@media screen and (max-width: 768px) { + .space-below { + margin-bottom: 10px; + } +} + +.universal-wrapper { + margin: 0 auto; + padding-right: 1rem; + padding-left: 1rem; + padding-top: 0.1rem; + width: 100%; +} + +@media only screen and (min-width: 1001px) { + .universal-wrapper { + width: 1000px; + } +} + +small, +.small { + font-size: .75em; +} + +.responsive-wrap iframe { + max-width: 100%; +} + +/************************************************* + * Modals. + **************************************************/ + +.modal-content { + background: $sta-background; +} + +.modal-title { + margin: 0; /* Override default h5 margin. */ +} + +.modal-content pre { + margin: 0; +} + +.modal-header { + border: 0; + color: rgba(0,0,0,0.8); +} + +.modal-footer { + border: 0; +} + +#modal-error { + color: red; +} + +/************************************************* + * Gallery. + **************************************************/ + +.gallery { + margin: 0.5em -4px 1.5em -4px; + font-size: 0; +} + +a[data-fancybox] { + text-decoration: none; + cursor: zoom-in; +} + +.gallery a[data-fancybox] img { + height: 250px; + max-width: 100%; + display: inherit; + margin: 0; + padding: 4px; + box-shadow: none; + vertical-align: inherit; +} + +.fancybox-caption { + font-size: 1rem; + line-height: 1.5rem; + text-align: center; +} + +/************************************************* + * Pager. + **************************************************/ + +.post-nav { + margin-top: 1rem; + font-size: 0.8rem; +} + +.post-nav-item { + hyphens: auto; + word-wrap: break-word; + padding: 11px 0 12px; + width: 100%; +} + +.post-nav-item a { + color: #2b2b2b; + line-height: 1.7; + text-transform: none; +} + +.post-nav-item .meta-nav { + color: #767676; + font-weight: 900; + line-height: 2; + text-transform: uppercase; +} + +.dark .post-nav-item a { + color: #ddd; +} + +/************************************************* + * Footer + **************************************************/ + +footer { + padding: 2rem 0; + width: 100%; +} + +footer p { + font-size: 0.75rem; +} + +site-footer, +footer a#back_to_top i { + color: rgba(0,0,0,0.54); +} + +.dark site-footer, +.dark footer a#back_to_top i, +.dark .docs .body-footer { + color: rgba(255,255,255,0.54); +} + +/************************************************** + * Tags/Labels + **************************************************/ + +.badge-light { + border: none; + color: rgba(0,0,0,.68); + background: rgba(0,0,0,.05); + font-weight: normal; + border-radius: 3px; + padding: 5px 10px; + margin-right: 8px; + margin-bottom: 8px; +} + +.article-tags > .badge-light:last-child { + margin-right: 0; +} + +.badge-light[href]:focus, +.badge-light[href]:hover { + background: rgba(0,0,0,.1); +} + +a.badge:focus, +a.badge:hover { + color: rgba(0,0,0,.68); +} + +.tag-cloud a { + display: inline-block; + position: relative; + margin: 5px 10px; + word-wrap: break-word; + transition-duration: .2s; + transition-property: transform; + transition-timing-function: ease-out; +} + +.tag-cloud a:active, +.tag-cloud a:focus, +.tag-cloud a:hover { + color: $sta-primary-dark; + transform: scale(1.2); +} + +.dark .tag-cloud a:active, +.dark .tag-cloud a:focus, +.dark .tag-cloud a:hover { + color: $sta-primary-light; +} + +/************************************************* + * Button size override + *************************************************/ + +.btn { + padding: .5rem; + font-size: .8rem; + line-height: .5; + border-radius: .3rem; + &:focus{ + box-shadow: none !important; + } +} + +.btn-primary{ + color: $white; +} + +.btn-outline-primary{ + &:hover{ + color: $white; + } +} + +.btn-links .btn { + padding: 5px .5rem 5px .5rem; + line-height: 1; +} + +.btn.btn-sm { + padding: 5px .4rem 5px .4rem; + font-size: .6rem; + border-radius: .2rem; +} + +/************************************************* + * Toolbar Buttons + **************************************************/ + +.btn-primary:not(:disabled):not(.disabled).active:focus, +.btn-primary:not(:disabled):not(.disabled):active:focus, +.show > .btn-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 .2rem $sta-primary-light; +} + +/************************************************* + * Tables + **************************************************/ + +/* Based on Bootstrap's `table-responsive` style. */ +table { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + margin-bottom: 1rem; + font-size: 0.8rem; +} + +table > thead > tr > th, +table > tbody > tr > th, +table > tfoot > tr > th, +table > thead > tr > td, +table > tbody > tr > td, +table > tfoot > tr > td { + padding: 8px; + line-height: 1.43; + vertical-align: top; + border-top: 1px solid #ddd; +} + +table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} + +table > caption + thead > tr:first-child > th, +table > colgroup + thead > tr:first-child > th, +table > thead:first-child > tr:first-child > th, +table > caption + thead > tr:first-child > td, +table > colgroup + thead > tr:first-child > td, +table > thead:first-child > tr:first-child > td { + border-top: 0; +} + +table > tbody + tbody { + border-top: 2px solid #ddd; +} + +table table { + background-color: #fff; +} + +/* Table Striped */ +table > tbody > tr:nth-child(odd) > td, +table > tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +/* Table Hover */ +table > tbody > tr:hover > td, +table > tbody > tr:hover > th { + background-color: #e5e5e5; +} + +/************************************************* + * Alerts + **************************************************/ + +div.alert > div { + position: relative; + display: block; + font-size: 1rem; + margin-left: 2rem; + margin-top: 0; + margin-bottom: 0; +} + +div.alert div > * { + margin-bottom: .5rem; /* Use smaller paragraph spacing than usual. */ +} + +div.alert div > :last-child { + margin-bottom: 0; +} + +div.alert > div:first-child::before { + position: absolute; + top: -0.5rem; + left: -2rem; + font-size: 1.5rem; + color: #209cee; + font-family: 'Font Awesome 5 Free'; + font-weight: 900; + content: '\f05a'; + width: 1.5rem; + text-align: center; +} + +div.alert-warning > div:first-child::before { + font-family: 'Font Awesome 5 Free'; + font-weight: 900; + color: #ff3860; + content: '\f071'; +} + +div.alert a { + color: currentColor; + text-decoration: none; + border-bottom: solid 1px currentColor; +} + +.alert-note { + color: #12537e; + background-color: #f6fbfe; + border-color: #209cee; +} + +.alert-warning { + color: #cd0930; + background-color: #fff5f7; + border-color: #ff3860; +} + +/* homepage */ +.hero-img{ + border: 10px solid #fff; + box-shadow: rgba(0, 0, 0, 0.2) 0px 20px 30px 0px; +} + +/* about */ +.network-icon{ + a{ + height: 40px; + width: 40px; + line-height: 40px; + display: block; + text-align: center; + border-radius: 50%; + background: transparent; + transition: .3s ease; + &:hover{ + background: rgb(235, 235, 235); + } + } +} + +.progress-bar{ + position: absolute; + height: 10%; + background: $sta-primary; + left: 0; + bottom: 0; + z-index: -1; +} + +.card .card-text{ + padding-left: 0 !important; +} + +.section-heading h1{ + position: relative; + text-transform: uppercase; + letter-spacing: 4px; + display: inline-block; + font-size: 30px; + &::before{ + content: ''; + position: absolute; + z-index: 99; + background-color: $sta-primary; + width: 6px; + height: 6px; + border-radius: 100%; + left: -17px; + top: 15px; + } + &::after{ + content: ''; + position: absolute; + z-index: 99; + background-color: $sta-primary; + width: 6px; + height: 6px; + border-radius: 100%; + right: -17px; + top: 15px; + } +} + +.section-heading p{ + text-transform: uppercase; +} diff --git a/assets/sass/academia/_search.scss b/assets/sass/academia/_search.scss new file mode 100644 index 0000000..a6fd06f --- /dev/null +++ b/assets/sass/academia/_search.scss @@ -0,0 +1,131 @@ +/************************************************* + * Search + **************************************************/ + +.search-results { + transform: scale(0); + -webkit-transform: scale(0); + background-color: $sta-background; + bottom: 0; + left: 0; + right: 0; + top: 0; + overflow: scroll; + position: fixed; + visibility: hidden; + z-index: -99; +} + +.dark .search-results { + background-color: rgb(40, 42, 54); +} + +.searching { + overflow: hidden; +} + +.searching .search-results { + transform: scale(1); + -webkit-transform: scale(1); + visibility: visible; + z-index: 1031; /* Highest index, higher than navbar. */ +} + +.searching #search-box #search-query { + width: 100%; +} + +.search-results > .container { + padding-top: 70px; /* Navbar height. */ +} +@media screen and (max-width: 1200px) { + .search-results > .container { + padding-top: 50px; /* Navbar height. */ + } +} + +.search-header { + position: -webkit-sticky; + position: sticky; + top: 70px; /* Navbar height. */ + background-color: $sta-background; + padding-top: 2rem; + padding-bottom: 1rem; +} +@media screen and (max-width: 1200px) { + .search-header { + top: 50px; /* Navbar height. */ + } +} + +.dark .search-header { + background-color: rgb(40, 42, 54); +} + +.search-header h1 { + margin: 0; + line-height: 1; +} + +.col-search-close { + text-align: right; +} + +.search-header i { + font-size: 2rem; + line-height: 1; +} + +#search-box { + position: relative; /* Required for search icon positioning. */ + margin-bottom: 0.5rem; +} + +#search-box::before { + font-family: 'Font Awesome 5 Free'; + font-weight: 900; + content: "\f002"; + font-size: 1rem; + opacity: 0.25; + line-height: 1rem; + position: absolute; + left: 0.7rem; + top: 0.6rem; + overflow-x: hidden; +} + +#search-box #search-query { + border: 1px solid #dedede; + border-radius: 1rem; + padding: 1rem 1rem 1rem 2rem; /* Wider left padding for search icon to fit in. */ + width: 250px; + line-height: 1rem; + height: 1rem; + font-size: 0.8rem; +} + +.search-hit em { + font-style: normal; + background-color: #FFE0B2; + color: #E65100; + border-bottom: 1px solid #E65100; +} + +.search-hit-type { + margin-bottom: 0 !important; /* Override .article-metadata margin. */ + text-transform: capitalize; +} + +.search-hit-description { + font-size: 0.7rem; +} + +/* Load more results button - hide when there are no more results. */ +#search-hits button[disabled] { + display: none; +} + +.form-control:focus { + border-color: $sta-primary; + box-shadow: 0 0 0 .2rem $sta-primary-light; +} diff --git a/assets/sass/academia/_widgets.scss b/assets/sass/academia/_widgets.scss new file mode 100644 index 0000000..107c3dd --- /dev/null +++ b/assets/sass/academia/_widgets.scss @@ -0,0 +1,553 @@ +/************************************************* + * Page Builder: sections and widgets + **************************************************/ + +@keyframes intro { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +.home-section { + background-color: $sta-home-section-odd; + padding: 110px 0 110px 0; + animation: intro 0.3s both; + animation-delay: 0.15s; +} + +/* Override dark colors that may be inherited from body.dark */ +.home-section.dark, +.home-section.dark h1, +.home-section.dark h2, +.home-section.dark h3, +.home-section.dark a:not(.btn) { + color: rgb(248, 248, 242); +} + +/* Underline links in dark sections to separate them from text */ +.home-section.dark a:not(.btn):not(.hero-cta-alt) { + text-decoration: underline; +} + +/* Revert Alert Box Link style (.home-section.dark style above should not be applied to it) */ +.home-section.dark .alert a { + color: inherit !important; + text-decoration: inherit !important; +} + +/* Big underline style for links in dark sections */ +/* Disabled as it's an experimental style that requires CSS NOT Selector Level 4 (only in Safari) */ +/* +.home-section.dark.big-underline a:not(.btn):not(.hero-cta-alt):not(.alert a) { + text-decoration: none; + position: relative; +} +.home-section.dark.big-underline a:not(.btn):not(.hero-cta-alt):not(.alert a):after { + background: #fff; + content: ""; + height: 2px; + left: 0; + right: 0; + position: absolute; + top: 100%; +}*/ + +/* Create the parallax scrolling effect */ +.parallax { + height: 100%; + background-attachment: fixed; + background-position: center; + background-repeat: no-repeat; + background-size: cover; +} + +.home-section:first-of-type { + padding-top: 50px; +} + +.home-section:nth-of-type(even) { + background-color: $sta-home-section-even; +} + +.dark .home-section { + background-color: $sta-dark-home-section-odd !important; +} + +.dark .home-section:nth-of-type(even) { + background-color: $sta-dark-home-section-even; +} + +@media screen and (max-width: 768px) { + .home-section { + padding: 60px 0 60px 0; + } + .home-section:first-of-type { + padding-top: 40px; + } +} + +.section-heading{ + margin-bottom: 40px; +} + +.section-heading h1 { + margin: 0 0 10px 0; +} + +.section-heading p { + font-weight: 400; + font-size: 1.1rem; + color: #b2b2b2; +} + +/************************************************* + * Widgets (common) + **************************************************/ + +.see-all { + margin-top: 2rem; + text-transform: uppercase; +} + +/* Reset code highlighting style in Alerts when Alert is child of a `.dark` widget, but Alert should be light.` */ +/* But will this affect page which should have dark Alert? */ +.dark .alert pre, +.dark .alert code { + color: initial; + background-color: initial; +} + +/************************************************* + * Hero Widget + **************************************************/ + +.wg-hero { + padding: 3em 0; + clear: both; + background-size: cover; + background-repeat: no-repeat; + background-position: center; + animation: intro 0.3s both; + animation-delay: 0s; + animation-delay: 0.25s; +} + +.hero-title { + font-size: 2.7rem; + margin-top: 0; + line-height: 1; +} + +.hero-lead { + max-width: 768px; + font-size: 1.35rem; +} + +.wg-hero.dark .hero-title, +.wg-hero.dark .hero-lead, +.wg-hero.dark .hero-cta-alt, +.wg-hero.dark .hero-note > * { + color: #fff; + /*text-shadow: 1px 1px 4px rgba(0,0,0,0.5);*/ /* Uncomment to standout on complicated backgrounds. */ +} + +.wg-hero.dark a:not(.wg-hero .btn) { + color: #fff; +} + +.wg-hero .hero-lead a { + text-decoration: underline; +} +.wg-hero .btn i{ + line-height: 0; +} +.wg-hero .btn { + padding: .6em 2.1em; +} + +.wg-hero.dark .btn { + color: $sta-primary-dark; +} + +a.hero-cta-alt { + display: inline-block; + position: relative; + transition-duration: .2s; + transition-property: transform; + transition-timing-function: ease-out; + font-size: 1.1rem; +} + +a.hero-cta-alt:active, +a.hero-cta-alt:focus, +a.hero-cta-alt:hover { + transform: scale(1.1); +} + +.wg-hero .btn-lg { + font-size: 1.1rem; +} + +.wg-hero .hero-note { + font-size: 0.8rem; +} + +.hero-media { + display: flex; + align-items: center; + justify-content: center; + height: 100%; + text-align: center; +} + +/************************************************* + * Slider Widget + **************************************************/ + +/* Clear `.home-section` as padding and animation interferes with Slider's layout and animations. */ +.home-section.wg-slider { + padding: 0; + animation: none; + animation-delay: unset; +} + +/* The Slider widget reuses the Hero widget's `.wg-hero` class. + * We must remove the `animation` and `clear` in this instance or + * multiple slides can be `.active` at once. */ +.carousel-inner .wg-hero { + animation: none; + clear: none; +} + +/************************************************* + * Featurette Widget + **************************************************/ + +.featurette { + font-size: 0.8rem; + line-height: 1.5; + color: #555; + text-align: center; +} + +.featurette h3 { + margin-top: 0; + margin-bottom: 5px; + font-weight: 400; + color: #333; +} + +.dark .featurette, +.dark .featurette h3 { + color: #fff; +} + +.featurette-icon { + display: block; + width: 100%; + color: $sta-primary; + font-size: 3rem; + text-align: center; +} + +.featurette-margin { + margin-bottom: 20px; +} + +/************************************************* + * About widget + **************************************************/ + +#profile { + text-align: center; + padding: 30px 10px; + position: relative; +} + +.portrait { + width: 200px; + height: 200px; + margin: 0 auto; + border-radius: 50%; + object-fit: cover; +} + +.portrait-title h2 { + font-size: 1.75em; + font-weight: 300; + color: #000000; + margin: 20px 0 10px 0; +} + +.portrait-title h3 { + font-size: 1rem; + font-weight: 300; + color: rgba(0,0,0, 0.54); + margin: 0px 0 10px 0; +} + +ul.network-icon { + list-style-type: none; + padding: 0; +} + +#profile .network-icon { + margin-top: 30px; +} + +.network-icon li { + margin-right: 10px; + display: inline-block; +} + +.network-icon li:last-of-type { + margin-right: 0; +} + +.big-icon { + font-size: 2rem; +} + +ul.ul-interests li { + font-size: 0.9rem; +} + +ul.ul-edu { + list-style: none; +} + +ul.ul-edu li { + position: relative; + padding: 0px 15px 4px 3px; +} + +ul.ul-edu li .description p { + margin: 0; +} + +ul.ul-edu li .description p.course { + font-size: 0.9rem; +} + +ul.ul-edu li .description p.institution { + font-size: 0.75rem; + color: rgba(0,0,0,0.6); +} + +/************************************************* + * Experience + **************************************************/ + +.exp-title { + text-transform: none !important; +} + +.exp-company { + font-weight: normal !important; + text-transform: none !important; +} + +.exp-meta { + font-size: 0.8rem; +} + +.experience .card-text, +.experience .card-text p { + color: #000 !important; + font-size: 0.75rem !important; +} + +.dark .experience .text-muted { + color: rgba(255, 255, 255, 0.8) !important; +} + +.dark .experience .card-text, +.dark .experience .card-text p { + color: rgb(248, 248, 242) !important; +} + +.card .card-text ul { + margin-top: -1rem; + margin-bottom: 0rem; +} + +.experience .m-2 .border, +.experience .col.border-right { + border-color: $sta-primary !important; +} + +.experience .m-2 .border.exp-fill { + background-color: $sta-primary !important; +} + +/************************************************* + * Talks + **************************************************/ + +.talk-metadata { + color: #4b4f56; + font-size: 0.8rem; +} + +/************************************************* + * Projects + **************************************************/ + +.project-widget-simple li { + margin-bottom: 1rem; +} + +.project-widget-simple li:last-of-type { + margin-bottom: 0; +} + +.project-widget-simple .project-title { + margin-bottom: 6px; +} + +.project-widget-simple .project-summary { + font-size: 0.9rem; + margin-bottom: 0.4rem; +} + +.projects-container { + display: block; + position: relative; + /*margin-top: 5rem;*/ + overflow: hidden; +} + +.project-toolbar{ + margin-bottom: 2rem; +} + +.project-card { + position: relative; + width: calc(33.3% - 2*20px); /* Fluid 3 columns (inc. 20px gutter) */ +} +@media screen and (max-width: 1199px) { + .project-card { + width: calc(50% - 20px); /* Fluid 2 columns (inc. 20px gutter) */ + } +} +@media screen and (max-width: 768px) { + .project-card { + width: 100%; /* 1 column */ + } +} + +.project-item { + margin-bottom: 1.5rem; +} + +.project-card.project-item { + margin: 0 0 20px 0; /* Set to Isotope's gutter size */ +} + +.project-card .card { + margin: 0; /* Remove default card margin and use Isotope gutter */ +} + +.project-showcase .project-item { + margin-bottom: 3rem; +} + +.project-item:last-of-type { + margin-bottom: 0; +} + +.isotope-item { + z-index: 2; +} + +.isotope-item:hover{ + z-index: 3; +} + +/************************************************* + * Accomplishments + **************************************************/ + +.card.course { + margin-bottom: 1rem; /* More compact spacing than Experience widget as typically more items here. */ +} + +.card.course:last-of-type { + margin-bottom: 0; +} + +.course .card-subtitle a { + border-bottom: solid 1px transparent; +} + +.course .card-subtitle a:hover { + border-bottom: solid 1px; + text-decoration: none; +} + +/************************************************* + * People widget + **************************************************/ + +.people-widget { + font-size: 0.8rem; + text-align: center; +} + +.people-widget .portrait-title h2 { + font-size: 1rem; +} + +.people-widget .portrait-title h3 { + font-size: 0.7rem; +} + +.people-widget .portrait { + width: 80%; + max-width: 150px; + height: auto; +} + +@media (min-width: 576px) { + .people-widget .col-sm-auto { + width: 30%; + } +} +@media (min-width: 992px) { + .people-widget .col-sm-auto { + width: 20%; + } +} + +/************************************************* + * Contact + **************************************************/ + +.contact-widget .fa-ul { + margin-left: 3.14285714rem; /* Must be > `fa-2x` icon size. */ +} + +.contact-widget .fa-li { + position: absolute; + left: -3.14285714rem; /* Negative of `.contact-widget .fa-ul` margin. */ + width: 2rem; /* Match `fa-2x` icon size. */ + top: 0.14285714em; /* Default FA value. */ + text-align: center; +} + +.contact-widget li { + padding-top: 0.8rem; /* Align text with bottom of `fa-2x` icon. */ + margin-bottom: 0.3rem; +} + +.contact-widget li:last-of-type { + margin-bottom: 0; +} + +#map { + height: 350px; + width: 100%; +} diff --git a/assets/sass/academia/academia.scss b/assets/sass/academia/academia.scss new file mode 100644 index 0000000..6e3f18e --- /dev/null +++ b/assets/sass/academia/academia.scss @@ -0,0 +1,17 @@ +/************************************************* + * academia: The Website Builder for Hugo + * Designed by @GeorgeCushen + * https://sourcethemes.com/academic/ + * License: https://github.com/gcushen/hugo-academia/blob/master/LICENSE.md + **************************************************/ + +@import "root"; +@import "nav"; +@import "card"; +@import "search"; +@import "content"; +@import "listings"; +@import "widgets"; +@import "docs"; +@import "dark"; +@import "integrations"; diff --git a/assets/sass/bootstrap_variables.scss b/assets/sass/bootstrap_variables.scss new file mode 100644 index 0000000..08a9b81 --- /dev/null +++ b/assets/sass/bootstrap_variables.scss @@ -0,0 +1,13 @@ +/* Set Bootstrap variables */ + +// Set colors. +$primary: $sta-primary; +$text-muted: rgba(0,0,0,0.54); + +// Container widths - override XL default of `1140px`. +$container-max-widths: ( + sm: 540px, + md: 720px, + lg: 960px, + xl: 1200px +); diff --git a/assets/sass/main.scss b/assets/sass/main.scss new file mode 100644 index 0000000..64caca9 --- /dev/null +++ b/assets/sass/main.scss @@ -0,0 +1,39 @@ +{{- $scr := .Scratch -}} +{{- $site := $scr.Get "site" -}} +{{- partial "functions/parse_theme" . -}} + +$sta-darken-percentage: 10%; +$sta-lighten-percentage: 10%; + +$sta-font-size: {{ $scr.Get "font_size" }}; +$sta-font-size-small: {{ $scr.Get "font_size_small" }}; + +$sta-font-body: {{ $scr.Get "body_font" }}; +$sta-font-heading: {{ $scr.Get "heading_font" }}; +$sta-font-nav: {{ $scr.Get "nav_font" }}; +$sta-font-mono: {{ $scr.Get "mono_font" }}; + +$sta-primary: {{ $scr.Get "primary" }}; +$sta-primary-light: lighten($sta-primary, $sta-lighten-percentage); +$sta-primary-dark: darken($sta-primary, $sta-darken-percentage); + +$sta-link: {{ $scr.Get "link" }}; +$sta-link-hover: {{ $scr.Get "link_hover" }}; + +$sta-menu-primary: {{ $scr.Get "menu_primary" }}; +$sta-menu-text: {{ $scr.Get "menu_text" }}; +$sta-menu-text-active: {{ $scr.Get "menu_text_active" }}; +$sta-menu-title: {{ $scr.Get "menu_title" }}; + +$sta-background: {{ $scr.Get "background" }}; +$sta-dark-background: {{ $scr.Get "dark_background" }}; + +$sta-home-section-odd: {{ $scr.Get "home_section_odd" }}; +$sta-home-section-even: {{ $scr.Get "home_section_even" }}; + +$sta-dark-home-section-odd: {{ $scr.Get "dark_home_section_odd" }}; +$sta-dark-home-section-even: {{ $scr.Get "dark_home_section_even" }}; + +@import "bootstrap_variables"; +@import "vendor/bootstrap/bootstrap"; +@import "academia/academia"; diff --git a/assets/sass/vendor/bootstrap/_alert.scss b/assets/sass/vendor/bootstrap/_alert.scss new file mode 100644 index 0000000..da2a98a --- /dev/null +++ b/assets/sass/vendor/bootstrap/_alert.scss @@ -0,0 +1,51 @@ +// +// Base styles +// + +.alert { + position: relative; + padding: $alert-padding-y $alert-padding-x; + margin-bottom: $alert-margin-bottom; + border: $alert-border-width solid transparent; + @include border-radius($alert-border-radius); +} + +// Headings for larger alerts +.alert-heading { + // Specified to prevent conflicts of changing $headings-color + color: inherit; +} + +// Provide class for links that match alerts +.alert-link { + font-weight: $alert-link-font-weight; +} + + +// Dismissible alerts +// +// Expand the right padding and account for the close button's positioning. + +.alert-dismissible { + padding-right: $close-font-size + $alert-padding-x * 2; + + // Adjust close link position + .close { + position: absolute; + top: 0; + right: 0; + padding: $alert-padding-y $alert-padding-x; + color: inherit; + } +} + + +// Alternate styles +// +// Generate contextual modifier classes for colorizing the alert. + +@each $color, $value in $theme-colors { + .alert-#{$color} { + @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level)); + } +} diff --git a/assets/sass/vendor/bootstrap/_badge.scss b/assets/sass/vendor/bootstrap/_badge.scss new file mode 100644 index 0000000..2082f05 --- /dev/null +++ b/assets/sass/vendor/bootstrap/_badge.scss @@ -0,0 +1,54 @@ +// Base class +// +// Requires one of the contextual, color modifier classes for `color` and +// `background-color`. + +.badge { + display: inline-block; + padding: $badge-padding-y $badge-padding-x; + @include font-size($badge-font-size); + font-weight: $badge-font-weight; + line-height: 1; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + @include border-radius($badge-border-radius); + @include transition($badge-transition); + + @at-root a#{&} { + @include hover-focus { + text-decoration: none; + } + } + + // Empty badges collapse automatically + &:empty { + display: none; + } +} + +// Quick fix for badges in buttons +.btn .badge { + position: relative; + top: -1px; +} + +// Pill badges +// +// Make them extra rounded with a modifier to replace v3's badges. + +.badge-pill { + padding-right: $badge-pill-padding-x; + padding-left: $badge-pill-padding-x; + @include border-radius($badge-pill-border-radius); +} + +// Colors +// +// Contextual variations (linked badges get darker on :hover). + +@each $color, $value in $theme-colors { + .badge-#{$color} { + @include badge-variant($value); + } +} diff --git a/assets/sass/vendor/bootstrap/_breadcrumb.scss b/assets/sass/vendor/bootstrap/_breadcrumb.scss new file mode 100644 index 0000000..be30950 --- /dev/null +++ b/assets/sass/vendor/bootstrap/_breadcrumb.scss @@ -0,0 +1,41 @@ +.breadcrumb { + display: flex; + flex-wrap: wrap; + padding: $breadcrumb-padding-y $breadcrumb-padding-x; + margin-bottom: $breadcrumb-margin-bottom; + list-style: none; + background-color: $breadcrumb-bg; + @include border-radius($breadcrumb-border-radius); +} + +.breadcrumb-item { + // The separator between breadcrumbs (by default, a forward-slash: "/") + + .breadcrumb-item { + padding-left: $breadcrumb-item-padding; + + &::before { + display: inline-block; // Suppress underlining of the separator in modern browsers + padding-right: $breadcrumb-item-padding; + color: $breadcrumb-divider-color; + content: $breadcrumb-divider; + } + } + + // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built + // without `